SQL面试题及详细答案150道(41-60) --- 条件查询与分组篇
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
- 一、本文面试题目录
- 41. 如何查询“部门为'技术部'且salary大于10000”的员工?
- 42. 如何查询“年龄大于30或职位为'经理'”的员工?
- 43. 如何查询“名字中第二个字是'三'”的员工?(使用LIKE)
- 44. 如何查询“入职日期在2023年之后”的员工?
- 45. 如何查询“工资在8000到15000之间,且部门不是'财务部'”的员工?
- 46. 如何对“每个部门”计算“平均工资”,并保留2位小数?
- 47. 如何查询“平均工资大于10000的部门”?(使用HAVING)
- 48. 如何查询“每个部门中工资最高的员工姓名和工资”?
- 49. 如何查询“每个部门不同性别的员工数量”?(多字段GROUP BY)
- 50. 如何查询“员工数量超过10人的部门”?
- 51. 如何查询“没有员工的部门”?(使用LEFT JOIN + IS NULL)
- 52. 如何查询“至少有3个不同职位”的部门?
- 53. 如何查询“工资大于本部门平均工资”的员工?
- 54. 如何查询“每个部门的工资总和,并按总和降序排序”?
- 55. 如何查询“部门名称包含'部'字,且员工数量大于5”的部门?
- 56. 如何查询“2023年每个月的新入职员工数”?
- 57. 如何查询“职位为'销售'且工资排名前3”的员工?
- 58. 如何查询“年龄最大的3名员工”?
- 59. 如何统计“每个部门的男女员工比例”?
- 60. 如何查询“连续两个月工资上涨”的员工?
- 二、150道面试题目录列表
一、本文面试题目录
41. 如何查询“部门为’技术部’且salary大于10000”的员工?
- 原理说明:多条件筛选时,使用
AND
连接多个条件,仅返回同时满足所有条件的记录。 - 示例代码:
SELECT * FROM employees WHERE dept = '技术部' AND salary > 10000;
42. 如何查询“年龄大于30或职位为’经理’”的员工?
- 原理说明:使用
OR
连接条件,返回满足任意一个条件的记录。 - 示例代码:
SELECT * FROM employees WHERE age > 30 OR position = '经理';
43. 如何查询“名字中第二个字是’三’”的员工?(使用LIKE)
- 原理说明:
LIKE
结合通配符_
(匹配单个字符)实现精确位置匹配。_三%
表示第一个字符任意,第二个字符为“三”,后面字符任意。 - 示例代码:
SELECT * FROM employees WHERE name LIKE '_三%';
44. 如何查询“入职日期在2023年之后”的员工?
- 原理说明:日期字段可直接与日期字符串比较,
>= '2023-01-01'
表示2023年1月1日及之后。 - 示例代码:
或更精确地排除2023年之前:SELECT * FROM employees WHERE hire_date >= '2023-01-01';
SELECT * FROM employees WHERE hire_date > '2022-12-31';
45. 如何查询“工资在8000到15000之间,且部门不是’财务部’”的员工?
- 原理说明:使用
BETWEEN
限定范围,NOT
否定条件,结合AND
连接多条件。 - 示例代码:
SELECT * FROM employees WHERE salary BETWEEN 8000 AND 15000 AND dept != '财务部';
46. 如何对“每个部门”计算“平均工资”,并保留2位小数?
- 原理说明:
GROUP BY
按部门分组,AVG(salary)
计算平均值,ROUND()
函数保留指定小数位数。 - 示例代码:
SELECT dept, ROUND(AVG(salary), 2) AS avg_salary FROM employees GROUP BY dept;
47. 如何查询“平均工资大于10000的部门”?(使用HAVING)
- 原理说明:
HAVING
用于筛选分组后的结果(需配合GROUP BY
),而WHERE
用于分组前筛选行。此处先按部门分组计算平均工资,再筛选平均值大于10000的部门。 - 示例代码:
SELECT dept, AVG(salary) AS avg_salary FROM employees GROUP BY dept HAVING AVG(salary) > 10000;
48. 如何查询“每个部门中工资最高的员工姓名和工资”?
- 原理说明:先按部门分组计算最高工资(子查询),再通过连接查询匹配对应员工信息。
- 示例代码:
-- 子查询获取每个部门的最高工资 SELECT e.dept, e.name, e.salary FROM employees e INNER JOIN (SELECT dept, MAX(salary) AS max_salary FROM employees GROUP BY dept ) AS dept_max ON e.dept = dept_max.dept AND e.salary = dept_max.max_salary;
49. 如何查询“每个部门不同性别的员工数量”?(多字段GROUP BY)
- 原理说明:
GROUP BY
可指定多个字段(用逗号分隔),按“部门+性别”组合分组,再统计每组人数。 - 示例代码:
SELECT dept, gender, COUNT(*) AS emp_count FROM employees GROUP BY dept, gender ORDER BY dept, gender;
50. 如何查询“员工数量超过10人的部门”?
- 原理说明:按部门分组后,用
HAVING
筛选人数(COUNT(*)
)大于10的分组。 - 示例代码:
SELECT dept, COUNT(*) AS emp_count FROM employees GROUP BY dept HAVING COUNT(*) > 10;
51. 如何查询“没有员工的部门”?(使用LEFT JOIN + IS NULL)
- 原理说明:部门表(
departments
)左连接员工表(employees
),未匹配到员工的部门即为空部门,通过IS NULL
判断。 - 示例代码:
SELECT d.dept_id, d.dept_name FROM departments d LEFT JOIN employees e ON d.dept_id = e.dept_id WHERE e.dept_id IS NULL;
52. 如何查询“至少有3个不同职位”的部门?
- 原理说明:按部门分组后,用
COUNT(DISTINCT position)
统计不同职位数量,再筛选大于等于3的部门。 - 示例代码:
SELECT dept, COUNT(DISTINCT position) AS position_count FROM employees GROUP BY dept HAVING COUNT(DISTINCT position) >= 3;
53. 如何查询“工资大于本部门平均工资”的员工?
- 原理说明:子查询计算每个部门的平均工资,主查询通过部门关联,筛选工资高于该部门平均值的员工。
- 示例代码:
SELECT e.name, e.dept, e.salary, dept_avg.avg_salary FROM employees e INNER JOIN (SELECT dept, AVG(salary) AS avg_salary FROM employees GROUP BY dept ) AS dept_avg ON e.dept = dept_avg.dept WHERE e.salary > dept_avg.avg_salary;
54. 如何查询“每个部门的工资总和,并按总和降序排序”?
- 原理说明:按部门分组计算工资总和(
SUM(salary)
),再用ORDER BY
按总和降序排列。 - 示例代码:
SELECT dept, SUM(salary) AS total_salary FROM employees GROUP BY dept ORDER BY total_salary DESC;
55. 如何查询“部门名称包含’部’字,且员工数量大于5”的部门?
- 原理说明:先通过
WHERE
筛选部门名称包含“部”的记录,再分组统计人数,最后用HAVING
筛选人数大于5的部门。 - 示例代码:
SELECT dept, COUNT(*) AS emp_count FROM employees WHERE dept LIKE '%部%' -- 部门名称含'部'字 GROUP BY dept HAVING COUNT(*) > 5; -- 员工数量>5
56. 如何查询“2023年每个月的新入职员工数”?
- 原理说明:用
YEAR(hire_date)
筛选2023年数据,MONTH(hire_date)
提取月份,分组统计每月入职人数。 - 示例代码:
SELECT MONTH(hire_date) AS month, COUNT(*) AS new_emp_count FROM employees WHERE YEAR(hire_date) = 2023 GROUP BY MONTH(hire_date) ORDER BY month;
57. 如何查询“职位为’销售’且工资排名前3”的员工?
- 原理说明:先筛选职位为“销售”的员工,按工资降序排序,再用
LIMIT
取前3条。 - 示例代码:
SELECT name, salary FROM employees WHERE position = '销售' ORDER BY salary DESC LIMIT 3;
58. 如何查询“年龄最大的3名员工”?
- 原理说明:按年龄降序排序(年龄最大在前),用
LIMIT 3
取前3名。 - 示例代码:
SELECT name, age FROM employees ORDER BY age DESC LIMIT 3;
59. 如何统计“每个部门的男女员工比例”?
- 原理说明:按部门和性别分组统计人数,用条件聚合(
SUM(CASE...)
)计算男女数量,再计算比例。 - 示例代码:
(SELECT dept,-- 男性人数SUM(CASE WHEN gender = '男' THEN 1 ELSE 0 END) AS male_count,-- 女性人数SUM(CASE WHEN gender = '女' THEN 1 ELSE 0 END) AS female_count,-- 男女比例(男性/女性,避免除数为0)ROUND(SUM(CASE WHEN gender = '男' THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN gender = '女' THEN 1 ELSE 0 END), 0), 2) AS male_female_ratio FROM employees GROUP BY dept;
NULLIF
用于避免女性人数为0时的除法错误)
60. 如何查询“连续两个月工资上涨”的员工?
- 原理说明:用
LAG()
窗口函数获取上一个月的工资,比较当前月工资是否高于上月,筛选连续两个月上涨的员工。 - 示例代码:
-- 假设工资表salaries包含员工ID、月份、工资 WITH monthly_salary AS (SELECT emp_id,month,salary,-- 获取上一个月的工资LAG(salary) OVER (PARTITION BY emp_id ORDER BY month) AS last_month_salaryFROM salaries ) SELECT DISTINCT emp_id FROM monthly_salary -- 当前月工资 > 上月工资,且上月工资 > 上上月工资(连续两个月上涨) WHERE salary > last_month_salary AND last_month_salary > LAG(salary, 2) OVER (PARTITION BY emp_id ORDER BY month);
二、150道面试题目录列表
文章序号 | SQL面试题150道 |
---|---|
1 | SQL面试题及详细答案150道(01-20) |
2 | SQL面试题及详细答案150道(20-40) |
3 | SQL面试题及详细答案150道(41-60) |
4 | SQL面试题及详细答案150道(61-80) |
5 | SQL面试题及详细答案150道(81-100) |
6 | SQL面试题及详细答案150道(101-115) |
7 | SQL面试题及详细答案150道(116-135) |
8 | SQL面试题及详细答案150道(136-150) |