序言
? ? ? MySQL中查詢功能是不可缺少的,而且在查詢過程中會使用各種join方式得到我們想要的數(shù)據(jù)饱亮,因此join的靈活應(yīng)用是不可或缺的瘩欺。當(dāng)然辰如,所有的連接都是忠實(shí)于我們的數(shù)據(jù)處理目的,SQL各種功能語句的應(yīng)用就是我們達(dá)成目的的工具责循,系統(tǒng)性雖不強(qiáng)糟港,但積累應(yīng)用是重中之重
JOIN 各種連接
1.左連接 left (outer) join
關(guān)鍵字會從左表那里返回所有的行,即使在右表中沒有匹配的行
select?*?from?table A?left?join?table B on?table A.Key=table B.Key
select * from table A left join table B on table A.Key=table B.Key where table B.Key is null
??:
題目來源:https://leetcode-cn.com/problems/customers-who-never-order/
解題思路:
為了得到從不訂購的客戶院仿,說明Customers表中的客戶Id沒有出現(xiàn)在Orders表的CustomerId中
以Customers作為左表秸抚,Orders作為與之連接的表速和,Orders中的CustomersId對應(yīng)Customers表中的Id,且Orders中的CustomersId全部都在Customers表的Id中剥汤,且個數(shù)小于等于Customers表中的Id數(shù)颠放。通過左連接得到4個字段,分別對應(yīng)Customers表中的Id吭敢,Name 和Orders表中的Id碰凶,CustomersId。沒有訂購的客戶連接之后對應(yīng)Orders的字段列Id和CustomersId是查詢不到的鹿驼,因此會顯示 null欲低,完整的語句如下:
select?Name?Customers
from?Customers?c?left?outer?join?Orders?o
on?c.Id=o.CustomerId?
where?o.Id?is?null
2.右連接 right (outer) join
right join 關(guān)鍵字會從右表里返回所有的行,即使在左表中沒有對應(yīng)匹配的行
select * from table A right join table B on table A.Key=table B.Key
select * from table A right join table B on table A.Key=table B.Key where table A.Key is null
基于上面未訂購用戶的例子畜晰,使用右連接方式做題砾莱,稍微修改一下順序即可
select?Name?Customers? ? ? ? ? ? ? ? ? ? ? ? ? ? 不變??????????select?Name?Customers
from?Customers?c?left?outer?join?Orders?o 改成??? ??????from?Orders?o left?outer?join??Customers?c
on?c.Id=o.CustomerId?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不變??????????on?c.Id=o.CustomerId?
where?o.Id?is?null? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不變??????????where?o.Id?is?null?
????????????左連接? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 右連接? ? ? ? ? ? ? ? ? ? ??
3. inner join 內(nèi)連接(兩個集合的交集)
select * from table A inner join table B on table A.Key=table B.Key
(類似Excel中的VLOOKUP函數(shù))
4.full join
SQL FULL JOIN結(jié)合的左,右外連接的結(jié)果舷蟀,連接表將包含的所有記錄來自兩個表恤磷,并使用NULL值作為兩側(cè)缺失匹配結(jié)果,MySQL中沒有此功能野宜,可以用union 代替
select * from table A full join table B where table A.Key=table B.Key
select *? from table A full join table B where table A.Key=table B.Key where table B.Key is null or table A.Key is null
MySQL union all替代方式
select?* col_name from?table A?left?join?table B on?table A.Key=table B.Key
union?
select *? from table A right join table B on table A.Key=table B.Key
ps: union 使用注意事項(xiàng)扫步,之前這塊寫錯了,使用了union all匈子,union all是不去重的河胎,但是采用左連接和右連接兩個集合整體交集部分多加了一次,需要去重所以應(yīng)使用union
5.cross join
CROSE JOIN返回兩張表的笛卡爾積虎敦,也就是不指定結(jié)合規(guī)則游岳,讓兩表中的元素直接兩兩組合
??:table A? ? ? ? ? ? ? ?table B? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?select * from table A cross join table B (cross join 可省略用“,”代替)
? ? ? ? c1? ? ? ? ? ? ? ? ? ? ? ? c2-----> c1? ? ? ? ? ? c2
? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ?4? ? ? ? ? ? 1? ? ? ? ? ? 4
? ? ? ? 2? ? ? ? ? ? ? ? ? ? ? ? ? ?5? ? ? ? ? ? 1? ? ? ? ? ? 5
? ? ? ? 3? ? ? ? ? ? ? ? ? ? ? ? ? ?6? ? ? ? ? ? 1? ? ? ? ? ? 6
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2? ? ? ? ? ? 4
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2? ? ? ? ? ? 5
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2? ? ? ? ? ? 6
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3? ? ? ? ? ? 4
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3? ? ? ? ? ? 5
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3? ? ? ? ? ? 6
union?
union查詢必須滿足的條件
1)兩個查詢返回的數(shù)據(jù)列數(shù)必須相同
2)? 兩個select語句對應(yīng)列返回的數(shù)據(jù)類型必須相同(至少兼容)
union & union all 區(qū)別
union上下兩張表有重復(fù)的記錄時(shí),union會對整體結(jié)果進(jìn)行去重? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? union all則展示所有結(jié)果