zoukankan      html  css  js  c++  java
  • sql综合练习题

    一、表关系
    年级表:class_grade
    create table class_grade(
        gid int primary key auto_increment,
        gname varchar(20) not null
        );
    insert into class_grade(gname) values
        ('一年级'),
        ('二年级'),
        ('三年级');
    班级表:class
    create table class(
        cid int primary key auto_increment,
        caption varchar(30) not null,
        grade_id int not null,
        constraint class_name foreign key(grade_id)
        references class_grade(gid)
        on delete cascade
        on update cascade
        );
    insert into class(caption,grade_id) values
        ('一年一班',1),
        ('二年一班',2),
        ('三年二班',3);
        
    学生表:student
    create table student(
        sid int primary key auto_increment,
        sname varchar(20) not null,
        gender enum('',''),
        class_id int not null,
        constraint student_name foreign key(class_id)
        references class(cid)
        on delete cascade
        on update cascade
        );
    insert into student(sname,gender,class_id) values
        ('乔丹','',1),
        ('艾弗森','',1),
        ('科比','',2);
        
    老师表:teacher
    create table teacher(
        tid int primary key auto_increment,
        tname varchar(30) not null
        );
    insert into teacher(tname) values
        ('张三'),
        ('李四'),
        ('王五');
        
    课程表:course
    create table course(
        cid int primary key auto_increment,
        cname varchar(30) not null,
        teacher_id int not null,
        constraint teacher_name foreign key(teacher_id)
        references teacher(tid)
        on delete cascade
        on update cascade
    );
    insert into course(cname,teacher_id) values
        ('生物',1),
        ('体育',1),
        ('物理',2);
        
    成绩表:score
    create table score(
        sid int primary key auto_increment,
        student_id int not null,
        course_id int not null,
        score int not null,
        foreign key(student_id) references student(sid)
        on delete cascade
        on update cascade,
        foreign key(course_id) references course(cid)
        on delete cascade
        on update cascade
    );
    
    insert into score(student_id,course_id,score) values
        (1,1,60),
        (1,2,59),
        (2,2,99);
        
    班级任职表:teach2cls
    create table teach2cls(
        tcid int primary key auto_increment,
        tid int not null,
        cid int not null,
        foreign key(tid) references teacher(tid)
        on delete cascade
        on update cascade,
        foreign key(cid) references class(cid)
        on delete cascade
        on update cascade
    );
    
    insert into teach2cls(tid,cid) values
        (1,1),
        (1,2),
        (2,1),
        (3,2);
        
    2、查询学生总人数
    select count(sname) 总人数 from student;
    
    3、查询’生物‘课程和’物理‘课程成绩都及格的学生id和姓名
    select 
        sid,
        sname
    from
        student
    inner join
        (
            select 
                student_id
            from 
                score
            where
                course_id in (
                    select
                        cid
                    from
                        course
                    where
                        cname in ('生物','物理')
                ) and  score >= 60
        ) as t1 on t1.student_id = student.sid;
        
    4、查询每个年级的班级数,取出班级数最多的前三个年级;
    select
        class_grade.gid,
        class_grade.gname
    from
        class_grade
    inner join
    (
        select 
            grade_id,
            count(cid)
        from
            class
        group by 
            grade_id
        order by 
            grade_id desc
        limit 3
    ) as t1 on t1.grade_id = class_grade.gid;
        
    5、查询平均成绩最高和最低的学生的id和姓名以及平均成绩;
    select
        student.sid,
        student.sname,
        avg_score
    from
        student
    inner join(
        select
            student_id,
            avg(score) as avg_score
        from
            score
        group by
            student_id
        having avg(score) in
            (
                (
                select
                    avg(score) as max_score
                from
                    score
                group by 
                    student_id
                order by
                    avg(score) desc
                limit 1
                ),
                (
                select
                    avg(score) as min_score
                from
                    score
                group by
                    student_id
                order by
                    avg(score)
                limit 1
                )
            )
        ) as t1 on t1.student_id = student.sid;
    
    6、查询每个年级的学生人数
    select 
        class_grade.gname,
        count_cid
    from 
        class_grade
    inner join
        (
        select
            grade_id,
            count(cid) as count_cid
        from
            class,student
        where
            class.cid = class_id
        group by grade_id
        ) as t1 on t1.grade_id = class_grade.gid;
    
    7、查询每位学生的学号、姓名、选课数、平均成绩;
    select
        student.sid,
        student.sname,
        course_count,
        avg_score
    from
        student
    left join
        (
        select
            student_id,
            count(course_id) as course_count,
            avg(score) as avg_score
        from
            score
        group by 
            student_id
        ) as t1 on t1.student_id = student.sid;
    
    8、查询学生编号为‘2’的学生的姓名,该学生成绩最高的课程名、成绩最低的课程名及分数;
    select
        student.sname,
        student.sid,
        t1.score
    from
    (
        select
            student_id,
            course_id,
            score
        from 
            score
        where student_id = 2 and score in
        (
            (
            select
                max(score)
            from
                score
            where student_id = 2),
            (
            select 
                min(score)
            from
                score
            where student_id =2)
        ) 
    )as t1
    inner join student on t1.student_id = student.sid
    inner join course on t1.course_id = course.cid;
    
    9、查询‘李’的老师的个数和所带班级数;
    select
        count(teacher.tname) as '李%个数',
        count(teach2cls.cid) as '班级数量'
    from teacher left join teach2cls on teach2cls.tid = teacher.tid
    where teacher.tname like '李%';
    
    10、查询班级数小于5年级的id和年级名;
    select
        gid,
        gname,
        count(cid)
    from
        class_grade
    inner join class on gid = grade_id
    group by
        gid
    having
        count(cid) < 5
    11、查询班级信息,包括班级id、班级名称、年级、年级级别(12
    为低年级,34为中年级,56为高年级)
    select
        class.cid as '班级id',
        class.caption as '班级名称',
        class_grade.gid as '年级',
    case
        when class_grade.gid between 1 and 2 then ''
        when class_grade.gid between 3 and 4 then ''
        when class_grade.gid between 5 and 6 then '' else 0 end as '年级级别'
    from
        class
    left join class_grade on class_grade.gid=class.grade_id;
    
    12、查询学过“张三”老师2门课以上的同学的学号、姓名;
    select 
        sid,
        sname
    from
        student
    where sid in 
    (
    select
        student_id
    from
        score
    left join course on course_id = course.cid
    where course.teacher_id in 
        (    
            select 
                tid
            from 
                teacher
            where tname = '张三'
        )
    group by
        student_id
    having count(course.cid)>=2
    )
    
    13、查询教授课程超过2门的老师的id和姓名;
    select
        tid,
        tname
    from
        teacher
    inner join 
        (
        select
            teacher_id,
            count(cid)
        from
            course
        group by
            teacher_id
        having count(cid) >=2
    ) as t1 on t1.teacher_id = teacher.tid;
    
    14、查询学过编号‘1’课程和编号2课程的同学的学号、姓名;
    select
        sid,
        sname
    from
        student
    where sid in 
    (
    select 
        course_id
    from
        score
    group by
        course_id
    having
        course_id in (1,2)
    )
    
    15、查询没有带过高年级的老师id和姓名;
    select
        tid,
        tname
    from
        teacher
    where tid  in
    (
    select 
        tid
    from
        teach2cls
    where tid in 
    (select
        cid
    from
        class
    where grade_id in (5,6)));
    
    16、查询学过'张三'老师所教的所有课的同学的学号、姓名;
    select
        sid,
        sname
    from
        student
    where sid in 
        (
        select
            student_id
        from
            score
        where course_id in 
            (    
            select
                cid
            from
                course
            inner join teacher on teacher_id = teacher.tid
            where teacher.tname ='张三'));
    
    17、查询带过超过2个班级的老师的id和姓名;
    select
        tid,
        tname
    from
        teacher
    where tid in (
    select
        tid
    from
        teach2cls
    group by
        tid
    having
        count(cid) >2);
    
    18、查询课程编号’2‘的成绩比课程’1‘课程低的所有同学的学号、姓名
    select 
        sid,
        sname
    from
        student
    where sid in (
    select 
        t1.student_id
    from
    (
        select
            student_id,
            score
        from
            score
        where 
            course_id =2
    ) as t1
    inner join
    (
        select
            student_id,
            score
        from
            score
        where 
            course_id =1
    ) as t2 on t1.student_id = t2.student_id
    where t1.score < t2.score);
    
    19、查询所带班级数最多的老师id和姓名;
    select
        tid,
        tname
    from
        teacher
    where tid =
    (select
        tid
    from
        teach2cls
    group by
        tid
    order by 
        count(cid) desc
    limit 1);
    20、查询有课程成绩小于60分的同学的学号、姓名;
    select
        sid,
        sname
    from
        student
    where sid in (
    select
        student_id
    from
        score
    where score <60);
    21、查询没有学全所有课的同学的学号、姓名;
    select
        sid,
        sname
    from
        student
    where sid not in (
    select
        student_id
    from
        score
    group by
        student_id
    having
        count(course_id) = (select count(cid) from course));
    22、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名;
    select
        sid,
        sname
    from
        student
    where sid in 
    (
    select
        student_id
    from
        score
    where course_id in 
    (select
        course_id
    from
        score
    where student_id = 1));
    
    23、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名;
    select
        sid,
        sname
    from
        student
    where sid in 
    (
    select
        student_id
    from
        score
    where course_id in 
    (select
        course_id
    from
        score
    where student_id = 1)
    having
        student_id !=1
    );
    
    24、查询和‘2’号同学学习的课程完全相同的其它同学的学号和姓名
    select
        sid,
        sname
    from
        student
    where sid in 
    (
        select
            student_id
        from
            score,(
        select 
            course_id 
        from
            score
        where student_id = 2) as t1
        where score.course_id = t1.course_id and score.student_id !=2
        group by
            score.student_id
        having
            count(score.course_id)=
            (
                select count(course_id) from score
                where student_id =2
            )
    );
    25、删除学习‘张三’老师课的score表记录;
    delete
    from
        score
    where course_id in (
    select 
        cid
    from
        course
    where course.teacher_id = (
    select 
        tid
    from 
        teacher
    where teacher.tname = '张三'));
    
    26、向score表中插入一些记录,这些记录要求符合以下条件:
    1、没有上过编号‘2’课程的同学学号
    2、插入’2‘号课程的平均成绩
        insert into score(student_id,course_id,score) 
         select t1.sid,2,t2.avg from (
         select sid from student where sid not in (
         select student_id from score where course_id = 2)) as t1,
         (select avg(score) as avg from score group by course_id having course_id =2) as t2;
    
    27、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,
        按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
        
      select sc.student_id as  学生ID,
            (select score.score from score left join course on score.course_id = course.cid 
              where course.cname = '生物' and score.student_id = sc.student_id) as 生物,
            (select score.score from score left join course on score.course_id = course.cid 
              where course.cname = '体育' and score.student_id = sc.student_id) as 体育,
            (select score.score from score left join course on score.course_id = course.cid 
              where course.cname = '物理' and score.student_id = sc.student_id) as 物理,
            count(sc.course_id) as '有效课程数',avg(sc.score) as '有效平均分'
        from score as sc group by sc.student_id order by avg(sc.score);
    
    28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,高低分;
        select course_id as "课程ID",max(score) as "最高分",min(score) as "最低分" from score
        group by course_id
    
    29、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
        SELECT course_id as '课程ID',AVG(score) as '平均成绩',
        sum(CASE WHEN score > 60 then 1 ELSE 0 END)/COUNT(1)*100 as '及格率'
        from score
        GROUP BY course_id ORDER BY '平均成绩' ASC,'及格率' desc;
    
    30、课程平均分从高到低显示(现实任课老师);
    SELECT score.course_id as '课程ID',avg(score) as '平均分' from score
    inner join course on score.course_id = course.cid
    GROUP BY course_id
    ORDER BY avg(score) DESC
    
    31、查询各科成绩前三名的记录(不考虑成绩并列情况)
    SELECT score.sid,score.course_id,score.score,t1.first_score,t1.sencond_score,t1.third_score from score LEFT JOIN
    (SELECT sid,
        (select  score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 0,1) as first_score,
        (select  score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 1,1) as sencond_score,
        (select  score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 2,1) as third_score
    from score as s1)as t1 on score.sid = t1.sid
    WHERE score.score in (t1.first_score,t1.sencond_score,t1.third_score)
    
    32、查询每门课程被选修的学生数;
    SELECT score.course_id as '课程ID',count(student_id) as '学生数' from score
    GROUP BY course_id
    
    33、查询选修了2门以上课程的全部学生的学号和姓名;
    SELECT student.sid,student.sname from student WHERE sid in (
    SELECT score.student_id from score
    GROUP BY student_id
    HAVING count(course_id) >=2);
    
    34、查询男生、女生的人数,按倒序排列;
    select gender,count(sid) as sum from student
    group by gender
    order by sum desc
    
    35、查询姓“张”的学生名单;
    SELECT sname from student WHERE sname like '张%'
    
    36、查询同名同姓学生名单,并统计同名人数;
    SELECT sname as '名字',count(sname) as '同名人数' from student
    GROUP BY sname
    HAVING count(sname) >1
    
    37、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
    select score.course_id,avg(score) as avg from score
    INNER JOIN course on course.cid = course_id
    GROUP BY course_id
    ORDER BY avg ASC,course_id DESC;
    
    38、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
    SELECT sid,sname from student
    where sid in (
    SELECT score.student_id  from score
    INNER JOIN course on course.cid = score.course_id
    WHERE course.cname = '体育' and score.score <60);
    
    39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;
    SELECT sid,sname from  student
    WHERE sid in (
    SELECT score.student_id  from score
    INNER JOIN course on course.cid = course_id
    WHERE course_id = 3 and score.score > 80);
    
    40、求选修了课程的学生人数
    select course_id as '课程ID',count(student_id) as '学生人数' from score group by course_id;
    
    41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;
    SELECT student.sname,max(score),min(score) from score
    INNER JOIN student on score.student_id = student.sid
    WHERE course_id in (
    SELECT cid from course
    WHERE teacher_id in (
    SELECT tid FROM teacher
    WHERE tname = '王五'))
    GROUP BY student_id
    ORDER BY max(score) DESC,MIN(score) ASC
    LIMIT 2
    
    42、查询各个课程及相应的选修人数;
    SELECT score.course_id as 'ID',course.cname as '课程',count(student_id) as '人数' from score
    LEFT JOIN course on score.course_id = course.cid
    GROUP BY course_id
    
    43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
    select DISTINCT s1.course_id,s2.course_id,s1.score,s2.score from score as s1, score as s2 where s1.score = s2.score and s1.course_id != s2.course_id;
    
    44、查询每门课程成绩最好的前两名学生id和姓名;
    SELECT score.sid,score.course_id,score.score,t1.first_score,t1.sencond_score from score LEFT JOIN
    (SELECT sid,
        (select  score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 0,1) as first_score,
        (select  score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 1,1) as sencond_score
    from score as s1)as t1 on score.sid = t1.sid
    WHERE score.score <= t1.first_score and score.score >= t1.sencond_score
    
    45、检索至少选修两门课程的学生学号;
    SELECT score.student_id as '学生ID',count(course_id) as '课程ID' from score
    GROUP BY student_id
    HAVING count(course_id)>=2
    
    46、查询没有学生选修的课程的课程号和课程名;
    SELECT cid,cname from course
    WHERE cid not IN(
    SELECT score.course_id from score
    GROUP BY score.course_id)
    
    47、查询没带过任何班级的老师id和姓名;
    SELECT tid,tname from teacher
    WHERE tid not in(
    SELECT teach2cls.cid from teach2cls
    GROUP BY teach2cls.cid)
    
    48、查询有两门以上课程超过80分的学生id及其平均成绩;
    SELECT score.student_id as '学生ID',avg(score) as '平均成绩' from score
    WHERE score > 30 
    GROUP BY student_id
    HAVING count(course_id) >=2
    
    49、检索“3”课程分数小于60,按分数降序排列的同学学号;
    select score.student_id from score
    WHERE score < 60 and course_id = 3
    ORDER BY score DESC
    
    50、删除编号为“2”的同学的“1”课程的成绩
    delete from score where score.student_id = 2 and score.course_id = 1;
    
    51、查询同时选修了物理课和生物课的学生id和姓名;
    SELECT sid,sname from student
    WHERE sid in(
    SELECT score.student_id from score
    WHERE course_id in (
    SELECT cid from course
    WHERE course.cname in ('生物','物理'))
    GROUP BY student_id
    HAVING count(course_id) =2)
  • 相关阅读:
    梯度
    正则化、方差、偏差
    K近邻python
    感知器python
    使用 Admission Webhook 机制实现多集群资源配额控制
    微众银行案例|容器化实践在金融行业落地面临的问题和挑战
    一个优秀的云原生架构需要注意哪些地方
    如何根据不同业务场景调节 HPA 扩缩容灵敏度
    如何使用容器镜像服务 TCR 轻松实现容器 DevOps
    腾讯云联合多家生态伙伴,重磅开源 SuperEdge 边缘容器项目
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/9263395.html
Copyright © 2011-2022 走看看