文章目錄
六 、查詢
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Selectjava
查詢語句語法:正則表達式
SELECT [ALL | DISTINCT] select_expr, select_expr, ... -- all是默認的 FROM table_reference [WHERE where_condition] [GROUP BY col_list] [HAVING col_list] [ORDER BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number] -- limit(2,5):表示從第二行開始顯示5行數據
一、基本查詢(select … from)
1.1 全表和特定列查詢
1.1.1 數據準備sql
(0)原始數據apache
dept: 10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700
emp: 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981-4-2 2975.00 20 7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20 7839 KING PRESIDENT 1981-11-17 5000.00 10 7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987-5-23 1100.00 20 7900 JAMES CLERK 7698 1981-12-3 950.00 30 7902 FORD ANALYST 7566 1981-12-3 3000.00 20 7934 MILLER CLERK 7782 1982-1-23 1300.00 10
(1)建立部門表函數
create table if not exists dept( deptno int, dname string, loc int ) row format delimited fields terminated by '\t';
(2) 建立員工表spa
create table if not exists emp( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int) row format delimited fields terminated by '\t'
(3)導入數據code
load data local inpath '/opt/module/hive/datas/dept.txt' into table dept; load data local inpath '/opt/module/hive/datas/emp.txt' into table emp;
1.1.2 全表查詢orm
hive (default)> select * from emp;
1.1.3 選擇特定列查詢接口
hive (default)> select empno, ename from emp;
注意:字符串
(1)SQL 語言大小寫不敏感。
(2)SQL 能夠寫在一行或者多行
(3)關鍵字不能被縮寫也不能分行
(4)各子句通常要分行寫。
(5)使用縮進提升語句的可讀性。
1.2 列別名
-
重命名一個列
-
便於計算
-
緊跟列名,也能夠在列名和別名之間加入關鍵字‘AS’
-
案例實操
查詢名稱和部門
hive (default)> select ename AS name, deptno dn from emp;
1.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按位取反 |
案例實操:查詢出全部員工的薪水後加1顯示。7的取反爲-8,-9的取反爲8.
hive (default)> select sal +1 from emp;
1.4 經常使用函數
1) 求總行數(count)
hive (default)> select count(*) cnt from emp;
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;
1.5 Limit 語句
典型的查詢會返回多行數據。LIMIT子句用於限制返回的行數。
hive (default)> select * from emp limit 5; hive (default)> select * from emp limit 2,3;
1.6 Where 語句
-
1)使用WHERE子句,將不知足條件的行過濾掉
-
2)WHERE 子句緊隨 FROM 子句
-
3)案例實操
-
查詢出薪水大於1000的全部員工
hive (default)> select * from emp where sal >1000;
- 注意:where 子句中不能使用字段別名。
1.7 比較運算符(Between/In/ Is Null)
1)下面表中描述了謂詞操做符,這些操做符一樣能夠用於 JOIN…ON 和 HAVING 語句中。
操做符 | 支持的數據類型 | 描述 |
---|---|---|
A=B | 基本數據類型 | 若是A等於B則返回TRUE,反之返回FALSE |
A<=>B | 基本數據類型 | 若是A和B都爲NULL,則返回TRUE,若是一邊爲NULL,返回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相匹配,而不是隻需與其字符串匹配。 |
2)案例實操
(1)查詢出薪水等於5000的全部員工
hive (default)> select * from emp where sal =5000;
(2)查詢工資在500到1000的員工信息
hive (default)> select * from emp where sal between 500 and 1000;
(3)查詢comm爲空的全部員工信息
hive (default)> select * from emp where comm is null;
(4)查詢工資是1500或5000的員工信息
hive (default)> select * from emp where sal IN (1500, 5000);
1.8 Like 和 RLike
1)使用LIKE運算選擇相似的值
2)選擇條件能夠包含字符或數字:
-
% 表明零個或多個字符(任意個字符)。
-
_ 表明一個字符。
3)RLIKE子句
- RLIKE子句是Hive中這個功能的一個擴展,其能夠經過Java的正則表達式這個更強大的語言來指定匹配條件。
4)案例實操
(1)查找名字以A開頭的員工信息
hive (default)> select * from emp where ename LIKE 'A%'; hive (default)> select * from emp where ename RLIKE '^A';
(2)查找名字中第二個字母爲A的員工信息
hive (default)> select * from emp where ename LIKE '_A%'; hive (default)> select * from emp where ename RLIKE '^.A';
(3)查找名字中帶有A的員工信息
hive (default)> select * from emp where ename LIKE '%A%'; hive (default)> select * from emp where ename RLIKE '[A]';
1.9 邏輯運算符(And/Or/Not)
操做符 | 含義 |
---|---|
AND | 邏輯並 |
OR | 邏輯或 |
NOT | 邏輯否 |
1)案例實操
(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);