当前位置: 首页 > 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.xdnf.cn/news/1331533.html

相关文章:

  • 【报错】Please do not run this script with sudo bash
  • 开源大模型如何选择?GPT-OSS综合评估
  • IDEA切换分支时,提示:Git Checkout Problem
  • 4位量化:常规的线性层被替换成了4位线性层(48)
  • 服务器硬件电路设计之 SPI 问答(二):SPI 与 I2C 的特性博弈及多从机设计之道
  • 基于单片机环境火灾安全检测
  • 27.语言模型
  • 3D max制作蝴蝶结详细步骤(新手可跟)♥️
  • Angular入门教程
  • Angular由一个bug说起之十八:伴随框架升级而升级ESLint遇到的问题与思考
  • 【机器学习】什么是损失景观(Loss Landscape)?
  • FPGA实现Aurora 64B66B图像视频点对点传输,基于GTH高速收发器,提供2套工程源码和技术支持
  • 大数据毕业设计选题推荐-基于大数据的1688商品类目关系分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • 新手向:使用STM32通过RS485通信接口控制步进电机
  • 实验8.20
  • Feign - 降级选 fallback 还是 fallbackFactory
  • HTTP/1.1 与 HTTP/2 全面对比:性能革命的深度解析
  • Final Cut Pro X Mac fcpx音视频剪辑编辑
  • MacBook Pro M1升级Burp Suite2025.8
  • 实时视频技术选型深度解析:RTSP、RTMP 与 WebRTC 的边界
  • AI on Mac, Your Way!全本地化智能代理,隐私与性能兼得
  • STM32存储结构
  • 【JavaEE】多线程(线程安全问题)
  • 中国大学MOOC-C语言第九周指针(上)
  • 数据结构:利用旋转在AVL树中维持平衡(Inserting in AVL with Rotation)
  • 自建开发工具IDE(一)之拖找排版—仙盟创梦IDE
  • RabbitMQ 基础
  • 吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
  • Windows 中的“计数器”
  • TDengine IDMP 运维指南(数据导入导出)