1. MySQL复合查询概述
在日常数据库操作中,单表查询往往无法满足复杂的业务需求。MySQL复合查询通过组合多种查询方式,能够实现更灵活、更强大的数据检索功能。作为一名长期使用MySQL的开发人员,我发现复合查询是处理复杂业务逻辑的利器,特别是在报表统计、数据分析等场景下尤为实用。
复合查询主要包括以下几种类型:
- 多表查询(连接查询)
- 自连接
- 子查询(嵌套查询)
- 合并查询
- 内外连接
这些查询方式可以单独使用,也可以相互组合,形成更复杂的查询语句。下面我将结合实例详细讲解每种查询方式的特点和使用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础查询回顾与练习
2.1 单表基础查询
在开始复合查询前,我们先回顾下基础的单表查询。假设我们有以下三张表:
- EMP员工表(员工编号、姓名、岗位、工资等)
- DEPT部门表(部门编号、部门名称等)
- SALGRADE工资等级表(等级范围)
示例1:查询工资高于500或岗位为MANAGER的雇员,且姓名首字母为J:
sql复制SELECT * FROM emp
WHERE (sal > 500 OR job = 'MANAGER')
AND ename LIKE 'J%';
示例2:按部门号升序、工资降序排序:
sql复制SELECT * FROM emp
ORDER BY deptno ASC, sal DESC;
提示:ORDER BY子句可以指定多个排序条件,优先级从左到右
2.2 聚合函数与分组查询
示例3:显示每个部门的平均工资和最高工资:
sql复制SELECT deptno, AVG(sal) as avg_sal, MAX(sal) as max_sal
FROM emp
GROUP BY deptno;
示例4:显示平均工资低于2000的部门信息:
sql复制SELECT deptno, AVG(sal) as avg_sal
FROM emp
GROUP BY deptno
HAVING avg_sal < 2000;
注意事项:
- WHERE在分组前过滤,HAVING在分组后过滤
- 聚合函数不能直接用在WHERE子句中
