SQL里 inner JOIN、 left (OUTER) JOIN 、right (OUTER) JOIN、 full (OUTER) JOIN 之间的区别
/* 直接上例子废话不多说
此例子里两张表之间相等的都是各自的主键
然而大部分情况下是A表的主键和B表里的外键相等,
所以就会存在B表里多行记录匹配A表里的一行记录
这里仅做例子
*/
/* 在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。
*/
A表(aID,aCourse,aGrade) | B表(bID,bName)
aID aCourse aGrade | bID bName
01 数学 95 | 01 张三
02 语文 90 | 02 李四
03 英语 80 | 04 王五
-- inner join(等值连接取交集) 只返回两个表中联结字段相等的行
SELECT a.*,b.* FROM A a INNER JOIN B b ON a.aID = b.bID; -- a.*,b.* 可用 * 替代,INNER JOIN中间没有OUTER
SELECT a.*,b.* FROM A a , B b WHERE a.aID = b.bID; --INNER JOIN 的简写,效果等同
-- 结果集:
aID aCourse aGrade bID bName
01 数学 95 01 张三
02 语文 90 02 李四
-- left join(左联接) 返回包括左表中的所有记录以及左表与右表中联结字段相等的记录
SELECT * FROM A a LEFT OUTER JOIN B b ON a.aID = b.bID; -- OUTER可省略
-- 结果集:B表记录不足的地方均为NULL
aID aCourse aGrade bID bName
01 数学 95 01 张三
02 语文 90 02 李四
03 英语 80 NULL NULL
--right join(右联接) 返回包括右表中的所有记录以及右边与左表中联结字段相等的记录
SELECT * FROM A a RIGHT JOIN B b ON a.aID = b.bID;-- OUTER省略
-- 结果集:A表记录不足的地方均为NULL
aID aCourse aGrade bID bName
01 数学 95 01 张三
02 语文 90 02 李四
NULL NULL NULL 04 王五
-- full JOIN(全连接) 返回包括A,B表中的所有记录
SELECT * FROM A a FULL JOIN B b ON a.aID = b.bID;---- OUTER省略
结果集:A、B表记录不足的地方均为NULL
aID aCourse aGrade bID bName
01 数学 95 01 张三
02 语文 90 02 李四
03 英语 80 NULL NULL
NULL NULL NULL 04 王五
注意:MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
LEFT JOIN + UNION(可去除重复数据)+ RIGHT JOIN
select * from A left join B on A.id = B.id (where 条件)
union
select * from A right join B on A.id = B.id (where条件);
上述全连接就可以在MYSQL中就可以替换成以下:
SELECT * FROM A a LEFT OUTER JOIN B b ON a.aID = b.bID
UNION
SELECT * FROM A a RIGHT JOIN B b ON a.aID = b.bID