SQL里 inner JOIN、 left (OUTER) JOIN 、right (OUTER) JOIN、 full (OUTER) JOIN 之间的区别

SQL里 inner JOINleft  (OUTER) JOINright  (OUTER) JOINfull (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

 

posted @ 2017-04-25 21:27 Cockroach_Ge 阅读(...) 评论(...) 编辑 收藏