数据库7之连接查询

连接查询,涉及两个或两个以上的表。这种查询是关系数据库中最主要的查询。

连接查询的两种表示形式:

一、用连接谓词

(1)连接谓词“=”

在select语句的where子句中使用比较运算符对多个表进行连接。

比较运算符在我的文章“数据库6之单表查询”中有写到,此处只讲最常用的连接谓词“=”

当比较运算符为“=”的时候,也被称为等值连接。


注意:等值连接只要有等值的条件,不需要列的属性相同。

属性:数据类型、存放的数据等

数据库7之连接查询_第1张图片

---->自然连接

这是一种特殊的等值连接。它要求两个列必须有相同的属性,而且要把重复的列属性去掉。而等值连接不会去掉重复的属性列。

此连接暂时不作详解,等以后遇到再更新。

(2)连接谓词between…and…

当我们选择的几个表中有重复列(重复列:表a中有sno列,表b中也有sno列)时,一定要显示指出该列属于哪个表。

语法:表.列。例如:treader.ReaderID表示该列ReaderID是treader表中的,不是tlend表中的。

数据库7之连接查询_第2张图片

二、关键字join

有的时候我们使用连接谓词不一定能满足所有的需求。比如下面这个例子

数据库7之连接查询_第3张图片

我们想要通过连接s表和sc表来获得该学生选修的课程以及成绩。

如果我们采用等值连接(s.学号=sc.学号),结果将会是这样子的:

为了得到完整的结果,我们可以使用join关键字指定连接的表示方式,这样,表的连接运算能力就有了增强。

格式:

数据库7之连接查询_第4张图片

on用于指定连接的条件,后面仍然可以加where子句。

1.[inner]join(内连接):如果表中有一个匹配就返回一行记录,没有匹配的就不返回。默认为inner(内连接)

数据库7之连接查询_第5张图片

2.left[outer]join(左连接):即使右表中没有相匹配的,也会返回左表所有的行。返回行的时候,如果B表中没有与之匹配的值,就用null取代。

数据库7之连接查询_第6张图片

数据库7之连接查询_第7张图片

3.right[outer]join(右连接):即使左表中没有相匹配的,也从右表中返回所有的行

结果的表中除了包括满足连接条件的行之外,还包括右表中的所有行。

数据库7之连接查询_第8张图片

4.full[outer]join(全连接):只要其中一个表中存在匹配就会返回两个表的所有行

除了包括满足条件的行之外,还包括两个表中的所有行。

注意:full outer join产生A和B的并集,但是对于没有匹配的记录,就会以null作为空值

数据库7之连接查询_第9张图片

数据库7之连接查询_第10张图片

5.cross join(交叉连接):笛卡尔积。是所有内连接的基础,返回两个集合的笛卡尔积,最终的结果集中的数据行数就是第一个表中符合查询条件的数据乘以第二个表中符合查询条件的数据行数。(实际意义不太大)

数据库7之连接查询_第11张图片

三、一种特殊的连接--------------自连接

数据库7之连接查询_第12张图片

问题:如果先查询和学号“131101”同一个系的所有学生的姓名,该怎么操作呢?

分析:首先找到学号为“131101”的学生所在的系,为“计算机”。然后再通过系名“计算机”找到所有的学生的姓名。

这个时候,只有一个xs表显然不够用,必须找到另外一个含有系名和姓名的表与xs表连接,才能通过系名“计算机”准确无误地找到和学号为“131101”相同系的所有的学生的姓名。我们发现,xs表中就包括了我们需要的这两个列,所以,我们把xs表和自身(xs表)连接起来,就产生了自连接。

概念:将一个表和它自身连接,这种连接称为自连接。

注意:使用自连接的时候,一定要给表指定两个别名,并且,对所有列的引用都要用别名限定,因为两个表的结构一模一样,不能区分你写的列是哪个表里面的。

数据库7之连接查询_第13张图片






你可能感兴趣的:(数据库)