MySQL语言(多表查询---连接查询,嵌套查询,集合查询)
0.学习前言
多表查询是最为实用的部分,值得好好学习掌握,一起加油鸭!
1.连接查询
1.1等值连接查询
等值连接:连接运算符为=
[例] 查询每个学生及其选修课程的情况
SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno;
自然连接:把重复的列去掉
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno = SC.Sno;
1.2自身连接
自身连接:一个表与其自己进行连接,需要给表起别名以示区别,由于所有属性名都是同名属性,因此必须使用别名前缀。
[例] 查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno;
1.3外连接
外连接与普通连接的区别:
普通连接操作只输出满足连接条件的元组。外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。
SELECT * FROM Course FIRST RIGHT JOIN Course SECOND ON (FIRST.Cpno=SECOND.Cno);
A left join B: 是以A表的记录为基础的,A的每一条记录依次和B连接,A的记录将会全部表示出来,而B只会显示符合连接条件的记录.
A right join B: 是以B表的记录为基础的,B的每一条记录依次和A连接,B的记录将会全部表示出来,而A只会显示符合连接条件的记录
1.4复合条件连接
复合条件连接:WHERE子句中含多个连接条件
例: 查询选修2号课程且成绩在90分以上的所有学生的学号和姓名
SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND Cno= ‘2’ AND Grade > 90;
2.嵌套查询
2.1嵌套查询概述
一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
子查询不能使用ORDER BY子句,有些嵌套查询可以用连接运算替代。
可分为相关子查询和不相关子查询
相关子查询:子查询的查询条件依赖于父查询
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表。然后再取外层表的下一个元组。重复这一过程,直至外层表全部检查完为止。
2.2带有IN谓词的子查询
[例] 查询与“刘三姐”在同一个系学习的学生。
思路:首先找到刘三姐所在的系,然后找到这个系里所有的学生。
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN
(SELECT Sdept FROM Student WHERE Sname= ‘ 刘三姐 ’);
此查询为不相关子查询。
三重嵌套例子:
上例也可以用连接查询实现:
SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno
AND SC.Cno=Course.Cno
AND Course.Cname='DB_DESIGN';
2.3带有比较运算符的子查询
当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。
与ANY或ALL谓词配合使用
这是一个相关子查询。
2.4带有ANY(SOME)或ALL谓词的子查询
谓词语义
ANY:任意一个值(只要有一个值)
ALL:所有值
上例还可以用聚集函数实现:思路是只要比最大的那个小就满足条件了。<>表示不等于。
SELECT Sname,Sage
FROM Student
WHERE
Sage < (SELECT MAX(Sage)
FROM Student
WHERE Sdept= ‘CS ')
AND Sdept <> ' CS ’;
2.5带有EXISTS谓词的子查询
EXISTS谓词 是存在量词
∃
\exist
∃
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
若内层查询结果非空,则外层的WHERE子句返回真值
若内层查询结果为空,则外层的WHERE子句返回假值
由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
[例] 查询所有选修了1号课程的学生姓名。
用嵌套查询
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT * FROM SC
WHERE Sno=Student.Sno AND Cno= ' 1 ');
用连接查询
SELECT Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND SC.Cno= '1';
由于SQL语言中没有全称量词
∀
\forall
∀,可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:没有一个不
3.集合查询
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
集合操作的种类:
并操作UNION
交集
差
笛卡尔积