一、子查询
子查询,又称之为内查询,是一种嵌套在其他 Sql 查询的 Where 子句中的查询。
- 子查询必须包含在圆括号内,并且不能使用 ORDER BY 进行排序。
实例 1 :
1 | SELECT * FROM a WHERE id IN (SELECT a_id FROM b); |
只能查询到 a 表内容,以子查询结果作为查询条件。
实例 2 :
1 | SELECT * FROM a, (SELECT a_id,remark FROM b)b WHERE a.id = b.a_id ; |
这种子查询格式是基于笛卡尔积,所以两表数据都可以查询到,但子查询结果中必须包含关联字段,且子查询表需要设置别名。最后要加上过滤条件过滤查询结果才能得到理想数据。
因为子查询结果可以控制第二个表乘积后的大小,相对于上面两个表直接乘积查询速度会快一点。
二、笛卡尔积查询
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y。
笛卡尔积在数据库查询中的应用:
- 先确定数据要用到哪些表。
- 将多个表先通过笛卡尔积生成一个查询结果集。
- 然后去除不符合逻辑的数据(根据两个表的关系去掉)。
- 最后当做是一个虚拟表一样来加上过滤条件得出查询数据。
实例 1:不使用查询条件过滤结果
1 | SELECT * FROM a,b |
实例 2:使用查询条件过滤结果
a 表的字段 id 与 b 表的字段 a_id 互为关联字段
1 | SELECT * FROM a,b WHERE a.id = b.a_id |
这种查询方式简单粗暴,它会先乘积生成两张表的查询结果集,然后再通过限制条件去过滤;因此,在数据量大的时候,查询速度会很慢
三、连接查询(join on)
JOIN 连接用于把来自两个或多个表的行结合起来。
- 其连接方式又分交叉连接、外连接和内连接。
1、交叉连接(cross join)
和笛卡尔积查询相似,交叉连接是基于笛卡尔积的连接方式,它实际上是把两个表乘起来,所以又称为笛卡尔积连接。交叉连接不能使用连接条件,但可以使用查询条件。
实例1:
1 | SELECT * FROM a CROSS JOIN b |
实例 2:
1 | ELECT * FROM a CROSS JOIN b WHERE a.id = b.student_id |
2、外连接()
外连接分为两种,一种是左连接(left join)和右连接(right join)。
2.1、左外连接(left join)
左连接全称为左外连接,是外连接的一种。是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只返回 ON 后条件与左表满足的部分,右表不存在的字段数据用 null 代替。
- 关键词为 LEFT JOIN 或 LEFT OUTER JOIN
实例:
1 | SELECT * FROM a LEFT JOIN b ON a.id = b.a_id ; |
id | name | a_id | age |
---|---|---|---|
1 | 张三 | 1 | 少年 |
2 | 李四 | 2 | 青年 |
3 | 王五 | null | null |
2.2、右外连接(right join)
右连接全称为右外连接,是外连接的一种。是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出 ON 后条件与右表满足的部分,左表不存在的字段数据用null代替。
- 关键词为 RIGHT JOIN 或 RIGHT OUTER JOIN
实例:
1 | SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id ; |
id | name | a_id | age |
---|---|---|---|
1 | 张三 | 1 | 少年 |
2 | 李四 | 2 | 青年 |
null | null | 3 | 老年 |
3、内连接
指同时将两表作为参考对象,根据ON后给出的两表的条件将两表连接起来。结果则是两表同时满足ON后的条件的部分才会列出。
实例:
1 | SELECT * FROM a INNER JOIN b ON a.id = b.a_id ; |
id | name | a_id | age |
---|---|---|---|
1 | 张三 | 1 | 少年 |
2 | 李四 | 2 | 青年 |
4、完全连接
全连接其实是左连接和右连接的一个合集,也就是说他会查询出左表和右表的全部数据,匹配不上的会显示为null。
1 | SELECT * FROM a FULL JOIN b on a.id=b.a_id; |
注意 :MySql 数据库不支持完全连接,可以使用左连接 + union + 右连接的方式去模拟完全连接。
四、联合查询(union)
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意:
- UNION 内部的 SELECT 语句必须拥有相同数量的列。
- 列也必须拥有相似的数据类型。
- 同时,每条 SELECT 语句中的列的顺序必须相同。
联合查询有两种方式,分别是 union 和 union all。
union 实例:
1 | SELECT name FROM a UNION SELECT name FROM b; |
union all 实例:
1 | SELECT name FROM a UNION ALL SELECT name FROM b; |
union all 命令和 union 命令几乎是等效的,不过 union all 命令会列出所有的值而 union 命令的值唯一。
五、总结
通常情况下,以上查询方式内连接查询会用的比较多,而基于笛卡尔积的查询查询会比较慢。
相比单表查询,多表查询可以覆盖更多业务场景,实际工作中,需要根据业务需求选择性的去使用。
2021年11月12日 稿