关联查询是两个(两个以上)的关系进行连接查询。很多人感觉单个关系查询很简单,但关联查询很复杂,实际上关联查询处理过程分两步,首先是将多个关系通过等值连接转换为单个关系,然后再对新生成的单个关系进行查询。
关系操作结果还是关系
需要理解关系的操作的结果还是关系,即通过连接、选择、投影、除、交、叉、并等操作得到是一个新的关系。
查询语句的执行过程
每一步都是对新关系的选择、投影等操作
1.通过等值连接(左连接或右连接)形成一个新的关系A;
2.执行where子句的选择条件,做行操作,得到新关系B;
3. 执行分组语句,进行聚集运算,得到新关系C;
4. 通过having对得到的元祖再次进行行操作,得到新关系D;
5. 对关系D做投影操作,选择目标列;
6. 根据order by完成排序输出;
注:from(join)后为准确的说是关系,而不是表或视图
select s.Sno,s.Sname,a.Cname
from S left join (select Sno,Cname from SC,C where c.Cno=SC.Cno ) a
on (s.Sno = a.Sno)
即:left join后 (select Sno,Cname from SC,C where c.Cno=SC.Cno )是一个新的关系
关系的连接(等值)
关联查询的核心是通过关系的连接将多个关系转换为一个关系,再复杂的连接都转换为经过多次的简单两个关系连接得到
1. 连接
- 在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组
- 表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组
- 重复上述操作,直到表1中的全部元组都处理完毕
例:两个关系S和SC做等值连接
得到新关系
左外连接(右外连接)
做等值连接时,如果没有匹配的记录,则将左(右)边元祖取出,右(左)边关系的值置空;
如: FROM student LEFT JOIN sc ON A.SNO = B.SNO ,得到新关系 - 选择
对连接后形成的新关系B做选择操作得到新的关系C,如:没有分组查询或排序,执行投影操作。 - 分组查询
如果有分组查询,则在新关系C的基础上做分组查询得到新的关系D,如果显示所有对分组的结果,如果还需要对分组的结果进行选择,则使用having+选择条件生成新关系E;若没有排序,在关系D或E上做投影操作。 - 排序
对最后形成的新关系进行排序
5.投影
输出查询结果