Part 07 MySQL多表查询
1092字约4分钟
2024-12-11
1 DQL回顾
在之前的DQL单表查询中,已经提到过单张真实表使用查询语法得到所需的虚拟表。而在多表查询中,需要利用合并语法将若干张真实表合并为一个中间虚拟表,在此基础上使用查询语句得到最终的所需要的虚拟表。
因此,多表查询的重点在于利用多表合并语法得到单张虚拟表。按照合并的方向,可以分为水平合并和垂直合并。
2 垂直合并
垂直合并用于将两张具有相同数量的字段且对应字段的数据类型相同的结果集合并成一张表。
垂直合并只是将结果集简单汇总,不涉及记录之间的连接,因此不要求有主外键。
-- 去除重复结果合并。只有当两条记录的所有字段值均相同时,才认为是重复结果。
SELECT <字段A1>, <字段A2> FROM <表A>
UNION
SELECT <字段B1>, <字段B2> FROM <表B>
UNION
SELECT <字段C1>, <字段C2> FROM <表C>;
-- 不去除重复结果
SELECT <字段A1>, <字段A2> FROM <表A>
UNION ALL
SELECT <字段B1>, <字段B2> FROM <表B>
UNION ALL
SELECT <字段C1>, <字段C2> FROM <表C>;
3 水平合并
水平合并又称为连接,用于将两张表之间的记录与记录相连接,因此要求两个表必须有主外键。
3.1 内连接
内连接会根据指定的连接条件(主外键相等),将两个表中满足条件的记录进行匹配,并返回匹配成功的记录。
-- 标准语法
SELECT * FROM <表A> JOIN <表B> ON <表A>.<表A主键> = <表B>.<表B外键>;
-- 非标准语法
SELECT * FROM <表A>, <表2> WHERE <表A>.<表A主键> = <表B>.<表B外键>;
连接查询就是将所有数据行拼接一次,然后根据主外键相等的条件筛选出正确连接的数据。
3.2 外连接
与内连接不同的是,外连接会返回所有符合匹配条件的记录,同时还会返回不符合匹配条件的记录。
外连接需要通过左和右指定一个逻辑主表,逻辑主表中的数据一定会被查询到。
-- 左连接
SELECT * FROM <表A> LEFT JOIN <表B> ON <表A>.<表A主键> = <表B>.<表B外键>;
-- 右连接
SELECT * FROM <表A> RIGHT JOIN <表B> ON <表A>.<表A主键> = <表B>.<表B外键>;
推荐将分析的逻辑主表放在左侧以保证外连接的连续性。
SELECT * FROM <表A>
LEFT JOIN <表B> ON <表A>.<表A主键> = <表B>.<表B外键>
LEFT JOIN <表C> ON <表A>.<表A主键> = <表C>.<表C外键>
LEFT JOIN ...;
此时结果中必包含表A的全部数据。
3.3 自然连接
自然连接会自动找到两个表中相同的字段名并判断相等,可以省略ON <表A>.<表A主键> = <表B>.<表B外键>
。
但是需要注意的是,除了主外键之外,如果有其他列名也相同,也会自动判定相等。
-- 自然内连接
SELECT * FROM <表A> NATURAL JOIN <表B>;
-- 自然左连接
SELECT * FROM <表A> NATURAL LEFT JOIN <表B>;
-- 自然右连接
SELECT * FROM <表A> NATURAL RIGHT JOIN <表B>;
3.4 自连接
自连接是指一个表与自身进行连接的操作。它在查询中使用相同表的别名来表示两个不同的实例,然后通过连接条件将这两个实例进行连接。
自连接是一种特殊的内外连接。当一个表中存在数据的引用关系,要查询的数据关联在同一个表的其他行中,就可以用自连接。
例如,员工表中存在员工编号和领导编号,当查询员工的领导信息时就属于自连接。
4 子查询
子查询是指在一个SQL语句中嵌套一个完整的SELECT语句。
标量子查询
子查询返回单行单列
行子子查询
子查询返回一行多列
列子子查询
子查询返回一列多行
表子子查询
子查询返回多行多列