思维导图

表格数据准备
SC表
| Sno |
Cno |
Grade |
| 200215121 |
1 |
92 |
| 200215121 |
2 |
54 |
| 200215121 |
3 |
88 |
| 200215122 |
2 |
57 |
| 200215122 |
3 |
80 |
Student表
| Sno |
Sname |
Ssex |
Sage |
Sdept |
| 200215121 |
李勇 |
男 |
20 |
CS |
| 200215122 |
刘晨 |
女 |
19 |
CS |
| 200215123 |
王敏 |
女 |
23 |
MA |
| 200215125 |
张立 |
男 |
19 |
IS |
| 200215126 |
张红 |
女 |
19 |
CS |
Course表
| Cno |
Cname |
Cpno |
Ccredit |
| 1 |
数据库 |
5 |
4 |
| 2 |
数学 |
NULL |
4 |
| 3 |
信息系统 |
1 |
4 |
| 4 |
操作系统 |
6 |
3 |
| 5 |
数据结构 |
7 |
4 |
| 6 |
数据处理 |
NULL |
2 |
| 7 |
PASCAL语言 |
6 |
2 |
| 8 |
Visual_Basic |
NULL |
4 |
代码测试
聚集函数、GROUP BY、HAVING
- GROUP BY子句将查询结果按一列或多列的值分组,值相等的为一组
- 对查询结果分组的目的是为了细化聚集函数的作用对象
- 分组后聚集函数将作用与每一个组,既每一个组都有一个函数值。
SELECT Cno,COUNT(Sno) 选课人数 from SC GROUP BY Cno;
SELECT Sno FROM SC GROUP BY Sno HAVING Count(*)>=3;
SELECT Sno,AVG(Grade) 平均分 FROM SC GROUP BY Sno HAVING AVG(Grade)>55;
| Sno |
平均分 |
| 200215121 |
78 |
| 200215122 |
68 |
连接查询
等值连接
SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno;
| Sno |
Sname |
Ssex |
Sage |
Sdept |
Sno |
Cno |
Grade |
| 200215121 |
李勇 |
男 |
20 |
CS |
200215121 |
1 |
92 |
| 200215121 |
李勇 |
男 |
20 |
CS |
200215121 |
2 |
54 |
| 200215121 |
李勇 |
男 |
20 |
CS |
200215121 |
3 |
88 |
| 200215122 |
刘晨 |
女 |
19 |
CS |
200215122 |
2 |
57 |
| 200215122 |
刘晨 |
女 |
19 |
CS |
200215122 |
3 |
80 |
自然连接
SELECT Student.*,SC.Cno,SC.Grade FROM Student,SC WHERE Student.Sno=SC.Sno;
| Sno |
Sname |
Ssex |
Sage |
Sdept |
Cno |
Grade |
| 200215121 |
李勇 |
男 |
20 |
CS |
1 |
92 |
| 200215121 |
李勇 |
男 |
20 |
CS |
2 |
54 |
| 200215121 |
李勇 |
男 |
20 |
CS |
3 |
88 |
| 200215122 |
刘晨 |
女 |
19 |
CS |
2 |
57 |
| 200215122 |
刘晨 |
女 |
19 |
CS |
3 |
80 |
外连接
SELECT Student.*,SC.Cno,SC.Grade FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
| Sno |
Sname |
Ssex |
Sage |
Sdept |
Cno |
Grade |
| 200215121 |
李勇 |
男 |
20 |
CS |
1 |
92 |
| 200215121 |
李勇 |
男 |
20 |
CS |
2 |
54 |
| 200215121 |
李勇 |
男 |
20 |
CS |
3 |
88 |
| 200215122 |
刘晨 |
女 |
19 |
CS |
2 |
57 |
| 200215122 |
刘晨 |
女 |
19 |
CS |
3 |
80 |
| 200215123 |
王敏 |
女 |
23 |
MA |
NULL |
NULL |
| 200215125 |
张立 |
男 |
19 |
IS |
NULL |
NULL |
| 200215126 |
张红 |
女 |
19 |
CS |
NULL |
NULL |
多表连接
SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
| Sno |
Sname |
Cname |
Grade |
| 200215121 |
李勇 |
数据库 |
92 |
| 200215121 |
李勇 |
数学 |
54 |
| 200215121 |
李勇 |
信息系统 |
88 |
| 200215122 |
刘晨 |
数学 |
57 |
| 200215122 |
刘晨 |
信息系统 |
80 |
嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE的语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query)
SELECT Sname FROM Student WHERE Sno IN(SELECT Sno FROM SC WHERE Cno='2');
先执行内查询SELECT Sno FROM SC WHERE Cno='2'找到选修了二号课程的学生
在通过内查询的结果执行SELECT Sname FROM Student WHERE Sno IN(内查询结果),查询选修了二号课程学生的姓名
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname='刘晨');
先执行内查询SELECT Sdept FROM Student WHERE Sname='刘晨'找到刘晨的系别
再执行外查询SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN(内查询结果),查询再Student表中系别和刘晨系别一样的同学学号,姓名,系别
| Sno |
Sname |
Sdept |
| 200215121 |
李勇 |
CS |
| 200215122 |
刘晨 |
CS |
| 200215126 |
张红 |
CS |
SELECT Sno,Sname FROM Student WHERE Sno IN(SELECT Sno FROM SC WHERE Cno IN(SELECT Cno FROM Course WHERE Cname='信息系统'));
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept=(SELECT Sdept FROM Student WHERE Sname='刘晨');
| Sno |
Sname |
Sdept |
| 200215121 |
李勇 |
CS |
| 200215122 |
刘晨 |
CS |
| 200215126 |
张红 |
CS |
SELECT Sno,Cno FROM SC x WHERE Grade>=(SELECT AVG(Grade) FROM SC y WHERE Y.Sno=x.Sno);
| Sno |
Cno |
| 200215121 |
1 |
| 200215121 |
3 |
| 200215122 |
3 |
SELECT Sname,Sage FROM Student WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept<>'CS';
SELECT Sname,Sage FROM Student WHERE Sage<(SELECT MAX(Sage)FROM Student WHERE Sdept='CS') AND Sdept <>'CS';
SELECT Sname,Sage FROM Student WHERE Sage<(SELECT MIN(Sage)FROM Student WHERE Sdept='CS')AND Sdept<>'CS';
SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1');
SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1');
EXISTS量词待理解
集合查询
集合查询包括并操作UNION、交操作INTERSECT和差操作EXCEPT
SELECT * FROM Student WHERE Sdept='CS' UNION SELECT * FROM Student WHERE Sage<=19;
SELECT * FROM Student WHERE Sdept='CS' OR Sage<=19;
| Sno |
Sname |
Ssex |
Sage |
Sdept |
| 200215121 |
李勇 |
男 |
20 |
CS |
| 200215122 |
刘晨 |
女 |
19 |
CS |
| 200215125 |
张立 |
男 |
19 |
IS |
| 200215126 |
张红 |
女 |
19 |
CS |
SELECT Sno FROM SC WHERE Cno='1' UNION SELECT Sno FROM SC WHERE Cno='2';
SELECT * FROM Student WHERE Sdept='CS' INTERSECT SELECT * FROM Student WHERE Sage<=19;
SELECT * FROM Student WHERE Sdept='CS' AND Sage<=19;
| Sno |
Sname |
Ssex |
Sage |
Sdept |
| 200215122 |
刘晨 |
女 |
19 |
CS |
| 200215126 |
张红 |
女 |
19 |
CS |
SELECT Sno FROM SC WHERE Cno='1' INTERSECT SELECT Sno FROM SC Where Cno='2';
SELECT Sno FROM SC WHERE Cno='1' AND Sno IN(SELECT Sno FROM SC WHERE Cno='2');
SELECT * FROM Student WHERE Sdept='CS' EXCEPT SELECT * FROM Student WHERE Sage<=19;
SELECT * FROM Student WHERE Sdept='CS' AND Sage>19;
| Sno |
Sname |
Ssex |
Sage |
Sdept |
| 200215121 |
李勇 |
男 |
20 |
CS |
数据库系统概论(第五版) 王珊 萨师煊
侵权必删