1
数据库技术及应用
1.8.3.1 5.3.1 多表查询
5.3.1 多表查询

用多个表中的数据来组合,再从中获取所需要的数据信息即是多表查询。多表查询实际上是通过各个表之间共同列的相关性来查询数据的,是数据库查询最主要的特征。多表查询首先要在各个表之间建立连接。下面就来介绍如何连接多个表进行查询操作。

1.内连接

当一个查询请求涉及数据库的多个表时,必须用一定的连接条件或连接谓词将这些表连接起来,才能提供用户需要的信息。

1)连接谓词的格式

连接谓词的一般格式为:

其中,比较运算符主要有=、>、<、>=、<=和!=。

注意:连接谓词还可以使用下面的格式:

其中,连接谓词中的各连接字段类型必须是可比的,但不必是相同的。

例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,因为两者都是数值型,因此是可比的。但若一个是字符型,另一个是整型,就不行了,因为两者是不可比的。

●等值连接:即为使用比较运算符等号(=)运算符的连接。

●非等值连接:即为使用比较运算符除等号(=)之外的其他运算符的连接。

2)连接操作的执行过程

对于等值连接,通过例5-22来介绍其执行过程。

【例5-22】在Student_info和SC表中,查询每个学生及其成绩的情况。

(1)启动MicrosofT-SQL Server Management Studio。

(2)单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(3)在查询编辑窗口中输入如下T-SQL代码:

(4)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图524所示。

图5-24 使用等值连接查询

对于非等值连接,通过例5-23来介绍其执行过程。

【例5-23】在Student_info和SC表中,查询所有成绩在90分以上的学生情况。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图525所示。

图5-25 使用非等值连接查询

2.自连接

连接操作不仅可以在两个表之间进行,也可以在一个表与其自身之间进行,这种连接称为自连接。

【例5-24】查询Student_info表中,地址是“广东省”或者“贵州省”的学生情况,输出结果按地址的升序排列。

(1)启动MicrosofT-SQL Server Management Studio,执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图526所示。

图5-26 使用自连接查询

3.外连接

当至少有一个同属于两个表的行符合连接条件时,内连接才返回行。内连接可以消除与另一个表的任何行不匹配的行,而外连接会返回FROM子句中提到的至少一个表或视图中的所有符合任何搜索条件的行。在外连接中,参与连接的表有主从之分,主表中的每行数据去匹配从表中的数据行,如果符合连接条件,则直接返回到查询结果中;如果主表中的行在从表中没有找到匹配的行,在内连接中将丢弃不匹配的行。与内连接不同的是,在外连接中主表的行仍然保留,并且返回到查询结果中,相应的从表中的行中被填上空值后也返回到查询结果中。

外连接返回所有匹配的行和一定的不匹配的行,这主要取决于建立的外连接类型,外连接类型可以分为3种类型。

●左外连接:返回所有匹配的行,并从关键字JOIN左边的表中返回所有不匹配的行。

●右外连接:返回所有匹配的行,并从关键字JOIN右边的表中返回所有不匹配的行。

●完全连接:返回两个表中所有匹配的行和不匹配的行。

1)左外连接

在左外连接的SELECT语句中,使用LEFTOUTERJOIN关键字对两个表进行连接。左外连接的查询结果中包含指定左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有找到匹配的行,则结果集中的右表的相对应的位置为NULL。

【例5-25】查询每个学生的课程编号及成绩。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图527所示。

2)右外连接

在右外连接的SELECT语句中,使用RIGHTOUTERJOIN关键字对两个表进行连接。右外连接是左外连接的反向连接,只是在查询结果集中包括的是指定右表的所有行。如果右表的某行在左表中没有找到匹配的行,则结果集中的左表的相对应位置为NULL。

【例5-26】查询SC表中所有成绩对应每个学生的学号及姓名。

(1)启动MicrosofT-SQL Server Management Studio,执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

图5-27 使用左外连接查询

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图528所示。

图5-28 使用右外连接查询

3)完全连接

完全连接的SELECT语句使用FULLOUTERJOIN关键字对两个表进行连接。这种连接方式返回左表和右表中的所有行。当某行在一个表中没有匹配的行时,则另一个表与之相对应列的值为NULL。如果表之间有匹配的行,则整个结果集包含表的数据值。

【例5-27】查询Course_info表中已经开设的课程及对应每个学生的学号及成绩等。

(1)启动MicrosofT-SQL Server Management Studio,执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)执行以上T-SQL代码命令,查看结果,如图5-29所示。

图5-29 使用完全连接查询

4.复合条件连接

以上连接查询中,WHERE子句只有一个条件,如果WHERE子句中有多个条件的连接操作,则称为复合条件连接。

注意:在连接操作中除了可以是两个表连接、一个表与其自身连接外,还可以是多表连接。

【例5-28】查询每个学生选修的课程名及其成绩。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图530所示。

图5-30 使用复合条件连接查询