目录
(1)数据准备
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
(2)建表
dept
- create table if not exists dept(
- deptno int,
- dname string,
- loc int)
- row format delimited fields terminated by ' ';
emp
- 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 ' ';
(3)导入数据
- #dept
- load data local inpath '/root/datas/dept.txt' into table dept;
-
- #emp
- load data local inpath '/root/datas/emp.txt' into table emp;
(4)全表查询
- select * from dept;
-
- select * from emp;

(5)特定列查询
select empno,ename from emp;

重命名一个列便于计算,列别名紧跟列名,也可以在列名和别名之间加入关键字AS。
select empno AS pno,ename name from emp;

| 运算符 | 描述 |
| A+B | 加 |
| A-B | 减 |
| A*B | 乘 |
| A/B | 除 |
| A%B | 取余 |
| A&B | 按位取与 |
| A|B | 按位取或 |
| A^B | 按位取异或 |
| ~A | 按位取反 |
| 操作符 | 数据类型 | 描述 |
| 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 | 基本数据类型 | 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(C>=A>=B)则结果为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。 例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。 |
例子:
- #查询工资在500到1000的员工
- select * from emp where sal between 500 and 1000;
-
- #查询comm为空的所有员工
- select * from emp where comm is null;
-
- #查询工资是500或5000的员工
- select * from emp where sal IN (500, 5000);
| 操作符 | 含义 |
| AND | 逻辑并 |
| OR | 逻辑或 |
| NOT | 逻辑否 |
例子:
- #查询薪水大于1000,部门是30
- select * from emp where sal>1000 and deptno=30;
-
- #查询薪水大于1000,或者部门是30
- select * from emp where sal>1000 or deptno=30;
-
- #查询除了20部门和30部门以外的员工信息
- select * from emp where deptno not IN(30, 20);

(1)总行数(count)
select count(*) con from emp;

(2)最大值(max)
select max(sal) max_sal from emp;

(3)最小值(min)
select min(sal) min_sal from emp;

(4)总和(sum)
select sum(sal) sum_sal from emp;

(5)平均值(avg)
select avg(sal) avg_sal from emp;

典型的查询会返回多行数据,LIMIT子句用于限制返回的行数。
select * from emp limit 3;

使用WHERE子句,将不满足条件的行过滤掉,WHERE子句紧随FROM子句。
查询sal大于2000的员工:
select * from emp where sal > 2000;

使用LIKE运算选择类似的值,选择条件可以包含字符或数字:
% 代表零个或多个字符(任意个字符);
_ 代表一个字符;
- #查找名字以A开头的员工信息
- select * from emp where ename LIKE 'A%';
-
- #查找名字中第二个字母为A的员工信息
- select * from emp where ename LIKE '_A%';
RLIKE 子句
RLIKE子句是Hive中这个like功能的一个扩展,可以通过Java的正则表达式来指定匹配条件。
- #查找名字中带有A的员工信息
- select * from emp where ename RLIKE '[A]';

GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
- #计算emp表每个部门的平均工资
- select deptno,avg(sal) avg_sal from emp t group by deptno;
-
- #计算emp每个部门中每个岗位的最高薪水
- select deptno,job,max(sal) max_sal from emp group by deptno,job;


where后面不能写分组函数,having后面可以使用分组函数;
having只用于group by分组统计语句;
- #求部门的平均工资大于500的部门
- select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 500;

本文仅仅是学习笔记!!!