深入理解SQL的四种连接

SQL标准

 1 select table1.column,table2.column
 2 from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;
 3 
 4         inner join 表示内连接;
 5 
 6         left join表示左外连接;
 7 
 8         right join表示右外连接;
 9 
10         full join表示完全外连接;
11 on子句 用于指定连接条件。

注意:

       如果使用from子句指定内、外连接,则必须要使用on子句指定连接条件;
       如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件。

一、内连接

(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接

eg:

Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id;   -- 标准写法

Select a.id,a.name,b.name from dave a join bl b on a.id=b.id;  -- 这里省略了inner 关键字

Select a.id,a.name,b.name from dave a,bl b where a.id=b.id;  -- select 多表查询

二、外连接

原理:在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记

录。 那么在相关联的结果集行中列显示为空值(NULL)。

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

左外连接:联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。   

LEFT  JOIN或LEFT OUTER JOIN   

对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。

select * from dave a left join bl b on a.id = b.id;

select * from dave a left outer join bl b on a.id = b.id;

Select * from dave a,bl b where a.id=b.id(+);   -- 注意: 用(+) 就要用关键字where

    

右外连接:右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

RIGHT  JOIN 或 RIGHT  OUTER  JOIN    

select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id 

完整外部连接(全外连接):联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有

匹配行,则整个结果集行包含基表的数据值。 全外连接不支持(+)这种写法

FULL  JOIN 或 FULL OUTER JOIN

select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   

三、交叉连接(笛卡尔积,几乎不用)

联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

四、联合连接(很少见

Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。

五、应用

1、 查两表关联列相等的数据用内连接。
2、 Col_L是Col_R的子集时用右外连接。
3、 Col_R是Col_L的子集时用左外连接。
4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型可以写到一块。例如:
SELECT T1.C1,T2.CX,T3.CY
FROM TAB1 T1
       INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
       INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
       LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
WHERE T1.X >T3.Y;

Oracle表之间的连接分为三种:

1. 内连接(自然连接)

2. 外连接

(1)左外连接 (左边的表不加限制)
       (2)右外连接(右边的表不加限制)
        (3)全外连接(左右两表都不加限制)

3. 自连接(同一张表内的连接)