數(shù)據(jù)產(chǎn)品經(jīng)理養(yǎng)成記(四):SQL多張表查詢

上一節(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)理之路。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氛驮,一起剝皮案震驚了整個濱河市腕柜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矫废,老刑警劉巖盏缤,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓖扑,居然都是意外死亡唉铜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門律杠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來打毛,“玉大人柿赊,你說我怎么就攤上這事』猛鳎” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵诡蜓,是天一觀的道長熬甫。 經(jīng)常有香客問我,道長蔓罚,這世上最難降的妖魔是什么椿肩? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮豺谈,結(jié)果婚禮上郑象,老公的妹妹穿的比我還像新娘。我一直安慰自己茬末,他們只是感情好厂榛,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丽惭,像睡著了一般击奶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上责掏,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天柜砾,我揣著相機與錄音,去河邊找鬼换衬。 笑死痰驱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瞳浦。 我是一名探鬼主播担映,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼术幔!你這毒婦竟也來了另萤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤诅挑,失蹤者是張志新(化名)和其女友劉穎四敞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔妥,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡忿危,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了没龙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铺厨。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缎玫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出解滓,到底是詐尸還是另有隱情赃磨,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布洼裤,位于F島的核電站邻辉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腮鞍。R本人自食惡果不足惜值骇,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望移国。 院中可真熱鬧吱瘩,春花似錦、人聲如沸迹缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裹芝。三九已至部逮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫂易,已是汗流浹背兄朋。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怜械,地道東北人颅和。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缕允,于是被迫代替她去往敵國和親峡扩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容