study
study
发布于 2025-09-17 / 11 阅读
0
0

3小时sql课程习题答案

员工信息管理

单表查询

1. 查询所有员工的姓名和职位,列名改为中文名

SELECT name as "姓名",job as '职位' FROM EMP;

SELECT name "姓名",job '职位' FROM EMP;

 

2. 查询部门 ID 为10的员工信息

SELECT * FROM EMP WHERE deptid = 10;

 

3. 查询部门 ID 不为10的员工信息

SELECT * FROM EMP WHERE deptid != 10;

SELECT * FROM EMP WHERE deptid <> 10;

 

4. 查询所有月薪超过 2000 的员工ID、姓名和薪资

SELECT id,name,salary FROM EMP WHERE salary > 2000;

 

5. 查询月薪在 1000 到 3000 之间的员工信息

SELECT * FROM EMP WHERE salary >= 1000 and salary <= 3000;

SELECT * FROM EMP WHERE salary between 1000 and 3000;

 

6. 查询部门 ID 为 10、20 或 30 的员工信息

SELECT * FROM EMP WHERE deptid = 10 or deptid = 20 or deptid = 30;

SELECT * FROM EMP WHERE deptid in (10,20,30);

 

7. 查询职位是 'Clerk' 且月薪超过 3000 的员工信息

SELECT * FROM EMP WHERE job = 'Clerk' and salary > 3000;

 

8. 查询部门 ID 为 20 或者30且职位是 'Manager' 的员工信息

SELECT * FROM EMP WHERE deptid in(20,30) and job = 'Manager';

 

9. 查询姓名包含AM的所有员工信息

SELECT * FROM EMP WHERE name like '%AM%';

 

10. 查询名称以S开头的所有员工信息

SELECT * FROM EMP WHERE name like 'S%';

 

11. 查询所有员工信息,按薪资降序排列

SELECT * FROM EMP ORDER BY salary DESC;

 

12. 查询部门 ID 为 30 的员工信息,按出生日期升序排列

SELECT * FROM EMP WHERE deptid = 30 ORDER BY birthday asc;

 

13. 查询薪资最高的前 5 名员工信息

SELECT * FROM EMP ORDER BY salary DESC LIMIT 5;

 

14. 统计每个部门的员工数量

SELECT deptid,COUNT(id) AS emp_num FROM EMP GROUP BY deptid;

 

15. 计算每个职位的平均薪资

SELECT job,AVG(salary) AS avg_salary FROM EMP GROUP BY job;

 

16. 查询每个部门的最高和最低薪资

SELECT deptid,MAX(salary) AS max_salary,MIN(salary) AS min_salary FROM EMP GROUP BY deptid;

 

17. 查询员工数量超过 5 人的部门 ID 和人数

SELECT deptid,COUNT(id) AS emp_num FROM EMP GROUP BY deptid HAVING COUNT(id) > 5;

 

18. 查询平均薪资高于 2000 的职位名称和平均薪资

SELECT job,AVG(salary) AS avg_salary FROM EMP GROUP BY job HAVING AVG(salary) > 2000;

 

19. 查询至少有两个经理的部门 ID(job='Manager')

SELECT deptid,COUNT(id) AS mng_num FROM EMP WHERE job = 'Manager' GROUP BY deptid HAVING COUNT(id) >= 2;

SELECT deptid,SUM(job = 'Manager') AS mng_num FROM EMP GROUP BY deptid HAVING SUM(job = 'Manager') >= 2;

 

20、查询每个部门下每种职位的员工数量

SELECT deptid,job,COUNT(id) as emp_num FROM EMP GROUP BY deptid,job;

 

多表查询

1. 查询每个员工的部门名称

select emp.*,dept.name as dept_name from emp join dept on emp.deptid = dept.id;

select emp.*,dept.name as dept_name from emp ,dept where emp.deptid = dept.id;

 

2. 查询每个员工的薪资等级

select e.*,s.grade from emp as e

join salgrade as s on e.salary between s.losal and s.hisal;

 

3. 查询薪资等级为 3 的员工以及他所在部门的名称和地址

select e.*,s.grade,d.name as dept_name,d.workaddress

from emp e

join dept d on e.deptid = d.id

join salgrade s on e.salary between s.losal and s.hisal

and s.grade = 3;

 

4. 查询平均薪资最高的部门名称和对应平均薪资

select dept.name,avg(salary) as avg_salary

from emp join dept on emp.deptid = dept.id

group by dept.name order by avg_salary desc limit 1

 

5. 查询每个部门薪资等级分布(如:部门 A 有 3 人在等级 2)

select e.deptid,s.grade,count(1) as emp_num from emp as e

join salgrade as s on e.salary between s.losal and s.hisal

group by e.deptid,s.grade;

 

6. 查询比部门平均薪资高的员工及其部门名称

-- 写法1

select * from emp join

(

select deptid,avg(salary) as avg_salary from emp group by deptid

) dept_avg_salary

on emp.deptid = dept_avg_salary.deptid

and emp.salary > dept_avg_salary.avg_salary;

 

-- 写法2

with dept_avg_salary as

(

select deptid,avg(salary) as avg_salary from emp group by deptid

)

 

select * from emp

join dept_avg_salary on emp.deptid = dept_avg_salary.deptid

and emp.salary > dept_avg_salary.avg_salary;

 

7. 查询每个员工的信息以及他直接上级的姓名(假设 managerid 关联员工表的 id)

select e1.*,e2.name as manager_name from emp e1 left join emp e2 on e1.managerid = e2.id

 

8. 查询没有员工的部门名称

select dept.name from dept left join emp on dept.id = emp.deptid

where emp.id is NULL;

 

9. 查询薪资不在任何等级范围内的员工

select * from emp e left join salgrade s on e.salary between s.losal and s.hisal

where s.grade is null;

 

 

窗口函数

1、 查询每个部门薪资排名前3的员工信息

SELECT 
  t1.deptid,  t1.name,t1.salary
FROM 
  emp t1
LEFT JOIN 
  emp t2 
  ON t1.deptid = t2.deptid  
  AND t1.salary < t2.salary      
GROUP BY 
  t1.deptid,  t1.name,t1.salary
HAVING 
  COUNT(t2.salary) < 3        -- 比当前记录大的记录数 < 3,即当前是前3名
ORDER BY 
  t1.deptid, t1.salary DESC;  

select * from
(
 select *,
 row_number() over(partition by deptid order by salary desc) as rank0
 from emp
) t where t.rank0 <= 3 

 

2、 查询每个部门薪资排名前10%的员工信息

with emp_info as

(

select *,

PERCENT_RANK() over(partition by deptid order by salary desc) * 100 as salary_percent_rank

from emp

)


select * from emp_info where salary_percent_rank <= 10;

 

 

3、查询工资比部门平均工资高的员工信息

select * from
(
select *,
avg(salary) over(PARTITION by deptid) as avg_salary
 from emp
 ) t where t.avg_salary < t.salary

 

 

4、查询每个职位中,每个员工的薪资与同职位最高薪资的差值

SELECT
		id,
		name,
		job,
		salary,
		MAX(salary) OVER (PARTITION BY job) as max_salary,
		MAX(salary) OVER (PARTITION BY job) - salary  as salary_ratio
FROM emp;

 

 

5、查询部门中每个员工与部门平均工资的差值

SELECT
    id,
    name,
    deptid,
    salary,
		AVG(salary) OVER (PARTITION BY deptid) AS avg_salary,
    salary - AVG(salary) OVER (PARTITION BY deptid) AS salary_diff
FROM emp;
 

 

 

客户商品订单管理

1、查询所有客户已完成订单信息以及对应商品信息

2、查询收货地址在广东的客户信息

3、查询购买过两种商品以上的客户+订单+商品信息

4、查询购买总价大于1000的客户+订单+商品信息

5、查询购买商品数量最多的客户信息

6、查询购买商品价格最多的客户信息

7、查询从未被购买过的商品信息

8、查询被买过且降价了的商品信息

9、查询被买过且涨价了的商品信息

10、查询被买过最多的商品

11、查询客户复购过的所有商品和客户信息

12、计算每个客户登陆时距离上次登陆的间隔时间

 

 


评论