SQL-Hive中的Where語句解析
本文轉(zhuǎn)載自微信公眾號「巡山貓說數(shù)據(jù)」,作者巡山貓說數(shù)據(jù)。轉(zhuǎn)載本文請聯(lián)系巡山貓說數(shù)據(jù)公眾號。
你好,我是巡山貓!
今天我們來講講Hive中最常用的 where 語句知識要點。
01-基礎(chǔ)語法
命令如下:
- SELECT 列名
- FROM 表名
- WHERE 列名 運算符 值 [AND 列名 運算符 值] [OR 列名 運算符 值];
備注:WHERE后的列名必須用真實列名,不能使用自定義的別名,否則會報錯。
02-謂詞操作符詳解
下面表中描述了謂詞操作符,這些操作符同樣可以用于JOIN…ON和HAVING語句中,后續(xù)我們會逐一介紹這兩個語句
備注:NULL在Hive中代表空值的意思。
03-AND & OR
用AND連接兩個及以上的謂詞操作符代表且的意思,即必須所有條件同時滿足;用OR連接兩個及以上的謂詞操作符代表或的意思,即至少有一個條件滿足即可。
下面舉幾個例子:
1、取出表t_od_use_cnt中滿足以下條件的5條記錄:
·日期為20190101到20190102之間;
·平臺取ios平臺(1為andriod,2為ios);
·當(dāng)日使用次數(shù)大于等于30。
語句如下:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 BETWEEN 20190101 AND 20190102
- AND platform = '2'
- AND use_cnt >= 30 limit 5;
備注:數(shù)值型的值可以直接寫,但字符格式及string格式的值必須加引號
運行結(jié)果如下:
- hive (app)> SELECT *
- > FROM app.t_od_use_cnt
- > WHERE date_8 BETWEEN 20190101 AND 20190102
- > AND platform = '2'
- > AND use_cnt >= 30 limit 5;
- OK
- t_od_use_cnt.platform t_od_use_cnt.app_version t_od_use_cnt.user_id t_od_use_cnt.use_cnt t_od_use_cnt.is_active t_od_use_cnt.date_8
- 2 1.3 10001 49 1 20190101
- 2 1.1 10016 37 1 20190101
- 2 1.4 10025 44 1 20190101
- 2 1.1 10034 49 1 20190101
- 2 1.2 10039 37 1 20190101
- Time taken: 0.28 seconds, Fetched: 5 row(s)
2、取出表t_od_use_cnt中滿足以下條件的5條記錄:
·日期大于20190102;
·1,3和1.4版本且當(dāng)日使用次數(shù)大于等于30 或 1,1和1.2版本且當(dāng)日使用次數(shù)大于等于20。
語句如下:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 > 20190102
- AND (
- (
- app_version IN ('1.3', '1.4')
- AND use_cnt >= 30
- )
- OR (
- app_version IN ('1.1', '1.2')
- AND use_cnt >= 20
- )
- ) limit 5;
備注:當(dāng)and、or同時出現(xiàn)時,要使用()將條件區(qū)分開,Hive會優(yōu)先執(zhí)行括號內(nèi)的條件語句。這樣一來避免邏輯錯誤,二來使邏輯更清晰。
運行結(jié)果如下:
- hive (app)> SELECT *
- > FROM app.t_od_use_cnt
- > WHERE date_8 > 20190102
- > AND (
- > (
- > app_version IN ('1.3', '1.4')
- > AND use_cnt >= 30
- > )
- > OR (
- > app_version IN ('1.1', '1.2')
- > AND use_cnt >= 20
- > )
- > ) limit 5;
- OK
- t_od_use_cnt.platform t_od_use_cnt.app_version t_od_use_cnt.user_id t_od_use_cnt.use_cnt t_od_use_cnt.is_active t_od_use_cnt.date_8
- 2 1.2 10400 40 1 20190103
- 1 1.2 10402 32 1 20190103
- 1 1.2 10403 41 1 20190103
- 2 1.4 10405 50 1 20190103
- 2 1.1 10406 24 1 20190103
- Time taken: 0.298 seconds, Fetched: 5 row(s)
04-Like & Rlike & Regexp
這三種語句的含義和用法上面已經(jīng)有所介紹,rlike、regexp功能和like功能一致,只是like是后面只支持簡單表達式匹配(_%),而rlike、regexp則支持標準正則表達式語法。所以如果正則表達式使用熟練的話,建議使用rlike,功能更加強大。所有的like匹配都可以被替換成rlike。反之,則不行。注意事項:like是從頭逐一字符匹配的,但是rlike則不是。這里我們舉幾個例子。
1、取出表t_od_use_cnt中滿足以下條件的5條記錄:
·日期大于20190102;
·user_id以5結(jié)尾
語句如下:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 > 20190102
- AND user_id LIKE '%5' limit 5;
運行結(jié)果如下:
- hive (app)> SELECT *
- > FROM app.t_od_use_cnt
- > WHERE date_8 > 20190102
- > AND user_id LIKE '%5' limit 5;
- OK
- t_od_use_cnt.platform t_od_use_cnt.app_version t_od_use_cnt.user_id t_od_use_cnt.use_cnt t_od_use_cnt.is_active t_od_use_cnt.date_8
- 2 1.4 10405 50 1 20190103
- 1 1.1 10415 30 1 20190103
- 2 1.3 10425 15 1 20190103
- 1 1.3 10435 3 0 20190103
- 1 1.4 10445 43 1 20190103
- Time taken: 0.977 seconds, Fetched: 5 row(s)
2、取出表t_od_use_cnt中滿足以下條件的5條記錄:
·日期大于等于20190102;
·user_id中含有45。
語句如下:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 > 20190102
- AND user_id RLIKE '45' limit 5;
還可以把RLIKE替換為REGEXP:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 > 20190102
- AND user_id REGEXP '45' limit 5;
運行結(jié)果如下:
- hive (app)> SELECT *
- > FROM app.t_od_use_cnt
- > WHERE date_8 > 20190102
- > AND user_id RLIKE '45' limit 5;
- OK
- t_od_use_cnt.platform t_od_use_cnt.app_version t_od_use_cnt.user_id t_od_use_cnt.use_cnt t_od_use_cnt.is_active t_od_use_cnt.date_8
- 1 1.4 10445 43 1 20190103
- 2 1.5 10450 6 1 20190103
- 2 1.5 10451 38 1 20190103
- 1 1.4 10452 44 1 20190103
- 1 1.5 10453 37 1 20190103
- Time taken: 0.13 seconds, Fetched: 5 row(s)
- hive (app)> SELECT *
- > FROM app.t_od_use_cnt
- > WHERE date_8 > 20190102
- > AND user_id REGEXP '45' limit 5;
- OK
- t_od_use_cnt.platform t_od_use_cnt.app_version t_od_use_cnt.user_id t_od_use_cnt.use_cnt t_od_use_cnt.is_active t_od_use_cnt.date_8
- 1 1.4 10445 43 1 20190103
- 2 1.5 10450 6 1 20190103
- 2 1.5 10451 38 1 20190103
- 1 1.4 10452 44 1 20190103
- 1 1.5 10453 37 1 20190103
- Time taken: 0.352 seconds, Fetched: 5 row(s)
RLIKE、REGEXP主要用于正則匹配,具體的正則表達式匹配規(guī)則我們后面的文章來具體說明。