VLOOKUP
假設你有兩個Excel表格麻车,其中一個為用戶信息表:
name,gender动猬,age
小A赁咙,男,20
小B彼水,男凤覆,21
小C,女盯桦,22
小D拥峦,女,23
另外一個為用戶購買明細表:
name事镣,order_no璃哟,order_amount
小A,1随闪,1000
小A,2撮奏,500
小D,3泽疆,800
小D玲献,4,900
小C瓢娜,5礼预,700
小C,6褒颈,1100
小C获高,7,1200
小B淤井,8摊趾,1400
具體Excel如下:
兩張表格
現(xiàn)在,有個需求是止吐,求出不同性別的客單價侨糟。
對于excel來說呢,首先第一步給每個訂單算出性別不同,這里就需要用到vlookup了:
vlookup
公式為
VLOOKUP(E3,A:C,2,FALSE)
二拐,表示需要查找的值為E3(小A)、查找范圍為A:C(A列 到 C列)百新、輸出第二列的值,不使用模糊搜索饭望。然后依次求值澜倦,我們就得到了帶有性別的購買明細表格。怎么求分性別的客單價呢杰妓?因為這個涉及到了聚合(按性別聚合),所以我們想到使用透視表:
透視表求分性別客單價
JOIN
如果剛剛的兩個Excel表格是MySQL表呢碘勉?我們要怎么樣才能把兩個表的數(shù)據(jù)放在一起呢巷挥?SQL提供了一個方案是JOIN。JOIN的用法是:
SELECT *
FROM <表名>
JOIN <表名> ON <表達式>
JOIN <表名> ON <表達式>
...
FROM 后面可以接多個JOIN验靡,每個JOIN后面緊跟一個表名倍宾,然后是ON,后面緊跟一個表達式胜嗓。
JOIN的邏輯是把FROM里面的表和JOIN的表高职,拼接成一個新表,然后符合ON表達式的行留下怔锌,其他的丟棄。那么怎樣拼接的呢变过?
拼接方案
拼接方案為:
A表的每一行和B表的每一行組合出所有可能埃元,所有可能性匯成一張表。
假設FROM表有N行媚狰,X個字段岛杀,JOIN表有M行Y個字段,那么拼接后的表每一行都有X+Y個字段崭孤,然后總共有N*M行类嗤。舉例:
A表
A_col1,A_col2
A11,A12
A21,A22
B表
B_col1,B_col2
B11,B12
B21,B22
B31,B33
拼接后的表為:
A11,A12,B11,B12
A11,A12,B21,B22
A11,A12,B31,B33
A21,A22,B11,B12
A21,A22,B21,B22
A21,A22,B31,B33
枚舉所有的組合可能性,每一行都有2+2個字段辨宠,然后剛好2*3行遗锣。
篩選
拼接之后要篩選,是利用ON后面的表達式來篩選的彭羹。比如我們要得到帶有性別的購買明細表黄伊,那么SQL如下:
SELECT * FROM 購買明細 JOIN 用戶信息 ON 購買明細.name = 用戶信息.name
拼接表完畢之后是:
小A,1派殷,1000还最,小A墓阀,男,20
小A拓轻,1斯撮,1000,小B扶叉,男勿锅,21
小A,1枣氧,1000溢十,小C,女达吞,22
小A张弛,1,1000酪劫,小D吞鸭,女,23
小A覆糟,2刻剥,500,小A滩字,男造虏,20
小A,2麦箍,500酗电,小B,男内列,21
小A撵术,2,500话瞧,小C嫩与,女,22
小A交排,2划滋,500,小D埃篓,女处坪,23
....
(僅顯示部分)
其中滿足購買明細.name = 用戶信息.name
僅有這些列:
小A,1,1000同窘,小A玄帕,男,20
小A想邦,2裤纹,500,小A丧没,男鹰椒,20
...
(僅顯示部分)
這就是我們這條SQL跑出來的結果。這樣看上去比較雜亂呕童,因為名字顯示了兩次漆际,還有我們不想要的年齡信息,所以優(yōu)化一下SQL:
SELECT
購買明細.name,
order_no,
order_amount,
gender
FROM 購買明細
JOIN 用戶信息 ON 購買明細.name = 用戶信息.name
(注意name字段需要指定表名夺饲,因為兩張表都有name字段灿椅,如果不指定系統(tǒng)會不知道用哪張表的name字段)
這就得到了我們想要的結果:
小A,1钞支,1000,男
小A操刀,2烁挟,500,男
...
(僅顯示部分)
當然骨坑,我們的目標是求出分性別的客單價撼嗓,那么再使用熟悉的GROUP BY即可:
SELECT gender, avg(order_amount)
FROM 購買明細
JOIN 用戶信息 ON 購買明細.name = 用戶信息.name
GROUP BY gender
總結
FROM只能從一個表里面拿數(shù)據(jù),會有諸多限制欢唾。所以可以把JOIN看做是對FROM的補充且警,通過JOIN,F(xiàn)ROM可以從多個表拿數(shù)據(jù)礁遣。整個SQL求值順序為:
JOIN拼接 => ON篩選 => WHERE過濾 => GROUP BY聚合
=> ORDER BY排序 => LIMIT限制輸出 => SELECT表達式求值