Alex_McAvoy

想要成为渔夫的猎手

SQL 连接查询

【连接查询】

前面的查询都是针对一个表进行的,当一个查询同时涉及到两个及以上的表时,称为连接查询,关于连接的关系代数的概念,在 关系代数 中介绍过

而连接查询是关系数据库中最主要的查询,包括:等值与非等值连接查询、自然连接查询、自身连接查询、外连接查询、多表连接查询、复合连接查询

WHERE 子句用于连接两个表的条件称为连接条件连接谓词,其一般格式为

1
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>

其中,<比较运算符> 即连接谓词,主要有:=><>=<=!=<>

除上述形式外,也可以使用 BETWEEN...AND... 作为连接谓词

1
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>

连接谓词中的列名称为连接字段,连接条件中的各连接字段类型必须是可比的,但名称不必相同

【连接操作执行过程】

嵌套循环法

嵌套循环法是最常用的一种方法,其执行过程如下

首先在表 1 中找到第一个元组,然后从头开始扫描表 2,逐一查找满足连接条件的元组,找到后就将表 1 中的第一个元组与该元组拼接起来,形成结果表中的一个元组

当表 2 全部查找完后,再找表 1 中的第二个元组,然后再从头开始扫描表 2,逐一查找满足连接条件的元组,找到后就将表 1 中的第一个元组与该元组拼接起来,形成结果表中的一个元组

重复上述操作,直到表 1 中的全部元组都处理完毕

排序合并法

排序合并法常用于等值连接,其执行过程如下

首先按照连接属性对表 1 和表 2 进行排序,然后再开始扫描

对表 1 的第一个元组,从头开始扫描表 2,顺序查找满足连接条件的元组,找到后就将表 1 中的第一个元组与该元组拼接起来,形成结果表中的一个元组,当遇到表 2 中第一条大于表 1 连接字段值的元组时,对表 2 的查询就不再继续

再找到表 1 的第二条元组,然后从刚才的中断点处继续顺序扫描表 2,查找满足连接条件的元组,找到后就将表 1 中的第一个元组与该元组拼接起来,形成结果表中的一个元组,当遇到表 2 中大于表 1 连接字段值的元组时,对表 2 的查询就不再继续

重复上述操作,直到表 1 或表 2 中的全部元组都处理完毕为止

索引连接法

索引连接法一般需要建立索引,其执行过程如下

首先对表 2 按连接字段建立索引

然后对表 1 中的每个元组,依次根据其连接字段值查询表 2 的索引,从中找到满足条件的元组,找到后就将表 1 中的第一个元组与该元组拼接起来,形成结果表中一个元组

【等值与非等值连接查询】

当连接谓词为 = 时,称为等值连接,使用其他运算符称为非等值连接

例如,使用等值连接查询每个学生及其选修课程的情况

【自然连接查询】

若在等值连接中,将目标列中重复的属性去掉,则称为自然连接

例如,使用自然连接查询每个学生及其选修课程的情况

【自身连接查询】

自身连接是一个表与其自己进行连接,由于所有属性名都是同名属性,因此必须需要给表起别名作为前缀以示区别

例如,查询每一门课的先修课的先修课

【外连接查询】

在常规的连接查询中,只有满足连接条件的元组才会被输出

外连接以指定表为连接主体,将主体表中不满足连接条件的元组一并输出,对于这些不满足连接条件的元组,将会根据需要填充上空值 NULL 作为悬浮元组,进行外连接(列出关系中的所有元组)、左外连接(列出左边关系中的所有元组)、右外连接(列出右边关系中的所有元组)

其语法如下

1
2
3
4
5
6
7
8
/*外连接*/
<表名1> JOIN <表名2> ON([<表名1>.]<列名1> <比较运算符> [<表名2.]<列名2>)

/*左外连接*/
<表名1> LEFT JOIN <表名2> ON([<表名1>.]<列名1> <比较运算符> [<表名2.]<列名2>)

/*右外连接*/
<表名1> RIGHT JOIN <表名2> ON([<表名1>.]<列名1> <比较运算符> [<表名2.]<列名2>)

例如,分别使用外连接、左外连接、右外连接查询每个课程与选修关系的情况

外连接

左外连接

右外连接

【复合条件连接查询】

复合条件连接查询是指 WHERE 子句中含有多个利用 ANDOR 短语连接的连接条件

例如,查询选修 1 号课程且成绩在 60 分以上的学生学号、姓名、成绩

【多表连接查询】

连接操作一般是两表连接,但可以将两个以上的表进行连接,后者称为多表连接

例如,查询每个学生的学号、姓名、选修课程名、成绩

感谢您对我的支持,让我继续努力分享有用的技术与知识点!