一、传统的连接查询
1、交叉连接:返回笛卡尔积
WHERE中限定查询条件,可以预先过滤掉掉不符合条件的记录,返回的只是两个表中剩余记录(符合条件的记录)的笛卡尔积。
2、内连接:参与连接的表地位平等,不分主次。两表均可能有丢弃。
(1)等值连接:表间记录的连接是通过相等的字段值为条件建立起来的。
(2)非等值连接:与等值连接类似。如果表间记录的连接条件使用除“=”以外的其它比较运算符(>,>=,<,<=,!>,!<,<>以及BETWEEN…AND等)比较被连接的字段值。注意“BETWEEN (较小值)AND (较大值)”对应闭区间,
3、外连接:参与连接的表分主次。主表不丢弃,从表可能有丢弃。
(1)左外连接:主表在左,从表一侧(右侧)使用“(+)”。
(2)右外连接:同理。
4、自连接:同一个表上的连接查询,令一个表与其自身连接。
注:SELECT子句中的字段别名可以中间使用AS,可以省略;但表名与表别名之间不允许使用AS。
二、SQL92连接语法
在SQL92标准中,除支持前述传统的连接语法之外,还定义了一组新的连接语法体系--在FROM子句中指定连接条件(之前是在WHERE子句中),二者功能几乎完全相互覆盖,只是语法格式有所不同、且SQL92中增加了一种全外连接。SQL92连接语法基本格式如下:
注意:连接条件仍是由被连接表中的字段和比较运算符、逻辑运算符等构成的表达式,使用关键字ON或USING等。
连接类型可分为交叉连接、内连接、外连接三种,并可再细分(下图):
(1)交叉连接的关键字是CROSS JOIN,返回笛卡尔积。例:
(2)等值连接、非等值连接用关键字:[INNER] JOIN,并且用ON代替WHERE指定连接条件及其他查询限定条件;
等值连接可以使用USING子句指定用于等值连接的字段(参照字段)。
自然连接的关键字是NATURAL [INNER] JOIN,基于两个表中的全部同名字段建立等值连接。如果类型不一致会出错。
注意:USING和NATURAL不允许在参照字段(包括SELECT列表中出现的参照字段)上使用表名或表别名作为前缀。此外,ON子句的等值连接不会去除查询结果集中的重复字段,但USING或NATURAL中则会自动去掉重复字段。例如:
(3)左外连接(右外连接同理):主表在左,关键字是LEFT [OUTER] JOIN,ON代替WHERE指定连接条件;
相当于前述传统方式中的从表侧加入“(+)”:
全外连接:关键字是FULL [OUTER] JOIN,ON代替WHERE指定连接条件。