在講left join(左關(guān)聯(lián))之前登失,要說下right join(右關(guān)聯(lián))的用法其實(shí)類似left join,把right join想象成是left join的一種轉(zhuǎn)化方式即可霸奕。
我們工作中經(jīng)常會用到left join來進(jìn)行聯(lián)表取數(shù)分析急膀,今天就專門來講講left join的用法沼填。
很多基礎(chǔ)的數(shù)據(jù)庫應(yīng)用的書籍都有講到left join的用法,但是都沒有深入在運(yùn)用過程中應(yīng)該注意哪些地方邪媳。如果你僅是單純地套用你會發(fā)現(xiàn)在實(shí)際工作中會遇到各種各樣的問題令蛉。
一、基本語句
select
a.id,
a.column,
b.id,
b.column
from a
left join b on a.id = b.id
在這里a表與b表以主鍵id進(jìn)行聯(lián)接屈呕。查詢的結(jié)果保留a表中全部的id數(shù)據(jù)和選到的某列的數(shù)據(jù)微宝,而b.id和其他列只保留與a表相匹配的數(shù)據(jù)。而不匹配的b表的id和其他列以null填充虎眨。這個用法類似excel中的vlookup的用法蟋软。掌握了vlookup的用法,基本上對left join的用法也掌握了嗽桩。
二钟鸵、如何解決一對多的問題
當(dāng)a表有100行數(shù)據(jù),而b表有1000行數(shù)據(jù)涤躲,并且b表中的b.id是有重復(fù)值的,而且在實(shí)際應(yīng)用過程中贡未,這確實(shí)屬于正持钟#現(xiàn)象蒙袍。
我們可以想象a表是用戶表,b表是訂單表嫩挤。自然也就想到了一個用戶可能多次下單害幅。我們假設(shè)b表中的用戶id在a表中匹配到50個用戶id,但是這50個用戶id總訂單數(shù)是500個岂昭。
那么當(dāng)我們在執(zhí)行以上sql語句時以现,就會出現(xiàn)查詢的結(jié)果550條,為什么呢约啊?
因?yàn)楫?dāng)left join 一對多的時候邑遏,就會出現(xiàn)將b表中相同匹配的數(shù)據(jù)填充到查詢結(jié)果去。
如何解決這種問題呢恰矩,我們可以根據(jù)實(shí)際情況來做調(diào)整记盒。
把一對多的問題轉(zhuǎn)化成聚合查詢
如果業(yè)務(wù)需求是要查詢用戶的下單量,可以將sql語句編程如下
select
a.用戶id,
a.用戶姓名,
count(訂單id)
from 用戶表 a
left join 訂單表b on a.用戶id = b.用戶id
group by a.用戶id, a.用戶姓名
把一對多的問題轉(zhuǎn)化成多對一的問題
如果業(yè)務(wù)需求是要查詢用戶的下單明細(xì)外傅,可以將sql語句編程如下
select
a.訂單id,
a.業(yè)務(wù)類型
a.單價
a.消費(fèi)數(shù)量
b.用戶姓名,
b.用戶聯(lián)系方式
from 訂單表 a
left join 用戶表b on a.用戶id = b.用戶id
三纪吮、條件聯(lián)接查詢
以上的sql語句都是全量查詢,在面對表數(shù)據(jù)較大的情況萎胰,全量查詢是非常耗時的碾盟。
所以查詢過程中,我們一定要運(yùn)用where子句來限定條件技竟,提高查詢效率冰肴。
在這里有兩種方式:一種是全量查詢后+where子句,一種是聯(lián)接前就先做限定灵奖。
全量查詢后+where子句嚼沿。
如查詢用戶為男,消費(fèi)總價大于1w元的用戶明細(xì)
select
a.訂單id,
a.業(yè)務(wù)類型
a.單價
a.消費(fèi)數(shù)量
b.用戶姓名,
b.用戶聯(lián)系方式
from 訂單表 a
left join 用戶表b on a.用戶id = b.用戶id
where b.用戶性別 = '男'
and (a.單價 * a.消費(fèi)數(shù)量) > 10000
and b.用戶id is not null
聯(lián)接前就先做限定瓷患。
如我們需要查詢用戶在某時間段骡尽,訪問A頁面再訪問B頁面的留存用戶量。查詢的表只有用戶行為表擅编。
select
count(a.user_id),
count(b.user_id)
from
(select
distinct
user_id
from 用戶行為表
where date_str = '2016-11-01'
and url = ‘A頁面路徑’)a
left join
(select
distinct
user_id
from 用戶行為表
where date_str = '2016-11-01'
and url = ‘B頁面路徑’)b on a.user_id = b.user_id
where b.user_id is not null
OK!
先講到這里攀细,希望對大家有用!