Hive基本查询语句

hive查询时显示字段名

  • 运行下面代码,查询即可看到字段名
set hive.cli.print.header=true;

在这里插入图片描述
在这里插入图片描述

  • 还可以去掉表名
set hive.resultset.use.unique.column.names=false;

在这里插入图片描述

全表和特定列查询

  • 查询语句语法:
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 number]

基本查询

全表和特定列查询

  • 数据准备

/root/hivedata 下面创建两个文件

在这里插入图片描述

  • 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(depton int,dname string,loc int)
row format delimited fields terminated by '\t';

在这里插入图片描述

  1. 创建员工表
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';

在这里插入图片描述

  1. 导入数据
load data local inpath '/root/hivedata/dept.txt' into table dept;
load data local inpath '/root/hivedata/emp.txt' into table emp;

在这里插入图片描述

全表查询

select * from emp;

在这里插入图片描述

选择特定列查询

select empno,ename from emp;

在这里插入图片描述

注意:

  • (1)SQL 语言大小写不敏感。
  • (2)SQL 可以写在一行或者多行
  • (3)关键字不能被缩写也不能分行
  • (4)各子句一般要分行写。
  • (5)使用缩进提高语句的可读性。

列别名

  • 1)重命名一个列
  • 2)便于计算
  • 3)紧跟列名,也可以在列名和别名之间加入关键字‘AS’

案例实操

  1. 查询名称和部门
select ename as name,deptno dn from emp;

在这里插入图片描述

算术运算符(常用)

运算符 描述
A+B A 和 B 相加
A-B A 减去 B
A/B A 除以 B
A*B A 和 B 相乘
  • 案例实操:查询出所有员工的薪水后加 1 显示。
select sal +1 from emp;

在这里插入图片描述

常用函数

求总行数(count)

select count(*) cnt from emp;

在这里插入图片描述

求工资的最大值(max)

select max(sal) max_sal from emp;

在这里插入图片描述

求工资的最小值(min)

select min(sal) min_sal from emp;

在这里插入图片描述

求工资的总和(sum)

select sum(sal) sum_sal from emp;

在这里插入图片描述

求工资的平均值(avg)

select avg(sal) avg_sal from emp;

在这里插入图片描述

Limit 语句

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

在这里插入图片描述

Where 语句

  1. 使用 WHERE 子句,将不满足条件的行过滤掉
  2. WHERE 子句紧随 FROM 子句

案例实操

  • 查询出薪水大于 1000 的所有员工
select ename,sal from emp where sal > 1000;

在这里插入图片描述

  • 注意:where 子句中不能使用字段别名。

比较运算符(Between/In/ Is Null)

在这里插入图片描述

案例实操

  • 查询出薪水等于 5000 的所有员工
select ename,sal from emp where sal=5000;

在这里插入图片描述

  • 查询工资在 500 到 1000 的员工信息
select ename,sal from emp where between 500 and 1000;

在这里插入图片描述

  • 查询 comm 为空的所有员工信息
select ename,comm from emp where comm is null;

在这里插入图片描述

  • 查询工资是 1500 或 5000 的员工信息
select ename,sal from emp where sal in (1500,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(20,30);

在这里插入图片描述

分组

Group By 语句

GROUP BY 语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

案例实操

  • 计算 emp 表每个部门的平均工资
select deptno,avg(sal) avg_sal from emp group by deptno;

在这里插入图片描述

  • 计算 emp 每个部门中每个岗位的最高薪水
select deptno,job,max(sal) max_sal from emp group by deptno,job;

在这里插入图片描述

Having 语句

(1)where 后面不能写分组函数,而 having 后面可以使用分组函数。
(2)having 只用于 group by 分组统计语句。

  • 求每个部门的平均薪水大于 2000 的部门
select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal>2000;

在这里插入图片描述

Join 语句

  • 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
select e.empno,e.ename,d.dname from emp e join dept d on e.deptno = d.depton;

在这里插入图片描述

表的别名

(1)使用别名可以简化查询。
(2)使用表名前缀可以提高执行效率

排序

全局排序(Order By)

  • Order By:全局排序,只有一个 Reducer
  • 使用 order by 子句排序
  • asc(ascend): 升序(默认)
  • desc(descend): 降序
  • order by 子句在 select 语句的结尾

案例实操

  1. 查询员工信息按工资升序排列
select * from emp order by sal;

在这里插入图片描述

  1. 查询员工信息按工资降序排列
select * from emp order by sal desc;

在这里插入图片描述

按照别名排序

  • 按照员工薪水的 2 倍排序
select ename,sal*2 twosal from emp order by twosal;

在这里插入图片描述

多个列排序

  • 按照部门和工资升序排序
select ename,deptno,sal from emp order by deptno,sal;

在这里插入图片描述

每个 Reduce 内部排序(Sort By)

  • Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排 序,此时可以使用 sort by。
  • Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集 来说不是排序。
  • 设置 reduce 个数
set mapreduce.job.reduces=3;

在这里插入图片描述

  • 查看设置 reduce 个数
set mapreduce.job.reduces;

在这里插入图片描述

  • 根据部门编号降序查看员工信息
select * from emp sort by deptno desc;

在这里插入图片描述

  • 将查询结果导入到文件中(按照部门编号降序排序)
insert overwrite local directory '/root/hivedata'
select * from emp sort by deptno desc;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51309151/article/details/126897742
今日推荐