SQL JOIN 关键字
sql join 关键字
sql join 用于把来自两个或多个表的行结合起来。
下图展示了 left join、right join、inner join、outer join 相关的 7 种用法。
1. sql join
sql join 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
最常见的 join 类型:sql inner join(简单的 join)。 sql inner join 从多个表中返回满足 join 条件的所有行。
样本数据库
在本教程中,我们将使用 yapf 样本数据库。
下面是选自 "websites" 表的数据:
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | google | https://www.google.cm/ | 1 | usa | | 2 | 淘宝 | https://www.taobao.com/ | 13 | cn | | 3 | 硕编程 | http://www.yapf.com/ | 4689 | cn | | 4 | 微博 | http://weibo.com/ | 20 | cn | | 5 | facebook | https://www.facebook.com/ | 3 | usa | | 7 | stackoverflow | http://stackoverflow.com/ | 0 | ind | +----+---------------+---------------------------+-------+---------+
下面是 "access_log" 网站访问记录表的数据:
+-----+---------+-------+------------+ | aid | site_id | count | date | +-----+---------+-------+------------+ | 1 | 1 | 45 | 2016-05-10 | | 2 | 3 | 100 | 2016-05-13 | | 3 | 1 | 230 | 2016-05-14 | | 4 | 2 | 10 | 2016-05-14 | | 5 | 5 | 205 | 2016-05-14 | | 6 | 4 | 13 | 2016-05-15 | | 7 | 3 | 220 | 2016-05-15 | | 8 | 5 | 545 | 2016-05-16 | | 9 | 3 | 201 | 2016-05-17 | +-----+---------+-------+------------+
请注意,"websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面这两个表是通过 "site_id" 列联系起来的。
然后,如果我们运行下面的 sql 语句(包含 inner join):
select websites.id, websites.name, access_log.count, access_log.date from websites inner join access_log on websites.id=access_log.site_id; 执行结果: +----+------------+-------+------------+ | id | name | count | date | +----+------------+-------+------------+ | 1 | google | 45 | 2016-05-10 | | 1 | google | 230 | 2016-05-14 | | 2 | 淘宝 | 10 | 2016-05-14 | | 3 | 硕编程 | 100 | 2016-05-13 | | 3 | 硕编程 | 220 | 2016-05-15 | | 3 | 硕编程 | 201 | 2016-05-17 | | 4 | 微博 | 13 | 2016-05-15 | | 5 | facebook | 205 | 2016-05-14 | | 5 | facebook | 545 | 2016-05-16 | +----+------------+-------+-----------+
2. 不同的 sql join
在我们继续讲解范例之前,我们先列出您可以使用的不同的 sql join 类型:
- inner join:如果表中有至少一个匹配,则返回行
- left join:即使右表中没有匹配,也从左表返回所有的行
- right join:即使左表中没有匹配,也从右表返回所有的行
- full join:只要其中一个表中存在匹配,则返回行