您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何快速上手SQL”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何快速上手SQL”這篇文章吧。
為了方便練習(xí)SQL語法,特地準(zhǔn)備了兩張hive表,ide_test.flights和 ide_test.airports, 表結(jié)構(gòu)如下面的建表語句。另外兩張表中各有數(shù)行測(cè)試數(shù)據(jù),可以在練習(xí)SQL時(shí)直接使用。
Flights表
CREATE TABLE `ide_test.flights`( `year` string COMMENT 'year', `month` string COMMENT 'month', `day` string COMMENT 'day', `dep_time` string COMMENT '起飛時(shí)間', `crs_dep_time` string COMMENT '計(jì)劃起飛時(shí)間', `arr_time` string COMMENT '到達(dá)時(shí)間', `crs_arr_time` string COMMENT '計(jì)劃到達(dá)時(shí)間', `carrier_code` string COMMENT '航空公司代號(hào)', `flight_num` string COMMENT '航班號(hào)', `actual_elapsed_time` string COMMENT '實(shí)際耗時(shí)', `crs_elapsed_time` string COMMENT '計(jì)劃耗時(shí)', `air_time` string COMMENT '飛行時(shí)間', `arr_delay` string COMMENT '到達(dá)延遲', `dep_delay` string COMMENT '起飛延遲', `origin` string COMMENT '起飛機(jī)場(chǎng)', `dest` string COMMENT '目標(biāo)機(jī)場(chǎng)', `distance` string COMMENT '距離') COMMENT '測(cè)試數(shù)據(jù)-航班信息'
Airports表
CREATE TABLE `ide_test.airports`( `name` string COMMENT 'name', `country` string COMMENT 'country', `area_code` string COMMENT 'area_code', `code` string COMMENT 'code') COMMENT '測(cè)試數(shù)據(jù)-機(jī)場(chǎng)信息'
使用select語句可以查看表里的數(shù)據(jù)
select用法
select name from ide_test.airports limit 5 --查詢ide_test.airports表中的name列,返回5行 select * from ide_test.airports limit 5 --使用 '*'代表表中所有列
特別提示:限制SQL返回的行數(shù)是一個(gè)好習(xí)慣,如上面的 limit 5, 表示最多返回5行數(shù)據(jù)
資料: 深入理解Hive Select語法
使用where語句,可以根據(jù)指定的條件刷選數(shù)據(jù),例如查看航班號(hào)為335的航班信息
where用法
select * -- 返回表里所有列 from ide_test.flights where flight_num= '335' --返回flight_num列為'335'的記錄 limit 5
Tips: where后面跟的是一個(gè)邏輯表達(dá)式,多個(gè)邏輯表達(dá)式用 AND、OR來連接
某一列(或多列)時(shí)常會(huì)有重復(fù)的值,有時(shí)候需要去重之后再查看,可以使用distinct語句來完成這個(gè)功能。例如查看ide_test.flights表中包含了那幾年的數(shù)據(jù),可以使用下面的SQL語句來完成:
distinct 用法
select distinct year -- distinct會(huì)對(duì)year列的值去重之后,再返回 from ide_test.flights limit 10
Tips**:**查看某列包含了哪些值,有更好的寫法,這里只是展示下distinct語句的用法
找出起飛時(shí)間最晚的5個(gè)航班
order by 用法
select origin, dest, flight_num, dep_time from ide_test.flights order by dep_time desc -- 按照起飛時(shí)間倒序排列, desc表示由大到小排序, asc(或者是省略不寫)表示由小到大排序 limit 5
使用count()函數(shù)可以計(jì)數(shù),比如要看一下ide_test.flights表里一共有多少個(gè)航班信息,則可以這么寫:
count 用法
select count(flight_num) as cnt -- count函數(shù)表示計(jì)數(shù) from ide_test.flights limit 10
sum()表示按照指定的列求和,比如計(jì)算一下335號(hào)航班一共飛行了多少公里
sum 用法
select sum(cast(distance as int)) as total_distance --sum函數(shù)表示求和 from ide_test.flights where flight_num = '335' limit 10
Tips: count/sum這種函數(shù)叫聚合函數(shù),還有其他聚合函數(shù),比如avg/max/min分別用戶求平均值、最大值和最小值
資料: 深入理解Hive函數(shù)
group by語句的用處很大,它可以先對(duì)數(shù)據(jù)分組、然后再計(jì)算,看個(gè)例子就明白了。比如,要計(jì)算每個(gè)航班飛行的里程數(shù),并按照總數(shù)由大到小取前10個(gè),寫法如下:
group by 用法
select flight_num, sum(distance) as total_distance --除了sum/count/avg/min/max這些聚合函數(shù)之外,明確寫在select之后的列,必須同時(shí)出現(xiàn)在group by的后面 from ide_test.flights group by flight_num --按照航班號(hào)分組,對(duì)每一組的里程數(shù)求和 order by total_distance desc limit 10
還有一種情況,查詢總飛行里程數(shù)大于3000的航班號(hào),這時(shí)having語句就排上用場(chǎng)了
having 語法
select flight_num --寫在select之后的列,必須同時(shí)出現(xiàn)在group by的后面 from ide_test.flights group by flight_num having sum(distance) > 3000 --刷選出飛行總里程大于3000的航班 limit 5
小思考:為什么這種情況下要使用having來作為篩選條件,而不是使用where?
資料: 深入理解Hive Group by語法
要計(jì)算飛行總里程大于3000的航班數(shù)量,SQL可以這么寫
子查詢用法
select count(1) as cnt from ( select flight_num from ide_test.flights group by flight_num having sum(distance) > 3000 ) t
Tips: 子查詢的用法和普通hive表是一樣的,一般為了清晰,會(huì)使用括號(hào)’()’把子查詢包含起來
資料:深入理解Hive 子查詢
假如,我們計(jì)劃查詢每個(gè)航班的飛行里程和起始機(jī)場(chǎng)名稱,因?yàn)檫@兩個(gè)信息分別存儲(chǔ)在兩張不同的hive表中,因此需要同時(shí)查詢兩張hive表才能得到結(jié)果,寫法如下
join 用法
select p.flight_num, -- 從flights表取出航班號(hào) p.distance, --從flights表取出飛行里程 q.name --從airports表取出出發(fā)的機(jī)場(chǎng)名稱 from ide_test.flights p left join ide_test.airports q on p.origin = q.code limit 10
Tips**:**
left join**:**左表關(guān)聯(lián)右表,當(dāng)坐標(biāo)中存在某值而右表不存在時(shí),則右表對(duì)應(yīng)信息使用null代替
inner join**:**只有左表和右表都存在對(duì)應(yīng)值的時(shí)候,才出現(xiàn)的結(jié)果中
right join**:**與left join相反
full outer join**:**當(dāng)左表或右表不存在相應(yīng)值時(shí),使用null代替
注意:
如果A中有m條記錄,B中有n條記錄,A join B的時(shí)候,則最多會(huì)產(chǎn)生m\n*條記錄,想想為什么?
資料
深入理解Hive Join語法
UNION 語句符用于合并兩個(gè)或多個(gè) SELECT 語句的結(jié)果集。
選出飛行里程大于1000或小于100的航班,SQL寫法如下:
注意:這里只是為了展示union用法,顯然應(yīng)該有更好的寫法,自己思考下:)
union 用法
select flight_num from ide_test.flights where distance > 1000 union select flight_num from ide_test.flights where distance < 100
Tips: 請(qǐng)注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語句中的列的順序必須相同
資料:深入理解Hive Union語法
查詢航班的飛行距離,按照距離分成“長(zhǎng)、中、短”三個(gè)級(jí)別,可以借助case when語句來實(shí)現(xiàn),示例寫法:
case when 用法
select flight_num, distance, case when distance > 3000 then '長(zhǎng)距離航班' when distance > 1000 then '中距離航班' else '近距離航班' end as flight_level from ide_test.flights limit 10
以上是“如何快速上手SQL”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。