连接查询总结

连接概述
关系数据库中所有的数据均以明确的数据值存在于它的字段中,表之间所有可能的关系都是通过匹配相关字段的内容来形成的。连接提供了一个强大的工具来生成数据库中的数据关系。事实上,因为关系数据库不包含指针或其他关联记录与记录的机制,连接是生成跨表数据关系的唯一机制。

通过匹配相关字段的内容来形成一对一对的记录的过程称为连接表结果表(包含两个源表的数据)称为两表之间的一个连接。

连接的数学基础
连接是对两个表的数据进行更通用的组合的一种特殊情况。...待补充...

查询的执行顺序
SELECT语句中的子句按照下列次序应用:
1:FROM 子句
2:WHERE子句
3:GROUP BY 子句
4:HAVING子句
5:SELECT子句
6:ORDER BY子句

更详细的介绍参见:详解SQL逻辑查询的各个阶段

连接的分类
连接分可分为三种:内连接、外连接和交叉连接。

内连接
内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据。也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表行,必须满足ON子句中的搜索条件。作为对照,如果在源表中的行在另一表中没有对应(相关)的行,则该行就被过滤掉,不会包括在结果表中。内连接使用比较运算符来完成。内连接可分为两种:等值连接、不等连接。

  1. 等值连接
    使用等于号(=)比较被连接列的列值,在查询结果中列出被连接表中的所有列,包括其中的重复列。
  2. 不等连接
    在连接条件中,可以使用其他比较运算符,比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。在默认情况下,DBMS将多表查询按INNER JOIN来执行,除非指定OUTER JOIN。即,如果将上例中的INNER JOIN关键字替换为JOIN也会得到同样的结果。

外连接
不管是内连接还是带WHERE子句的多表查询,都组合自多个表,并生成结果表。换句话说,如果任何一个源表中的行在另一个源表中没有匹配,DBMS将不把该行放在最后的结果表中。而外连接告诉ODBC生成的结果表,不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

SQL的外连接共有3种类型:左外连接,关键字为LEFT OUTER JOIN、右外连接,关键字为RIGHT OUTER JOIN和全外连接,关键字为FULL OUTER JOIN。外连接的用法和内连接一样,只是将INNER JOIN关键字替换为相应的外连接关键字即可。

  1. 左外连接
    左外连接,LEFT OUTER JOIN,告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表的不匹配行。其中,缺少的左边表中的属性值用NULL表示。
    左外连接实际上可以表示为:

    左外连接 = 内连接 + 左边表中失配的元组
  2. 右外连接
    右外连接(RIGHT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)右边表的不匹配行。其中,缺少的左边表中的属性值用NULL表示。
    右外连接实际上可以表示为:

    右外连接 = 内连接 + 右边表中失配的元组
  3. 全外连接
    全外连接,FULL OUTER JOIN,告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表和右边表的不匹配行。其中,缺少的左边表或者右边表中的属性值用NULL表示。

    全外连接实际上可以表示为:

    全外连接 = 内连接 + 左边表中失配的元组 + 右边表中失配的元组。

交叉连接连接
除了在FROM子句中使用逗号间隔连接的表外,SQL还支持另一种被称为交叉连接的操作,它们都返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。惟一的不同在于,交叉连接分开列名时,使用CROSS JOIN关键字而不是逗号。在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。

实际上,下面两个表达式是完全等价的。

SELECT * FROM table1, table2
SELECT * FROM table1 CROSS JOIN table2

交叉连接(CORSS JOIN)和逗号连接使用哪种方式,完全看个人喜好。没有哪种方式优于另外一种。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非的在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。

内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

参考链接:
熔岩的这篇文章图文并茂,也有例子可以实践一下:
http://lavasoft.blog.51cto.com/62575/38929

同样很不错的一篇文章:
http://www.cnblogs.com/eflylab/archive/2007/06/25/794278.html

在线书籍:《精通SQL——结构化查询语言详解》
http://book.51cto.com/art/200806/77064.htm

此条目发表在DB/ES分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据