上一節(jié)講了SQL簡單查詢许溅,包括SQL語句的分類隙券、基本查詢語句(select)、條件語句闹司、運算符等。本節(jié)講一下多表查詢沐飘。
舉個工作中的實際例子游桩,假設你在做一款貸款產(chǎn)品,這里有兩張表:用戶表(userinfo)耐朴、借款還款表(loanapp)借卧。你想查詢所有用戶的借款總筆數(shù)、借款總金額筛峭,就需要以用戶作為關聯(lián)條件铐刘,從三張表里面查找相應的數(shù)據(jù)進行分析。具體如何實現(xiàn)影晓?看完下面的內(nèi)容你就能輕松解決這個問題镰吵。
1.表的加法
表的加法是指按行檩禾,將表合并在一起,通過關鍵字union實現(xiàn)“碳溃現(xiàn)在盼产,這里有兩張格式一樣的表,你想把兩張表的數(shù)據(jù)合并起來勺馆,該如何操作戏售?
先寫語句再解釋,如下:
select 學生姓名草穆,學生編號 --注釋:選擇course1表的兩列數(shù)據(jù)
from 表1
union--注釋:合并
select 學生姓名灌灾,學生編號 --注釋:選擇course1表的兩列數(shù)據(jù)
from 表2;
運行結(jié)果如下:
注意:
表1 中有兩行數(shù)據(jù),表2 中有三行數(shù)據(jù)悲柱,加起來是五行數(shù)據(jù)锋喜,但是運行出來的結(jié)果只有四行數(shù)據(jù)。這是因為關鍵字【union】會把表里面重復的數(shù)據(jù)去重诗祸。如果你想保存重復的行跑芳,將【union】改為【union all】即可。
2.表的聯(lián)結(jié)
之前介紹過直颅,關系數(shù)據(jù)庫中博个,表和表之間是通過關系列關聯(lián)起來的(哪里都要靠這種關鍵節(jié)點,數(shù)據(jù)庫中是功偿,生活中也是這樣盆佣,有關系好辦事。械荷。共耍。)
有了關系列后,就可以把不同的表聯(lián)結(jié)起來吨瞎,常見的聯(lián)結(jié)方式有以下幾種:
交叉聯(lián)結(jié)痹兜、內(nèi)連接、做鏈接颤诀、右聯(lián)結(jié)字旭、全聯(lián)結(jié),我們逐一介紹崖叫。
交叉聯(lián)結(jié)(cross join)
又稱為笛卡爾積遗淳,作用是將一個表中的每一行,和另一個表中的每一行合并在一起心傀。交叉聯(lián)結(jié)后的總行數(shù)屈暗,是兩張表的行數(shù)的乘機,舉個例子:
兩個表交叉聯(lián)結(jié)后的結(jié)果如下:
可以看到,聯(lián)結(jié)后的展示的內(nèi)容养叛,是將兩個表的內(nèi)容拼起來种呐。表的行數(shù)是兩張表的行數(shù)的乘機:1*2=2.如果第一張表有5行,第二張表有3行一铅,那么兩張表交叉聯(lián)結(jié)后的行數(shù)為:5*3=15.
說明:
交叉聯(lián)結(jié)在實際業(yè)務中用的比較少陕贮,因為交叉聯(lián)結(jié)產(chǎn)生的數(shù)據(jù)太多了,需要耗費很多設備潘飘、時間成本計算肮之。而且,交叉聯(lián)結(jié)會產(chǎn)生很多無意義的數(shù)據(jù)卜录。但是戈擒,交叉聯(lián)結(jié)是我們接下來要說的幾種聯(lián)結(jié)方式的基礎,因此還是有必要了解清楚艰毒。
內(nèi)聯(lián)結(jié)(inner join)
作用是選取出同時存在于兩張表中的數(shù)據(jù)筐高,選取后按照交叉聯(lián)結(jié)的方式合并展示出來。
舉個例子丑瞧,現(xiàn)在有兩張表柑土,如下:一張學生信息表,一張學生成績表绊汹,現(xiàn)在你想查出某個學生的信息和成績稽屏,如何用inner join實現(xiàn)?
這里先寫語句:
select學生信息表.學號,學生信息表.姓名,學生成績表.學號,學生成績表.課程,學生成績表.成績--選擇要拼接的列西乖,為了方便區(qū)別這個列是哪張表的狐榔,需在列名前邊加表名
from學生信息表inner join學生成績表--選擇拼接的表
on學生信息表.學號 = 學生成績表.學號;--選擇以哪個列作為拼接條件
上面兩張表的名稱太長,不管在書寫還是在閱讀上都不方便获雕,能不能給它們起一個臨時名稱薄腻,以方便書寫?這里可以用關鍵字as來實現(xiàn)届案,寫法如下;
select a.學號,a.姓名,b.學號,b.課程,b.成績--選擇要拼接的列庵楷,為了方便區(qū)別這個列是哪張表的,需在列名前邊加表名
from學生信息表as a inner join學生成績表as b--選擇拼接的表
on a.學號 = b.學號;--選擇以哪個列作為拼接條件
通過以上語句楣颠,運行處的結(jié)果如下:
說名:
內(nèi)聯(lián)結(jié)的SQL 語句運行順序如下:
- 將兩個表里面【學號】相同的列的數(shù)據(jù)都取出來嫁乘。
- 將兩個表里面取出的數(shù)據(jù)合并,使用交叉聯(lián)結(jié)的方式合并球碉。
- 將一個表中的所有行與另個表中所有合并在一起。
左聯(lián)結(jié)
左聯(lián)結(jié)是將左側(cè)表作為主表仓蛆,并指定主表的某一列為【關聯(lián)列】睁冬。運行時,主表的數(shù)據(jù)全部讀出來;右邊表的數(shù)據(jù)按照【關聯(lián)列】進行選取豆拨,與【關聯(lián)列】相同的數(shù)據(jù)會被選取直奋,不同的數(shù)據(jù)不會被選取。選取之后施禾,兩個表的數(shù)據(jù)按照交叉聯(lián)結(jié)的方式合并展示脚线。
舉個例子,弥搞,現(xiàn)在有兩張表邮绿,如下:一張學生信息表,一張學生成績表攀例,現(xiàn)在通過左聯(lián)結(jié)將以下兩張表合并后的結(jié)果會是怎樣船逮?
先公布語句寫法:
select a.學號,a.姓名,b.學號,b.課程,b.成績
from學生信息表as a left join 學生成績表as b
on a.學號 =b.學號;
可以發(fā)現(xiàn)語句和寫法和inner join類似。通過以上語句粤铭,運行處的結(jié)果如下:
因為學號0002在右邊的表里沒有對應的行挖胃,所以合并后,對應的位置顯示空值梆惯。如果你想刪除掉有空值的行酱鸭,可以通過where字句增加一個篩選條件,如下:
selecta.學號,a.姓名,b.學號,b.課程,b.成績f
rom學生信息表asaleftjoin學生成績表asb
ona.學號 = b.學號
whereb.學號 =null;
右聯(lián)結(jié)
右聯(lián)結(jié)是將右側(cè)表作為主表垛吗,并指定主表的某一列為【關聯(lián)列】凹髓。運行時,主表的數(shù)據(jù)全部讀出來职烧;左邊表的數(shù)據(jù)按照【關聯(lián)列】進行選取扁誓,與【關聯(lián)列】相同的數(shù)據(jù)會被選取,不同的數(shù)據(jù)不會被選取蚀之。選取之后蝗敢,兩個表的數(shù)據(jù)按照交叉聯(lián)結(jié)的方式合并展示。
具體的寫法與左聯(lián)結(jié)類似足删,我這里就不再舉例了寿谴,大家可以自己打開Navicat寫一寫。
全聯(lián)結(jié)
全聯(lián)結(jié)會返回兩個表的所有行失受。當A表【關聯(lián)列】的值與B表【關聯(lián)列】的值相等時讶泰,按照交叉聯(lián)結(jié)合并顯示。
當A表【關聯(lián)列】的值與B表【關聯(lián)列】的值不相等時拂到,另一個表中對應地方的值用控制來填充痪署。(類似左聯(lián)結(jié)和右聯(lián)結(jié)的結(jié)合)
舉個例子:
全聯(lián)結(jié)后顯示的結(jié)果為:
說明:MYSQL是不支持全聯(lián)結(jié)的。一般來說兄旬,全聯(lián)結(jié)應用場景也不多狼犯。
3. 案例解答
回到文章一開始的問題:
假設你在做一款貸款產(chǎn)品,這里有兩張表:用戶表(userinfo)、借款還款表(loanapp)悯森。你想查詢所有用戶的借款總筆數(shù)宋舷、借款總金額,就需要以用戶作為關聯(lián)條件瓢姻,從三張表里面查找相應的數(shù)據(jù)進行分析祝蝠。具體如何實現(xiàn)?
說明:遇到問題的時候幻碱,一定不能上來就寫SQL語句绎狭,這里有一個三步走分析模型,分享給大家:
1. 拆解問題—2. 寫出分析思路—3. 寫出對應的SQL字句
1. 拆解問題
以上問題拆分成三個關鍵部分:所有用戶收班,借款總筆數(shù)坟岔,借款總金額
2. 分析思路
所有用戶:用戶ID,用戶姓名摔桦,在userinfo查詢
借款總筆數(shù):按照用戶ID分組社付,對借款編號按照筆數(shù)計數(shù)(count)
借款總金額:按照用戶ID分組,對借款金額求和(sum)
3. 寫出SQL語句
selecta.ID,a.姓名,b.ID,count(借款編號)as借款總筆數(shù),sum(借款金額)as借款總金額fromuserinfoasaleftjoinloanappasbona.ID = B.ID
groupbya.ID;
到此為止邻耕,簡單查詢和多表查詢告一段落鸥咖。在以后的文章中,我會盡量舉一些工作中的實例兄世,由淺入深啼辣,與大家一起深入掌握這門語言。接下來將分享復雜查詢御滩,和一些實戰(zhàn)數(shù)據(jù)分析鸥拧。如果有寫的不對的地方,歡迎指正削解。也希望你持續(xù)關注富弦,公號:數(shù)據(jù)產(chǎn)品經(jīng)理之路。