连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。
连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。
- 内连接
- 等值连接
- 不等连接
- 自然连接
- 外连接
- 左连接
- 右连接
- 全连接
内连接
内连接是一种最常用的连接类型。内连接查询实际上是一种任意条件的查询。使用内连接时,如果两个表的相关字段满足连接条件,就从这两个表中提取数据并组合成新的记录,也就是在内连接查询中,只有满足条件的元组才能出现在结果关系中。
--例如:要查询每个已经选课的学生的情况,查询语句为
--等值连接
SELECT *
FROM Student INNER JOIN SC
ON S.Sno = SC.Sno
--实际使用中常常省略inner join
SELECT * FROM Student,SC WHERE S.Sno = SC.Sno
--自然连接
SELECT *
FROM Student NATURAL JOIN SC
ON S.Sno = SC.Sno
根据比较方式不同,内连接又可以分为三种:
1)等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2)不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3)自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
自连接
如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询就称为自连接查询。同一张表在FROM字句中多次出现,为了区别该表的每一次出现,需要为表定义一个别名。
自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。
--要求检索出学号为20210的学生的同班同学的信息,查询语句为
SELECT S.*
FROM S JOIN S AS S1 ON S.class = S1.class
WHERE S1.Sno='20210'
外连接
内连接的查询结果都是满足连接条件的元组。但有时我们也希望输出那些不满足连接条件的元组信息。比如,我们想知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足连接条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),这时就需要使用外连接。
外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。
注:以下例子实际使用中Outer关键字通常会省略。
1)左外连接(LEFT OUTER JOIN)
如果在连接查询中,连接管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTERJOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容。
--左外连接查询中左端表中的所有元组的信息都得到了保留。
--要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为
SELECT Sno,Sname,Class,Cno,Grade
FROM S LEFT OUTER JOIN SC
ON S.Sno = SC.Sno
2)右外连接(RIGHT OUTER JOIN)
右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中`的内容。
--右外连接查询中右端表中的所有元组的信息都得到了保留
--同上例内容,查询语句为
SELECT Sno,Sname,Class,Cno,Grade
FROM S RIGHT OUTER JOIN SC
ON S.Sno = SC.Sno
3)全外连接(FULL OUTER JOIN)
全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。
--全外连接查询中所有表中的元组信息都得到了保留。
--同左外连接例子内容,查询语句为
SELECT Sno, Sname, Class,Cno,Grade
FROM S FULL OUTER JOIN SC
ON S.Sno = SC.Sno
交叉连接
交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。(实际应用中不会使用到)
--如果希望得到学生表和选课表两个关系模式的笛卡尔乘积,查询语句为
SELECT*
FROM S CROSS JOIN SC
参考资料:
http://www.cnblogs.com/still-windows7/archive/2012/10/22/2734613.html(适合快速入门)
https://baike.baidu.com/item/%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2/3450616?fr=aladdin