本文仅在 Mysql 中验证,其它数据库中可能会有差异。
多表查询,即同时查询两张表或更多表,包括交叉连接、内连接、左/右外连接、合并等。
在使用时:
- 多张表中的列名可能一致,所以必须为每张表起别名,通过别名指向对应的列
- 通常需要有关联条件
交叉连接查询:
- 得到的是两个表的乘积(笛卡尔集),返回左表中的所有行,及左表中的每一行与右表中的所有行组合
- 简单查询两张表组合,就是求笛卡儿积,效率最低,基本不会使用。
select * from a, b;
内/外连接
内连接查询:
- 可以有效的去除笛卡尔集现象
- 有两种方式:隐式内连接,显式内连接
"隐式内连接:"
select a.xx, a.xxx, b.xxx
from A a, B b
where a.xx = b.xx;
或者:
select a.*, b.*
from A a, B b
where a.xx = b.xx;
"显式内连接:"
select * from A a
inner join B b
on a.xx = b.xx;
(其中 inner 可以省略)
外连接查询:
- 有两种方式:左外连接,右外连接
- 左外连接:简称左连接
- 左边表的内容全部显示,然后匹配右边的表
- 如果右边的表匹配不到,则空
- 即返回两张表共有的部分,及左表中独有的信息
- 右外连接:简称右连接
- 右边表的内容全部显示,然后匹配左边的表
- 如果左边的表匹配不到,则空
- 即返回两张表共有的部分,及右表中独有的信息
(其中,out 可省略)
"左外连接:"
select * from A
left outer join B
on 条件
"右外连接:"
select * from A
right out join B
on 条件
总结:
- 内连接:两表交集
- 左外连接:左边表,包含两表交集
- 右外连接:右边表,包含两表交集
select a.field1, b.field2...
from tab1 a
inner/left/right join tab2 b
on a.field1 = b.field1;
Union 合并
- 用于合并两个或多个 SELECT 语句的结果集
- 使用 UNION 时,多张表查询的结果要有相同数量的列、且列类型相似。
- 有两种用法:
UNION
和UNION ALL
UNION:
- 消除多表中任何重复行
UNION ALL:
- 不消除重复行