当前位置: 首页 > news >正文

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日及之后。
  • 示例代码
    SELECT * 
    FROM employees 
    WHERE hire_date >= '2023-01-01';
    
    或更精确地排除2023年之前:
    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道
1SQL面试题及详细答案150道(01-20)
2SQL面试题及详细答案150道(20-40)
3SQL面试题及详细答案150道(41-60)
4SQL面试题及详细答案150道(61-80)
5SQL面试题及详细答案150道(81-100)
6SQL面试题及详细答案150道(101-115)
7SQL面试题及详细答案150道(116-135)
8SQL面试题及详细答案150道(136-150)
http://www.dtcms.com/a/340416.html

相关文章:

  • 【自记】Power BI 中 ALL、ALLSELECTED、ALLEXCEPT、ALLNOBLANKROW 的区别说明
  • 自学嵌入式第二十三天:数据结构(3)-双链表
  • SQL四大类命令(DQL、DML、DDL、DCL)
  • 第1课_Rust基础入门
  • Rust系统编程:从入门到实战的蜕变之旅
  • MySQL 数据与表结构导出 Excel 技术文档
  • 基础笔记8.20
  • Spring Cloud Gateway 负载均衡全面指南
  • 甘特图-项目可视化引擎|Highcharts.js 模块特征
  • Linux I/O 多路复用实战:Select/Poll 编程指南
  • Java主流框架全解析:从企业级开发到云原生
  • 通过自动化本地计算磁盘与块存储卷加密保护数据安全
  • 819 机器学习-决策树2
  • 学习threejs,打造宇宙星云背景
  • 芯科科技即将重磅亮相IOTE 2025深圳物联网展,以全面的无线技术及生态覆盖赋能万物智联
  • CentOS 系统 Java 开发测试环境搭建手册
  • CentOS 7.6安装崖山23.4.1.102企业版踩坑实战记录(单机)
  • Git 新手完全指南(二):在vscode中使用git
  • Linux 文本处理与 Shell 编程笔记:正则表达式、sed、awk 与变量脚本
  • CentOS 7/8 搭建 Samba 文件共享服务并与Windows无缝集成
  • centos配置ip地址不生效
  • 关于多个el-input的自动聚焦,每输入完一个el-input,自动聚焦到下一个
  • 基于SpringBoot的校园跳蚤市场二手交易管理系统【2026最新】
  • 如何删除三星手机上的所有内容(5 种解决方案)
  • 微美全息(NASDAQ:WIMI):以区块链+云计算混合架构,引领数据交易营销科技新潮流
  • 2026 济南淀粉深加工展览会亮点:玉米科技与未来产业发展
  • Vue3 element ui 给表格的列设置背景颜色
  • vue3源码reactivity响应式之数组代理的方法
  • 解决前端项目启动时找不到esm文件的问题
  • 微算法科技(NASDAQ: MLGO)引入高级区块链DSR算法:重塑区块链网络安全新范式