5.1.2 连接查询
由关系代数运算可知,所谓连接就是从两个关系表的笛卡尔乘积中,选择满足一定条件元组记录。本节主要介绍等值连接(内连接)、外连接、自连接与交叉连接。
1.等值连接(内连接)查询
等值连接(内连接)是将两个表中满足等值连接条件的行组合起来,有两种语句格式。 (1)语句格式1(等值连接方式): Select <列名表> From <表1> , <表2> Where <表1>.<列名1>=<表2>.<列名2> (2)语句格式2(内连接方式): Select <列名表> From <表1> [Inner]
Join <表2> On <表1>.<列名1>=<表2>.<列名2>
从概念上讲DBMS执行等值连接操作的过程是,先在表1中找到第一个元组,然后从头开始顺序或按索引扫描表2 ,查询满足条件的元组,每找到一个元组,就将表1 中的第一个元组与该元组拼接形成新的元组。表2全部扫描完毕后,再到表1中找到第二个元组,重复上述过程,直到表1的全部元组处理完毕为止。
说明:
(1)通常情况下,表1为子表,列名1为外键,而表2为主表,列名2为主键。 (2)当列名1与列名2的名称不相同时,在Where 与On 子句中的列名前缀“表1.”与“表2.”可以省略。
(3)查询条件可使用关系运算符“>、<、>=、<=、<>”构成非等值连接查询,由于非等值查询使用较少,本书不再介绍。
(4)可对多个数据表进行等值连接查询,在查询条件中用And运算符连接两表间的等值连接表达式。
【例5-11】 在班级编码表TB03中,用两种方式查询班级名称、班级编码与系部名称。 等值连接方式: Use Xsgl
Select TB0302,TB0301,TB0602 From TB03,TB06
- 141 -
Where TB03.TB0309=TB06.TB0601
由于连接字段名不同,所以可省略表名TB03与TB06,简写如下: Select TB0302,TB0301,TB0602 From TB03,TB06 Where TB0309=TB0601 内连接方式:
Select TB0302,TB0301,TB0602 From TB03
Inner Join TB06 On TB03.TB0309=TB06.TB0601
【例5-12】在学生管理数据库Xsgl中,查询计算机系所属班级的班级名称(TB0302)、班级编码(TB0301)、专业名称(TB0402)、在校标志(TC0402)与系部名称(TB0602)。
由于班级名称(TB0302)、班级编码(TB0301)、专业名称(TB0402)、在校标志(TC0402)与系部名称(TB0602)五个字段分别属于班级编码表(TB03)、专业编码表(TB04)、毕业标志编码表(TC04)与系部编码表(TB06)四个数据表,因此,必须用三个等值表达式将四张表连接在一起。由附表中的学生班级编码表A.2可知,与学生班级编码子表中的外键TB0304(专业编码)、TB0308(毕业标志)、TB0309(系部编码)对应的父表为TB04(专业编码表)、TC04(毕业标志编码表)与TB06(系部编码表),对应主键分别为TB0401(专业编码)、TC0401(毕业标志编码)与TB0601(系部编码)。由此可写多表等值连接查询语句如下。
Use Xsgl
Select TB0302,TB0301,TB0402,TC0402,TB0602 From TB03,TB04,TC04,TB06 Where TB0304=TB0401 And
TB0308=TC0401 And TB0309=TB0601 And TB0602='计算机系' 也可用内连接方式写成:
Select TB0302,TB0301,TB0402,TC0402,TB0602 From TB03
Join TB04 On TB0304=TB0401 Join TC04 On TB0308=TC0401
- 142 -
Join TB06 On TB0309=TB0601 Where TB0602='计算机系'
【例5-13】 查询学生档案表XA01中“王”姓男生的所有信息,要求编码字段(如性别XA0106)要用汉字显示。
由附录A中表A.5学生档案表XA01可知,性别(XA0106)、民族(XA0108)、籍贯(XA0109)、政治面貌(XA0110)、班级编码(XA0114)均采用编码,若要用汉字显示就必须使用与之联系的父表中的代码名称字段。因此,在Select子句中使用GC0102、GC0202、GC0302、GC0402与TB0302字段来显示上述代码对应的汉字名称,另用A.*表示学生档案表XA01中的所有字段信息。而在From子句中应列出包含上述字段的代码表GC01、GC02、GC03、GC04与TB03,及学生档案表XA01 As A,其中A为XA01的别名。在Where子句中,6张表共要建立5个等值连接表达式,等值表达式中的所使用的外键与主键见表A.5,最后再加“王”姓“男”生两个条件表达式即可构成满足要求的查询语句。语句有两种表达方式。 (1)等值连接方式:
Select A.*,GC0102,GC0202,GC0302,GC0402,TB0302 From XA01 As A ,GC01,GC02,GC03,GC04 ,TB03 Where XA0106 = GC0101 And
XA0108 = GC0301 And XA0109 = GC0201 And XA0110=GC0401 And XA0114=TB0301 And XA0104 Like '王%' And GC0102='男'
(2)内连接方式:
Select A.*,GC0102,GC0202,GC0302,GC0402,TB0302 From XA01 As A
Join GC01 On XA0106 = GC0101 Join GC03 On XA0108 = GC0301 Join GC02 On XA0109 = GC0201 Join GC04 On XA0110=GC0401 Join TB03 On XA0114=TB0301
- 143 -
Where XA0104 Like '王%' And
GC0102='男' 2.外连接查询
外连接分为左外连接、右外连接和全外连接,左外连接对连接条件中左边的表不加限制,右外连接对连接条件中右边的表不加限制,全外连接是对两个表都不加限制,所有两个表中的行都出现在结果集中。下面依次介绍三种外连接查询的语句格式与使用方法。
(1)左外连接查询语句格式 Select 选择列表 From <表1>
Left [Outer] Join <表2> On <表1>.<列名1>=<表2>.<列名2> (2)右外连接查询语句格式 Select <选择列表> From <表1>
Right [Outer] Join <表2> On <表1>.<列名1>=<表2>.<列名2> (3)全外连接语句格式 Select 选择列表 From <表1>
Full [Outer] Join <表2> On <表1>.<列名1>=<表2>.<列名2>
【例5-14】查询班级编码表TB03中的班级名称、班级编码与系部名称,分别采用左外连接、右外连接与全外连接三种查询方式。
假设:班级表(TB03)中的第一条记录(汽车10021)中的TB0309字段为NULL值;在班级表(TB03)中没有TB0309字段为“00”(即班级所属系部为基础部)的班级存在。
(1)左外连接查询
Select TB0302,TB0301,TB0602 From TB03
Left Join TB06 On TB0309=TB0601
在执行上述语句后,由于左外连接对连接条件中左边的表TB03不加限制,但对右边的表TB06限制,所以会出现没有指定系部的班级信息,如图5-1(a)所示的第一条记录“1000221 汽车10021 NULL”。
(2)右外连接查询
- 144 -
Select TB0302,TB0301,TB0602 From TB03
Right Join TB06 On TB0309=TB0601
由于右外连接对左边的表TB03限制,但对连接条件中右边的表TB06不加限制,所以 “1000221 汽车10021 NULL”记录不显示,但会显示没有班级的系部,如图5-1(b)所示的第一条记录“NULL NULL 基础部”。
(a)左外连接
图5-1 TB03与TB06执行外连接的结果
(b)右外连接
(3)全外连接查询
Select TB0302,TB0301,TB0602 From TB03
Full Join TB06 On TB0309=TB0601
由于全外连接是对两个表TB03与TB06都不加限制,所有两个表中的行都出现在结果集中。执行上述语句后,“1000221 汽车10021 NULL”和“NULL NULL 基础部”都会显示。
通常在数据查询中,全外连接查询使用的概率较小。左外连接和右外连接可以互换,而对于究竟是采取左外连接还是右外连接编写查询语句,则是根据公司的编码规范选择其中的一种进行编写。
【例5-15】在学籍管理系统数据库Studentsys中,根据学生档案表tblStudent与成绩表tblScore查询所有学生选课成绩情况,包含没有选课学生的情况。
当学生在成绩表tblScore中没有选课记录时,用等值连接查询不会显示这些学生的成绩信息。只有用左外连接才能查询学生档案表与成绩表中所有学生的成绩记录,包含没有选课学生的情况。在这些没有选课的记录中,只有学生档案表中的学号、姓名等信息,而成绩表中课程号和成绩只能用NULL表示。这里选择左外连接查询实现。
Use Studentsys
- 145 -