zoukankan      html  css  js  c++  java
  • MYSQL语句强化练习

    之前发现自己写sql不怎么得心应手,总是百度零零散散的学习一下,所以在空闲的时候自己就专门找一下mysql的强化题敲一下练习一下,简要记录一下,sql写着写着就会越来越熟练,总之要自己加油!

    表结构

    学生表:Student(SNO,Sname,Sage,Sex)
    课程表:Course(CNO,Cname,TNO)
    成绩表:SC(SNO,CNO,score)
    教师表:Teacher(TNO,Tname)

    建表语句

    create table student(
        id int primary key auto_increment comment '主键id',
        sno int not null comment '学号',
        sname varchar(100) comment '姓名',
        age int comment '年龄',
        sex int not null comment '性别0男1女'
    )comment= '学生表'
    
    create table course(
        id int primary key auto_increment comment '课程表主键id',
        cno int not null comment '课程号',
        cname varchar(100) comment '课程名',
        tno int not null comment '教师编号'
    )comment = '课程表'
    
    create table sc(
        id int primary key auto_increment comment '成绩表主键id',
        sno int not null comment '学号',
        cno int not null comment '课程号',
        score int not null comment '分数'
    )comment = '成绩表'
    
    create table teacher(
     id int primary key auto_increment comment '教师表主键id',
     tno int not null comment '教师编号',
     tname varchar(100) comment '教师姓名'
    )comment = '教师表'
    #1.查询“3001”课程比“3002”课程成绩高的所有学生的学号
    select a.sno from
        (select sno,score from sc where cno=3001)a,
        (select sno,score from sc where cno=3002)b
    where a.score>b.score and a.sno=b.sno
    
    #2.查询平均成绩大于60分的同学的学号和平均成绩
    select 
    sno,
    AVG(score) avg_score
    from sc
    group by sno
    having avg_score>60
    
    #3.查询所有同学的学号、姓名、选课数、总成绩
    select
    student.sno,
    student.sname,
    count(sc.cno),
    sum(sc.score)
    from student
    left join sc on student.sno = sc.sno
    group by student.sno
    
    #4.查询姓“李”的教师数
    select count(distinct(teacher.tname)) num
    from teacher where teacher.tname like '李%'
    
    #5.查询没有学过“李老师”课程的同学的学号、姓名
    select 
    student.sno,
    student.sname
    from student
    where student.sno not in
    (
        select sc.sno from sc
        inner join course on sc.cno = course.cno
        inner join teacher on teacher.tno = course.tno
        where teacher.tname = '李老师'
    )
    
    #6.查询学过“王老师”所有课程的学生的学号、姓名
    select student.sno,student.sname 
    from student where student.sno in
    (
    select sc.sno
    from sc
    inner join course on sc.cno = course.cno
    inner join teacher on course.tno = teacher.tno
    where teacher.tname = '王老师'
    group by sc.sno
    having count(sc.sno)=(
        select COUNT(course.cno) from teacher
        inner join course on teacher.tno = course.tno
        where teacher.tname = '王老师'
        )
    )
    
    #7.查询学过“3001”也学过“3004”课程的学生的学号、姓名
    select student.sno,student.sname
    from student
    inner join sc on student.sno = sc.sno
    where cno = 3001
    and student.sno in (
        select sc.sno from sc where sc.cno=3004
    )
    
    select student.sno,student.sname
    from student
    inner join sc a on student.sno = a.sno
    where cno = 3001
    and EXISTS
    (
        select b.sno from sc b where a.sno = b.sno and b.cno=3004
    )
    
    #8.查询所有课程成绩小于60的同学的学号、姓名
    select stu.sno,stu.sname
    from student stu
    where stu.sno not in(
        select sc.sno from sc where sc.score >= 60 group by sc.sno
    )
    
    #9.查询没有学全所有课的同学的学号、姓名
    select student.sno,student.sname
    from student
    inner join sc on student.sno = sc.sno
    group by sc.sno having count(*)<
    (
    select count(cno) from course
    )
    
    #10.查询至少有一门课与学号为“1001”同学所学相同的学生的学号和姓名
    select student.sno,student.sname
    from student
    inner join sc on student.sno = sc.sno
    where sc.sno != 1001
    and sc.cno in(
        select sc.cno from sc where sc.sno = 1001
    )
    group by student.sno
    
    #11.查询和“1001”号的同学学习的课程完全相同的其他同学学号和姓名
    select sc.sno
    from sc where sc.sno != 1002 and cno in
    (select cno from sc where sc.sno = 1002)    
    group by sno having count(*) =
    (select count(*) from sc where sno = 1002)
    
    #12.删除学习“李老师”课的sc表记录
    delete sc
    from sc
    inner join course on course.cno = sc.cno
    inner join teacher on teacher.tno = course.tno
    where teacher.tname = '李老师'
    
    #13.向sc表中插入一些记录,这些记录要求符合以下条件;没有上过编号“3004”课程的同学学号、3001号课程的平均成绩
    insert into sc(sno,cno,score)
    select sno,3001,(SELECT AVG(score) from sc where cno = 3001)
    from student where sno not in
    (
        select sno from sc where cno = 3003
    )
    
    #14.按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示:学生id,语文,数学,英语,有效课程数,有效平均分
    select
    s.sno as '学生id',
    (select s1.score from sc s1 where s1.sno = s.sno and s1.cno = 3001) as '语文',
    (select s2.score from sc s2 where s2.sno = s.sno and s2.cno = 3002) as '数学',
    (select s3.score from sc s3 where s3.sno = s.sno and s3.cno = 3003) as '英语',
    count(cno) as '有效课程数',
    AVG(score) as '有效平均分'
    from sc s group by s.sno order by '有效平均分'
    
    #15.查询各科成绩最高和最低的分:以如下的形式显示,课程id,最高分,最低分
    select
    s.cno as '课程id',
    (select max(score) from sc s1 where s1.cno = s.cno) as '最高分',
    (select min(score) from sc s2 where s2.cno = s.cno) as '最低分'
    from sc s group by s.cno
    
    #16.按各科平均成绩从低到高和及格率的百分数从高到低顺序
    select
    s.cno as '课程id',
    course.cname as '课程名',
    AVG(s.score) as avgScore,
    (select count(*) from sc s1 where s.cno = s1.cno and s1.score>60)/count(sno)*100 as rate
    from sc s
    inner join course on course.cno = s.cno
    group by s.cno
    order by avgScore asc,rate desc
    
    #17.查询“3001”课程成绩在第2名到3名的学生的各科成绩
    select
    student.sname,course.cname,sc.score
    from course
    inner join sc on course.cno = sc.cno
    and course.cno = 3001
    inner join student on student.sno = sc.sno
    order by sc.score desc
    limit 1,2
    
    #18.查询出只选修两门课程的全部学生的学号和姓名
    select student.sno,student.sname
    from student
    inner join sc on student.sno = sc.sno
    group by student.sno having count(student.sno)=2
  • 相关阅读:
    函数
    拉取代码到本地
    逻辑位运算符 以及 布尔运算符&&、||
    JS中substr与substring的区别
    ? :和!:的用法含义及es6语法...
    JS中attribute和property的区别
    并发、并行的理解
    斑鸠云商小程序记住账号和密码
    js中的foreach用法
    指针与数组
  • 原文地址:https://www.cnblogs.com/chao-zjj/p/10472130.html
Copyright © 2011-2022 走看看