• MySQL数据库


    一、创建如下表,并创建相关约束

    二、操作表

      1、自行创建测试数据;

      2、查询学生总人数;

      3、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;

      4、查询每个年级的班级数,取出班级数最多的前三个年级;

      5、查询平均成绩最高和最低的学生的id和姓名以及平均成绩;

      6、查询每个年级的学生人数;

      7、查询每位学生的学号,姓名,选课数,平均成绩;

      8、查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;

      9、查询姓“李”的老师的个数和所带班级数;

      10、查询班级数小于5的年级id和年级名;

      11、查询班级信息,包括班级id、班级名称、年级、年级级别(12为低年级,34为中年级,56为高年级),示例结果如下;

      

      12、查询学过“张三”老师2门课以上的同学的学号、姓名;

      13、查询教授课程超过2门的老师的id和姓名;

      14、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;

      15、查询没有带过高年级的老师id和姓名;

      16、查询学过“张三”老师所教的所有课的同学的学号、姓名;

      17、查询带过超过2个班级的老师的id和姓名;

      18、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;

      19、查询所带班级数最多的老师id和姓名;

      20、查询有课程成绩小于60分的同学的学号、姓名;

      21、查询没有学全所有课的同学的学号、姓名;

      22、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名;

      23、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名;

      24、查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;

      25、删除学习“张三”老师课的score表记录;

      26、向score表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩;

      27、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;

      28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

      29、按各科平均成绩从低到高和及格率的百分数从高到低顺序;

      30、课程平均分从高到低显示(现实任课老师);

      31、查询各科成绩前三名的记录(不考虑成绩并列情况)

      32、查询每门课程被选修的学生数;

      33、查询选修了2门以上课程的全部学生的学号和姓名;

      34、查询男生、女生的人数,按倒序排列;

      35、查询姓“张”的学生名单;

      36、查询同名同姓学生名单,并统计同名人数;

      37、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;

      38、查询课程名称为“数学”,且分数低于60的学生姓名和分数;

      39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;

      40、求选修了课程的学生人数

      41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;

      42、查询各个课程及相应的选修人数;

      43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;

      44、查询每门课程成绩最好的前两名学生id和姓名;

      45、检索至少选修两门课程的学生学号;

      46、查询没有学生选修的课程的课程号和课程名;

      47、查询没带过任何班级的老师id和姓名;

      48、查询有两门以上课程超过80分的学生id及其平均成绩;

      49、检索“3”课程分数小于60,按分数降序排列的同学学号;

      50、删除编号为“2”的同学的“1”课程的成绩;

      51、查询同时选修了物理课和生物课的学生id和姓名;

    此处是求知的分割线

    --------------------------------------------------------------------------------------------------------------------------------------------

    test_1

    建库建表
                # 作业库 
                    create database mysql_work; 
                # 年级表
                    create table class_grade(
                    -> gid int not null auto_increment,
                    -> gname varchar(20) not null unique,
                    -> primary key(gid)
                    -> );
                # 班级表
                    create table class(
                    -> cid int not null primary key auto_increment,
                    -> caption varchar(20) not null,
                    -> grade_id int not null,
                    -> foreign key(grade_id) references class_grade(gid)
                    -> );
                # 学生表
                    create table student(
                    -> sid int not null primary key auto_increment,
                    -> gender enum('','') not null,
                    -> class_id int not null,
                    -> foreign key(class_id) references class(cid)
                    -> );
                # 老师表
                    create table teacher(
                    -> tid int not null primary key auto_increment,
                    -> tname varchar(20) not null
                    -> );
                # 课程表
                    create table course(
                    -> cid int not null primary key auto_increment,
                    -> cname varchar(20) not null,
                    -> teacher_id int not null ,
                    -> foreign key(teacher_id) references teacher(tid)
                    -> );
                # 成绩表
                    create table score(
                    -> sid int not null unique auto_increment,
                    -> student_id int not null,
                    -> course_id int not null,
                    -> score int not null,
                    -> primary key(student_id,course_id),
                    -> 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
                    -> );
                # 班级任职表
                    create table teach2cls(
                    -> tcid int not null unique auto_increment,
                    -> tid int not null,
                    -> cid int not null,
                    -> primary key(tid,cid),
                    -> foreign key(tid) references teacher(tid)
                    -> on delete cascade
                    -> on update cascade,
                    -> foreign key(cid) references course(cid)
                    -> on delete cascade
                    -> on update cascade
                    -> );
                    
            插入数据
                insert into class_grade(gname) values    # 4个年级
                ('一年级'),
                ('二年级'),
                ('三年级'),
                ('四年级');
                +-----+-----------+
                | gid | gname     |
                +-----+-----------+
                |   1 | 一年级    |
                |   3 | 三年级    |
                |   2 | 二年级    |
                |   4 | 四年级    |
                +-----+-----------+
                
                insert into class(caption,grade_id) values  # 9个班级
                ('一年一班',1),
                ('一年二班',1),
                ('一年三班',1),
                ('二年一班',2),
                ('二年二班',2),
                ('三年一班',3),
                ('三年二班',3),
                ('四年一班',4),
                ('四年二班',4);
                +-----+--------------+----------+
                | cid | caption      | grade_id |
                +-----+--------------+----------+
                |   1 | 一年一班     |        1 |
                |   2 | 一年二班     |        1 |
                |   3 | 一年三班     |        1 |
                |   4 | 二年一班     |        2 |
                |   5 | 二年二班     |        2 |
                |   6 | 三年一班     |        3 |
                |   7 | 三年二班     |        3 |
                |   8 | 四年一班     |        4 |
                |   9 | 四年二班     |        4 |
                +-----+--------------+----------+
                
                insert into student(sname,gender,class_id) values  # 12个学生
                ('Jane','',1),
                ('Rose','',1),
                ('Jack','',2),
                ('Alice','',2),
                ('Alex','',3),
                ('Drigon','',4),
                ('Lily','',5),
                ('Lucy','',6),
                ('Jone','',6),
                ('紫霞','',7),
                ('张尊宝','',8),
                ('高圆圆','',9);
                +-----+--------+----------+-----------+
                | sid | gender | class_id | sname     |
                +-----+--------+----------+-----------+
                |   1 | 女     |        1 | Jane      |
                |   2 | 女     |        1 | Rose      |
                |   3 | 男     |        2 | Jack      |
                |   4 | 女     |        2 | Alice     |
                |   5 | 男     |        3 | Alex      |
                |   6 | 男     |        4 | Drigon    |
                |   7 | 女     |        5 | Lily      |
                |   8 | 女     |        6 | Lucy      |
                |   9 | 男     |        6 | Jone      |
                |  10 | 女     |        7 | 紫霞      |
                |  11 | 男     |        8 | 张尊宝    |
                |  12 | 女     |        9 | 高圆圆    |
                +-----+--------+----------+-----------+
                
                insert into teacher(tname) values   # 4个老师
                ('曹显'),
                ('王浩'),
                ('王五'),
                ('赵坤');
                +-----+--------+
                | tid | tname  |
                +-----+--------+
                |   1 | 曹显   |
                |   2 | 王浩   |
                |   3 | 王五   |
                |   4 | 赵坤   |
                +-----+--------+
                
                insert into course(cname,teacher_id) values  # 6门课程
                ('生物',1),
                ('物理',2),
                ('化学',3),
                ('语文',3),
                ('数学',4),
                ('地理',2);
                +-----+--------+------------+
                | cid | cname  | teacher_id |
                +-----+--------+------------+
                |   1 | 生物   |          1 |
                |   2 | 物理   |          2 |
                |   3 | 化学   |          3 |
                |   4 | 语文   |          3 |
                |   5 | 数学   |          4 |
                |   6 | 地理   |          2 |
                +-----+--------+------------+
                
                insert into score(student_id,course_id,score) values # 12个学生,6门课程   
                (1,1,60),
                (1,2,59),
                (2,4,60),
                (2,5,59),
                (2,6,33),
                (3,1,59),
                (3,5,28),
                (4,4,100),
                (4,6,90),
                (5,4,88),
                (6,5,100),
                (6,6,60),
                (7,3,57),
                (7,5,60),
                (8,2,61),
                (8,4,59),
                (9,1,60),
                (9,2,61),
                (9,3,21),
                (10,5,68),
                (11,1,89),
                (12,3,100);
                +-----+------------+-----------+-------+
                | sid | student_id | course_id | score |
                +-----+------------+-----------+-------+
                |   1 |          1 |         1 |    60 |
                |   2 |          1 |         2 |    59 |
                |   3 |          2 |         4 |    60 |
                |   4 |          2 |         5 |    59 |
                |   5 |          2 |         6 |    33 |
                |   6 |          3 |         1 |    59 |
                |   7 |          3 |         5 |    28 |
                |   8 |          4 |         4 |   100 |
                |   9 |          4 |         6 |    90 |
                |  10 |          5 |         4 |    88 |
                |  11 |          6 |         5 |   100 |
                |  12 |          6 |         6 |    60 |
                |  13 |          7 |         3 |    57 |
                |  14 |          7 |         5 |    60 |
                |  15 |          8 |         2 |    61 |
                |  16 |          8 |         4 |    59 |
                |  17 |          9 |         1 |    60 |
                |  18 |          9 |         2 |    61 |
                |  19 |          9 |         3 |    21 |
                |  20 |         10 |         5 |    68 |
                |  21 |         11 |         1 |    89 |
                |  22 |         12 |         3 |   100 |
                +-----+------------+-----------+-------+ 
                
                insert into teach2cls(tid,cid) values # 4个老师 9个班级 
                (1,1),
                (1,2),
                (1,3),
                (1,7),
                (2,4),
                (2,8),
                (2,7),
                (2,5),
                (3,9),
                (3,3),
                (3,5),
                (3,2),
                (4,8),
                (4,4),
                (4,6),
                (4,1);
                +------+-----+-----+
                | tcid | tid | cid |
                +------+-----+-----+
                |    1 |   1 |   1 |
                |    2 |   1 |   2 |
                |    3 |   1 |   3 |
                |    4 |   1 |   7 |
                |    5 |   2 |   4 |
                |    6 |   2 |   8 |
                |    7 |   2 |   7 |
                |    8 |   2 |   5 |
                |    9 |   3 |   9 |
                |   10 |   3 |   3 |
                |   11 |   3 |   5 |
                |   12 |   3 |   2 |
                |   13 |   4 |   8 |
                |   14 |   4 |   4 |
                |   15 |   4 |   6 |
                |   16 |   4 |   1 |
                +------+-----+-----+
    View Code

    test_2

    查询学生总人数;
                select count(sid) as count_student from student;
                +---------------+
                | count_student |
                +---------------+
                |            12 |
                +---------------+
    View Code

    test_3

    查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;
                select sid,sname from student where sid in(
                    select score.student_id from score inner join course on score.course_id=course.cid
                    where course.cname in(
                        "生物",
                        "物理")
                        and score.score >= 60 
                        group by score.student_id
                        having count(course_id) = 2
                        );
                +-----+-------+
                | sid | sname |
                +-----+-------+
                |   9 | Jone  |
                +-----+-------+
    View Code

    test_4

    查询每个年级的班级数,取出班级数最多的前三个年级;
                select class_grade.gname from class_grade inner join 
                    (select grade_id,count(cid) as count_course 
                    from class 
                    group by grade_id 
                    order by count_course desc limit 3)
                    as t1 
                    on class_grade.gid = t1.grade_id;
                +-----------+
                | gname     |
                +-----------+
                | 一年级    |
                | 三年级    |
                | 二年级    |
                +-----------+
    View Code

    test_5

    查询平均成绩最高和最低的学生的id和姓名以及平均成绩;
                select student.sid,student.sname,t1.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_avg_score
                            from score
                            group by student_id
                            order by avg(score) desc
                            limit 1
                            ),
                            (
                            select avg(score) as min_avg_score
                            from score
                            group by student_id
                            order by avg(score) asc
                            limit 1
                            )
                        )
                    )as t1 on student.sid = t1.student_id;
                +-----+-----------+-----------+
                | sid | sname     | avg_score |
                +-----+-----------+-----------+
                |   3 | Jack      |   43.5000 |
                |  12 | 高圆圆    |  100.0000 |
                +-----+-----------+-----------+
    View Code

    test_6

    查询每个年级的学生人数;
                select t1.grade_id,count(t1.sid) as count_student
                from (
                        select student.sid,class.grade_id
                        from 
                            student,
                            class
                        where
                            student.class_id = class.cid
                    )as t1
                group by 
                        t1.grade_id;
                +----------+---------------+
                | grade_id | count_student |
                +----------+---------------+
                |        1 |             5 |
                |        2 |             2 |
                |        3 |             3 |
                |        4 |             2 |
                +----------+---------------+
    View Code

    test_7

    查询每位学生的学号,姓名,选课数,平均成绩;
                select student.sid,student.sname,t1.count_course,t1.avg_score
                    from student 
                        left join(
                            select 
                                student_id,
                                count(course_id) as count_course,
                                avg(score) as avg_score
                            from
                                score
                            group by    
                                student_id
                            )as t1 on student.sid=t1.student_id;
                +-----+-----------+--------------+-----------+
                | sid | sname     | count_course | avg_score |
                +-----+-----------+--------------+-----------+
                |   1 | Jane      |            2 |   59.5000 |
                |   2 | Rose      |            3 |   50.6667 |
                |   3 | Jack      |            2 |   43.5000 |
                |   4 | Alice     |            2 |   95.0000 |
                |   5 | Alex      |            1 |   88.0000 |
                |   6 | Drigon    |            2 |   80.0000 |
                |   7 | Lily      |            2 |   58.5000 |
                |   8 | Lucy      |            2 |   60.0000 |
                |   9 | Jone      |            3 |   47.3333 |
                |  10 | 紫霞      |            1 |   68.0000 |
                |  11 | 张尊宝    |            1 |   89.0000 |
                |  12 | 高圆圆    |            1 |  100.0000 |
                +-----+-----------+--------------+-----------+
    View Code

    test_8

    查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;
                select student.sname,course.cname,t1.score
                    from(
                        select
                            student_id,
                            course_id,
                            t1.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;
                        +-------+--------+-------+
                        | sname | cname  | score |
                        +-------+--------+-------+
                        | Rose  | 语文   |    60 |
                        | Rose  | 地理   |    33 |
                        +-------+--------+-------+
    View Code

    test_9

    查询班级数小于5的年级id和年级名;
                方法1:
                select 
                    gid,gname,count(cid) as count_cid 
                from class_grade 
                    inner join class on gid=grade_id
                group 
                    by gid 
                having 
                    count(cid)<5;
                
                方法2:
                select
                    gid,
                    gname
                from
                    class_grade
                where gid in (
                    select
                        grade_id
                    from
                        class
                    group by
                        grade_id
                    having
                        count(caption) < 5
                );
                +-----+-----------+-----------+
                | gid | gname     | count_cid |
                +-----+-----------+-----------+
                |   1 | 一年级    |         3 |
                |   2 | 二年级    |         2 |
                |   3 | 三年级    |         2 |
                |   4 | 四年级    |         2 |
                +-----+-----------+-----------+    
    View Code

    test_10

    查询班级数小于5的年级id和年级名;
                方法1:
                select 
                    gid,gname,count(cid) as count_cid 
                from class_grade 
                    inner join class on gid=grade_id
                group 
                    by gid 
                having 
                    count(cid)<5;
                
                方法2:
                select
                    gid,
                    gname
                from
                    class_grade
                where gid in (
                    select
                        grade_id
                    from
                        class
                    group by
                        grade_id
                    having
                        count(caption) < 5
                );
                +-----+-----------+-----------+
                | gid | gname     | count_cid |
                +-----+-----------+-----------+
                |   1 | 一年级    |         3 |
                |   2 | 二年级    |         2 |
                |   3 | 三年级    |         2 |
                |   4 | 四年级    |         2 |
                +-----+-----------+-----------+    
    View Code

    test_11

    查询班级信息,包括班级id、班级名称、年级、年级级别
                select 
                    class.cid,class.caption,class_grade.gid,
                    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,
                    class_grade
                where
                    class.grade_id=class_grade.gid;
                +-----+--------------+-----+--------------+
                | cid | caption      | gid | 年级级别     |
                +-----+--------------+-----+--------------+
                |   1 | 一年一班     |   1 | 低           |
                |   2 | 一年二班     |   1 | 低           |
                |   3 | 一年三班     |   1 | 低           |
                |   6 | 三年一班     |   3 | 中           |
                |   7 | 三年二班     |   3 | 中           |
                |   4 | 二年一班     |   2 | 低           |
                |   5 | 二年二班     |   2 | 低           |
                |   8 | 四年一班     |   4 | 中           |
                |   9 | 四年二班     |   4 | 中           |
                +-----+--------------+-----+--------------+
    View Code

    test_12

    查询学过“张三”老师2门课以上的同学的学号、姓名;
                select 
                    student.sid,student.sname
                from 
                    student
                where 
                    sid in(
                        select 
                            student_id
                        from 
                            score
                        where
                            course_id in(
                                select    
                                    course.cid
                                from
                                    teacher,
                                    course
                                where 
                                    teacher.tid=course.teacher_id
                                    and teacher.tname='张三'
                                )
                        group by
                            student_id
                        having
                            count(course_id) >2
                    );
                    
                # Empty set (0.00 sec) 记录为空
    View Code

    test_13

    查询教授课程超过2门的老师的id和姓名;
                select 
                    teacher.tid,teacher.tname 
                from teacher
                    where
                        tid in(
                            select 
                                teacher_id
                            from course
                            group by
                                teacher_id
                            having
                                count(cid)>2
                            );
                # Empty set (0.00 sec) 无记录
    View Code

    test_14

    查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
                select
                    sid,
                    sname
                from
                    student
                where
                    sid in (
                        select distinct
                            student_id
                        from
                            score
                        where
                            course_id in (
                                1,
                                2
                            )
                    );
                +-----+-----------+
                | sid | sname     |
                +-----+-----------+
                |   1 | Jane      |
                |   3 | Jack      |
                |   8 | Lucy      |
                |   9 | Jone      |
                |  11 | 张尊宝    |
                +-----+-----------+        
    View Code

    test_15

    查询没有带过高年级的老师id和姓名;
                select tid,tname 
                    from teacher
                where 
                    tid not in(
                    select 
                        tid 
                    from 
                        teach2cls
                    where 
                        cid in(
                            select
                                t1.cid
                                from(
                                    select
                                        class.cid,
                                        class.caption,
                                        class_grade.gname,
                                        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 grade_layer
                                    from
                                        class,
                                        class_grade
                                    where
                                        class.grade_id=class_grade.gid
                                    )as t1
                                where    
                                    t1.grade_layer=''
                            )
                        );
                +-----+--------+
                | tid | tname  |
                +-----+--------+
                |   1 | 曹显   |
                |   2 | 王浩   |
                |   3 | 王五   |
                |   4 | 赵坤   |
                +-----+--------+
    View Code

    test_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 course.teacher_id=teacher.tid
                                where teacher.tname = '张三'
                                )
                        );
                            
                Empty set (0.00 sec)    记录为空
    View Code

    test_17

    查询带过超过2个班级的老师的id和姓名;
                select tid,tname from teacher
                    where tid in(
                        select tid from teach2cls
                            group by tid 
                            having count(cid)>2
                            );
                +-----+--------+
                | tid | tname  |
                +-----+--------+
                |   1 | 曹显   |
                |   2 | 王浩   |
                |   3 | 王五   |
                |   4 | 赵坤   |
                +-----+--------+    
    View Code

    test_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
                                group by
                                    student_id
                            ) as t1,
                            (select student_id,score from score
                                where    
                                    course_id=1
                                group by
                                    student_id
                            ) as t2
                        where 
                            t1.student_id = t2.student_id
                            and t1.score < t2.score
                        );
                        
                +-----+-------+
                | sid | sname |
                +-----+-------+
                |   1 | Jane  |
                +-----+-------+    
    View Code

    test_19

    查询所带班级数最多的老师id和姓名;
                select tid,tname from teacher
                    where tid in(
                        select tid from teach2cls
                            group by tid
                            having count(cid)=(
                                select count(cid) from teach2cls
                                    group by tid
                                    order by count(cid) desc
                                    limit 1
                                )
                    );
                +-----+--------+
                | tid | tname  |
                +-----+--------+
                |   1 | 曹显   |
                |   2 | 王浩   |
                |   3 | 王五   |
                |   4 | 赵坤   |
                +-----+--------+
    View Code

    test_20

    查询有课程成绩小于60分的同学的学号、姓名;
                select sid,sname from student
                    where sid in (
                        select distinct student_id from score
                            where score<60
                    );
                +-----+-------+
                | sid | sname |
                +-----+-------+
                |   1 | Jane  |
                |   2 | Rose  |
                |   3 | Jack  |
                |   7 | Lily  |
                |   8 | Lucy  |
                |   9 | Jone  |
                +-----+-------+        
    View Code

    test_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)
                            );
                +-----+-----------+
                | sid | sname     |
                +-----+-----------+
                |   1 | Jane      |
                |   2 | Rose      |
                |   3 | Jack      |
                |   4 | Alice     |
                |   5 | Alex      |
                |   6 | Drigon    |
                |   7 | Lily      |
                |   8 | Lucy      |
                |   9 | Jone      |
                |  10 | 紫霞      |
                |  11 | 张尊宝    |
                |  12 | 高圆圆    |
                +-----+-----------+    
    View Code

    test_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                    
                        )
                        group by student_id
                    );
                +-----+-----------+
                | sid | sname     |
                +-----+-----------+
                |   1 | Jane      |
                |   3 | Jack      |
                |   8 | Lucy      |
                |   9 | Jone      |
                |  11 | 张尊宝    |
                +-----+-----------+    
    View Code

    test_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
                                )
                            group by student_id
                            )
                            and sid!=1;
                +-----+-----------+
                | sid | sname     |
                +-----+-----------+
                |   3 | Jack      |
                |   9 | Jone      |
                |  11 | 张尊宝    |
                |   8 | Lucy      |
                +-----+-----------+    
    View Code

    test_24

    查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;
                     select sid,sname from student where sid in (
                        select
                            score.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
                            )
                    );    
    View Code

    test_25

    删除学习“张三”老师课的score表记录;                
                delete from  score where course_id in(
                    select course.cid from course,teacher
                        where course.teacher_id = teacher.tid
                            and teacher.tname = '张三');
                
                Query OK, 0 rows affected (0.08 sec) 无数据受到影响
    View Code

    test_26

    向score表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩;
                insert into score(student_id,course_id,score)
                    select t1.sid,2,t2.avg_score 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_score from score
                                    where  course_id=2
                            ) as t2;
                
                Query OK, 9 rows affected (0.14 sec)  # 添加了9行记录
                Records: 9  Duplicates: 0  Warnings: 0
    View Code

    test_27

    按平均成绩从低到高显示所有学生的“语文”、“数学”、“物理”三门的课程成绩,按如下形式显示:
                select 
                    sc.student_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 Chinese,
                    (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 math,
                    (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 physics,
                        count(sc.course_id),
                        avg(sc.score)
                    from score as sc
                    group by
                        sc.student_id
                    order by
                        avg(sc.score) asc;
                
                +------------+---------+------+---------+---------------------+---------------+
                | student_id | Chinese | math | physics | count(sc.course_id) | avg(sc.score) |
                +------------+---------+------+---------+---------------------+---------------+
                |          9 |    NULL | NULL |      61 |                   3 |       47.3333 |
                |          3 |    NULL |   28 |      60 |                   3 |       49.0000 |
                |          2 |      60 |   59 |      60 |                   4 |       53.0000 |
                |          7 |    NULL |   60 |      60 |                   3 |       59.0000 |
                |          1 |    NULL | NULL |      59 |                   2 |       59.5000 |
                |          8 |      59 | NULL |      61 |                   2 |       60.0000 |
                |         10 |    NULL |   68 |      60 |                   2 |       64.0000 |
                |          6 |    NULL |  100 |      60 |                   3 |       73.3333 |
                |          5 |      88 | NULL |      60 |                   2 |       74.0000 |
                |         11 |    NULL | NULL |      60 |                   2 |       74.5000 |
                |         12 |    NULL | NULL |      60 |                   2 |       80.0000 |
                |          4 |     100 | NULL |      60 |                   3 |       83.3333 |
                +------------+---------+------+---------+---------------------+---------------+
                12 rows in set (0.00 sec)
    View Code

    test_28

    查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
                select course.cid,max(score.score) as max_score,min(score.score) as min_score
                    from course left join score on course.cid=score.course_id
                    group by score.course_id;
                +-----+-----------+-----------+
                | cid | max_score | min_score |
                +-----+-----------+-----------+
                |   1 |        89 |        59 |
                |   2 |        61 |        59 |
                |   3 |       100 |        21 |
                |   4 |       100 |        59 |
                |   5 |       100 |        28 |
                |   6 |        90 |        33 |
                +-----+-----------+-----------+
                6 rows in set (2.43 sec)
    View Code

    test_29

    按各科平均成绩从低到高和及格率的百分数从高到低顺序;
                select course_id,avg(score) as avg_score,
                    sum(case when score.score>60 then 1 else 0 end)/count(1)*100 as percent
                    from
                        score
                    group by
                        course_id
                    order by
                        avg(score) asc,
                        percent desc;
    View Code

    test_30

    课程平均分从高到低显示(显示任课老师);
                select t1.course_id,t1.avg_score,teacher.tname from course,teacher,
                    (
                    select course_id,avg(score) as avg_score from score
                    group by course_id
                    order by avg_score desc
                    ) as t1
                where 
                    course.cid = t1.course_id
                    and course.teacher_id = teacher.tid
                order by
                    t1.avg_score desc;
                    
                +-----------+-----------+--------+
                | course_id | avg_score | tname  |
                +-----------+-----------+--------+
                |         4 |   76.7500 | 王五   |
                |         1 |   67.0000 | 曹显   |
                |         5 |   63.0000 | 赵坤   |
                |         6 |   61.0000 | 王浩   |
                |         2 |   60.0833 | 王浩   |
                |         3 |   59.3333 | 王五   |
                +-----------+-----------+--------+
                6 rows in set (0.05 sec)
    View Code

    test_31

    查询各科成绩前三名的记录
                select 
                    score.sid,
                    score.student_id,
                    score.course_id,
                    score.score,
                    t1.first_score,
                    t1.second_score,
                    t1.third_score
                from score inner join(
                    select
                        s1.sid,
                        (select score from score as s2 where s1.course_id=s2.course_id order by score  desc limit 0,1) as first_score,
                        (select score from score as s3 where s1.course_id=s3.course_id order by score  desc limit 1,1) as second_score,
                        (select score from score as s4 where s1.course_id=s4.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.second_score,
                        t1.third_score
                        
                    );
                +-----+------------+-----------+-------+-------------+--------------+-------------+
                | sid | student_id | course_id | score | first_score | second_score | third_score |
                +-----+------------+-----------+-------+-------------+--------------+-------------+
                |   1 |          1 |         1 |    60 |          89 |           60 |          60 |
                |   3 |          2 |         4 |    60 |         100 |           88 |          60 |
                |   5 |          2 |         6 |    33 |          90 |           60 |          33 |
                |   8 |          4 |         4 |   100 |         100 |           88 |          60 |
                |   9 |          4 |         6 |    90 |          90 |           60 |          33 |
                |  10 |          5 |         4 |    88 |         100 |           88 |          60 |
                |  11 |          6 |         5 |   100 |         100 |           68 |          60 |
                |  12 |          6 |         6 |    60 |          90 |           60 |          33 |
                |  13 |          7 |         3 |    57 |         100 |           57 |          21 |
                |  14 |          7 |         5 |    60 |         100 |           68 |          60 |
                |  15 |          8 |         2 |    61 |          61 |           61 |          60 |
                |  17 |          9 |         1 |    60 |          89 |           60 |          60 |
                |  18 |          9 |         2 |    61 |          61 |           61 |          60 |
                |  19 |          9 |         3 |    21 |         100 |           57 |          21 |
                |  20 |         10 |         5 |    68 |         100 |           68 |          60 |
                |  21 |         11 |         1 |    89 |          89 |           60 |          60 |
                |  22 |         12 |         3 |   100 |         100 |           57 |          21 |
                |  23 |          2 |         2 |    60 |          61 |           61 |          60 |
                |  24 |          3 |         2 |    60 |          61 |           61 |          60 |
                |  25 |          4 |         2 |    60 |          61 |           61 |          60 |
                |  26 |          5 |         2 |    60 |          61 |           61 |          60 |
                |  27 |          6 |         2 |    60 |          61 |           61 |          60 |
                |  28 |          7 |         2 |    60 |          61 |           61 |          60 |
                |  29 |         10 |         2 |    60 |          61 |           61 |          60 |
                |  30 |         11 |         2 |    60 |          61 |           61 |          60 |
                |  31 |         12 |         2 |    60 |          61 |           61 |          60 |
                +-----+------------+-----------+-------+-------------+--------------+-------------+
                26 rows in set (0.00 sec)
    View Code

    test_32

    查询每门课程被选修的学生数;
                select course.cid,ifnull(t1.count_students,0) as count_student 
                    from course left join (
                        select course_id,count(student_id) as count_students
                        from score 
                        group by
                            course_id
                        ) as t1 on course.cid = t1.course_id;
                +-----+---------------+
                | cid | count_student |
                +-----+---------------+
                |   1 |             4 |
                |   2 |            12 |
                |   6 |             3 |
                |   3 |             3 |
                |   4 |             4 |
                |   5 |             5 |
                +-----+---------------+
                6 rows in set (0.06 sec)
    View Code

    test_33

    查询选修了2门以上课程的全部学生的学号和姓名;
                select sid,sname from student
                    where sid in(
                        select student_id from score
                        group by
                            student_id
                        having
                            count(course_id)>2
                        );
                +-----+--------+
                | sid | sname  |
                +-----+--------+
                |   2 | Rose   |
                |   3 | Jack   |
                |   4 | Alice  |
                |   6 | Drigon |
                |   7 | Lily   |
                |   9 | Jone   |
                +-----+--------+
                6 rows in set (0.06 sec)
    View Code

    test_34

    查询男生、女生的人数,按倒序排列;
                select gender,count(sid) as count_student
                    from student
                    group by gender
                    order by count_student desc;
                +--------+---------------+
                | gender | count_student |
                +--------+---------------+
                | 女     |             7 |
                | 男     |             5 |
                +--------+---------------+
                2 rows in set (0.02 sec)    
    View Code

    test_35

    查询姓“张”的学生名单;
                select sid,sname,gender,class.caption 
                    from student inner join class on student.class_id = class.cid
                    where sname like '张%';
                +-----+-----------+--------+--------------+
                | sid | sname     | gender | caption      |
                +-----+-----------+--------+--------------+
                |  11 | 张尊宝    | 男     | 四年一班     |
                +-----+-----------+--------+--------------+
                1 row in set (0.06 sec)
            
    View Code

    test_36

    查询同名同姓学生名单,并统计同名人数;
                select sid,sname,count(sname) as count_sname 
                    from student
                    group by sname
                    having count(sname)>1;
                    
                Empty set (0.00 sec)
    View Code

    test_37

    查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
                select cid,cname,avg(score.score) as avg_score from course 
                    inner join score on course.cid = score.course_id
                    group by cid
                    having avg(score.score)
                    order by avg(score.score),
                    course_id desc;
                +-----+--------+-----------+
                | cid | cname  | avg_score |
                +-----+--------+-----------+
                |   3 | 化学   |   59.3333 |
                |   2 | 物理   |   60.0833 |
                |   6 | 地理   |   61.0000 |
                |   5 | 数学   |   63.0000 |
                |   1 | 生物   |   67.0000 |
                |   4 | 语文   |   76.7500 |
                +-----+--------+-----------+
                6 rows in set (0.00 sec)
    View Code

    test_38

    查询课程名称为“数学”,且分数低于60的学生姓名和分数;
                select student.sid,student.sname,t1.score from student
                            inner join (
                                select score.student_id,score.score from score
                                inner join course on score.course_id=course.cid
                            where cname='数学' 
                                  and score.score<60
                            )as t1 on student.sid=t1.student_id;
                +-----+-------+-------+
                | sid | sname | score |
                +-----+-------+-------+
                |   2 | Rose  |    59 |
                |   3 | Jack  |    28 |
                +-----+-------+-------+
                2 rows in set (0.00 sec)
    View Code

    test_39

    查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;
                select student.sid,student.sname,t1.score from student
                    inner join(
                        select score.student_id,score.score from score
                        inner join course on score.course_id=course.cid
                    where cid=3
                        and score.score>80
                    )as t1 on student.sid = t1.student_id;
                
                +-----+-----------+-------+
                | sid | sname     | score |
                +-----+-----------+-------+
                |  12 | 高圆圆    |   100 |
                +-----+-----------+-------+
                1 row in set (0.00 sec)    
    View Code

    test_40

    求选修了课程的学生人数
                select course_id,count(student_id) as count_student 
                    from score
                    group by course_id;
            
            +-----------+---------------+
            | course_id | count_student |
            +-----------+---------------+
            |         1 |             4 |
            |         2 |            12 |
            |         3 |             3 |
            |         4 |             4 |
            |         5 |             5 |
            |         6 |             3 |
            +-----------+---------------+
            6 rows in set (0.00 sec)
    View Code

    test_41

    查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;
                select student.sid,student.sname,t2.course_id,t2.score,t2.max_score,t2.min_score from student
                    inner join (
                        select score.student_id,score.course_id,score.score,t1.max_score,t1.min_score
                            from score,
                            (
                            select course_id,max(score) as max_score,min(score) as min_score
                            from score
                            where course_id in (
                                select cid from course
                                inner join teacher on course.teacher_id = teacher.tid
                            where teacher.tname = '王五'
                            )
                        group by course_id
                        ) as t1
                    where score.course_id = t1.course_id
                        and score.score in(
                            max_score,
                            min_score
                        )
                        
                    )as t2 on student.sid  = t2.student_id;
            +-----+-----------+-----------+-------+-----------+-----------+
            | sid | sname     | course_id | score | max_score | min_score |
            +-----+-----------+-----------+-------+-----------+-----------+
            |   4 | Alice     |         4 |   100 |       100 |        59 |
            |   8 | Lucy      |         4 |    59 |       100 |        59 |
            |   9 | Jone      |         3 |    21 |       100 |        21 |
            |  12 | 高圆圆    |         3 |   100 |       100 |        21 |
            +-----+-----------+-----------+-------+-----------+-----------+
            4 rows in set (0.00 sec)
            
    View Code

    test_42

    查询各个课程及相应的选修人数;
                select course.cid,course.cname,count(student_id) as count_student from course
                    inner join score on course.cid = score.course_id
                    group by course.cid
                    having count(student_id);                        
                -+--------+---------------+
                | cid | cname  | count_student |
                +-----+--------+---------------+
                |   1 | 生物   |             4 |
                |   2 | 物理   |            12 |
                |   3 | 化学   |             3 |
                |   4 | 语文   |             4 |
                |   5 | 数学   |             5 |
                |   6 | 地理   |             3 |
                +-----+--------+---------------+
                6 rows in set (0.00 sec)    
    View Code

    test_43

    查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
                select distinct s1.student_id,s2.student_id,
                    s1.course_id as s1_course_id,
                    s2.course_id as s2_course_id,
                    s1.score,s2.score
                from 
                    score as s1,
                    score as s2
                where s1.student_id = s2.student_id
                and s1.course_id != s2.course_id
                and s1.score = s2.score;
                +------------+------------+--------------+--------------+-------+-------+
                | student_id | student_id | s1_course_id | s2_course_id | score | score |
                +------------+------------+--------------+--------------+-------+-------+
                |          2 |          2 |            2 |            4 |    60 |    60 |
                |          2 |          2 |            4 |            2 |    60 |    60 |
                |          6 |          6 |            2 |            6 |    60 |    60 |
                |          6 |          6 |            6 |            2 |    60 |    60 |
                |          7 |          7 |            2 |            5 |    60 |    60 |
                |          7 |          7 |            5 |            2 |    60 |    60 |
                +------------+------------+--------------+--------------+-------+-------+
                6 rows in set (0.00 sec)
    View Code

    test_44

    查询每门课程成绩最好的前两名学生id和姓名;
                select
                    student.sid,
                    student.sname,
                    t2.course_id,
                    t2.score,
                    t2.first_score,
                    t2.second_score
                from
                    student
                inner join (                    
                    select
                        score.student_id,
                        score.course_id,
                        score.score,
                        t1.first_score,
                        t1.second_score
                    from
                        score
                    inner join (
                        select
                            s1.sid,
                            (select s2.score from score as s2 where s1.course_id = s2.course_id order by s2.score desc limit 0,1) as first_score,
                            (select s3.score from score as s3 where s1.course_id = s3.course_id order by s3.score desc limit 1,1) as second_score
                        from
                            score as s1
                    ) as t1 on score.sid = t1.sid
                    where
                        score.score in (           
                            t1.first_score,
                            t1.second_score
                        )
                ) as t2 on student.sid = t2.student_id;
    View Code

    test_45

    检索至少选修两门课程的学生学号;
                select student_id,student.sname from score inner join student on score.student_id = student.sid
                group by student_id
                having count(course_id)>=2;
                +------------+-----------+
                | student_id | sname     |
                +------------+-----------+
                |          1 | Jane      |
                |          2 | Rose      |
                |          3 | Jack      |
                |          4 | Alice     |
                |          5 | Alex      |
                |          6 | Drigon    |
                |          7 | Lily      |
                |          8 | Lucy      |
                |          9 | Jone      |
                |         10 | 紫霞      |
                |         11 | 张尊宝    |
                |         12 | 高圆圆    |
                +------------+-----------+
                12 rows in set (0.00 sec)
    View Code

    test_46

    查询没有学生选修的课程的课程号和课程名;
                select course.cid,course.cname from course
                    where course.cid not in (
                        select course_id from score 
                        group by course_id
                        );
                            
                Empty set (0.00 sec)    无数据受到影响
    View Code

    test_47

    查询没带过任何班级的老师id和姓名;
                select teacher.tid,teacher.tname from teacher
                    where teacher.tid not in(
                        select tid from teach2cls
                        group by tid
                    );
                    
                    Empty set (0.05 sec) 无数据受到影响
    View Code

    test_48

    查询有两门以上课程超过80分的学生id及其平均成绩;
                select score.student_id,avg(score) as avg_score from score
                    where student_id in (
                        select student_id from score
                        where score>80
                        group by student_id
                        having count(score.course_id)>2
                        )
                    group by student_id;
                    
                Empty set (0.00 sec)   无数据受到影响
    View Code

    test_49

    检索“3”课程分数小于60,按分数降序排列的同学学号;
                select score.student_id,score.score from score
                        where score<60
                            and course_id = 3
                    order by score.score desc;
                    
                +------------+-------+
                | student_id | score |
                +------------+-------+
                |          7 |    57 |
                |          9 |    21 |
                +------------+-------+
                2 rows in set (0.00 sec)
    View Code

    test_50

    删除编号为“2”的同学的“1”课程的成绩;
                方法一:
                    delete score from score where student_id=2 and course_id=1;
                    
                方法二:
                    delete from score where sid=(
                        select t1.sid from (
                            select sid from score 
                                where  student_id = 2 and course_id = 1
                        )as  t1
                        );
                Query OK, 0 rows affected (0.00 sec) 无数据受到影响
    View Code

    test_51

    查询同时选修了物理课和生物课的学生id和姓名;
                select sid,sname from student
                    where sid in(
                        select 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
                );
                +-----+-----------+
                | sid | sname     |
                +-----+-----------+
                |   1 | Jane      |
                |   3 | Jack      |
                |   9 | Jone      |
                |  11 | 张尊宝    |
                +-----+-----------+
                4 rows in set (0.00 sec)
                            
    View Code
  • 相关阅读:
    【java】工厂模式Factory,利用反射改进
    【java】反射简单示例
    【java】java.util.regex.Pattern和java.util.regex.Matcher简单示例
    【java】实现一个简单的正则:判断一个字符串是否全由数字组成
    【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>
    【java】java.util.Arrays类常用方法
    【java】Date与String之间的转换及Calendar类:java.text.SimpleDateFormat、public Date parse(String source) throws ParseException和public final String format(Date date)
    【java】获取当前日期时间:java.util.Date
    44-python-三维画图
    43-python-自己的词典
  • 原文地址:https://www.cnblogs.com/schut/p/9097035.html
Copyright © 2020-2023  润新知