1、第8章 关系数据库的结构化查询语言SQL -多表连接查询 多表连接查询8.2 UNION合并查询8.3 嵌套查询8.4单表查询8.1一、多表连接查询一、多表连接查询1、传统连接方式、传统连接方式Select 学号,课程名学号,课程名From 选修表选修表,课程表课程表Where 选修表选修表.课程号课程号=课程表课程表.课程号课程号选修表选修表课程表课程表2、SQL的连接方式的连接方式JOIN连接(基本原理)连接(基本原理)JOIN的意义是将的意义是将多个数据表多个数据表的记录的记录横向横向连接起来,连接起来,然后利用然后利用ON来设置条件以过滤不需要的记录。例来设置条件以过滤不需要的记录。例
2、如:将下面的两个简单的表如:将下面的两个简单的表JOIN的结果为:的结果为:选修表选修表课程表课程表Select 学号,学号,课程名课程名,成绩,成绩 From 课程表课程表 JION 选修表选修表 On 课程表课程表.课程号课程号=选修表选修表.课程号课程号 生成后的表生成后的表在新的在新的SQL标准中规定了专门的连接语句格式标准中规定了专门的连接语句格式:Select From join join 关系关系3ononon Where 注意注意:join的顺序和的顺序和on的顺序是逆着的的顺序是逆着的.2、JOIN的类型:的类型:inner、left、right、full 和和Cross可以
3、使用可以使用JOIN参数将那些数据表结合在一起,依据不用参数将那些数据表结合在一起,依据不用的查询目的,的查询目的,JOIN的方式可分为多种类型:的方式可分为多种类型:inner JOIN:只显示符合条件的数据行,此为默认的:只显示符合条件的数据行,此为默认的JOIN方式,因此,方式,因此,INNER参数可以省略。参数可以省略。LEFT JOIN:显示符合条件的数据行,以及左边数据:显示符合条件的数据行,以及左边数据表中不符合条件的数据行(此时右边数据行会以表中不符合条件的数据行(此时右边数据行会以NULL来显示)来显示)RIGHT JOIN:显示符合条件的数据行,以及右边数据:显示符合条件的
4、数据行,以及右边数据表中不符合条件的数据行(此时左边数据行会以表中不符合条件的数据行(此时左边数据行会以NULL来显示)来显示)FULL JOIN:显示符合条件的数据行,以及左边和右边:显示符合条件的数据行,以及左边和右边数据表中不符合条件的数据行(此时缺乏数据的数据行数据表中不符合条件的数据行(此时缺乏数据的数据行会以会以NULL来显示)来显示)CROSS JOIN:此类型会直接将一个数据表的每一条数:此类型会直接将一个数据表的每一条数据行和另一个数据表的每一条数据行搭配成新的数据行,据行和另一个数据表的每一条数据行搭配成新的数据行,不需要用不需要用ON来设置条件来设置条件(表表3就是通过这
5、种方式由表就是通过这种方式由表1和表和表2产生的产生的)。选修表选修表课程表课程表Select 课程名课程名,学号学号 From 课程表课程表 left JoiN 选修表选修表On 课程课程.课程号课程号=选修选修.课程号课程号 选修表选修表学生表学生表Select 姓名姓名,课程号课程号 From 选修选修right JoiN 学生学生On 选修选修.学号学号=学生学生.学号学号 选修表选修表学生表学生表Select 姓名姓名,课程号课程号 From 选修选修cross JoiN studentOn 选修选修.学号学号=student.学号学号 三、UNION合并UNION可将多个可将多个S
6、ELECT语句的查询结果合并成一组。语句的查询结果合并成一组。从图中我们能够看出从图中我们能够看出UNION是将多个查询结果做上是将多个查询结果做上下下垂直合并垂直合并,所以字段数不会增加,而,所以字段数不会增加,而JOIN做的是做的是左右水平合并左右水平合并。UNION合并很简单:但必须符合下列条件:合并很简单:但必须符合下列条件:欲合并的查询结果,其欲合并的查询结果,其字段数字段数必须必须相同相同;欲合并的查询结果,其对应的字段一定要具备兼容欲合并的查询结果,其对应的字段一定要具备兼容的的数据类型数据类型,即数据类型可以不同,但两者必须能,即数据类型可以不同,但两者必须能够相互转换够相互转
7、换合并后的结果:合并后的结果:合并结果的字段名称会以第一个查询结果合并结果的字段名称会以第一个查询结果 字段名称字段名称为名,其他查询结果的字段则会被忽略。为名,其他查询结果的字段则会被忽略。合并时,若对应的字段具备不同的数据类型,则会进合并时,若对应的字段具备不同的数据类型,则会进行兼容性类型转换,转换原则是可容纳较多数据的类行兼容性类型转换,转换原则是可容纳较多数据的类型为主。假设乙列是型为主。假设乙列是CHAR(10)类型,丁列是)类型,丁列是CHAR(20)类型,则合并后的乙列是)类型,则合并后的乙列是CHAR(20)类型。类型。例如有2个数据表分别从员工及客户这两个数据表中查询员工及
8、客户分别从员工及客户这两个数据表中查询员工及客户的姓名和地址,然后将这两个查询结果合并成一分的姓名和地址,然后将这两个查询结果合并成一分 Select 姓名 as 邀请名单,地址 From 员工 UNION Select 联络人,地址 From 客户 Order by 姓名GROUP BY 和和HAVING子句只能用在个别子句只能用在个别Select_statemen中,不可用在整个语句的最后。中,不可用在整个语句的最后。ORDER BY 及子句则只能用在整个语句及子句则只能用在整个语句的最后的最后,针对最后的合并结果做排序或计算,不能针对最后的合并结果做排序或计算,不能用在个别用在个别Sel
9、ect_statemen中。中。ALL:如果设置:如果设置ALL参数,最后的合并结果会将重参数,最后的合并结果会将重复的记录都显示出来。如果不设置复的记录都显示出来。如果不设置ALL参数,则在参数,则在合并中,重复的记录将只会显示一笔。合并中,重复的记录将只会显示一笔。UNION的语法:的语法:Select_statemen UNIONselect_statemen UNION select_statemen order by四、嵌套查询四、嵌套查询-子查询子查询子查询是指包含在主要查询中的另一个子查询是指包含在主要查询中的另一个SELECT查查询。通常会利用子查询先挑选出部分数据,以作为询。
10、通常会利用子查询先挑选出部分数据,以作为主要查询的数据来源或选取条件子查询的语法与范主要查询的数据来源或选取条件子查询的语法与范例子查询的语法和例子查询的语法和select语句一样,但有下列限语句一样,但有下列限制:制:整个子查询语句需用小括号括住整个子查询语句需用小括号括住select 姓名姓名 from 学生表学生表where 学号学号 in(select 学号学号 from 选修选修 where 课程号课程号=ww01)查询选修了查询选修了课程号课程号是是ww01课程的学生课程的学生姓名姓名子查询的类型与处理方式:子查询的类型与处理方式:子查询的返回结果可分三种类型,单一值,单列子查询的
11、返回结果可分三种类型,单一值,单列多行数据和不限列数的多条数据,而用来处理子查多行数据和不限列数的多条数据,而用来处理子查询的返回结果的方法也分询的返回结果的方法也分3种:种:方法一:直接取值:直接使用子查询的返回值,例方法一:直接取值:直接使用子查询的返回值,例如如=、做比较或进行其他运算。、做比较或进行其他运算。方法二:比较清单:使用方法二:比较清单:使用in、all运算符判断某个值运算符判断某个值是是否存在于返回清单中否存在于返回清单中.方法三:测试存在,使用方法三:测试存在,使用exists运算符判断是否返运算符判断是否返回回数据。数据。select 学号学号 from 选修表选修表w
12、here 成绩成绩=(select max(成绩成绩)from 选修表选修表where 课程号课程号=ww01)查询查询WW01课程课程的最高分学生的学的最高分学生的学号号select 学号学号 from 选修表选修表where 成绩成绩=all(select 成绩成绩 from 选修选修表表where 课程号课程号=ww01)select 学号学号 from 选修表选修表where 成绩成绩=(select min(成绩成绩)from 选修表选修表where 课程号课程号=ww01)查询查询WW01课程课程的最低分学生的学的最低分学生的学号号select 学号学号 from 选修表选修表where 成绩成绩any(select 成绩成绩 from 选修选修表表where 课程号课程号=ww01)供应表供应表职工表职工表仓库表仓库表 订购单表订购单表 例例1、查询所有职工的工资都多于、查询所有职工的工资都多于1210元的仓库信息。元的仓库信息。例例2、查询供应商为华通电子的订单单号。、查询供应商为华通电子的订单单号。例例3、检索有职工的工资大于或等于、检索有职工的工资大于或等于WH1仓库中所有职仓库中所有职工的工资的仓库号。工的工资的仓库号。例例4、检索哪些仓库中至少已经有一个职工的仓库的信息。、检索哪些仓库中至少已经有一个职工的仓库的信息。