查詢文法:
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語句進行過濾。