Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

数据库表连接(join)的简单解释

https://www.ruanyifeng.com/blog/2019/01/table-join.html

图解 SQL 中各种连接 JOIN - 知乎 (zhihu.com)

多表连接查询

  • 内连接
  • 外连接
  • 交叉连接

连接查询是啥

所谓”连接”,就是两张表根据关联字段,组合成一个数据集。

举例

车站站点表。假设用的是关系型数据库(早期开发中估计这么干,现在估计用的都是图数据库)

我们建一张表 bus_sche,为了简单,表中只有上一站地点下一站地点及唯一标识,然后插入一些模拟数据。

img

可以通过自连接查询上下站关系找到坐车线路

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条件连接查询

查询结果

img

四种连接(内外连接)

字段不可以构成完全匹配的情况下:

  • 只返回两张表匹配的记录,这叫内连接(inner join)

  • 返回匹配的记录,以及表 A 多余的记录,这叫左连接(left join)

  • 返回匹配的记录,以及表 B 多余的记录,这叫右连接(right join)

  • 返回匹配的记录,以及表 A 和表 B 各自的多余记录,这叫全连接(full join)

这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。

img

颜色表示匹配关系(比如A.book_id=B.book_id)

左连接的结果举例:

img

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 条记录的新表(见下图)。

img

评论