006-VLOOKUP与JOIN

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如下:

两张表格

现在,有个需求是,求出不同性别的客单价。
对于excel来说呢,首先第一步给每个订单算出性别,这里就需要用到vlookup了:
vlookup

公式为VLOOKUP(E3,A:C,2,FALSE),表示需要查找的值为E3(小A)、查找范围为A:C(A列 到 C列)、输出第二列的值,不使用模糊搜索。然后依次求值,我们就得到了带有性别的购买明细表格。
怎么求分性别的客单价呢?因为这个涉及到了聚合(按性别聚合),所以我们想到使用透视表:
透视表求分性别客单价

JOIN

如果刚刚的两个Excel表格是MySQL表呢?我们要怎么样才能把两个表的数据放在一起呢?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跑出来的结果。这样看上去比较杂乱,因为名字显示了两次,还有我们不想要的年龄信息,所以优化一下SQL:

SELECT 
购买明细.name, 
order_no, 
order_amount, 
gender
FROM 购买明细 
JOIN 用户信息 ON 购买明细.name = 用户信息.name
(注意name字段需要指定表名,因为两张表都有name字段,如果不指定系统会不知道用哪张表的name字段)

这就得到了我们想要的结果:

小A,1,1000,男
小A,2,500,男
...
(仅显示部分)

当然,我们的目标是求出分性别的客单价,那么再使用熟悉的GROUP BY即可:

SELECT gender, avg(order_amount)
FROM 购买明细 
JOIN 用户信息 ON 购买明细.name = 用户信息.name
GROUP BY gender

总结

FROM只能从一个表里面拿数据,会有诸多限制。所以可以把JOIN看做是对FROM的补充,通过JOIN,FROM可以从多个表拿数据。整个SQL求值顺序为:

JOIN拼接 => ON筛选 => WHERE过滤 => GROUP BY聚合 
=> ORDER BY排序 => LIMIT限制输出 => SELECT表达式求值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342