SQL中 Inner Join(内连),Left Join(左连),Right Join(右连),Full Join(全外连) 之间的区别
I. 概念
1. CROSS JOIN(交叉连接)
如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。
例如:
A:SELECT a.*,b.* FROM table1 a,table2 b WHERE a.id=b.id
B:SELECT * FROM table1 a CROSS JOIN table2 b WHERE a.id=b.id
一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。因此,如果两个需要求交集的表太大,将会非常非常慢。
2. INNER JOIN(内连接)
两边表同时符合条件的组合。
例如:
SELECT * FROM table1 a INNER JOIN table2 b ON a.id=b.id
如果仅仅使用 SELECT * FROM table1 INNER JOIN table2 内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。
3. LEFT [OUTER] JOIN(左外连接 )
显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
例如:
SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
4. RIGHT [OUTER] JOIN(右外连接)
显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
例如:
SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
5. FULL [OUTER] JOIN(全外连接)
显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。
例如:
SELECT * FROM table1 FULL JOIN table2 ON table1.id=table2.id
II. 辨析
> Join = Inner Join
> Left Join = Left Outer Join
> Right Join = Right Outer Join
> Full Join = Full Outer Join
> A left join B 的连接的记录数与A表的记录数同
> A right join B 的连接的记录数与B表的记录数同
> A left join B 等价于 B right join A
> A inner join B 查询出来是A、B都有的数据
> A full outer join B 查询出来是A、B所有总共的数据
III. 示例
示例表:
A表(a1,b1,c1) B表(a2,b2)
a1 b1 c1 a2 b2
01 数学 95 01 张三
02 语文 90 02 李四
03 英语 80 04 王五
1. Inner Join
select A.*,B.* from A
inner join B on(A.a1=B.a2)
结果是:
a1 b1 c1 a2 b2
01 数学 95 01 张三
02 语文 90 02 李四
2. Left Join
select A.*,B.* from A
left outer join B on(A.a1=B.a2)
结果是:
a1 b1 c1 a2 b2
01 数学 95 01 张三
02 语文 90 02 李四
03 英语 80 NULL NULL
3. Right Join
select A.*,B.* from A
right outer join B on(A.a1=B.a2)
结果是:
a1 b1 c1 a2 b2
01 数学 95 01 张三
02 语文 90 02 李四
NULL NULL NULL 04 王五
4. Full Join
select A.*,B.* from A
full outer join B on(A.a1=B.a2)
结果是:
a1 b1 c1 a2 b2
01 数学 95 01 张三
02 语文 90 02 李四
03 英语 80 NULL NULL
NULL NULL NULL 04 王五