MySQL 联合查询实战
在数据库设计的范式下,数据往往分散在多个表中。当我们需要同时获取这些表的信息时,就必须使用联合查询(Join)将多个表连接起来。
笛卡尔积的陷阱
如果直接对两个表进行查询而不加限制,会产生笛卡尔积。例如:
SELECT * FROM student, class;
这会返回两个表行数的乘积,数据量会非常庞大且包含大量无效结果。正确的做法是加上 WHERE 条件,确保关联字段相等:
SELECT * FROM student, class WHERE student.class_id = class.id;
此时查询结果才合理。为了避免歧义,建议显式指定列名并使用表别名,特别是当不同表存在同名列时:
SELECT student.id, student.name, sex, student.class_id, class.id, class.name
FROM student, class
WHERE student.class_id = class.id;
联合查询基本步骤:
- 确定查询表(隐含笛卡尔积)
- 确定连接条件
- 加入过滤条件
- 精简查询列,建议使用表别名
内连接 (Inner Join)
内连接只返回两个表中连接字段相匹配的行。除了传统的逗号分隔写法,推荐使用标准的 JOIN 语法:
-- 传统写法
SELECT 字段 FROM 表 1 别名 1, 表 2 别名 2 WHERE 连接条件 AND 其他条件;
-- 标准写法
SELECT 字段 FROM 表 1 别名 1 INNER JOIN 表 2 别名 2 ON 连接条件 WHERE 其他条件;
示例:查询学生成绩
假设有课程、班级、学生、分数四张表。查询'唐三藏'的所有学科成绩:


