• Mysql综合练习作业50题



    #作业库
    create database db8 charset utf8;

    #年级表
    create table class_grade(
    gid int not null primary key auto_increment,
    gname varchar(20) not null unique
    );

    #班级表
    create table class(
    cid int 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 primary key auto_increment,
    sname varchar(20) not null,
    gender enum("女",'男') not null,
    class_id int not null,
    foreign key(class_id) references class(cid)
    );

    #老师表
    create table teacher(
    tid int primary key auto_increment,
    tname varchar(20) not null
    );

    #课程表
    create table course(
    cid int 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 unique not null 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 class(cid)
    on delete cascade
    on update cascade
    );


    #插入数据
    insert into class_grade(gname) values #4个年级
    ('一年级'),
    ('二年级'),
    ('三年级'),
    ('四年级');


    insert into class(caption,grade_id) values #9个
    ('一年一班',1),
    ('一年二班',1),
    ('一年三班',1),
    ('二年一班',2),
    ('二年二班',2),
    ('三年一班',3),
    ('三年二班',3),
    ('四年一班',4),
    ('四年二班',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);

    insert into teacher(tname) values #4个老师
    ('曹显'),
    ('王浩'),
    ('王五'),
    ('赵坤');

    insert into course(cname,teacher_id) values #6门课程
    ('生物',1),
    ('物理',2),
    ('化学',3),
    ('语文',3),
    ('数学',4),
    ('地理',2);

    #12个学生,6门课程
    insert into score(student_id,course_id,score) values
    (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);

    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);


    # 4个老师 9个班级
    insert into teach2cls(tid,cid) values
    (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);

    二、操作表
    1、自行创建测试数据;
    2、查询学生总人数;

    select count(sid) 学生总人数 from student;

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

    select sid 学生ID,sname 姓名 from student
    where
    sid in (
    select student_id from score inner join
    course on score.course_id = course.cid
    where cname in (
    "生物",
    "物理")
    and score.score >= 60
    group by score.student_id
    having count(course_id) =2
    );

    4、查询每个年级的班级数,取出班级数最多的前三个年级;
    select gname 年级 from class_grade inner join(
    select grade_id from class
    group by grade_id
    order by count(caption) desc
    limit 3
    ) t1 on t1.grade_id = class_grade.gid;

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

    select student.sid,student.sname,t1.avg_score
    from student inner join(
    select student_id ,avg(score) avg_score from score
    group by student_id
    having student_id in (
    (select student_id from score
    group by student_id
    order by avg(score) desc
    limit 1),
    (select student_id from score
    group by student_id
    order by avg(score) asc
    limit 1)
    )) t1 on t1.student_id = student.sid;


    6、查询每个年级的学生人数;
    select class_grade.gid,gname,t1.count_sid
    from class_grade inner join(
    select grade_id, count(sid) count_sid
    from class inner join student
    on class.cid = student.class_id
    group by grade_id
    ) t1 on t1.grade_id = class_grade.gid;


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

    select
    student_id,sname,t1.count_course,t1.avg_score
    from student inner join(
    select
    student_id,count(course_id) count_course,avg(score) avg_score
    from score
    group by student_id
    ) t1 on student.sid = t1.student_id;

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

    select
    student.sid,student.sname,course.cname,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)
    ) ) t1
    inner join student on t1.student_id = student.sid
    inner join course on course.cid = t1.course_id;

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

    select
    count(teacher.tname) 姓李的老师个数,
    count(teach2cls.cid) 带班级数
    from teacher left join teach2cls
    on teacher.tid = teach2cls.tid
    where teacher.tname like '李%';

    10、查询班级数小于5的年级id和年级名;
    select
    gid 年级id,
    gname 年级名,
    count(cid)
    from class inner join class_grade
    on class.grade_id = class_grade.gid
    group by gid
    having count(cid) <5;


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

    select
    class.cid '班级id',
    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 "年级级别"
    from class inner join class_grade
    on class.grade_id = class_grade.gid;

    12、查询学过“张三”老师2门课以上的同学的学号、姓名;
    select
    student.sid '学号',
    student.sname '姓名'
    from
    student
    inner join(
    select
    student_id
    from score
    where score.course_id in (
    select course.cid from course
    where teacher_id in(
    select tid from teacher
    where tname = '张三'
    )
    ) group by student_id
    having count(course_id) >2
    ) as t1 on student.sid = t1.student_id;

    13、查询教授课程超过2门的老师的id和姓名;
    select
    tid '老师id',
    tname '姓名'
    from teacher
    where tid in (
    select
    teacher_id
    from course
    group by teacher_id
    having count(cid) >2

    );

    14、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
    select
    sid '学号',
    sname '姓名'
    from student
    where sid in
    (
    select distinct student_id
    from score where course_id in (1,2)
    );

    15、查询没有带过高年级的老师id和姓名;
    select
    tid '老师id',
    tname '姓名'
    from
    teacher
    where tid in (

    select distinct
    teach2cls.tid
    from teach2cls inner join class on
    teach2cls.cid = class.cid
    where class.grade_id not in (5,6)
    );


    16、查询学过“张三”老师所教的所有课的同学的学号、姓名;
    select
    sid '学号',
    sname '姓名'
    from
    student
    where sid in (
    select distinct student_id from
    score where course_id in(
    select cid from course inner join teacher
    on course.teacher_id = teacher.tid
    where tname = '张三'
    )
    );


    17、查询带过超过2个班级的老师的id和姓名;
    select
    tid 'id',
    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
    t2.student_id
    from (select * from score
    where course_id = 2) t2
    inner join(
    select * from score
    where course_id = 1
    ) t1 on t2.student_id = t1.student_id
    where t2.score < t1.score
    )

    19、查询所带班级数最多的老师id和姓名;
    select
    tid 'id',
    tname '姓名' #3、取得结果
    from
    teacher
    where tid in (
    select tid from teach2cls cls #2、根据数值取出并列的老师ID
    group by tid
    having count(cid) = (
    select count(cid) from teach2cls #1、求出带班级数最多的数值
    group by tid
    order by count(cid) desc
    limit 1
    )
    );



    20、查询有课程成绩小于60分的同学的学号、姓名;
    select
    sid '学号',
    sname '姓名'
    from
    student where sid in (
    select distinct student_id from score
    where score.score < 60
    );


    21、查询没有学全所有课的同学的学号、姓名;
    select
    sid '学号',
    sname '姓名'
    from
    student where sid 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 distinct
    student_id
    from
    score where course_id in (
    select course_id from score
    where student_id = 1 group by course_id
    )
    );

    23、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名;
    select
    sid '学号',
    sname '姓名'
    from
    student where sid in(
    select distinct 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 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)
    );

    25、删除学习“张三”老师课的score表记录;
    delete
    from
    score where course_id in(
    select cid from teacher,course
    where teacher_id = tid and tname = "张三"
    )

    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;


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

    select
    sc.student_id 学生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) 课程数,
    avg(sc.score) 平均分
    from score as sc
    group by
    sc.student_id
    order by
    avg(sc.score) asc;


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


    select
    course_id 课程ID,
    max(score) 最高分,
    min(score) 最低分
    from
    score
    group by course_id;

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

    select
    course_id,
    avg(score) '平均成绩',
    (sum(case when score >= 60 then 1 else 0 end) / count(score)) *100 '及格率'
    from
    score
    group by
    course_id
    order by
    avg(score) asc,
    '及格率' desc;

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

    select
    t1.course_id '课程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;


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

    select
    score.sid,
    score.student_id '学生ID',
    score.course_id '课程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

    );

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

    select course.cid '课程ID',
    ifnull(t1.count_students,0) as '选修学生数'
    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;

    #第二种
    select course_id,count(student_id) from score group by course_id

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

    select sid,sname from student
    where sid in(
    select student_id from score
    group by
    student_id
    having
    count(course_id)>2
    );

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

    select gender,count(sid) as count_student
    from student
    group by gender
    order by count_student desc;


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

    select sid,sname,gender,class.caption
    from student inner join class on student.class_id = class.cid
    where sname like '张%';

    #第二种方法
    select * from student where sname like "张%";

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

    SELECT sname as '名字',count(sname) as '同名人数' from student
    GROUP BY sname
    HAVING count(sname) >1

    select sname,count(sname) from student group by sname
    having count(sname) >1


    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;

    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;


    select student.sid,student.sname,t1.score from student
    right join
    (select student_id,score from score where course_id in(
    select cid from course where cname = '数学'
    ) having score < 60) t1 on t1.student_id = student.sid;

    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;


    select sid, sname from student where sid in(
    select student_id from score where course_id = 3 and score > 80
    )
    40、求选修了课程的学生人数

    select course_id,count(student_id) as count_student
    from score
    group by course_id;


    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;

    #第二种方法
    select t1.max_sname,t1.t1.max_score ,
    t2.min_sname,t2.t2.min_score
    from (
    select t1.student_id,sname max_sname,t1.max_score from student inner join (
    select student_id,score max_score from score where course_id in
    (select cid from teacher,course
    where teacher.tid = course.teacher_id
    and tname = '王五'
    ) order by score desc
    limit 1 ) t1 on student.sid = t1.student_id) t1,
    (
    select t2.student_id,sname min_sname,t2.min_score from student inner join (
    select student_id,score min_score from score where course_id in
    (select cid from teacher,course
    where teacher.tid = course.teacher_id
    and tname = '王五'
    ) order by score asc
    limit 1 ) t2 on student.sid = t2.student_id
    )t2

    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);

    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;


    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;

    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;

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

    select course.cid,course.cname from course
    where course.cid not in (
    select course_id from score
    group by course_id
    );

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

    select teacher.tid,teacher.tname from teacher
    where teacher.tid not in(
    select tid from teach2cls
    group by tid
    );

    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;

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

    select score.student_id,score.score from score
    where score<60
    and course_id = 3
    order by score.score desc;

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


    delete from score where sid=(
    select t1.sid from (
    select sid from score
    where student_id = 2 and course_id = 1
    )as t1
    );

    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
    );

  • 相关阅读:
    进阶之路(基础篇)
    进阶之路(基础篇)
    进阶之路(基础篇)
    进阶之路(基础篇)
    进阶之路
    C语言连接MySQL数据库(转)
    Linux下mysql的远程连接(转)
    Linux 操作MySQL常用命令行(转)
    Linux(Ubuntu12.04)上玩儿STC单片机(转)
    信号量 Linux函数 semget();semctl();semop();(转)
  • 原文地址:https://www.cnblogs.com/anzhangjun/p/9899042.html
Copyright © 2020-2023  润新知