【數(shù)據(jù)分析工具】SQL基礎(chǔ)語法必知必會(huì)

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)贊和收藏哈~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜓洪,一起剝皮案震驚了整個(gè)濱河市纤勒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隆檀,老刑警劉巖摇天,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恐仑,居然都是意外死亡泉坐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門裳仆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腕让,“玉大人,你說我怎么就攤上這事歧斟〈客瑁” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵静袖,是天一觀的道長液南。 經(jīng)常有香客問我,道長勾徽,這世上最難降的妖魔是什么滑凉? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮喘帚,結(jié)果婚禮上畅姊,老公的妹妹穿的比我還像新娘。我一直安慰自己吹由,他們只是感情好若未,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倾鲫,像睡著了一般粗合。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乌昔,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天隙疚,我揣著相機(jī)與錄音,去河邊找鬼磕道。 笑死供屉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伶丐,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼悼做,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了哗魂?” 一聲冷哼從身側(cè)響起肛走,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎录别,沒想到半個(gè)月后羹与,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庶灿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年纵搁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片往踢。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腾誉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峻呕,到底是詐尸還是另有隱情利职,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布瘦癌,位于F島的核電站猪贪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讯私。R本人自食惡果不足惜热押,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斤寇。 院中可真熱鬧桶癣,春花似錦、人聲如沸娘锁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫秆。三九已至间雀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镊屎,已是汗流浹背惹挟。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杯道,地道東北人匪煌。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓责蝠,卻偏偏與公主長得像党巾,于是被迫代替她去往敵國和親萎庭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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