SQL-Hive中的Where語句解析
本文轉載自微信公眾號「巡山貓說數據」,作者巡山貓說數據。轉載本文請聯系巡山貓說數據公眾號。
你好,我是巡山貓!
今天我們來講講Hive中最常用的 where 語句知識要點。
01-基礎語法
命令如下:
- SELECT 列名
- FROM 表名
- WHERE 列名 運算符 值 [AND 列名 運算符 值] [OR 列名 運算符 值];
備注:WHERE后的列名必須用真實列名,不能使用自定義的別名,否則會報錯。
02-謂詞操作符詳解
下面表中描述了謂詞操作符,這些操作符同樣可以用于JOIN…ON和HAVING語句中,后續我們會逐一介紹這兩個語句
備注:NULL在Hive中代表空值的意思。
03-AND & OR
用AND連接兩個及以上的謂詞操作符代表且的意思,即必須所有條件同時滿足;用OR連接兩個及以上的謂詞操作符代表或的意思,即至少有一個條件滿足即可。
下面舉幾個例子:
1、取出表t_od_use_cnt中滿足以下條件的5條記錄:
·日期為20190101到20190102之間;
·平臺取ios平臺(1為andriod,2為ios);
·當日使用次數大于等于30。
語句如下:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 BETWEEN 20190101 AND 20190102
- AND platform = '2'
- AND use_cnt >= 30 limit 5;
備注:數值型的值可以直接寫,但字符格式及string格式的值必須加引號
運行結果如下:
- 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版本且當日使用次數大于等于30 或 1,1和1.2版本且當日使用次數大于等于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;
備注:當and、or同時出現時,要使用()將條件區分開,Hive會優先執行括號內的條件語句。這樣一來避免邏輯錯誤,二來使邏輯更清晰。
運行結果如下:
- 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
這三種語句的含義和用法上面已經有所介紹,rlike、regexp功能和like功能一致,只是like是后面只支持簡單表達式匹配(_%),而rlike、regexp則支持標準正則表達式語法。所以如果正則表達式使用熟練的話,建議使用rlike,功能更加強大。所有的like匹配都可以被替換成rlike。反之,則不行。注意事項:like是從頭逐一字符匹配的,但是rlike則不是。這里我們舉幾個例子。
1、取出表t_od_use_cnt中滿足以下條件的5條記錄:
·日期大于20190102;
·user_id以5結尾
語句如下:
- SELECT *
- FROM app.t_od_use_cnt
- WHERE date_8 > 20190102
- AND user_id LIKE '%5' limit 5;
運行結果如下:
- 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;
運行結果如下:
- 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主要用于正則匹配,具體的正則表達式匹配規則我們后面的文章來具體說明。