引言
目前實(shí)習(xí)階段,工作中用到最多的是hive sql。以前沒有發(fā)現(xiàn),sql,代碼也可寫的十分優(yōu)雅,有一些知識(shí)點(diǎn)不容小覷,把這些知識(shí)點(diǎn)整理如下:
1.where和on條件的區(qū)別
使用left join時(shí),原理簡單的可以描述為先將左邊的主表結(jié)果集查詢出來,然后遍歷主表結(jié)果集,對(duì)于每一條主表數(shù)據(jù)都會(huì)根據(jù)on后的條件去查詢從表,查到了就拿出從表中需要的數(shù)據(jù),查不到就為空。
也就是說on后的條件僅僅是針對(duì)從表數(shù)據(jù)進(jìn)行篩選的。這樣即使篩選不到也不影響最終的結(jié)果集數(shù)量。
而篩選條件放在where之后,就是對(duì)總的結(jié)果集進(jìn)行篩選了。
On在where條件之前執(zhí)行,因此效率比where略高
執(zhí)行過程:
兩條SQL:
1、select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
第一條SQL的過程:
第二條SQL的過程:
總結(jié):
其實(shí)以上結(jié)果的關(guān)鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會(huì)返回left或right表中的記錄,full則具有l(wèi)eft和right的特性的并集。 而inner jion沒這個(gè)特殊性,則條件放在on中和where中,返回的結(jié)果集是相同的。
2、 union和union all 區(qū)別
Union:對(duì)兩個(gè)結(jié)果集進(jìn)行并集操作,不包括重復(fù)行(即刪除重復(fù)項(xiàng)),同時(shí)進(jìn)行默認(rèn)規(guī)則的排序;
Union All:對(duì)兩個(gè)結(jié)果集進(jìn)行并集操作,包括重復(fù)行(即不刪除重復(fù)項(xiàng))不進(jìn)行排序;
測試:
(1)s1,s2兩個(gè)表的內(nèi)容
(2)union結(jié)果
(3)union all結(jié)果
3、 join & left outer join & Cross join
(1)Join 默認(rèn)為inner join
(2)Left join:
做連接時(shí),最好滿足右表到左表 數(shù)量遞增
思考一個(gè)問題:
多表做關(guān)聯(lián)時(shí),執(zhí)行順序是怎樣的?
比如 a join b join c,是a與b先做關(guān)聯(lián),然后再與C表做關(guān)聯(lián)嗎?
答案:
如果只是join(即內(nèi)連接,等同于inner join),則這里表的順序是沒有要求的,但如果是left join或right join則是有順序要求的
(3)Cross join(交叉連接) 笛卡爾積
交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。
簡單查詢兩張表組合,這是求笛卡兒積,效率最低。
笛卡兒積:笛卡爾乘積,也叫直積。假設(shè)集合A={a,b},集合B={0,1,2},則兩個(gè)集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以擴(kuò)展到多個(gè)集合的情況。類似的例子有,如果A表示某學(xué)校學(xué)生的集合,B表示該學(xué)校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。
笛卡爾積出現(xiàn)的三種情況:
1)交叉連接(顯式)
查詢學(xué)生的信息,其中包括學(xué)生ID,學(xué)生姓名和專業(yè)名稱。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName FROM Students CROSS JOIN Majors
查詢結(jié)果:
2)查詢多表
其實(shí)也是笛卡兒積,與CROSS JOIN等價(jià),以下查詢同上述結(jié)果一樣。
這種情況也查詢了兩張表中所有組合的全集。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName FROM Students,Majors
3)加了查詢條件
注意:在使用CROSS JOIN關(guān)鍵字交叉連接表時(shí),因?yàn)樯傻氖莾蓚€(gè)表的笛卡爾積,因而不能使用ON關(guān)鍵字,只能在WHERE子句中定義搜索條件。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName FROM Students CROSS JOIN Majors WHERE Students.MajorID = Majors.ID
查詢結(jié)果與INNER JOIN一樣,但是其效率就慢很多了
4、 hive 中常用的 時(shí)間格式的相互轉(zhuǎn)換
(1)時(shí)間戳格式——》日期型
from_unixtime(cast(pay_time / 1000 as bigint), 'yyyy-MM-dd') as pay_time
注:/1000是因?yàn)椤V蝗r(shí)間戳格式數(shù)據(jù)前13位即可
可實(shí)現(xiàn)時(shí)間戳格式——》日期時(shí)間
(2)日期時(shí)間型——》日期型
To_date()函數(shù)
(3)日期時(shí)間>>>>>>年/月/日/時(shí)/分/秒
year(string date),month(),day(),hour(),minute(),second()
原文參考鏈接:
時(shí)間格式轉(zhuǎn)化 https://blog.csdn.net/shuangshaung_/article/details/53611188
union & union all https://blog.csdn.net/qq_33326449/article/details/53079082
where & on https://blog.csdn.net/wb_snail/article/details/79235219
join, left join,cross join https://blog.csdn.net/scythe666/article/details/51881235
以上是目前遇到的幾個(gè)問題的總結(jié),未完待續(xù)、、、、