Hive-查詢(一)Select...From+Where+分組查詢


查詢(一)Select...From+Where+分組查詢

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available starting with Hive 0.13.0)

SELECT [ALL | DISTINCT] select_expr, elect_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 number]

一、基本查詢(Select…From)

1. 全表和特定列查詢

1)全表查詢

hive (default)> select * from emp;

2)選擇特定列查詢

hive (default)> select empno, ename from emp;

注意:

(1)SQL 語言大小寫不敏感。 

(2)SQL 可以寫在一行或者多行

(3)關鍵字不能被縮寫也不能分行

(4)各子句一般要分行寫。

(5)使用縮進提高語句的可讀性。

2. 列別名

1)重命名一個列。

2)便於計算。

3)緊跟列名,也可以在列名和別名之間加入關鍵字‘AS’ 

4)案例實操:

查詢名稱和部門

hive (default)> select ename AS name, deptno dn from emp;

OK

name dn

SMITH 20

ALLEN 30

WARD 30

JONES 20

MARTIN 30

BLAKE 30

CLARK 10

SCOTT 20

KING 10

TURNER 30

ADAMS 20

JAMES 30

FORD 20

MILLER 10

3. 算術運算符

運算符

描述

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按位取反

案例實操

查詢出所有員工的薪水后加1000顯示。

hive (default)> select sal +1000 from emp;

4. 常用函數

1)求總行數(count)

hive (default)> select count(1) cnt from emp;

    這里,count后的括號里的數字沒有效用(比如count(1)和count(0)結果是一樣的),count()就是計算指定列的行數。

2)求工資的最大值(max)

hive (default)> select max(sal) max_sal from emp;

3)求工資的最小值(min)

hive (default)> select min(sal) min_sal from emp;

4)求工資的總和(sum)

hive (default)> select sum(sal) sum_sal from emp;

5)求工資的平均值(avg)

hive (default)> select avg(sal) avg_sal from emp;

5. Limit語句

典型的查詢會返回多行數據。LIMIT子句用於限制返回的行數。

hive (default)> select * from emp limit 5;

這里是返回表中所有數據的前5行數據。

二、 Where語句

1)使用WHERE子句,將不滿足條件的行過濾掉。

2)WHERE子句緊隨FROM子句。

3)案例實操:

查詢出薪水大於1000的所有員工

hive (default)> select ename , sal from emp where sal > 1000;

1. 比較運算符(Between/In/ Is Null

1)下面表中描述了謂詞操作符,這些操作符同樣可以用於JOIN…ON和HAVING語句中。

操作符

支持的數據類型

描述

A=B

基本數據類型

如果A等於B則返回TRUE,反之返回FALSE

A<=>B

基本數據類型

如果A和B都為NULL,則返回TRUE,其他的和等號(=)操作符的結果一致,如果任一為NULL則結果為NULL

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是一個正則表達式,如果A與其匹配,則返回TRUE;反之返回FALSE。匹配使用的是JDK中的正則表達式接口實現的,因為正則也依據其中的規則。例如,正則表達式必須和整個字符串A相匹配,而不是只需與其字符串匹配。

2)案例實操

(1)查詢出薪水等於5000的所有員工

hive (default)> select * from emp where sal =5000;

(2)查詢工資在5001000的員工信息,注意between ... and 是閉區間-是個范圍

hive (default)> select * from emp where sal between 500 and 1000;

(3)查詢comm(獎金)為空的所有員工信息

hive (default)> select * from emp where comm is null;

(4)查詢工資是15005000的員工信息-是具體的數

hive (default)> select * from emp where sal IN (1500, 5000);

2. LikeRLike

1)使用LIKE運算選擇類似的值

2)選擇條件可以包含字符或數字:

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

_ 代表一個字符。

3)RLIKE子句是Hive中這個功能的一個擴展,其可以通過Java的正則表達式這個更強大的語言來指定匹配條件。

4)案例實操

(1)查找以2開頭薪水的員工信息

hive (default)> select * from emp where sal LIKE '2%';

(2)查找第二個數值為2的薪水的員工信息

hive (default)> select * from emp where sal LIKE '_2%';

(3)查找薪水中含有2的員工信息-兩種寫法

hive (default)> select * from emp where sal RLIKE '[2]';

hive (default)> select * from emp where sal LIKE'%2%';

3. 邏輯運算符(And/Or/Not

操作符

含義

AND

邏輯並

OR

邏輯或

NOT

邏輯否

案例實操

(1)查詢薪水大於1000,並且部門是30

hive (default)> select * from emp where sal>1000 and deptno=30;

(2)查詢薪水大於1000,或者部門是30

hive (default)> select * from emp where sal>1000 or deptno=30;

(3)查詢除了20部門和30部門以外的員工信息

hive (default)> select * from emp where deptno not IN(30, 20);

三、分組

1. Group By語句

GROUP BY語句通常會和聚合函數一起使用,按照一個或者多個列隊結果進行分組,然后對每個組執行聚合操作。

案例實操:

(1)計算emp表每個部門的平均工資

下面t作為表的別名-省略as

hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;

結果:

OK
t.deptno avg_sal
10 2916.6666666666665
20 2175.0
30 1566.6666666666667
Time taken: 72.134 seconds, Fetched: 3 row(s)

(2)計算emp每個部門中每個崗位的最高薪水

hive (default)> select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;

2. Having語句

1)having與where不同點

(1)where針對表中的列發揮作用,查詢數據;having針對查詢結果中的列發揮作用,篩選數據。

(2)where后面不能寫分組函數,而having后面可以使用分組函數。

(3)having只用於group by分組統計語句。

2)案例實操:

(1)求每個部門的平均薪水大於2000的部門

求每個部門的平均工資

hive (default)> select deptno, avg(sal) from emp group by deptno;

求每個部門的平均薪水大於2000的部門

hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM