01、寫在前面
SQL作為數(shù)據(jù)分析師必備技能之一笋敞,無論是初級(jí)分析師還是高級(jí)分析師觉痛,SQL已經(jīng)是各大公司招聘條件里的必選項(xiàng),為什么SQL對(duì)于數(shù)據(jù)分析師來說如此重要呢段化?在回答這個(gè)問題之前嘁捷,我們先搞懂以下幾個(gè)問題。
第一個(gè)問題显熏,SQL是啥普气?
SQL是Structured Query Language的縮寫,意思是結(jié)構(gòu)化查詢語言佃延,是一種在數(shù)據(jù)庫管理系統(tǒng)(RelationalDatabase Management System, RDBMS)中查詢數(shù)據(jù)现诀,或通過RDBMS對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行更改的語言。
看不懂履肃。仔沿。。能不能說人話尺棋?好嘞封锉,SQL就是一種對(duì)數(shù)據(jù)庫中的數(shù)據(jù)表或者數(shù)據(jù)進(jìn)行增、刪膘螟、改成福、查等操作的語言。
什么是數(shù)據(jù)庫荆残?“數(shù)據(jù)庫是“按照數(shù)據(jù)結(jié)構(gòu)來組織奴艾、存儲(chǔ)和管理數(shù)據(jù)的倉庫”。是一個(gè)長期存儲(chǔ)在計(jì)算機(jī)內(nèi)的内斯、有組織的蕴潦、可共享的、統(tǒng)一管理的大量數(shù)據(jù)的集合俘闯。說人話就是按照一定的組織結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的倉庫潭苞。我們常見的Oracle,MySQL真朗,SQL Server都是數(shù)據(jù)庫此疹,只是有一些是商業(yè)的數(shù)據(jù)庫,一些是開源免費(fèi)的而已。
第二個(gè)問題蝗碎,數(shù)據(jù)分析為啥要學(xué)SQL?
其實(shí)理解了數(shù)據(jù)庫和SQL的關(guān)系之后振诬,這個(gè)問題就是句廢話了。巧婦難為無米之炊衍菱,數(shù)據(jù)分析的第一步肯定是要有數(shù)據(jù),數(shù)據(jù)哪里來肩豁?肯定要從數(shù)據(jù)庫中取出來脊串,SQL就是這樣一個(gè)方便、普適的取數(shù)工具清钥,因?yàn)閹缀跛械臄?shù)據(jù)庫的SQL語法都是相似的琼锋,甚至現(xiàn)在我們做大數(shù)據(jù)分析用到的Hive SQL,其語法99%也是和SQL一樣的祟昭,所以學(xué)會(huì)SQL基本上就掌握了所有數(shù)據(jù)庫的取數(shù)方法缕坎。
第三個(gè)問題,到底怎么學(xué)習(xí)SQL?
你以為SQL只是一個(gè)簡(jiǎn)單的取數(shù)工具篡悟,把數(shù)據(jù)從數(shù)據(jù)庫中拉出來就完事了谜叹?
1、SQL不僅能取數(shù)據(jù)搬葬,還提供了豐富的函數(shù)荷腊,可以做數(shù)據(jù)的清洗、轉(zhuǎn)換等數(shù)據(jù)處理急凰,而且SQL還能像Excel的透視表那樣女仰,可以方便地在不同的維度上對(duì)數(shù)據(jù)進(jìn)行求和、計(jì)數(shù)抡锈、去重計(jì)數(shù)疾忍、求平均等操作,進(jìn)而對(duì)數(shù)據(jù)進(jìn)行分析床三,而這一切一罩,也只需要短短的幾行SQL代碼就能實(shí)現(xiàn)。
2撇簿、如果數(shù)據(jù)很多很復(fù)雜擒抛,像Excel那樣存放在不同的Sheet里,要匯總在一起進(jìn)行分析补疑,要怎么處理呢歧沪?SQL的強(qiáng)大之處就在于可以非常方便地將不同的數(shù)據(jù)按照一定的關(guān)聯(lián)連接起來,這個(gè)關(guān)聯(lián)可以是內(nèi)連接inner join (找兩個(gè)表的交集)莲组、左連接left join (交集并且左表所有)诊胞、右連接(right join 交集并且右表所有)、全連接outer join(找兩個(gè)表的并集),可以通過各種不同的關(guān)聯(lián)條件可以實(shí)現(xiàn)各種不同的數(shù)據(jù)連接撵孤,最終對(duì)連接后的數(shù)據(jù)進(jìn)行分析迈着。
3、通過以上兩點(diǎn)來看邪码,SQL好像和Excel功能上沒啥區(qū)別霸2ぁ?Excel也能做數(shù)據(jù)清洗闭专,透視表也能做求和奴潘、計(jì)數(shù)等聚合操作,Excel的Power Pivot也能實(shí)現(xiàn)多個(gè)表之間的連接影钉。實(shí)際上画髓,SQL除了以上這些功能之外,還提供了一個(gè)非常強(qiáng)大的功能:窗口函數(shù)平委,窗口函數(shù)有什么用呢奈虾?如果我們要計(jì)算每個(gè)人在特定分組下的排名、每月銷售額的同比廉赔、環(huán)比肉微、截至每天的累計(jì)銷售額,這些數(shù)據(jù)分析中經(jīng)常遇到的蜡塌、且基礎(chǔ)的SQL語句無法很好解決的問題浪册,窗口函數(shù)就顯示出它的威力了。所以窗口函數(shù)也是判斷你是SQL基礎(chǔ)玩家和高階玩家的重要標(biāo)準(zhǔn)岗照,也是數(shù)據(jù)分析面試中最喜歡考查的內(nèi)容之一村象。
那么想入行數(shù)據(jù)分析的同學(xué)來說,怎么快速高效地掌握SQL這個(gè)數(shù)據(jù)分析的利器呢攒至?根據(jù)前面的介紹厚者,提升SQL水平可以按照這樣的學(xué)習(xí)路徑:
1、SQL基礎(chǔ)語法:首先熟悉SQL的基礎(chǔ)語法迫吐,對(duì)于數(shù)據(jù)分析而言库菲,重點(diǎn)掌握數(shù)據(jù)查詢SELECT,包括:如何使用WHERE進(jìn)行數(shù)據(jù)篩選志膀,熟練使用算數(shù)運(yùn)算符(+-*/)熙宇、邏輯運(yùn)算符(AND /OR/NOT)進(jìn)行字段計(jì)算和條件過濾,使用SUM 溉浙、COUNT烫止、AVG等聚合函數(shù)結(jié)合GROUP BY進(jìn)行不同維度下的匯總分析,如何用HAVING子句對(duì)聚合的結(jié)果進(jìn)行過濾戳稽,并使用ORDER BY 對(duì)最終的查詢結(jié)果進(jìn)行排序馆蠕。這一部分最最重要的一點(diǎn)是:要明確SQL語句的執(zhí)行順序與書寫書序的差異,這一點(diǎn)對(duì)于了解SQL的執(zhí)行過程很有幫助。作為SQL系列文章的第一篇內(nèi)容互躬,我們會(huì)在本文中重點(diǎn)講解播赁。
2、SQL常用函數(shù):在掌握了SQL基礎(chǔ)語法的基礎(chǔ)上吼渡,下面就要熟練掌握一些數(shù)據(jù)分析中常用的函數(shù)容为,包括但不限于:日期類函數(shù)、字符串類函數(shù)寺酪,數(shù)值運(yùn)算類函數(shù)等坎背。熟練使用這些函數(shù)可以幫助我們高效地做數(shù)據(jù)的清洗、轉(zhuǎn)換等數(shù)據(jù)處理工作房维。這部分內(nèi)容我們會(huì)在SQL系列文章的第二篇重點(diǎn)講解。
3抬纸、SQL子查詢與表連接:在之前的基礎(chǔ)上咙俩,我們還要熟練掌握子查詢和多個(gè)表之間的連接。數(shù)據(jù)分析工作中湿故,往往需要對(duì)多張有關(guān)聯(lián)的表進(jìn)行分析阿趁,對(duì)于簡(jiǎn)單的查詢,我們可以使用嵌套的子查詢解決坛猪。但如果涉及的表很多脖阵,且表之間的關(guān)聯(lián)關(guān)系比較復(fù)雜,我們就需要使用表連接墅茉,按照一定的關(guān)聯(lián)關(guān)系將各個(gè)表連接在一起命黔,常見的連接類型有內(nèi)連接:INNER JOIN 、左連接:LEFT JOIN就斤、右連接:RIGHT JOIN 悍募、全連接:FULL JOIN。這部分內(nèi)容我們會(huì)在SQL系列文章的第三篇文章中重點(diǎn)講解洋机。
4坠宴、SQL窗口函數(shù):前面三部分基本上已經(jīng)涵蓋了數(shù)據(jù)分析對(duì)于SQL的基礎(chǔ)要求,但是實(shí)際工作中绷旗,我們有一些比較復(fù)雜且常見的場(chǎng)景喜鼓,使用基礎(chǔ)語法并不能很好的解決,比如:每月銷售額的同比/環(huán)比衔肢、截至每天的累計(jì)銷售額庄岖、每種商品在它所屬分類下的銷售額排名,窗口函數(shù)就是為這些場(chǎng)景而生的角骤,如果能熟練掌握窗口函數(shù)顿锰,數(shù)據(jù)分析中就基本上不會(huì)遇到什么SQL的問題了。這部分內(nèi)容作為SQL系列文章的壓軸,會(huì)在第四篇文章中重點(diǎn)講解硼控。
另外刘陶,前面已經(jīng)總結(jié)了一些數(shù)據(jù)分析中常用的Excel使用技巧,有興趣的可以翻看之前的文章牢撼,包括:
【數(shù)據(jù)分析工具】數(shù)據(jù)分析案例實(shí)操匙隔,手把手教你學(xué)PowerBI !
【數(shù)據(jù)分析工具】Excel也能玩轉(zhuǎn)大數(shù)據(jù)分析?是時(shí)候祭出超級(jí)透視表Power Pivot了熏版!
【數(shù)據(jù)分析工具】數(shù)據(jù)透視表:菜鳥也能做數(shù)據(jù)分析(文末送教程)
【數(shù)據(jù)分析工具】數(shù)據(jù)分析必知必會(huì)的Excel函數(shù)(文末領(lǐng)取Excel教程)
02纷责、SQL基礎(chǔ)語法
1、SQL基礎(chǔ)操作
前面已經(jīng)按照從基礎(chǔ)到高階逐步提升的角度對(duì)SQL的學(xué)習(xí)階段進(jìn)行了劃分撼短,下面我們就來講講學(xué)習(xí)SQL的第一階段:SQL基礎(chǔ)語法再膳。
SQL是一種對(duì)數(shù)據(jù)庫中的數(shù)據(jù)表或者數(shù)據(jù)進(jìn)行增、刪曲横、改喂柒、查等操作的語言。根據(jù)操作對(duì)象的不同禾嫉,我們把SQL的基礎(chǔ)操作分為以下幾類:
DDL(Data Definition Language灾杰,數(shù)據(jù)定義語言)
用來創(chuàng)建、刪除或者修改數(shù)據(jù)庫以及數(shù)據(jù)庫中的數(shù)據(jù)表等對(duì)象熙参。DDL 包含以下幾種指令艳吠。
CREATE:創(chuàng)建數(shù)據(jù)庫、數(shù)據(jù)表等對(duì)象
DROP:刪除數(shù)據(jù)庫孽椰、數(shù)據(jù)表等對(duì)象
ALTER:修改數(shù)據(jù)庫昭娩、數(shù)據(jù)表等對(duì)象的結(jié)構(gòu)
DML(Data Manipulation Language,數(shù)據(jù)操縱語言)
用來查詢黍匾、新增题禀、修改或者刪除數(shù)據(jù)表中的記錄。DML 包含以下幾種指令膀捷。
SELECT:查詢數(shù)據(jù)表中的數(shù)據(jù)
INSERT:向數(shù)據(jù)表中插入新數(shù)據(jù)
UPDATE:修改數(shù)據(jù)表中的數(shù)據(jù)
DELETE:刪除數(shù)據(jù)表中的數(shù)據(jù)
DCL(Data Control Language迈嘹,數(shù)據(jù)控制語言)
用來確認(rèn)或者取消對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行的變更。除此之外全庸,還可以對(duì)數(shù)據(jù)庫用戶的權(quán)限進(jìn)行設(shè)定秀仲。DCL 包含以下幾種指令。
COMMIT:確認(rèn)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行的變更
ROLLBACK:取消對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行的變更
GRANT:賦予用戶操作權(quán)限
REVOKE:取消用戶的操作權(quán)限
作為數(shù)據(jù)分析師壶笼,我們的工作重心在于提取已有數(shù)據(jù)神僵,分析數(shù)據(jù)背后的業(yè)務(wù)價(jià)值,所以絕大多數(shù)時(shí)候我們只需要用到數(shù)據(jù)查詢SELECT覆劈,而不需要或者也不允許對(duì)數(shù)據(jù)庫保礼、數(shù)據(jù)表進(jìn)行增沛励、刪、改等操作炮障,畢竟公司也怕你刪庫跑路目派,哈哈哈!所以我們文章也會(huì)著重講解如何使用SQL進(jìn)行高效的數(shù)據(jù)提取和分析胁赢。
下面我們就通過一個(gè)實(shí)際案例企蹭,手動(dòng)創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表,手動(dòng)插入一些數(shù)據(jù)智末,然后基于這些數(shù)據(jù)完整地從頭到尾講解一下SQL的基礎(chǔ)語法谅摄,希望想學(xué)習(xí)SQL的小伙伴也動(dòng)起手來,一邊學(xué)習(xí)一邊操作系馆,在實(shí)踐中學(xué)習(xí)才是最高效的學(xué)習(xí)方法送漠。我們這里使用的數(shù)據(jù)庫是MySQL,使用的數(shù)據(jù)庫工具是MySQL Workbench 8.0 CE由蘑,具體的數(shù)據(jù)庫和工具我們到MySQL官網(wǎng)下載后安裝就可以了闽寡,我們就不再展開了。
2纵穿、創(chuàng)建數(shù)據(jù)庫
為了方便我們進(jìn)行后面的演示下隧,我們首先需要建立一個(gè)數(shù)據(jù)庫奢人,用于存放我們需要的數(shù)據(jù)表谓媒,打開MySQL Workbench 8.0 CE如下圖所示,主要功能介紹如下:
在中間空白處輸入SQL代碼:
-- 說明:本數(shù)據(jù)僅為演示需要何乎,無需關(guān)注數(shù)據(jù)真實(shí)性
-- 1句惯、 創(chuàng)建數(shù)據(jù)庫Sales,用于存放演示的數(shù)據(jù)
CREATE DATABASE Sales;
注意代碼中的—-是注釋符,意味著后面的內(nèi)容僅為更好地理解下面的代碼而做的說明支救,并不會(huì)執(zhí)行抢野。點(diǎn)擊圖中的執(zhí)行按鈕,執(zhí)行代碼各墨,執(zhí)行成功后指孤,會(huì)在查詢結(jié)果區(qū)顯示,并可以在數(shù)據(jù)庫預(yù)覽區(qū)發(fā)現(xiàn)多了一個(gè)數(shù)據(jù)庫Sales贬堵。
3恃轩、創(chuàng)建數(shù)據(jù)表(CREATE TABLE)
我們?cè)赟ales數(shù)據(jù)庫下創(chuàng)建一個(gè)產(chǎn)品銷售明細(xì)表Product,用于記錄每天各個(gè)商品的銷售情況黎做,其中包括以下字段:
USE Sales; -- 轉(zhuǎn)到Sales數(shù)據(jù)庫下執(zhí)行以下操作
CREATE TABLE Product
(
? ? ? product_id? ? CHAR(4)? ? ? NOT NULL,-- 產(chǎn)品id叉跛,字符類型CHAR
? ? ? product_name? VARCHAR(100) NOT NULL,-- 產(chǎn)品名稱,字符類型VARCHAR
? ? ? product_category? VARCHAR(32)? NOT NULL,-- 產(chǎn)品所屬類別蒸殿,字符類型VARCHAR
? ? ? sale_price? ? INT,-- 產(chǎn)品售價(jià)筷厘,整數(shù)類型INT
? ? ? cost_price INT,-- 產(chǎn)品成本價(jià)鸣峭,整數(shù)類型INT
? ? ? sale_date? ? DATE -- 銷售日期,日期類型DATE
)
4酥艳、向表中插入數(shù)據(jù)(INSERT)
用于存放各產(chǎn)品銷售記錄的product表已經(jīng)創(chuàng)建好摊溶,下面我們就可以向表中插入數(shù)據(jù),這些數(shù)據(jù)只是用來演示說明玖雁,并無實(shí)際意義和真實(shí)性更扁。
INSERT INTO Product VALUES ('0001', 'iPHONE', '手機(jī)', 8000, 6500, '2020-09-20');
INSERT INTO Product VALUES ('0002', 'MacBook Pro', '電腦', 9500, 8000, '2020-09-11');
INSERT INTO Product VALUES ('0003', 'HUAWEI Mate40 Pro', '手機(jī)', 6000, 4800, '2020-09-11');
INSERT INTO Product VALUES ('0004', '索尼電視機(jī)', '電視機(jī)', 9000, 6800, '2020-09-20');
INSERT INTO Product VALUES ('0005', 'TCL電視機(jī)', '電視機(jī)', 6800, 5000, '2020-01-15');
INSERT INTO Product VALUES ('0006', '創(chuàng)維電視機(jī)', '電視機(jī)', 5000, 3000, '2020-09-20');
INSERT INTO Product VALUES ('0007', '小米電視機(jī)', '電視機(jī)', 3800, 2500, '2008-04-28');
INSERT INTO Product VALUES ('0008', '聯(lián)想筆記本', '電腦', 4000, 3000,'2020-11-11');
插入成功后,查詢結(jié)果區(qū)會(huì)有成功的標(biāo)志赫冬。
5浓镜、查詢數(shù)據(jù)(SELECT)
使用SELECT子句可以從表中查詢出需要的列。
1劲厌、為了方便我們理解各列是什么含義膛薛,我們可以通過AS為列設(shè)定別名;
2、我們可以新增一列常量列constant补鼻,即這一列的所以值都是我們指定的常量;
3哄啄、如果我們希望查詢結(jié)果按照某個(gè)字段進(jìn)行排序,可以使用ORDER BY DESC/ASC進(jìn)行降序/升序排序风范;
4咨跌、另外,為了防止我們查詢的數(shù)據(jù)量太大硼婿,我們可以使用limit 5锌半,把查詢結(jié)果限制在5行。
例如:我們想看看按照產(chǎn)品id升序排列的5條記錄寇漫。
SELECT
product_id AS '產(chǎn)品id',
product_name AS '產(chǎn)品名稱',
cost_price AS '成本價(jià)格',
'我是個(gè)常量' AS constant
FROM Product
ORDER BY product_id ASC
limit 5;
結(jié)果如下所示:
6刊殉、指定查詢的條件(WHERE)
很多時(shí)候我們只需要選取部分?jǐn)?shù)據(jù),而不是整個(gè)數(shù)據(jù)表的數(shù)據(jù)州胳,所以這個(gè)時(shí)候我們需要在查詢的時(shí)候設(shè)置過濾條件记焊,篩選出我們需要的數(shù)據(jù)。
例如:我們要查看Product中所有“手機(jī)”類產(chǎn)品的產(chǎn)品名稱栓撞。
SELECT DISTINCT product_name, product_category
FROM Product;
WHERE product_category = '手機(jī)';
結(jié)果如下:
7遍膜、算術(shù)運(yùn)算符和比較運(yùn)算符
有時(shí)候我們需要對(duì)數(shù)據(jù)表中的字段進(jìn)行加減乘除(+-*/)運(yùn)算以產(chǎn)生一個(gè)新的字段,比如我們?nèi)绻胍?jì)算每筆交易中的凈利潤瓤湘,就可以通過銷售價(jià)sale_price減去成本價(jià)格cost_price獲得瓢颅。
除了算數(shù)運(yùn)算符(+-*/),我們?cè)谛枰O(shè)置篩選條件查詢數(shù)據(jù)的時(shí)候岭粤,常常需要用到如下所示的比較運(yùn)算符惜索,做一些復(fù)雜的過濾條件。
等于 =
不等于 <>
大于 >
大于等于 >=
小于 << span="">
小于等于 <=< span="">
介于兩者之間 BETWEEN
我們通過一個(gè)例子剃浇,將算數(shù)運(yùn)算符和比較運(yùn)算符結(jié)合使用巾兆。
例如:我們想查看利潤不低于500的所有的銷售記錄猎物。
SELECT
product_id,
product_name,
sale_price,
cost_price,
sale_price-cost_price AS 'profit' -- 通過算數(shù)運(yùn)算產(chǎn)生一個(gè)新的字段
FROM Product
where sale_price-cost_price>=500;
結(jié)果如下:
8、邏輯運(yùn)算符(NOT角塑、AND蔫磨、OR)
上面介紹的查詢條件都是單個(gè)條件,實(shí)際情況下我們可能會(huì)需要設(shè)置多個(gè)條件對(duì)數(shù)據(jù)進(jìn)行篩選圃伶,這個(gè)時(shí)候就需要用到邏輯運(yùn)算符NOT堤如、AND、OR對(duì)多個(gè)條件進(jìn)行邏輯運(yùn)算窒朋。
NOT
NOT運(yùn)算符在當(dāng)前查詢條件不成立時(shí)整個(gè)查詢條件才成立搀罢,即取出不滿足當(dāng)前條件的記錄,其意思相當(dāng)于取反侥猩。
例如:我們想查看售價(jià)不大于5000元的銷售記錄榔至。
SELECT
product_id,
product_name,
sale_price,
cost_price
FROM Product
WHERE NOT sale_price > 5000; -- (也就是sale_price<=5000)
結(jié)果如下:
AND
AND運(yùn)算符在其兩側(cè)的查詢條件都成立時(shí)整個(gè)查詢條件才成立,其意思相當(dāng)于“并且”欺劳。
例如:我們想查看“電視機(jī)”產(chǎn)品類別下售價(jià)在6000以上(包含)的銷售數(shù)據(jù)唧取。
SELECT
product_id,
product_name,
sale_price,
cost_price
FROM Product
WHERE product_category = '電視機(jī)'
AND sale_price >= 6000;
結(jié)果如下:
OR
OR運(yùn)算符在其兩側(cè)的查詢條件有一個(gè)成立時(shí)整個(gè)查詢條件都成立,其意思相當(dāng)于“或者”划提。
例如:我們想查看產(chǎn)品類別是“手機(jī)”或者“電腦”的銷售記錄枫弟。
SELECT
product_id,
product_name,
sale_price,
cost_price
FROM Product
WHERE product_category = '手機(jī)'
OR product_category = '電腦';
結(jié)果如下:
9、聚合函數(shù)(SUM/COUNT/...)
按照上面的步驟鹏往,我們已經(jīng)可以按照需求設(shè)置不同的篩選條件淡诗,篩選出我們需要的數(shù)據(jù),完成了數(shù)據(jù)提取的工作掸犬。接下來袜漩,我們就可以針對(duì)提取的數(shù)據(jù)做一些聚合操作绪爸,進(jìn)行簡(jiǎn)單的分析湾碎。
常用的五個(gè)聚合函數(shù):
COUNT:計(jì)算表中的記錄數(shù)(行數(shù))
SUM:計(jì)算表中數(shù)值列中數(shù)據(jù)的合計(jì)值
AVG:計(jì)算表中數(shù)值列中數(shù)據(jù)的平均值
MAX:求出表中任意列中數(shù)據(jù)的最大值
MIN:求出表中任意列中數(shù)據(jù)的最小值
但是需要注意的是:
COUNT(*)計(jì)算全部數(shù)據(jù)的行數(shù)(包含NULL)
COUNT(column)計(jì)算某一列的行數(shù)(不包含NULL)
COUNT(DISTINCT column)計(jì)算刪除重復(fù)數(shù)據(jù)后的行數(shù)
SUM/AVG函數(shù)只能對(duì)數(shù)值類型的列使用,而MAX/MIN函數(shù)原則上可以適用于任何數(shù)據(jù)類型的列奠货。
我們通過下面的例子展示一下各個(gè)聚合函數(shù)的使用介褥。
SELECT
COUNT(*),-- 計(jì)算全部數(shù)據(jù)的行數(shù)(包含NULL)
COUNT(product_name), -- 計(jì)算某一列的行數(shù)(不包含NULL)
COUNT(DISTINCT product_name), -- 計(jì)算刪除重復(fù)數(shù)據(jù)后的行數(shù)
SUM(sale_price),-- 計(jì)算某列所有行的總和,這里是總銷售額
AVG(sale_price),-- 計(jì)算某列所有行的平均值递惋,這里是客單價(jià)
MAX(sale_date), -- 計(jì)算某列所有行的最大值柔滔,這里是最近的銷售日期
MIN(sale_date) -- 計(jì)算某列所有行的最小值,這里是最早的銷售日期
FROM Product;
10萍虽、對(duì)表進(jìn)行分組(GROUP BY)
GROUP BY可以像切蛋糕那樣將數(shù)據(jù)進(jìn)行分組睛廊,通常情況下GROUP BY和聚合函數(shù)搭配使用,用于計(jì)算在各種不同的分組下的聚合值杉编。例如超全,可以按照“商品種類”product_category和“銷售日期”sale_date將數(shù)據(jù)分組后再進(jìn)行匯總咆霜,計(jì)算不同商品種類、每天的銷售額嘶朱。
使用聚合函數(shù)和GROUP BY子句時(shí)需要注意以下 4點(diǎn):
1蛾坯、使用GROUP BY子句時(shí),SELECT子句中不能出現(xiàn)聚合鍵之外的列名疏遏。SELECT 子句中只能存在以下三種 元素:常數(shù) 脉课、聚合函數(shù)和GROUP BY子句中指定的列名(也就是聚合鍵)。
2财异、在GROUP BY子句中不能使用SELECT子句中定義的字段別名院刁。
3、GROUP BY子句結(jié)果的顯示是無序的岩喷。
4匈勋、GROUP BY和WHERE并用時(shí)SELECT語句的執(zhí)行順序:
FROM → WHERE → GROUP BY → SELECT
例如:我們想查看2021-07-01以來,不同商品種類庆揩、每天的銷售額俐东。
就可以先篩選銷售日期sale_date在2021-07-01以后的數(shù)據(jù),按照“商品種類”product_category和“銷售日期”sale_date將數(shù)據(jù)分組后订晌,再對(duì)sale_price進(jìn)行求和操作虏辫。
SELECT product_category,
sale_date,
SUM(sale_price)
FROM Product
WHERE sale_date > '2021-07-01'
GROUP BY product_category,
sale_date;
結(jié)果如下:
11、對(duì)聚合結(jié)果進(jìn)行過濾(HAVING)
有的時(shí)候我們還需要對(duì)聚合后的數(shù)據(jù)進(jìn)行過濾锈拨,什么意思呢砌庄?我們知道WHERE子句可以用來對(duì)原數(shù)據(jù)進(jìn)行過濾,取出數(shù)據(jù)表中符合條件的記錄奕枢,如果需要對(duì)聚合后的記錄進(jìn)行過濾娄昆,就需要用到HAVING子句,所以HAVING子句要寫在GROUP BY子句之后缝彬。
在使用HAVING子句對(duì)聚合結(jié)果進(jìn)行過濾的時(shí)候萌焰,需要注意以下幾點(diǎn):
1、因?yàn)镠AVING子句是對(duì)聚合的結(jié)果進(jìn)行過濾谷浅,所以要寫在GROUP BY子句之后扒俯。
2、HAVING子句后面的聚合值不能使用別名一疯,只能使用聚合公式撼玄,至于為什么,我們?cè)谙履闟QL執(zhí)行順序部分會(huì)展開講墩邀。
例如:上一步我們已經(jīng)計(jì)算得到2021-07-01以來掌猛,不同商品種類、每天的銷售額眉睹,我們現(xiàn)在要在這個(gè)基礎(chǔ)上篩選出荔茬,銷售額在10000以上的記錄只盹。
SELECT product_category,
sale_date,
SUM(sale_price) as GMV
FROM Product
WHERE sale_date > '2021-07-01'
GROUP BY product_category,
sale_date
HAVING SUM(sale_price)>10000 --對(duì)聚合結(jié)果進(jìn)行過濾,不能使用GMV別名
結(jié)果如下:可以看到,SUM(sale_price)在10000以下的記錄已經(jīng)被過濾掉兔院。
12殖卑、查詢結(jié)果排序(ORDER BY)
為了符合我們查看數(shù)據(jù)的習(xí)慣,很多時(shí)候我們需要對(duì)查詢的結(jié)果進(jìn)行排序坊萝,就需要用到ORDER BY孵稽。
ORDER BY使用時(shí)需要注意以下幾點(diǎn):
1、在ORDER BY子句中列名的后面使用關(guān)鍵字ASC/DESC可以進(jìn)行升序/降序排序十偶,默認(rèn)是升序排列菩鲜。
2、ORDER BY子句通常寫在SELECT語句的末尾惦积。
3接校、ORDER BY 子句中同時(shí)存在多個(gè)排序列時(shí),規(guī)則是優(yōu)先使用左側(cè)的鍵狮崩,以此類推蛛勉。
4、在ORDER BY子句中可以使用SELECT子句中定義的字段和聚合值的別名睦柴。
為什么ORDER BY 要寫在SELECT語句的末尾诽凌?為什么ORDER BY可以使用字段別名和聚合函數(shù)?這里就涉及到一個(gè)非常關(guān)鍵的問題:SQL語句的執(zhí)行順序坦敌,SQL語句的書寫順序如下:
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
但實(shí)際的執(zhí)行順序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
在這里可以看到侣诵,ORDER BY 是在執(zhí)行的最后一步,聚合操作等已經(jīng)在GROUP BY 環(huán)節(jié)完成了狱窘,且別名已經(jīng)在SELECT環(huán)節(jié)生效了杜顺,所以O(shè)RDER BY這一步可以使用聚合值的別名了,當(dāng)然這里也順便解釋了:為什么在使用HAVING對(duì)聚合結(jié)果過濾的時(shí)候不能使用別名蘸炸,因?yàn)閯e名是在SELECT環(huán)節(jié)才生效的躬络,在HAVING階段根本就沒有別名的存在。
例如:我們對(duì)上一步的結(jié)果按照日期升序幻馁、銷售額降序進(jìn)行展示洗鸵,注意HAVING 和ORDER BY中別名的使用區(qū)別越锈。
SELECT product_category,
sale_date,
SUM(sale_price) as GMV
FROM Product
WHERE sale_date > '2021-07-01'
GROUP BY product_category,
sale_date
HAVING SUM(sale_price)>10000 --對(duì)聚合結(jié)果進(jìn)行過濾,不能使用GMV別名
ORDER BY sale_date,GMV DESC -- 按照日期升序仗嗦、銷售額GMV降序排列
結(jié)果如下:先按照日期升序排列,同一日期的情況下甘凭,再按照GMV降序排列
以上就是數(shù)據(jù)分析工具—SQL基礎(chǔ)語法部分的內(nèi)容稀拐,部分?jǐn)?shù)據(jù)分析工具請(qǐng)翻看歷史文章,更多數(shù)據(jù)分析工具的文章持續(xù)更新中丹弱,敬請(qǐng)期待德撬,如果覺得不錯(cuò)铲咨,也歡迎分享、點(diǎn)贊和收藏哈~