本文通過(guò)案例進(jìn)行講解
假設(shè)數(shù)據(jù)庫(kù)有一個(gè)名為students_grade的表:
計(jì)算所有學(xué)生各個(gè)學(xué)科在2019年的平均分壤躲,篩選出平均分超過(guò)60分的記錄刷后,并且最后以平均分進(jìn)行降序排列沿彭。
-
代碼示例:
1峻汉、關(guān)鍵字的執(zhí)行順序
from -> where -> group by -> select -> having -> order by
-
關(guān)鍵字的執(zhí)行順序并不是完全按照代碼中書(shū)寫(xiě)的順序來(lái)執(zhí)行的
2互躬、from
-
from开仰,后面跟著原表拟枚,最終的結(jié)果表是基于該表進(jìn)行加工得到的
-
案例中,原表是students_grade众弓,其全名是由庫(kù)名和表名兩部分組成的恩溅,用“.”連接,如dw.students_grade
-
所以在表名中使用“_”進(jìn)行連接谓娃,而不用"."脚乡,避免引起歧義
3.where
-
where,表示在計(jì)算前對(duì)原表的記錄進(jìn)行篩選
-
Hive中大部分表示分區(qū)表滨达,使用分區(qū)字段可以加快查詢(xún)速度
-
對(duì)于分區(qū)表奶稠,where條件是不可或缺的,一定要在where條件中選擇分區(qū)范圍
4.group by
-
group by捡遍,用于分組锌订,確定后面聚合計(jì)算的范圍
-
案例中要計(jì)算同一個(gè)學(xué)生、同一個(gè)學(xué)科的平均分画株,因此使用group by id,name,subject
-
對(duì)于簡(jiǎn)單的不需要進(jìn)行分組計(jì)算的查詢(xún)辆飘,可以不使用group by
5.select
-
在from啦辐、where、group by語(yǔ)句都執(zhí)行完成后蜈项,才會(huì)開(kāi)始執(zhí)行select語(yǔ)句
-
select后面的是最終會(huì)出現(xiàn)在結(jié)果表的字段
-
select后的字段包括兩部分:用于分組的字段和利用聚合函數(shù)計(jì)算出的字段
6.group by
-
在group by語(yǔ)句存在的情況下芹关,select后的所有非聚合字段都會(huì)被視為分組字段,需要在group by語(yǔ)句中出現(xiàn)战得,否則就會(huì)報(bào)錯(cuò)
-
在group by后出現(xiàn)的分組字段充边,不在select語(yǔ)句中出現(xiàn)庸推,不會(huì)報(bào)錯(cuò)常侦,但是會(huì)引起歧義
-
需要保證select后的非聚合字段和group by后的分組字段一一對(duì)應(yīng)
7.as
-
在select語(yǔ)句中可以使用as為所有字段重命名,稱(chēng)為字段別名
-
通過(guò)聚合計(jì)算得到的字段贬媒,這一步是不可或缺的聋亡,否則會(huì)給出默認(rèn)的沒(méi)有任何含義的字段名
-
由于group by語(yǔ)句是在select語(yǔ)句前執(zhí)行的,因此select語(yǔ)句中不可以出現(xiàn)字段別名
8.having
-
只有存在group by語(yǔ)句時(shí)才會(huì)使用having际乘,沒(méi)有g(shù)roup by語(yǔ)句而只有having會(huì)報(bào)錯(cuò)
-
having主要用于對(duì)聚合計(jì)算后的字段進(jìn)行篩選
-
having語(yǔ)句在select語(yǔ)句之后執(zhí)行坡倔,可以使用字段別名
9.order by
-
用于排序
-
基于一列進(jìn)行排序的語(yǔ)法格式:"order by 字段名 asc/desc"
-
asc表示升序排列,desc表示降序排列
-
基于多列排序的語(yǔ)法格式:"order by c1 asc, c2 desc,c3 asc"
-
order語(yǔ)句在select語(yǔ)句之后執(zhí)行脖含,可以使用字段別名
參考文獻(xiàn)
1.《拿下Offer 數(shù)據(jù)分析師求職面試指南》徐麟 著