基础回顾
聚合函数
- COUNT(列名/常量/):统计记录的条数,推荐使用 COUNT()。
- SUM(列名):求和,列必须是数值类型。
- ROUND(数值,小数点的位数):格式化小数输出格式。
- AVG(列名):求平均值,列必须是数值类型。
- MAX(列名):求最大值,列必须是数值类型。
- MIN(列名):求最小值,列必须是数值类型。
分组查询
语法:SELECT 要分组的列,聚合函数 (列名) FROM 表名 GROUP BY 要分组的列 HAVING 对分组的结果进行过滤
WHERE 子句与 HAVING 子句的区别
- WHERE 子句:用于在分组前过滤数据行。
- HAVING 子句:用于在分组后对分组结果进行筛选,特别适用于聚合函数的条件过滤。
- HAVING 与 GROUP BY:通常与 GROUP BY 一起使用,便于对分组后的结果进行筛选。
- WHERE 和 HAVING 的结合使用:先使用 WHERE 子句进行行级筛选,然后再使用 HAVING 进行分组后的筛选。
联合查询概述
使用联合查询的步骤
- 明确查询需求:确定要从两个(或多个)表中查询哪些数据。明确哪些表包含所需信息,哪些字段之间有关系(笛卡尔积)。
- 选择 JOIN 类型:根据需求选择合适的 JOIN 类型:
- INNER JOIN(内连接):只返回两个表中都有匹配的数据。
- LEFT JOIN(左连接):返回左表的所有数据,右表中没有匹配时显示 NULL。
- RIGHT JOIN(右连接):返回右表的所有数据,左表中没有匹配时显示 NULL。
- FULL JOIN(全连接):(MySQL 需用 UNION 实现):返回两个表中的所有数据。
- CROSS JOIN(交叉连接):返回两个表的笛卡尔积,生成所有可能的组合。
- 编写 JOIN 查询语句:编写 SQL 查询语句,指定表之间的连接条件(ON 条件),通常是表之间的主键和外键。
- 添加过滤条件:使用 WHERE 子句进一步限制结果集。
- 执行并验证查询结果:运行查询,检查返回的结果是否符合需求。
为什么要使用联合查询?
- 避免数据冗余:联合查询帮助从分散的表中合并数据,避免重复存储大量数据。
- 高效的数据管理:当数据分布在多个表中时,通过 JOIN 可以快速检索关联数据。
- 多表关系查询:大部分实际应用场景的数据是相互关联的,联合查询能够从关联表中提取相关数据。
- 简化查询逻辑:在单条 SQL 语句中获取多个表的关联数据,简化了数据提取和处理的逻辑。
连接类型详解
1. 笛卡尔积 (CROSS JOIN)
概念:将两个表中的每一条记录都与另一个表中的每一条记录组合,生成所有可能的组合。如果表 A 有 m 条记录,表 B 有 n 条记录,那么笛卡尔积的结果会包含 m * n 条记录。
示例:
INSERT INTO school VALUES (1,'李白'),(2,'白居易');
INSERT INTO subject VALUES (,),(,),(,);
school.name, subject.subject01
school
subject;


