数据库表连接(join)的简单解释
多表连接查询
- 内连接
- 外连接
- 交叉连接
连接查询是啥
所谓”连接”,就是两张表根据关联字段,组合成一个数据集。
举例
车站站点表。假设用的是关系型数据库(早期开发中估计这么干,现在估计用的都是图数据库)
我们建一张表 bus_sche,为了简单,表中只有上一站地点和下一站地点及唯一标识,然后插入一些模拟数据。
可以通过自连接查询上下站关系找到坐车线路
SELECT b.lastStation,b.nextStation,a.lastStation,a.nextStation
FROM bus_sche a, bus_sche b
WHERE b.nextStation = a.lastStation;
只在一张表中查询,表 bus_sche 使用了两个别名 bus_sche a, bus_sche b,因此相当于有两张表,用 WHERE条件连接查询
查询结果
四种连接(内外连接)
字段不可以构成完全匹配的情况下:
只返回两张表匹配的记录,这叫内连接(inner join)。
返回匹配的记录,以及表 A 多余的记录,这叫左连接(left join)。
返回匹配的记录,以及表 B 多余的记录,这叫右连接(right join)。
返回匹配的记录,以及表 A 和表 B 各自的多余记录,这叫全连接(full join)。
这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。
颜色表示匹配关系(比如A.book_id=B.book_id)
左连接的结果举例:
SQL
这四种连接的 SQL 语句如下。
SELECT * FROM A INNER JOIN B ON A.book_id=B.book_id; SELECT * FROM A LEFT JOIN B ON A.book_id=B.book_id; SELECT * FROM A RIGHT JOIN B ON A.book_id=B.book_id; SELECT * FROM A FULL JOIN B ON A.book_id=B.book_id;
上面的 SQL 语句还可以加上where
条件从句,对记录进行筛选,比如只返回表 A 里面不匹配表 B 的记录。
SELECT * FROM A LEFT JOIN B ON A.book_id=B.book_id WHERE B.id IS null;
另一个例子,返回表 A 或表 B 所有不匹配的记录。
SELECT * FROM A FULL JOIN B ON A.book_id=B.book_id WHERE A.id IS null OR B.id IS null;
交叉连接
“交叉连接”(cross join),指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。