mysql实验四、五复杂查询

List item

1) 查询每个学生及其选课情况;
mysql> select student.,sc. from student,sc where student.sno=sc.sno;
±------±-------±-----±------±-----±------±----±------+
| sno | sname | ssex | sdept | sage | sno | cno | Grade |
±------±-------±-----±------±-----±------±----±------+
| 08001 | 张力 | 男 | cs | 18 | 08001 | 002 | 100 |
| 08001 | 张力 | 男 | cs | 18 | 08001 | 003 | 95 |
| 08001 | 张力 | 男 | cs | 18 | 08001 | 004 | 90 |
| 08001 | 张力 | 男 | cs | 18 | 08001 | 006 | 100 |
| 08002 | 李丽 | 女 | is | 19 | 08002 | 002 | 98 |
| 08002 | 李丽 | 女 | is | 19 | 08002 | 003 | NULL |
| 08003 | 赵海 | 男 | ma | 20 | 08003 | 001 | 99 |
| 08003 | 赵海 | 男 | ma | 20 | 08003 | 002 | 80 |
| 08003 | 赵海 | 男 | ma | 20 | 08003 | 003 | 98 |
| 08004 | 张那 | 女 | cs | 17 | 08004 | 001 | 90 |
| 08005 | 刘晨 | 男 | is | 18 | 08005 | 002 | 37 |
| 08005 | 刘晨 | 男 | is | 18 | 08005 | 007 | 97 |
| 08006 | 刘丹丹 | 女 | ma | 17 | 08006 | 003 | NULL |
| 08008 | 王江 | 男 | cs | 19 | 08008 | 001 | 50 |
| 08008 | 王江 | 男 | cs | 19 | 08008 | 003 | 80 |
| 08009 | 高晓 | 男 | is | 20 | 08009 | 001 | 89 |
| 08009 | 高晓 | 男 | is | 20 | 08009 | 004 | 90 |
| 08010 | 张丽 | 女 | cs | 19 | 08010 | 005 | 100 |
±------±-------±-----±------±-----±------±----±------+
18 ows in set
2) 查询每门课的间接先修课
mysql> select *from course;
±----±---------±-------±-----+
| cno | cname | Credit | Cpno |
±----±---------±-------±-----+
| 001 | 数据库 | 4 | 005 |
| 002 | 高等数学 | 2 | NULL |
| 003 | 信息系统 | 4 | 001 |
| 004 | 操作系统 | 3 | 006 |
| 005 | 数据结构 | 4 | 007 |
| 006 | 数据处理 | 2 | NULL |
| 007 | C语言 | 4 | 006 |
±----±---------±-------±-----+
7 rows in set

mysql> select *from course;
±----±---------±-------±-----+
| cno | cname | Credit | Cpno |
±----±---------±-------±-----+
| 001 | 数据库 | 4 | 005 |
| 002 | 高等数学 | 2 | NULL |
| 003 | 信息系统 | 4 | 001 |
| 004 | 操作系统 | 3 | 006 |
| 005 | 数据结构 | 4 | 007 |
| 006 | 数据处理 | 2 | NULL |
| 007 | C语言 | 4 | 006 |
±----±---------±-------±-----+
7 rows in set

mysql> select first.cno,second.cpno from course first,course second where first.cpno=second.cno;
±----±-----+
| cno | cpno |
±----±-----+
| 001 | 007 |
| 003 | 005 |
| 004 | NULL |
| 005 | 006 |
| 007 | NULL |
±----±-----+
5 rows in set
3) 将STUDENT,SC进行右连接
mysql> select student.,sc. from student right
join sc on student.sno=sc.sno;
±------±-------±-----±------±-----±------±----±------+
| sno | sname | ssex | sdept | sage | sno | cno | Grade |
±------±-------±-----±------±-----±------±----±------+
| 08001 | 张力 | 男 | cs | 18 | 08001 | 002 | 100 |
| 08001 | 张力 | 男 | cs | 18 | 08001 | 003 | 95 |
| 08001 | 张力 | 男 | cs | 18 | 08001 | 004 | 90 |
| 08001 | 张力 | 男 | cs | 18 | 08001 | 006 | 100 |
| 08002 | 李丽 | 女 | is | 19 | 08002 | 002 | 98 |
| 08002 | 李丽 | 女 | is | 19 | 08002 | 003 | NULL |
| 08003 | 赵海 | 男 | ma | 20 | 08003 | 001 | 99 |
| 08003 | 赵海 | 男 | ma | 20 | 08003 | 002 | 80 |
| 08003 | 赵海 | 男 | ma | 20 | 08003 | 003 | 98 |
| 08004 | 张那 | 女 | cs | 17 | 08004 | 001 | 90 |
| 08005 | 刘晨 | 男 | is | 18 | 08005 | 002 | 37 |
| 08005 | 刘晨 | 男 | is | 18 | 08005 | 007 | 97 |
| 08006 | 刘丹丹 | 女 | ma | 17 | 08006 | 003 | NULL |
| 08008 | 王江 | 男 | cs | 19 | 08008 | 001 | 50 |
| 08008 | 王江 | 男 | cs | 19 | 08008 | 003 | 80 |
| 08009 | 高晓 | 男 | is | 20 | 08009 | 001 | 89 |
| 08009 | 高晓 | 男 | is | 20 | 08009 | 004 | 90 |
| 08010 | 张丽 | 女 | cs | 19 | 08010 | 005 | 100 |
±------±-------±-----±------±-----±------±----±------+
18 rows in set
4) 查询有不及格的学生姓名和所在系
mysql> select sname,sdept from student, sc where student.sno=sc.sno and sc.grade<60;
±------±------+
| sname | sdept |
±------±------+
| 刘晨 | is |
| 王江 | cs |
±------±------+
2 rows in set
5) 查询所有成绩为优秀(大于90分)的学生姓名
mysql> select sname from student,sc where student.sno=sc.sno and student.sno not in(select sno from sc where grade is null) group by sname having min(grade)>90;
±------+
| sname |
±------+
| 张丽 |
±------+
1 row in set
6) 查询既选修了2号课程又选修了3号课程的学生姓名、学号;
mysql> select student.sno,student.sname from student,sc where student.sno=sc.sno and cno=‘002’ and sc.sno in(select sno from sc where cno=‘003’);
±------±------+
| sno | sname |
±------±------+
| 08001 | 张力 |
| 08002 | 李丽 |
| 08003 | 赵海 |
±------±------+
3 rows in set
7) 查询和刘晨同一年龄的学生
mysql> select student.* from student where sage=(select sage from student where sname=‘刘晨’)and sname<>‘刘晨’;

±------±------±-----±------±-----+
| sno | sname | ssex | sdept | sage |
±------±------±-----±------±-----+
| 08001 | 张力 | 男 | cs | 18 |
±------±------±-----±------±-----+
1 row in set
8) 选修了课程名为“数据库”的学生姓名和年龄
mysql> select sname,sage from student where sno in (select sno from sc where cno in (
select cno from course where cname=‘数据库’));
±------±-----+
| sname | sage |
±------±-----+
| 赵海 | 20 |
| 张那 | 17 |
| 王江 | 19 |
| 高晓 | 20 |
±------±-----+
4 rows in set
9) 统计每门课程的学生选修人数(超过3人的才统计)。要求输出课程号和选修人数,结果按人数降序排列,若人数相同,按课程号升序排列
mysql> select cno,count(sno) from sc group by cno having count(sno)>3 order by count(sno) asc,cno desc;
±----±-----------+
| cno | count(sno) |
±----±-----------+
| 002 | 4 |
| 001 | 4 |
| 003 | 5 |
±----±-----------+
3 rows in set
10) 求每门课程学生的平均成绩
mysql> select cno,avg(grade) from sc group by cno;
±----±-----------+
| cno | avg(grade) |
±----±-----------+
| 001 | 82.0000 |
| 002 | 78.7500 |
| 003 | 91.0000 |
| 004 | 90.0000 |
| 005 | 100.0000 |
| 006 | 100.0000 |
| 007 | 97.0000 |
±----±-----------+
7 rows in set

1) 查询其他系比IS系任一学生年龄小的学生名单
mysql> select student.* from student where sage‘is’;
±------±-------±-----±------±-----+
| sno | sname | ssex | sdept | sage |
±------±-------±-----±------±-----+
| 08001 | 张力 | 男 | cs | 18 |
| 08004 | 张那 | 女 | cs | 17 |
| 08006 | 刘丹丹 | 女 | ma | 17 |
| 08008 | 王江 | 男 | cs | 19 |
| 08010 | 张丽 | 女 | cs | 19 |
±------±-------±-----±------±-----+
5 rows in set
2) 查询其他系中比IS系所有学生年龄都小的学生名单
mysql> select student.* from student where sage‘is’;
±------±-------±-----±------±-----+
| sno | sname | ssex | sdept | sage |
±------±-------±-----±------±-----+
| 08004 | 张那 | 女 | cs | 17 |
| 08006 | 刘丹丹 | 女 | ma | 17 |
±------±-------±-----±------±-----+
2 rows in set
3) 查询选修了全部课程的学生姓名
mysql> select sname from student where not exists(select *from course where not exists (select *from sc where sno =student.sno and cno=course.cno));
Empty set
4) 查询计算机系学生及其性别是男的学生
mysql> select *from student where sdept='is’and ssex=‘男’;
±------±------±-----±------±-----+
| sno | sname | ssex | sdept | sage |
±------±------±-----±------±-----+
| 08005 | 刘晨 | 男 | is | 18 |
| 08009 | 高晓 | 男 | is | 20 |
±------±------±-----±------±-----+
2 rows in set
5) 查询选修课程1的学生集合和选修2号课程学生集合的差集
mysql> select sno from sc where cno =‘001’ and sno in (select sno from sc where cno<>‘002’);
±------+
| sno |
±------+
| 08003 |
| 08004 |
| 08008 |
| 08009 |
±------+
4 rows in set
6) 查询李丽同学不学的课程的课程号
mysql> select distinct cno from sc where cno not in (select cno from student,sc where student.sno=sc.sno and sname=‘李丽’);
±----+
| cno |
±----+
| 001 |
| 004 |
| 005 |
| 006 |
| 007 |
±----+
5 rows in set
7) 查询选修了3号课程的学生平均年龄
mysql> select avg(sage) from student ,sc where student.sno=sc.sno and cno=‘003’;
±----------+
| avg(sage) |
±----------+
| 18.6000 |
±----------+
1 row in set
8) 查询学号比刘晨大,而年龄比他小的学生姓名。
mysql> select *from student where sno>(select sno from student where sname=‘刘晨’) and sage <(select sage from student where sname=‘刘晨’);
±------±-------±-----±------±-----+
| sno | sname | ssex | sdept | sage |
±------±-------±-----±------±-----+
| 08006 | 刘丹丹 | 女 | ma | 17 |
±------±-------±-----±------±-----+
1 row in set
9) 求年龄大于女同学平均年龄的男同学姓名和年龄
mysql> select sname,sage from student where sage>(select avg(sage)from student where ssex=‘女’) and ssex=‘男’;
±------±-----+
| sname | sage |
±------±-----+
| 赵海 | 20 |
| 刘立 | 21 |
| 王江 | 19 |
| 高晓 | 20 |
±------±-----+
4 rows in set
10) 求年龄大于所有女同学年龄的男同学姓名和年龄
mysql> select sname,sage from student where sage>all (select sage from student where ssex=‘女’) and ssex=‘男’;
±------±-----+
| sname | sage |
±------±-----+
| 赵海 | 20 |
| 刘立 | 21 |
| 高晓 | 20 |
±------±-----+
3 rows in set
11) 查询至少选修了08002选修的全部课程的学生号码
mysql> select sno from sc where cno in(select cno from sc where sno=‘08002’)and sno<>‘08002’ group by sno having count(cno)=(select count(cno) from sc where sno =‘08002’);
±------+
| sno |
±------+
| 08001 |
| 08003 |
±------+
2 rows in set
12) 查询08001和08002两个学生都选修的课程的信息
mysql> select course.cno,cname,cpno,credit from sc,course where sc.cno=course.cno and sno=‘08001’ and sc.cno in(select cno from sc where sno=‘08002’);
±----±---------±-----±-------+
| cno | cname | cpno | credit |
±----±---------±-----±-------+
| 002 | 高等数学 | NULL | 2 |
| 003 | 信息系统 | 001 | 4 |
±----±---------±-----±-------+
2 rows in set

你可能感兴趣的:(mysql随笔,mysql)