数据库多表链接查询的实现方式

数据库多表链接查询的实现方式

  链接查询是关系数据库中最主要的查询,主要包括自链接内链接外链接交叉链接。经过链接运算符能够实现多个表查询。链接是关系数据库模型的主要特色,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表创建时各数据之间的关系没必要肯定,常把一个实体的全部信息存放在一个表中。当检索数据时,经过链接操做查询出存放在多个表中的不一样实体的信息。链接操做给用户带来很大的灵活性,他们能够在任什么时候候增长新的数据类型。为不一样实体建立新的表,而后经过链接进行查询。

  内链接的链接查询结果集中仅包含知足条件的行,内链接是SQL Server缺省的链接方式,能够把INNERJOIN简写成JOIN,根据所使用的比较方式不一样,内链接又分为等值链接、天然链接和不等链接三种;交叉链接的链接查询结果集中包含两个表中全部行的组合;外链接的链接查询结果集中既包含那些知足条件的行,还包含其中某个表的所有行,有3种形式的外链接:左外链接、右外链接、全外链接。

1、交叉链接

  交叉链接即笛卡儿乘积,是指两个关系中全部元组的任意组合。通常状况下,交叉查询是没有实际意义的。

    例如:若是但愿获得学生表和选课表两个关系模式的乘积,查询语句为

      SELECT *

      FROM学生表CROSS JOIN选课表

2、内链接

  内链接是一种最经常使用的链接类型。内链接查询其实是一种任意条件的查询。使用内链接时,若是两个表的相关字段知足链接条件,就从这两个表中提取数据并组合成新的记录,也就是在内链接查询中,只有知足条件的元组才能出如今结果关系中。

    例如:要查询每一个已经选课的学生的状况,查询语句为

      SELECT*

      FROM学生表INNER JOIN选课表ON学生表.学号=选课表.学号

分类:

根据比较方式分为:

1)等值链接:在链接条件中使用等于号(=)运算符比较被链接列的列值,其查询结果中列出被链接表中的全部列,包括其中的重复列。

2)不等链接:在链接条件使用除等于运算符之外的其它比较运算符比较被链接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

3)天然链接:在链接条件中使用等于(=)运算符比较被链接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除链接表中的重复列。

 

3、自链接

  若是在一个链接查询中,涉及到的两个表都是同一个表,这种查询就称为自链接查询。同一张表在FROM字句中屡次出现,为了区别该表的每一次出现,须要为表定义一个别名。自链接是一种特殊的内链接,它是指相互链接的表在物理上为同一张表,但能够在逻辑上分为两张表。

    例如:要求检索出学号为20210的学生的同班同窗的信息,查询语句为

      SELECT学生表.*

      FROM学生表JOIN学生表AS学生表1ON学生表.班级=学生表1.班级

      WHERE学生表1.学号='20210'

 

4、外链接

  内链接的查询结果都是知足链接条件的元组。但有时咱们也但愿输出那些不知足链接条件的元组信息。好比,咱们想知道每一个学生的选课状况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是知足链接条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不知足链接条件),这时就须要使用外链接。外链接是只限制一张表中的数据必须知足链接条件,而另外一张表中的数据能够不知足链接条件的链接方式。

3种外链接:

1)左外链接(LEFTOUTER JOIN)

  若是在链接查询中,链接管子左端的表中全部的元组都列出来,而且能在右端的表中找到匹配的元组,那么链接成功。若是在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTERJOIN,也就是说,左外链接的含义是限制链接关键字右端的表中的数据必须知足链接条件,而不关左端的表中的数据是否知足链接条件,均输出左端表中的内容。

    例如:要查询全部学生的选课状况,包括已经选课的和尚未选课的学生,查询语句为

      SELECT学生表.学号,姓名,班级,课程号,成绩

      FROM学生表LEFT OUTER JOIN选课表ON学生表.学号=选课表.学号

左外链接查询中左端表中的全部元组的信息都获得了保留。

2)右外链接(RIGHTOUTERJOIN)

  右外链接与左外链接相似,只是右端表中的全部元组都列出,限制左端表的数据必须知足链接条件,而无论右端表中的数据是否知足链接条件,均输出表中的内容。

    例如:同上例内容,查询语句为

      SELECT学生表.学号,姓名,班级,课程号,成绩

      FROM学生表RIGHTOUTERJOIN选课表ON学生表.学号=选课表.学号

右外链接查询中右端表中的全部元组的信息都获得了保留。

3)全外链接(FULL OUTER JOIN)

  全外链接查询的特色是左、右两端表中的元组都输出,若是没能找到匹配的元组,就使用NULL来代替。

    例如:同左外链接例子内容,查询语句为

      SELECT学生表.学号,姓名,班级,课程号,成绩

      FROM学生表FULL OUTER JOIN选课表ON学生表.学号=选课表.学号

全外链接查询中全部表中的元组信息都获得了保留。

 

5、应用示例

 2 以MySql为例。在MySQL数据库中创建两张数据表,并分别插入一些数据。
 4 脚本以下:
 5 drop table table1;
 6 CREATE TABLE `andrew`.`table1`
 7 (
 8 `name` VARCHAR(32) NOT NULL,
 9 `city` VARCHAR(32) NOT NULL
10 )
11 ENGINE = MyISAM;
12 insert into TABLE1(name, city) values ('Person A', 'BJ');
13 insert into TABLE1(name, city) values ('Person B', 'BJ');
14 insert into TABLE1(name, city) values ('Person C', 'SH');
15 insert into TABLE1(name, city) values ('Person D', 'SZ');
16 commit;
17 drop table table2;
18 CREATE TABLE `andrew`.`table2`
19 (
20 `name` VARCHAR(32) NOT NULL,
21 `city` VARCHAR(32) NOT NULL
22 )
23 ENGINE = MyISAM;
24 insert into TABLE2(name, city) values ('Person W', 'BJ');
25 insert into TABLE2(name, city) values ('Person X', 'SH');
26 insert into TABLE2(name, city) values ('Person Y', 'SH');
27 insert into TABLE2(name, city) values ('Person Z', 'NJ');
28 commit;
29 1. 外链接 – 左链接结果
30 table1居左,故谓之左链接。这种状况下,以table1为主,即table1中的全部记录均会被列出。有一下三种状况:
31 a. 对于table1中的每一条记录对应的城市若是在table2中也刚好存在并且恰好只有一条,那么就会在
32 返回的结果中造成一条新的记录。如上面Person A和Person B对应的状况。
33 b. 对于table1中的每一条记录对应的城市若是在table2中也刚好存在并且有N条,那么就会在返回的结果中造成N条新的记录。如上面的Person C对应的状况。
34 c. 对于table1中的每一条记录对应的城市若是在table2中不存在,那么就会在返回的结果中造成一条
35 条新的记录,且该记录的右边所有NULL。如上面的Person D对应的状况。
36 不符合上面三条规则的记录不会被列出。
37 2. 外链接 – 右链接结果
38 table2居右,故谓之右链接。这种状况下,以table2为主,即table2中的全部记录均会被列出。有一下三种状况:
39 a. 对于table2中的每一条记录对应的城市若是在table1中也刚好存在并且恰好只有一条,那么就会在
40 返回的结果中造成一条新的记录。如上面Person X和Person Y对应的状况。
41 b. 对于table2中的每一条记录对应的城市若是在table1中也刚好存在并且有N条,那么就会在返回的结果中造成N条新的记录。如上面的Person W对应的状况。
42 c. 对于table2中的每一条记录对应的城市若是在table1中不存在,那么就会在返回的结果中造成一条
43 条新的记录,且该记录的左边所有NULL。如上面的Person Z对应的状况。
44 不符合上面三条规则的记录不会被列出。
45 3. 内链接
46 内链接的数据记录中,不会存在字段为NULL的状况。能够简单地认为,内连接的结果就是在左链接或者右链接的结果中剔除存在字段为NULL的记录后所获得的结果。  甚至能够认为,若是两个表中仅分别剩下内链接运算后所得的数据记录,如table1中只有Person A、Person B和Person C,table2中只有Person W、Person X和Person Y,  那么这两个表的之间的左链接和右链接的返回的结果是同样的。
47 注意:select * from table1 a inner join table2 b on a.city = b.city 和select * from table1 a join table2 b on a.city = b.city 的效果是同样的,  即若是join的左边没有诸如left、right或者inner这样的关键字时,缺省的是内链接。另,MySQL不支持full join。
相关文章
相关标签/搜索