(用hive数据查询语言和hive相关函数实现) 一、结合某公司人事部门的ERP信息管理系统,基于该系统中员工信息表emp与部门信息表dept的基础数据,按要求完成相关业务操作。 员工信息表(emp): (员工编号,员工姓名,工作岗位,部门经理,受雇日期,薪水,奖金,部门编号) (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,BONUS,DEPTNO) 部门信息表(dept): (部门编号,部门名称,部门地点) (DEPTNO,DEPTNAME,DEPTADDR) 创建员工信息表emp与部门信息表dept。 (1)列出至少有一个员工的所有部门信息; (2)列出薪金比“Alice”高的所有员工; (3)列出所有员工的姓名及其直接上级的姓名; (4)列出所有“CLERK”(办事员)的姓名及其部门名称; (5)列出最低薪金大于1500的各种工作; (6)列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号; (7)计算每个部门的平均薪资,保留小数点后两位。 (8)列出薪金高于公司平均薪金的所有员工。 部分数据如下:employees.txt:E001,Alice,CLERK,7902,1980-12-17,2500,,10 E002,Bob,SALESMAN,7698,1981-02-20,3000,500,30 E003,Charlie,MANAGER,7839,1981-04-02,5000,,20 E004,David,ANALYST,7566,1987-04-19,4500,,20 E005,Eve,SALESMAN,7698,1981-09-28,3200,800,30 departments.txt数据:10,ACCOUNTING,NEW YORK 20,RESEARCH,DALLAS 30,SALES,CHICAGO 40,OPERATIONS,BOSTON 50,FINANCE,LOS ANGELES
时间: 2025-05-18 16:12:54 浏览: 62
### Hive SQL 实现多种业务查询
以下是针对所提问题的具体解决方案:
#### 1) 列出至少有一个员工的所有部门信息
通过 `INNER JOIN` 将员工表和部门表连接起来,筛选出有对应员工的部门。
```sql
SELECT DISTINCT d.*
FROM departments d
JOIN employees e ON d.department_id = e.department_id;
```
此查询利用了 INNER JOIN 的特性来过滤掉没有任何员工关联的部门[^1]。
---
#### 2) 列出薪金比 Alice 高的所有员工
先找到 Alice 的薪水,再查找其他薪水更高的员工。
```sql
SELECT *
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE first_name = 'Alice'
);
```
这里使用子查询获取 Alice 的薪水,并将其作为比较条件的一部分[^1]。
---
#### 3) 列出所有员工及其直接上级的姓名
假设每名员工都有一个字段 `manager_id` 表示其直属经理,则可以通过自联结完成该需求。
```sql
SELECT e.first_name AS employee, m.first_name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
```
上述语句中的 LEFT JOIN 可以处理某些员工可能没有上级的情况。
---
#### 4) 列出所有办事员的姓名及其部门名称
假设职位存储在 `job_title` 字段中,而部门名称存储在另一个表中。
```sql
SELECT e.first_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.job_title = 'Clerk';
```
此处通过指定 `job_title='Clerk'` 来限定只返回办事员的信息[^1]。
---
#### 5) 列出最低薪金大于 1500 的各种工作
统计不同职位对应的最低薪资并设置阈值。
```sql
SELECT job_title, MIN(salary) AS min_salary
FROM employees
GROUP BY job_title
HAVING MIN(salary) > 1500;
```
这里的 HAVING 子句用于进一步筛选满足特定条件的结果集[^1]。
---
#### 6) 列出在销售部工作的员工姓名(假定不知道销售部编号)
如果知道销售部的名字可以这样写:
```sql
SELECT e.first_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';
```
即使不确定具体 ID 或编码也能轻松定位目标记录[^1]。
---
#### 7) 计算每个部门的平均薪资,保留两位小数
采用聚合函数计算均值,并应用格式化工具控制显示精度。
```sql
SELECT department_id,
ROUND(AVG(salary), 2) AS avg_salary
FROM employees
GROUP BY department_id;
```
ROUND 函数确保最终输出符合题目关于数值精确度的要求。
---
#### 8) 列出薪金高于公司平均薪金的所有员工
首先求得整体平均水平,接着找出超过这一标准的人选。
```sql
SELECT *
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
```
嵌套结构允许动态调整参照基准从而获得更灵活的结果集合。
---
### 问题
阅读全文
相关推荐


















