【MySQL 学习笔记 _ Day13】多表连接进阶 + 企业实战5题(IN_BETWEEN_LIKE_日期_比较)
【MySQL 学习笔记 | Day13】多表连接进阶 + 企业实战5题(IN/BETWEEN/LIKE/日期/比较)
大家好,我是白鹿为溪~ 今天是MySQL初级SQL学习的第13天,承接Day12的多表连接基础,今天重点讲解多表连接的进阶场景,同时配套5道难度略高于基础的企业SQL题,精准覆盖IN、BETWEEN、LIKE、日期函数、比较运算符,贴合初级开发高频需求,帮大家巩固多表连接的同时,熟练运用各类常用运算符,内容无冗余、纯初级知识点,可直接复制到博客园发布。
一、前言
Day12我们掌握了INNER JOIN、LEFT JOIN、RIGHT JOIN的基础用法,今天重点讲解多表连接的进阶场景(多表连接+条件过滤、多表连接+简单统计),同时配套5道难度略高于基础的企业SQL题,精准覆盖IN、BETWEEN、LIKE、日期函数、比较运算符,贴合初级开发高频需求,帮大家巩固多表连接的同时,熟练运用各类常用运算符。
二、核心知识点:多表连接进阶(初级必掌握)
1. 多表连接+条件过滤(企业高频)
核心逻辑:先通过JOIN关联多张表,再用WHERE过滤原始数据,最后按需排序/统计,区别于HAVING(过滤聚合结果),这里的条件过滤针对的是关联后的每一行原始数据。
实战案例:查询部门地址为「上海」且薪资大于6000的员工信息,显示员工姓名、薪资、部门名称、部门地址,按薪资降序排列。
SELECT
e.emp_name,
e.salary,
d.dept_name,
d.dept_address
FROM emp e
INNER JOIN dept d ON e.dept_id = d.dept_id
WHERE d.dept_address = '上海' -- 部门地址条件(比较运算符)
AND e.salary > 6000 -- 薪资条件(比较运算符)
ORDER BY e.salary DESC;
2. 多表连接+简单统计
核心逻辑:多表连接后,结合COUNT、SUM等基础聚合函数,实现简单的分组统计,无需复杂的高级聚合,贴合初级开发场景。
实战案例:统计每个部门、不同性别的员工人数,显示部门名称、性别、员工人数,按部门名称升序排列。
SELECT
d.dept_name,
e.gender,
COUNT(e.emp_id) AS emp_count
FROM emp e
LEFT JOIN dept d ON e.dept_id = d.dept_id
GROUP BY d.dept_name, e.gender
ORDER BY d.dept_name ASC;
3. 常用运算符回顾(铺垫练习题)
结合今日练习题,快速回顾5类核心运算符,重点掌握初级场景的用法:
-
比较运算符:>、<、=、>=、<=、!=(用于薪资、年龄等数值比较)
-
IN:判断字段值是否在指定集合中(如dept_id IN (1,2,3))
-
BETWEEN ... AND ...:判断字段值是否在指定区间内(含首尾值)
-
LIKE:模糊查询,搭配%(任意字符)、_(单个字符)使用
-
日期函数:CURDATE()、DATE_SUB()等,用于日期相关条件过滤
三、今日企业实战5题(难度略高于基础,覆盖指定运算符)
基于emp(员工表)、dept(部门表)设计,所有题目均为企业初级开发高频场景,附详细参考答案和知识点解析,可直接复制执行练习。
第1题:比较运算符+多表连接
#### 题目
查询薪资在6000-8000之间(不含6000,含8000)、入职日期在2024年之后的员工信息,显示员工姓名、薪资、入职日期、部门名称,要求部门名称不含“行政”二字,按入职日期降序排列。
#### 参考答案
SELECT
e.emp_name,
e.salary,
e.entry_date,
d.dept_name
FROM emp e
INNER JOIN dept d ON e.dept_id = d.dept_id
WHERE e.salary > 6000 -- 比较运算符
AND e.salary <= 8000 -- 比较运算符
AND e.entry_date > '2024-12-31'
AND d.dept_name NOT LIKE '%行政%' -- LIKE模糊查询(取反)
ORDER BY e.entry_date DESC;
#### 知识点
比较运算符(>、<=)的组合使用,LIKE模糊查询(NOT LIKE取反),日期条件过滤。
第2题:IN运算符+条件过滤
#### 题目
查询部门ID为1、3、5的员工信息,显示员工姓名、性别、薪资、部门名称,要求性别为女,且薪资不等于7000,按薪资升序排列。
SELECT
e.emp_name,
e.gender,
e.salary,
d.dept_name
FROM emp e
INNER JOIN dept d ON e.dept_id = d.dept_id
WHERE e.dept_id IN (1,3,5) -- IN运算符,指定部门ID集合
AND e.gender = '女'
AND e.salary != 7000 -- 比较运算符(不等于)
ORDER BY e.salary ASC;
#### 知识点
IN运算符的使用(指定离散值集合),比较运算符(!=),多表连接的条件筛选。
第3题:BETWEEN...AND...+日期函数
#### 题目
查询入职时间在2023年1月1日至2024年12月31日之间的员工,显示员工姓名、入职日期、薪资、部门地址,要求薪资在5000-7500之间(含首尾),按入职日期升序排列。
SELECT
e.emp_name,
e.entry_date,
e.salary,
d.dept_address
FROM emp e
INNER JOIN dept d ON e.dept_id = d.dept_id
WHERE e.entry_date BETWEEN '2023-01-01' AND '2024-12-31' -- 日期区间
AND e.salary BETWEEN 5000 AND 7500 -- 薪资区间(BETWEEN)
ORDER BY e.entry_date ASC;
#### 知识点
BETWEEN...AND...运算符(日期、数值区间均适用),多表连接关联部门地址。
第4题:LIKE模糊查询+多表统计
#### 题目
统计部门名称包含“技术”或“研发”的部门,每个部门的员工人数和平均薪资,显示部门名称、员工人数、平均薪资(保留2位小数),要求平均薪资大于6500,按平均薪资降序排列。
SELECT
d.dept_name,
COUNT(e.emp_id) AS emp_count,
ROUND(AVG(e.salary), 2) AS avg_salary
FROM emp e
INNER JOIN dept d ON e.dept_id = d.dept_id
WHERE d.dept_name LIKE '%技术%' OR d.dept_name LIKE '%研发%' -- LIKE模糊查询(多条件)
GROUP BY d.dept_name
HAVING AVG(e.salary) > 6500 -- 比较运算符,过滤聚合结果
ORDER BY avg_salary DESC;
#### 知识点
LIKE模糊查询(多条件搭配OR),聚合函数(COUNT、AVG),ROUND函数保留小数,HAVING过滤聚合结果。
第5题:日期函数+比较运算符+IN
#### 题目
查询入职时间超过1年(按当前日期2026-04-16计算)、部门ID不在2、4的员工信息,显示员工姓名、入职日期、工龄(保留1位小数)、薪资,要求薪资>6000,按工龄降序排列。
SELECT
e.emp_name,
e.entry_date,
ROUND(TIMESTAMPDIFF(YEAR, e.entry_date, CURDATE()), 1) AS work_years, -- 日期函数计算工龄
e.salary
FROM emp e
WHERE e.entry_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR) -- 日期函数+比较运算符
AND e.dept_id NOT IN (2,4) -- IN运算符(取反)
AND e.salary > 6000 -- 比较运算符
ORDER BY work_years DESC;
#### 知识点
日期函数(TIMESTAMPDIFF、CURDATE、DATE_SUB)的使用,IN运算符(NOT IN取反),比较运算符,ROUND函数保留小数。
四、今日学习总结
1. 掌握了多表连接进阶用法(多表连接+条件过滤、多表连接+简单统计),贴合企业初级开发场景;
2. 熟练运用比较运算符、IN、BETWEEN、LIKE、日期函数,能应对难度略高于基础的企业SQL查询;
3. 理解了各类运算符的适用场景,能根据业务需求灵活组合使用,提升SQL查询的实用性。
五、明日预告
后续将继续更新MySQL初级SQL相关内容,聚焦初级高频知识点,配套企业实战题,稳步夯实基础,为后续SpringBoot学习做好铺垫。
(注:文档部分内容可能由 AI 生成)

浙公网安备 33010602011771号