SQL or Hive SQL基礎(chǔ)易忽視知識點整理(1)

引言
目前實習(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í)行過程:


表1表2

兩條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執(zhí)行過程

第二條SQL的過程:


第二條sql執(zhí)行過程

總結(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)容

表內(nèi)容

(2)union結(jié)果


union結(jié)果

(3)union all結(jié)果


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é)果:


查詢結(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é)果

查詢結(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ù)、、、、

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容