MySQL 复合查询解决单表无法满足的复杂业务需求。内容涵盖多表关联消除笛卡尔积、自连接处理层级关系、子查询嵌套筛选及 Union 集合操作。结合员工薪资等实战案例演示语法细节,重点讲解关联条件、别名管理及性能优化要点,助力开发者高效完成跨表数据检索与分析任务。
暗影行者9 浏览
MySQL 复合查询实战:多表关联、子查询与合并技巧
在实际开发中,单表查询往往无法满足复杂的业务需求。员工信息散落在不同的表中,需要跨表关联才能获取完整数据;统计分析时需嵌套查询筛选条件;多结果集合并需用到集合操作符。本文全面拆解 MySQL 复合查询的核心玩法,包括多表查询、自连接、子查询、合并查询,所有 SQL 均采用小写形式,贴合开发规范,附带实战案例和避坑要点。
一、基础回顾:复合查询的前置知识
在学习复杂复合查询前,先回顾基础查询的核心语法,为后续进阶打基础:
-- 1. 条件筛选:工资>500 或岗位为 manager,且姓名首字母为 JSELECT*FROM emp WHERE (sal >500OR job ='manager') AND ename LIKE'j%';
-- 2. 多字段排序:部门号升序,工资降序SELECT*FROM emp ORDERBY deptno ASC, sal DESC;
-- 3. 计算字段 + 排序:年薪(sal*12+补贴)降序SELECT ename, sal *12+ IFNULL(comm, 0) AS 年薪 FROM emp ORDERBY 年薪 DESC;
-- 4. 聚合查询 + 筛选:各部门平均工资(保留 2 位小数)和最高工资SELECT deptno, FORMAT(AVG(sal), 2) AS 平均工资,MAX(sal) AS 最高工资 FROM emp GROUPBY deptno;
-- 5. having 筛选聚合结果:平均工资低于 2000 的部门SELECT deptno, (sal) avg_sal emp deptno avg_sal ;
SELECT ename, sal, job FROM emp WHERE sal >2500UNION-- 自动去重(manager 中工资>2500 的员工只显示一次)SELECT ename, sal, job FROM emp WHERE job ='manager';
案例 2:union all 不去重合并需求:查询工资 > 2500 或岗位为 manager 的员工(保留重复)
SELECT ename, sal, job FROM emp WHERE sal >2500UNIONALL-- 保留重复行(manager 中工资>2500 的员可能会显示多次)SELECT ename, sal, job FROM emp WHERE job ='manager';
六、实战 OJ 真题:复合查询落地应用
结合经典 OJ 题,练习复合查询的实际应用:
真题 1:查找所有员工入职时的薪水情况(emp_no+salary,逆序)
SELECT e.emp_no, s.salary
FROM employees e, salaries s
WHERE e.emp_no = s.emp_no AND s.from_date = e.hire_date
ORDERBY e.emp_no DESC;
真题 2:生成所有表的 count 查询语句
SELECT CONCAT('SELECT COUNT(*) FROM ', table_name, ';') AS count_sql
FROM information_schema.tables
WHERE table_schema ='your_database_name'; -- 替换为你的数据库名
真题 3:获取所有非 manager 的员工 emp_no
SELECT emp_no FROM employees
WHERE emp_no NOTIN (SELECT emp_no FROM dept_manager);
真题 4:获取所有员工当前的 manager(排除 manager 是自己的情况)
SELECT e.emp_no, d.emp_no AS manager
FROM dept_emp AS e, dept_manager AS d
WHERE e.dept_no = d.dept_no AND e.emp_no != d.emp_no;
七、总结
MySQL 复合查询是解决复杂业务需求的核心,核心要点总结:
多表查询:通过关联字段消除笛卡尔积,适用于跨表提取数据;
自连接:同表当作两张表,适用于表内关联(如员工与领导);
子查询:嵌套在 where/from 子句中,灵活筛选和统计,需注意单行/多行匹配规则;
合并查询:union(去重)和 union all(不去重),适用于多结果集合并;
避坑关键:关联字段一致、临时表起别名、优先选择高效语法(如 union all 替代 union)。
掌握这些复合查询技巧,能应对 90% 以上的业务场景。建议多结合实际需求练习,逐步提升 SQL 的灵活性和性能优化能力。后续会持续更新 MySQL 索引优化、事务、存储过程等进阶内容,带你从入门到精通数据库开发。