天天看點

hive-DML-查詢

查詢文法:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT [offset,] rows]
           

SELECT 語句可以是聯合查詢的一部分,也可以是另一個查詢的子查詢。

table_reference表示查詢的輸入。它可以是正常表、視圖、連接配接構造或子查詢。

表名和列名不區分大小寫。

簡單查詢

全表查詢

指定列查詢

算術運算符

運算符 描述
A+B A和B相加
A-B A減去B
A*B A和B相乘
A/B A除以B
A%B A對B取餘
A&B A和B按位取與
A|B A和B按位取或
A^B A和B按位取異或
~A A按位取反

limit子句

LIMIT 子句可用于限制 SELECT 語句傳回的行數。

LIMIT 需要一個或兩個數字參數,它們都必須是非負整數常量。

第一個參數指定要傳回的第一行的偏移量,第二個參數指定要傳回的最大行數。

當給出單個參數時,它代表最大行數,偏移量預設為 0。

以下查詢傳回 5 個任意客戶

SELECT * FROM customers LIMIT 5;

以下查詢傳回要建立的前 5 個客戶

SELECT * FROM customers ORDER BY create_date LIMIT 5;
 

以下查詢傳回要建立的第 3 個到第 7 個客戶

SELECT * FROM customers ORDER BY create_date LIMIT 2,5;

這些例子來自hive官網
           

where子句

WHERE 條件是一個布爾表達式。也支援某些類型的子查詢。

比較運算符
操作符 支援的資料類型 描述
A=B 基本資料類型 如果A等于B則傳回TRUE,否則傳回FALSE
A<=>B 基本資料類型 如果A和B都為NULL,則傳回TRUE,否則傳回FALSE
A<>B, A!=B 基本資料類型 A或者B為NULL則傳回NULL;如果A不等于B,則傳回TRUE,反之傳回FALSE
A<B 基本資料類型 A或者B為NULL,則傳回NULL;如果A小于B,則傳回TRUE,反之傳回FALSE
A<=B 基本資料類型 A或者B為NULL,則傳回NULL;如果A小于等于B,則傳回TRUE,反之傳回FALSE
A>B 基本資料類型 A或者B為NULL,則傳回NULL;如果A大于B,則傳回TRUE,反之傳回FALSE
A>=B 基本資料類型 A或者B為NULL,則傳回NULL;如果A大于等于B,則傳回TRUE,反之傳回FALSE
A [NOT] BETWEEN B AND C 基本資料類型 如果A,B或者C任一為NULL,則結果為NULL。如果A的值大于等于B而且小于或等于C,則結果為TRUE,反之為FALSE。如果使用NOT關鍵字則可達到相反的效果。
A IS NULL 所有資料類型 如果A等于NULL,則傳回TRUE,反之傳回FALSE
A IS NOT NULL 所有資料類型 如果A不等于NULL,則傳回TRUE,反之傳回FALSE
IN(數值1, 數值2) 所有資料類型 使用 IN運算顯示清單中的值
A [NOT] LIKE B STRING 類型 B是一個SQL下的簡單正規表達式,也叫通配符模式,如果A與其比對的話,則傳回TRUE;反之傳回FALSE。B的表達式說明如下:‘x%’表示A必須以字母‘x’開頭,‘%x’表示A必須以字母’x’結尾,而‘%x%’表示A包含有字母’x’,可以位于開頭,結尾或者字元串中間。如果使用NOT關鍵字則可達到相反的效果。
A RLIKE B, A REGEXP B STRING 類型 B是基于java的正規表達式,如果A與其比對,則傳回TRUE;反之傳回FALSE。比對使用的是JDK中的正規表達式接口實作的,因為正則也依據其中的規則。例如,正規表達式必須和整個字元串A相比對,而不是隻需與其字元串比對。
like

通配符:

% 代表零個或多個字元(任意個字元)

_ 代表一個字元

邏輯運算符
操作符 含義
AND 邏輯并
OR 邏輯或
NOT 邏輯否

group by語句

按性别計算不同使用者的數量,可以編寫以下查詢:

INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count (DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
           

可以同時進行多個聚合,但是,任何兩個聚合都不能具有不同的 DISTINCT 列。例如,以下是可能的,因為 count(DISTINCT) 和 sum(DISTINCT) 指定了相同的列:

INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
           

但是,不允許以下查詢。不允許在同一個查詢中使用多個 DISTINCT 表達式。

INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip)
FROM pv_users
GROUP BY pv_users.gender;
           

使用 group by 子句時,select 語句隻能包含 group by 子句中包含的列

SELECT
   a,
   sum(b)
FROM
   t1
GROUP BY
   a;
           

以下查詢不工作,這是因為 select 子句有一個額外的列 ( b),它沒有包含在 group by 子句中(它也不是聚合函數)

SELECT
   a,
   b
FROM
   t1
GROUP BY
   a;
           

group by 語句後使用having語句進行過濾。