JOIN的含義就如英文單詞“join”一樣,連接兩張表,大致分為內連接,外連接,右連接,左連接,自然連接。這里描述先甩出一張用爛了的圖,然后插入測試數據。
首先先列舉本篇用到的分類(內連接,外連接,交叉連接)和連接方法(如下):
A)內連接:join,inner join
B)外連接:left join,left outer join,right join,right outer join,union
C)交叉連接:cross join
案例表:
t_users:
t_department:
第一種:內連接 inner join
內連接INNER JOIN是最常用的連接操作。從數學的角度講就是求兩個表的交集,從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。
有INNER JOIN,WHERE(等值連接),STRAIGHT_JOIN,JOIN(省略INNER)四種寫法。
select d.id, d.department, t.name from t_users t inner join t_department d on d.id = t.department_id
結果說明;只去表A表和B表共同有的on 條件部分數據;
第二種:外連接 left join,left outer join ,right join, right outer join, union
1)左連接LEFT JOIN的含義就是求兩個表A表和B表的交集外加左表剩下的數據。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表A表中剩余的記錄(見最后三條)。
where b.id is null
select t.name, t.department_id, d.department from t_users t left join t_department d on d.id = t.department_id
2)右連接 RIGHT JOIN
同理右連接RIGHT JOIN就是求兩個表A和B表的交集外加右表B剩下的數據。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上右表中剩余的記錄(見最后一條)
where a.id is null
select t.id userid,t.name, t.department_id, d.department from t_users t right join t_department d on d.id = t.department_id
3)外連接 FULL OUTER JOIN
外連接就是求兩個表A和B集合的並集。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄,最后加上右表中剩余的記錄。另外MySQL不支持OUTER JOIN,但是我們可以對左連接和右連接的結果做 UNION 操作來實現。
情景一:A和B的並集
select t.id userid,t.name, t.department_id, d.department from t_users t left join t_department d on d.id = t.department_id UNION select t.id userid,t.name, t.department_id, d.department from t_users t right join t_department d on d.id = t.department_id
情景二:A和B中不滿足某個條件的記錄
如:即不在A表user里面;也不在B表department里面的數據;條件 is null
select t.id userid,t.name, t.department_id, d.department from t_users t left join t_department d on d.id = t.department_id where d.id is null UNION select t.id userid,t.name, t.department_id, d.department from t_users t right join t_department d on d.id = t.department_id where t.department_id is null