网站首页 > 知识剖析 正文
欢迎来到我们的SQL连接查询系列,我们将深入探讨使用连接操作分析HR数据的高级技术。本博客专注于一个员工管理数据库,包含Worker、Department和Worker_rating表。我们将提供45个SQL查询,利用各种连接类型(INNER、LEFT等)来处理复杂的HR场景。这些查询非常适合数据分析师、HR专业人员或开发者,他们希望掌握SQL连接以获得员工洞察。
数据库架构概览
Worker:存储员工详细信息
列:
o worker_id
o first_name
o last_name
o salary
o joining_date
o department_id
Department:包含部门信息
列:
o id
o department
Worker_rating:跟踪员工绩效评级
列:
o id
o worker_id
o rating
创建表
CREATE TABLE Department (
id INT PRIMARY KEY AUTO_INCREMENT,
department VARCHAR(50) NOT NULL
);
CREATE TABLE Worker (
worker_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
salary INT NOT NULL,
joining_date DATE NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES Department(id)
);
CREATE TABLE Worker_rating (
id INT PRIMARY KEY AUTO_INCREMENT,
worker_id INT,
rating INT NOT NULL,
FOREIGN KEY (worker_id) REFERENCES Worker(worker_id)
);
插入示例数据
INSERT INTO Department (id, department) VALUES
(1, 'HR'),
(2, 'Admin'),
(3, 'Account'),
(4, 'Sales');
INSERT INTO Worker (worker_id, first_name, last_name, salary, joining_date, department_id) VALUES
(1, 'Monika', 'Arora', 100000, '1982-02-20', 1),
(2, 'Niharika', 'Verma', 80000, '2014-06-11', 2),
(3, 'Vishal', 'Singhal', 300000, '2015-02-20', 1),
(4, 'Amitabh', 'Singh', 500000, '2014-02-20', 2),
(5, 'Vivek', 'Bhati', 500000, '2016-06-11', 2),
(6, 'Vipul', 'Diwan', 200000, '2014-06-11', 3),
(7, 'Satish', 'Kumar', 75000, '1985-01-20', 4),
(8, 'Geetika', 'Chauhan', 90000, '1988-04-11', 2),
(9, 'Ramesh', 'Sharma', 120000, '2018-03-15', 1),
(10, 'Suresh', 'Yadav', 95000, '2017-07-01', 3),
(11, 'Anjali', 'Kapoor', 85000, '2013-01-25', 4),
(12, 'Pooja', 'Malhotra', 110000, '2016-12-10', 2),
(13, 'Deepak', 'Gupta', 140000, '2019-09-05', 1),
(14, 'Rohit', 'Jain', 70000, '2020-01-20', 3),
(15, 'Sneha', 'Mehra', 80000, '2012-06-25', 4),
(16, 'Arjun', 'Chopra', 130000, '2021-03-14', 1),
(17, 'Kiran', 'Reddy', 120000, '2022-05-18', 2),
(18, 'Meena', 'Naik', 110000, '2020-08-21', 1),
(19, 'Rajesh', 'Pillai', 95000, '2018-11-30', 4),
(20, 'Bhavna', 'Iyer', 105000, '2015-07-22', 3),
(21, 'Prakash', 'Joshi', 98000, '2016-04-25', 2),
(22, 'Gaurav', 'Patel', 88000, '2019-10-15', 3),
(23, 'Manisha', 'Desai', 102000, '2014-11-20', 2),
(24, 'Ajay', 'Khan', 92000, '2021-01-12', 4),
(25, 'Sanjay', 'Ghosh', 135000, '2017-03-08', 1),
(26, 'Priya', 'Das', 80000, '2018-05-14', 2),
(27, 'Anil', 'Nair', 125000, '2020-09-16', 3),
(28, 'Siddharth', 'Rao', 140000, '2022-11-10', 4),
(29, 'Radha', 'Kulkarni', 95000, '2015-12-23', 2),
(30, 'Tanya', 'Mishra', 89000, '2019-06-29', 3);
INSERT INTO Worker_rating (id, worker_id, rating) VALUES
(1, 1, 3),
(2, 1, 2),
(3, 2, 4),
(4, 3, 5),
(5, 4, 2),
(6, 2, 1),
(7, 3, 3),
(8, 5, 2),
(9, 6, 5),
(10, 7, 4),
(11, 8, 3),
(12, 9, 4),
(13, 10, 3),
(14, 11, 4),
(15, 12, 2),
(16, 13, 5),
(17, 14, 3),
(18, 15, 4),
(19, 16, 5),
(20, 17, 2),
(21, 18, 3),
(22, 19, 4),
(23, 20, 5),
(24, 21, 2),
(25, 22, 4),
(26, 23, 3),
(27, 24, 2),
(28, 25, 5),
(29, 26, 3),
(30, 27, 4);
员工分析的高级SQL连接查询
以下是45个SQL查询及其解释,利用连接操作来组合Worker、Department和Worker_rating表的数据,以获得可操作的HR洞察。
1. 检索所有员工的名字和姓氏以及他们的部门名称
SELECT w.first_name, w.last_name, d.department
FROM Worker w
JOIN Department d ON w.department_id = d.id;
2. 检索每个部门员工的总工资
SELECT d.department, SUM(w.salary) AS total_salary
FROM Department d
JOIN Worker w ON d.id = w.department_id
GROUP BY d.department;
3. 获取按部门分组的员工数量
SELECT d.department, COUNT(w.worker_id) AS number_of_workers
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department
HAVING AVG(w.salary) > 100000;
4. 获取每个部门的最高工资记录
SELECT d.department, MAX(w.salary) AS highest_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
5. 获取评级大于等于4的员工的平均评级和详细信息
SELECT w.first_name, w.last_name, w.salary, AVG(r.rating) AS average_rating
FROM Worker w
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating >= 4
GROUP BY w.worker_id, w.first_name, w.last_name, w.salary;
6. 获取评级为3或以上的员工列表,包括部门名称和工资
SELECT w.first_name, w.last_name, d.department, w.salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating >= 3;
7. 显示评级为4或以上的员工按部门分组的平均工资
SELECT d.department, AVG(w.salary) AS average_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating >= 4
GROUP BY d.department;
8. 查找每个部门中工资最高的员工
SELECT w.first_name, w.last_name, d.department, w.salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
WHERE w.salary = (
SELECT MAX(salary)
FROM Worker w2
WHERE w2.department_id = w.department_id
);
9. 获取每个部门的员工数量和平均工资
SELECT d.department, COUNT(w.worker_id) AS worker_count, AVG(w.salary) AS avg_salary
FROM Department d
LEFT JOIN Worker w ON d.id = w.department_id
GROUP BY d.department;
10. 查找评级为5的员工及其部门信息
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 5;
11. 获取每个部门的最高和最低工资
SELECT d.department, MAX(w.salary) AS max_salary, MIN(w.salary) AS min_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
12. 查找平均评级最高的部门
SELECT d.department, AVG(r.rating) AS avg_rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department
ORDER BY avg_rating DESC
LIMIT 1;
13. 获取工资高于部门平均工资的员工
SELECT w.first_name, w.last_name, w.salary, d.department
FROM Worker w
JOIN Department d ON w.department_id = d.id
WHERE w.salary > (
SELECT AVG(salary)
FROM Worker w2
WHERE w2.department_id = w.department_id
);
14. 查找每个部门中评级最高的员工
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = (
SELECT MAX(rating)
FROM Worker_rating r2
JOIN Worker w2 ON r2.worker_id = w2.worker_id
WHERE w2.department_id = w.department_id
);
15. 获取每个部门的工资分布(高、中、低)
SELECT d.department,
COUNT(CASE WHEN w.salary >= 100000 THEN 1 END) AS high_salary,
COUNT(CASE WHEN w.salary BETWEEN 50000 AND 99999 THEN 1 END) AS medium_salary,
COUNT(CASE WHEN w.salary < 50000 THEN 1 END) AS low_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
16. 查找评级低于3的员工及其部门
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating < 3;
17. 获取每个部门的工资总和和员工数量
SELECT d.department, SUM(w.salary) AS total_salary, COUNT(w.worker_id) AS worker_count
FROM Department d
LEFT JOIN Worker w ON d.id = w.department_id
GROUP BY d.department;
18. 查找评级为1的员工及其部门信息
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 1;
19. 获取每个部门的平均评级
SELECT d.department, AVG(r.rating) AS average_rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department;
20. 查找工资最高的前5名员工及其部门
SELECT w.first_name, w.last_name, d.department, w.salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
ORDER BY w.salary DESC
LIMIT 5;
21. 获取评级为4或5的员工数量按部门分组
SELECT d.department, COUNT(w.worker_id) AS high_rated_workers
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating IN (4, 5)
GROUP BY d.department;
22. 查找每个部门中评级最低的员工
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = (
SELECT MIN(rating)
FROM Worker_rating r2
JOIN Worker w2 ON r2.worker_id = w2.worker_id
WHERE w2.department_id = w.department_id
);
23. 获取每个部门的工资范围
SELECT d.department,
MAX(w.salary) - MIN(w.salary) AS salary_range,
MAX(w.salary) AS max_salary,
MIN(w.salary) AS min_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
24. 查找评级为2的员工及其部门信息
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 2;
25. 获取每个部门的平均工资和平均评级
SELECT d.department, AVG(w.salary) AS avg_salary, AVG(r.rating) AS avg_rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department;
26. 查找评级为3的员工及其部门信息
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 3;
27. 获取每个部门的工资中位数
SELECT d.department,
AVG(w.salary) AS median_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
WHERE w.salary IN (
SELECT w2.salary
FROM Worker w2
WHERE w2.department_id = w.department_id
ORDER BY w2.salary
LIMIT 1 OFFSET (
SELECT COUNT(*) / 2
FROM Worker w3
WHERE w3.department_id = w.department_id
)
)
GROUP BY d.department;
28. 查找评级为4的员工及其部门信息
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 4;
29. 获取每个部门的工资标准差
SELECT d.department,
STDDEV(w.salary) AS salary_stddev
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
30. 查找评级为5的员工及其部门信息
SELECT w.first_name, w.last_name, d.department, r.rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 5;
31. 获取每个部门的工资分布百分比
SELECT d.department,
ROUND(COUNT(CASE WHEN w.salary >= 100000 THEN 1 END) * 100.0 / COUNT(*), 2) AS high_salary_percent,
ROUND(COUNT(CASE WHEN w.salary BETWEEN 50000 AND 99999 THEN 1 END) * 100.0 / COUNT(*), 2) AS medium_salary_percent,
ROUND(COUNT(CASE WHEN w.salary < 50000 THEN 1 END) * 100.0 / COUNT(*), 2) AS low_salary_percent
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
32. 查找评级分布按部门分组
SELECT d.department,
COUNT(CASE WHEN r.rating = 1 THEN 1 END) AS rating_1,
COUNT(CASE WHEN r.rating = 2 THEN 1 END) AS rating_2,
COUNT(CASE WHEN r.rating = 3 THEN 1 END) AS rating_3,
COUNT(CASE WHEN r.rating = 4 THEN 1 END) AS rating_4,
COUNT(CASE WHEN r.rating = 5 THEN 1 END) AS rating_5
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department;
33. 列出最高工资大于300,000的部门
SELECT d.department
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department
HAVING MAX(w.salary) > 300000;
34. 显示员工平均评级恰好为2的部门
SELECT d.department
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department
HAVING AVG(r.rating) = 2;
35. 获取平均评级小于3且总工资大于1,000,000的部门
SELECT d.department
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department
HAVING AVG(r.rating) < 3 AND SUM(w.salary) > 1000000;
36. 检索评级为1或2的员工及其部门名称
SELECT w.first_name, w.last_name, d.department
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
WHERE r.rating = 1 OR r.rating = 2;
37. 查找总工资最高的部门
SELECT d.department, SUM(w.salary) AS total_salary
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department
ORDER BY total_salary DESC
LIMIT 1;
38. 查找平均评级最低的部门,排除没有评级的部门
SELECT d.department, AVG(r.rating) AS average_rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department
ORDER BY average_rating ASC
LIMIT 1;
39. 查找总工资大于500,000的部门的总工资和平均评级
SELECT d.department, SUM(w.salary) AS total_salary, AVG(r.rating) AS average_rating
FROM Worker w
JOIN Department d ON w.department_id = d.id
JOIN Worker_rating r ON w.worker_id = r.worker_id
GROUP BY d.department
HAVING SUM(w.salary) > 500000;
40. 使用GROUP_CONCAT获取按部门分组的员工姓名
SELECT d.department, GROUP_CONCAT(CONCAT(w.first_name, ' ', w.last_name)) AS worker_names
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
41. 获取过去5年加入的员工
SELECT w.first_name, w.last_name, w.joining_date
FROM Worker w
WHERE w.joining_date >= DATE_SUB(CURDATE(), INTERVAL 5 YEAR);
42. 获取每年加入的员工数量
SELECT YEAR(w.joining_date) AS join_year, COUNT(w.worker_id) AS worker_count
FROM Worker w
GROUP BY YEAR(w.joining_date);
43. 获取每个部门的最早和最晚加入日期
SELECT d.department, MIN(w.joining_date) AS earliest_joining, MAX(w.joining_date) AS latest_joining
FROM Worker w
JOIN Department d ON w.department_id = d.id
GROUP BY d.department;
44. 获取在公司工作超过10年的员工
SELECT w.first_name, w.last_name, w.joining_date
FROM Worker w
WHERE w.joining_date < DATE_SUB(CURDATE(), INTERVAL 10 YEAR);
45. 检索今天加入的员工
SELECT w.first_name, w.last_name, w.joining_date
FROM Worker w
WHERE DATE(w.joining_date) = CURDATE();
结论
本文章演示了45个SQL查询,利用连接操作从员工数据库中提取可操作的HR洞察。从分析工资和评级到跟踪加入日期,这些查询展示了SQL连接在员工管理中的强大功能。练习这些示例以增强你的HR数据分析能力,并通过高效的基于连接的查询推动明智的决策。
猜你喜欢
- 2025-09-19 Excel VBA 这样酷炫的日期控件,你不想要吗?
- 2025-09-19 总结面试:SQL常见面试题-1_sql面试必会6题经典
- 2025-09-19 一行 VBA 代码完成一项任务10个示例
- 2025-09-19 Excel:拆分工作表_Excel拆分工作表为单独文件
- 2025-09-19 告别慢查询:让SQL JOIN多表查询飞起来
- 2025-09-19 索引失效了?看看这几个常见的情况!
- 2025-09-19 什么是数据库分区?为什么要使用它?
- 2025-09-19 Excel技巧!!!1行代码永久修改默认保存路径,办公效率翻倍
- 2025-09-19 1个Excel文件拆分为100个,我需要2小时,同事2分钟就搞定
- 2025-09-19 「数分分析面试」大厂高频SQL笔试题(三)
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)