网站首页 > 技术文章 正文
欢迎来到我们SQL子查询系列的第2部分,我们将深入探讨利用子查询从HR数据库中获得强大洞察。
在本博客中,我们专注于一个实用的员工管理系统,包含员工和部门表。我们将介绍模式、插入示例数据,并演示42个高级SQL查询,强调子查询来解决复杂的HR和业务场景。本指南非常适合数据分析师、HR专业人员或开发者,他们希望通过真实世界的示例来提高SQL技能。
数据库架构概览
tbl_emp:存储员工详细信息
列:
o emp_id
o emp_name
o street_address
o city
o salary
o commission
o job
o deptno
o hiredate
o company_name
tbl_department:包含部门信息
列:
o deptno
o dept_name
创建表
CREATE TABLE tbl_department (
deptno INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE tbl_emp (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
street_address VARCHAR(100),
city VARCHAR(50),
salary DECIMAL(10,2),
commission DECIMAL(10,2),
job VARCHAR(50),
deptno INT,
hiredate DATE,
company_name VARCHAR(100),
FOREIGN KEY (deptno) REFERENCES tbl_department(deptno)
);
插入示例数据
INSERT INTO tbl_department (deptno, dept_name) VALUES
(10, 'Sales'),
(20, 'HR'),
(30, 'IT'),
(40, 'Finance'),
(50, 'Marketing');
INSERT INTO tbl_emp (emp_id, emp_name, street_address, city, salary, commission, job, deptno, hiredate, company_name) VALUES
(1, 'Amit Sharma', '123 MG Road', 'Delhi', 12000.00, 500.00, 'Salesman', 10, '2015-06-10', 'First Bank Corporation'),
(2, 'Priya Verma', '456 Park Avenue', 'Mumbai', 25000.00, 2000.00, 'Manager', 20, '2012-08-15', 'First Bank Corporation'),
(3, 'Rajesh Kumar', '789 Green Street', 'Bangalore', 18000.00, 1500.00, 'Salesman', 30, '2016-02-20', 'Second Bank Corporation'),
(4, 'Anjali Gupta', '321 Ocean Drive', 'Chennai', 9500.00, 0.00, 'Clerk', 10, '2018-07-10', 'First Bank Corporation'),
(5, 'Vikram Singh', '654 Palm Street', 'Delhi', 22000.00, 3000.00, 'Salesman', 10, '2014-04-01', 'First Bank Corporation'),
(6, 'Rina Patel', '987 Sunset Boulevard', 'Ahmedabad', 13000.00, 0.00, 'Clerk', 20, '2017-05-23', 'First Bank Corporation'),
(7, 'Manoj Desai', '852 Elm Street', 'Mumbai', 30000.00, 3500.00, 'Manager', 30, '2010-01-12', 'Second Bank Corporation'),
(8, 'Sonia Reddy', '741 Maple Lane', 'Hyderabad', 15000.00, 1000.00, 'Salesman', 30, '2019-11-02', 'First Bank Corporation'),
(9, 'Sandeep Jain', '258 High Street', 'Kolkata', 20000.00, 2500.00, 'Manager', 40, '2011-03-22', 'First Bank Corporation'),
(10, 'Neha Kapoor', '963 River Road', 'Pune', 27000.00, 1500.00, 'Clerk', 50, '2013-09-14', 'Second Bank Corporation');
高级SQL子查询练习
1. First Bank Corporation中收入超过10,000美元的员工
SELECT * FROM tbl_emp
WHERE company_name = 'First Bank Corporation' AND salary > 10000;
2. 选择部门30中的员工
SELECT * FROM tbl_emp
WHERE deptno = 30;
3. 列出所有文员的姓名、编号和部门
SELECT emp_name, emp_id, deptno FROM tbl_emp
WHERE job = 'Clerk';
4. 部门编号大于20的员工的部门编号和名称
SELECT DISTINCT d.deptno, d.dept_name
FROM tbl_emp e
JOIN tbl_department d ON e.deptno = d.deptno
WHERE d.deptno > 20;
5. 佣金大于工资的员工
SELECT * FROM tbl_emp
WHERE commission > salary;
6. 佣金大于工资60%的员工
SELECT * FROM tbl_emp
WHERE commission > salary * 0.6;
7. 列出部门20中收入超过2000的所有员工的姓名、工作和工资
SELECT emp_name, job, salary FROM tbl_emp
WHERE deptno = 20 AND salary > 2000;
8. 部门30中工资超过1,500美元的销售员
SELECT * FROM tbl_emp
WHERE deptno = 30 AND job = 'Salesman' AND salary > 1500;
9. 经理或总裁的员工
SELECT * FROM tbl_emp
WHERE job='Manager' or job='President';
10. 不在部门30的经理
SELECT * FROM tbl_emp
WHERE job = 'Manager' AND deptno != 30;
11. 部门10中的经理和文员
SELECT * FROM tbl_emp
WHERE deptno = 10 AND job IN ('Manager', 'Clerk');
12. 经理(任何部门)和部门20中的文员
SELECT * FROM tbl_emp
WHERE job = 'Manager' OR (job = 'Clerk' AND deptno = 20);
13. 查找部门10中所有经理的详细信息、部门20中所有文员的详细信息,以及既不是经理也不是文员但工资大于等于2000的所有员工
SELECT * FROM tbl_emp
WHERE (job = 'Manager' AND deptno = 10)
OR (job = 'Clerk' AND deptno = 20)
OR (job NOT IN ('Manager', 'Clerk') AND salary >= 2000);
14. 查找部门20中既不是经理也不是文员的任何人姓名
SELECT emp_name FROM tbl_emp
WHERE deptno = 20 AND job NOT IN ('Manager', 'Clerk');
15. 收入在1200到1400之间的员工
SELECT * FROM tbl_emp
WHERE salary BETWEEN 1200 AND 1400;
16. 查找是文员、分析师或销售员的员工
SELECT * FROM tbl_emp
WHERE job IN ('Clerk', 'Analyst', 'Salesman');
17. 查找不是文员、分析师或销售员的员工
SELECT * FROM tbl_emp
WHERE job NOT IN ('Clerk', 'Analyst', 'Salesman');
18. 查找工资大于2000且佣金大于200的员工
SELECT * FROM tbl_emp
WHERE salary > 2000 AND commission > 200;
19. 查找工资大于2000或佣金大于200的员工
SELECT * FROM tbl_emp
WHERE salary > 2000 OR commission > 200;
20. 查找工资大于2000且佣金大于200的员工,或者工资大于2000且佣金为0的员工
SELECT * FROM tbl_emp
WHERE (salary > 2000 AND commission > 200)
OR (salary > 2000 AND commission = 0);
21. 查找姓名以'A'开头的员工
SELECT emp_name
FROM tbl_emp
WHERE emp_name LIKE 'A%';
22. 查找姓名以'A'结尾的员工
SELECT emp_name
FROM tbl_emp
WHERE emp_name LIKE '%A';
23. 查找姓名以'M'开头或结尾的所有员工
SELECT emp_name
FROM tbl_emp
WHERE emp_name LIKE 'M%' OR emp_name LIKE '%M';
24. 查找姓名中包含字母'M'的所有员工(不区分大小写)
SELECT emp_name
FROM tbl_emp
WHERE emp_name LIKE '%M%' OR emp_name LIKE '%m%';
25. 查找姓名最多15个字符且姓名第3个字符为'R'的所有员工
SELECT emp_name
FROM tbl_emp
WHERE LENGTH(emp_name) <= 15 AND emp_name LIKE '__R%';
26. 查找在2月份(任何年份)被雇佣的所有员工
SELECT emp_name
FROM tbl_emp
WHERE MONTH(hiredate) = 2;
27. 查找在月末被雇佣的所有员工
SELECT emp_name
FROM tbl_emp
WHERE LAST_DAY(hiredate) = hiredate;
28. 查找2年多前被雇佣的所有员工
SELECT emp_name
FROM tbl_emp
WHERE hiredate < CURDATE() - INTERVAL 2 YEAR;
29. 查找2003年被雇佣的经理
SELECT emp_name
FROM tbl_emp
WHERE job = 'Manager' AND YEAR(hiredate) = 2003;
30. 显示所有员工的姓名和工作,用空格分隔
SELECT CONCAT(emp_name, ' ', job) AS name_and_job
FROM tbl_emp;
31. 显示所有员工的姓名,右对齐到15个字符
SELECT LPAD(emp_name, 15, ' ') FROM tbl_emp;
32. 显示所有员工的姓名,用'*'右填充到15个字符
SELECT RPAD(emp_name, 15, '*') FROM tbl_emp;
33. 显示所有员工的姓名,去掉前导'A'
SELECT TRIM(LEADING 'A' FROM emp_name) FROM tbl_emp;
34. 显示所有员工的姓名,去掉尾随'R'
SELECT TRIM(TRAILING 'R' FROM emp_name) FROM tbl_emp;
35. 显示所有员工姓名的前3个和后3个字符
SELECT CONCAT(LEFT(emp_name, 3), RIGHT(emp_name, 3)) AS first_last_chars
FROM tbl_emp;
36. 显示所有员工的姓名,将'A'替换为'a'
SELECT REPLACE(emp_name, 'A', 'a') FROM tbl_emp;
37. 显示所有员工的姓名和姓名中字符串'AR'出现的位置
SELECT emp_name, POSITION('AR' in emp_name) AS position
FROM tbl_emp;
38. 显示所有员工的工资,四舍五入到最接近的1000卢比
SELECT emp_name, ROUND(salary, -3) AS rounded_salary
FROM tbl_emp;
39. 显示员工的姓名、工作和工资,按工作和工资排序
SELECT emp_name, job, salary
FROM tbl_emp
ORDER BY job, salary;
40. 显示员工的姓名、工作和工资,按工作降序排序,在工作内按工资排序
SELECT emp_name, job, salary
FROM tbl_emp
ORDER BY job DESC, salary ASC;
41. 列出已完成1年服务的员工的姓名、部门名称和工资
SELECT e.emp_name, d.dept_name, e.salary
FROM tbl_emp e
JOIN tbl_department d ON e.deptno = d.deptno
WHERE e.hiredate <= DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
42. 列出2003年加入的员工的姓名、部门名称和雇佣日期。按加入日期排序输出
SELECT e.emp_name, d.dept_name, e.hiredate
FROM tbl_emp e
JOIN tbl_department d ON e.deptno = d.deptno
WHERE YEAR(e.hiredate) = 2003
ORDER BY e.hiredate;
结论
我们SQL子查询系列的第2部分展示了高级查询来提取关键的HR洞察,重点关注用于复杂过滤和比较的子查询。
从分析员工收入到跟踪雇佣日期和姓名模式,这些查询展示了SQL在HR数据管理中的强大功能。
使用这些示例作为基础来构建你自己的查询并推动明智的业务决策。
猜你喜欢
- 2025-09-03 数据库教程-SQL Server多条件模糊查询
- 2025-09-03 数据库教程-SQL Server海量数据的快速存储
- 2025-09-03 数据库教程-SQL Server数据字典查询及导出
- 2025-09-03 利用VBA+SQL查询Excel工作表数据(基本查询)
- 2025-09-03 紫金桥组态软件基于内置SQL查询历史数据的方法
- 2025-09-03 【开源推荐】SQL 审核查询平台Archery v1.7.9 发布,数据可归档
- 2025-09-03 SQL - 通过TSQL代码方式进行简单的数据查询 153
- 2025-09-03 利用VBA+SQL查询Excel工作表数据(分组查询)
- 2025-09-03 这才是数据分析全流程,而不是跑个SQL
- 2025-09-03 见过最惊艳的 SQL 查询语句是什么?揭秘高效查询的奥秘
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)