來源:Mysql 多表連接查詢 inner join 和 outer join 的使用
JOIN的含義就如英文單詞“join”一樣渠缕,連接兩張表,大致分為內(nèi)連接舵匾,外連接,右連接谁不,左連接坐梯,自然連接。這里描述先甩出一張用爛了的圖刹帕,然后插入測(cè)試數(shù)據(jù)吵血。
首先先列舉本篇用到的分類(內(nèi)連接,外連接偷溺,交叉連接)和連接方法(如下):
A)內(nèi)連接:join蹋辅,inner join
B)外連接:left join,left outer join挫掏,right join侦另,right outer join,union
C)交叉連接:cross join
案例表:
t_users:
t_department:
第一種:內(nèi)連接 inner join
內(nèi)連接INNER JOIN是最常用的連接操作尉共。從數(shù)學(xué)的角度講就是求兩個(gè)表的交集褒傅,從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。
有INNER JOIN袄友,WHERE(等值連接)殿托,STRAIGHT_JOIN,JOIN(省略INNER)四種寫法。
selectd.id, d.department, t.namefrom t_users t
inner join t_department d on d.id = t.department_id
結(jié)果說明剧蚣;只去表A表和B表共同有的on 條件部分?jǐn)?shù)據(jù)支竹;
第二種:外連接 left join旋廷,left outer join ,right join唾戚, right outer join柳洋, union
1)左連接LEFT JOIN的含義就是求兩個(gè)表A表和B表的交集外加左表剩下的數(shù)據(jù)待诅。依舊從笛卡爾積的角度講叹坦,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表A表中剩余的記錄(見最后三條)卑雁。
where b.id is null
selectt.name, t.department_id, d.departmentfrom t_users tleftjoint_department dond.id=t.department_id
2)右連接 RIGHT JOIN
同理右連接RIGHT JOIN就是求兩個(gè)表A和B表的交集外加右表B剩下的數(shù)據(jù)募书。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄测蹲,然后加上右表中剩余的記錄(見最后一條)
where a.id is null
selectt.id userid,t.name, t.department_id, d.departmentfrom t_users trightjoint_department dond.id=t.department_id
?3)外連接 FULL OUTER JOIN
外連接就是求兩個(gè)表A和B集合的并集莹捡。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄扣甲,最后加上右表中剩余的記錄篮赢。另外MySQL不支持OUTER JOIN,但是我們可以對(duì)左連接和右連接的結(jié)果做?UNION?操作來實(shí)現(xiàn)琉挖。
情景一:A和B的并集
selectt.id userid,t.name, t.department_id, d.departmentfrom t_users tleftjoint_department dond.id= t.department_idUNIONselectt.id userid,t.name, t.department_id, d.departmentfrom t_users trightjoint_department dond.id=t.department_id
情景二:A和B中不滿足某個(gè)條件的記錄
如:即不在A表user里面启泣;也不在B表department里面的數(shù)據(jù);條件 is null
selectt.id userid,t.name, t.department_id, d.departmentfrom t_users tleftjoint_department dond.id= t.department_idwhered.idisnullUNIONselectt.id userid,t.name, t.department_id, d.departmentfrom t_users trightjoint_department dond.id= t.department_idwheret.department_idisnull