引言
目前實習(xí)階段,工作中用到最多的是hive sql。以前沒有發(fā)現(xiàn),sql,代碼也可寫的十分優(yōu)雅,有一些知識點不容小覷,把這些知識點整理如下:
1.where和on條件的區(qū)別
使用left join時,原理簡單的可以描述為先將左邊的主表結(jié)果集查詢出來,然后遍歷主表結(jié)果集,對于每一條主表數(shù)據(jù)都會根據(jù)on后的條件去查詢從表,查到了就拿出從表中需要的數(shù)據(jù),查不到就為空。
也就是說on后的條件僅僅是針對從表數(shù)據(jù)進行篩選的。這樣即使篩選不到也不影響最終的結(jié)果集數(shù)量。
而篩選條件放在where之后,就是對總的結(jié)果集進行篩選了。
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é):
其實以上結(jié)果的關(guān)鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有l(wèi)eft和right的特性的并集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結(jié)果集是相同的。
2、 union和union all 區(qū)別
Union:對兩個結(jié)果集進行并集操作,不包括重復(fù)行(即刪除重復(fù)項),同時進行默認(rèn)規(guī)則的排序;
Union All:對兩個結(jié)果集進行并集操作,包括重復(fù)行(即不刪除重復(fù)項)不進行排序;
測試:
(1)s1,s2兩個表的內(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ù)量遞增
思考一個問題:
多表做關(guān)聯(lián)時,執(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},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}??梢詳U展到多個集合的情況。類似的例子有,如果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)查詢多表
其實也是笛卡兒積,與CROSS JOIN等價,以下查詢同上述結(jié)果一樣。
這種情況也查詢了兩張表中所有組合的全集。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName FROM Students,Majors
3)加了查詢條件
注意:在使用CROSS JOIN關(guān)鍵字交叉連接表時,因為生成的是兩個表的笛卡爾積,因而不能使用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 中常用的 時間格式的相互轉(zhuǎn)換
(1)時間戳格式——》日期型
from_unixtime(cast(pay_time / 1000 as bigint), 'yyyy-MM-dd') as pay_time
注:/1000是因為。只取時間戳格式數(shù)據(jù)前13位即可
可實現(xiàn)時間戳格式——》日期時間
(2)日期時間型——》日期型
To_date()函數(shù)
(3)日期時間>>>>>>年/月/日/時/分/秒
year(string date),month(),day(),hour(),minute(),second()
原文參考鏈接:
時間格式轉(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
以上是目前遇到的幾個問題的總結(jié),未完待續(xù)、、、、