连接查询

  连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

  在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。

  内连接的连接查询结果集中仅包含满足条件的行,内连接是SQLServer缺省的连接方式,可以把INNER JOIN简写成JOIN根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种;交叉连接的连接查询结果集中包含两个表中所有行的组合;外连接的连接查询结果集中既包含那些满足条件的行,还包含其中某个表的全部行,有3种形式的外连接:左外连接、右外连接、全外连接。

1.交叉连接

  交叉连接即,是指两个关系中所有的任意组合。一般情况下,交叉查询是没有实际意义的。

  例如:如果希望得到学生表和选课表两个关系模式的乘积,查询语句为

SELECT*

FROM 学生表CROSS JOIN选课表

2.内连接查询

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

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

SELECT *

FROM学生表INNERJOIN选课表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全外连接(FULLOUTER JOIN

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

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

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

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

  全外连接查询中所有表中的元组信息都得到了保留。