首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:连接类型的快速分解

问MySQL:连接类型的快速分解
EN

Stack Overflow用户
提问于 2011-06-09 14:49:45
回答 3查看 140K关注 0票数 157

我希望对MySQL联接的类型进行快速细分。我知道这些,其余的我不知道它们是什么意思。

  • 逗号分隔(这到底是什么意思?):SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • 显示a中的信息,即使b:SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...中没有匹配项

我见过其他联接,但是想知道是什么使它们不同,什么是INNER/OUTER,添加LEFT会改变什么。

我已经知道联接是如何工作的,我只想知道是否有其他类型的联接,或者它们是否只是获得相同结果的不同方式。

EN

回答 3

Stack Overflow用户

发布于 2011-06-09 15:01:15

根据您的注释,最好在W3Schools中找到每个类型的简单定义--每个类型的第一行给出了连接类型的简要说明。

  • 联接:当两个表中至少有一个匹配时返回行
  • 左联接:返回左表中的所有行,即使右表中没有匹配项
  • 右联接:返回右表中的所有行,即使左侧表中没有匹配项
  • 完全连接:当其中一个表中有匹配时返回行

端编辑

简而言之,您给出的逗号分隔的示例

代码语言:javascript
复制
SELECT * FROM a, b WHERE b.id = a.beeId AND ...

从表a和表b中选择每条记录,并使用分隔表的逗号,这也可以用于如下

代码语言:javascript
复制
SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

然后,在示例中b.id列和a.beeId列匹配的行中获取指定的信息。因此,在您的示例中,它将从表a和b获取所有信息,其中b.id等于a.beeId。在我的示例中,当a.beeName等于a.beeId时,它将从b表获取所有信息,而只从a.beeId列获取信息。注意,还有一个AND子句,这将有助于细化结果。

对于一些关于mySQL联接和左联接的简单教程和解释,请参阅Tizag的mySQL教程。您还可以查看基思·布朗的网站以获得更多关于连接的信息,这也是非常好的。

我希望这对你有帮助

票数 27
EN

Stack Overflow用户

发布于 2018-04-26 11:34:55

我有两张这样的桌子:

代码语言:javascript
复制
> SELECT * FROM table_a;
+------+------+
| id   | name |
+------+------+
|    1 | row1 |
|    2 | row2 |
+------+------+

> SELECT * FROM table_b;
+------+------+------+
| id   | name | aid  |
+------+------+------+
|    3 | row3 |    1 |
|    4 | row4 |    1 |
|    5 | row5 | NULL |
+------+------+------+

内部连接关心两个表

内部联接关心两个表,因此只有当两个表都有一行时才会得到行。如果有多个匹配对,则会得到多个行。

代码语言:javascript
复制
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
+------+------+------+------+------+

如果您反转顺序,内部联接没有什么不同,因为它关心两个表:

代码语言:javascript
复制
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
+------+------+------+------+------+

您得到相同的行,但列的顺序不同,因为我们提到的表的顺序不同。

左联接只关心第一个表

LEFT关心给它的第一个表,而不太关心第二个表,所以您总是从第一个表中获得行,即使第二个表中没有对应的行:

代码语言:javascript
复制
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
|    2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+

上面可以看到table_a的所有行,尽管其中一些行与表b中的任何行不匹配,但并不是所有table_b行都与table_a中的某些行匹配。

如果我们反转表的顺序,则左联接的行为会有所不同:

代码语言:javascript
复制
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
|    5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+

现在我们得到了所有的table_b行,但是只有匹配的table_a行。

右联接只关心第二个表

a RIGHT JOIN b为您提供与b LEFT JOIN a完全相同的行。唯一的区别是列的默认顺序。

代码语言:javascript
复制
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
| NULL | NULL |    5 | row5 | NULL |
+------+------+------+------+------+

这是与table_b LEFT JOIN table_a相同的行,我们在左侧联接部分中看到了这一点。

同样:

代码语言:javascript
复制
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
| NULL | NULL | NULL |    2 | row2 |
+------+------+------+------+------+

是与table_a LEFT JOIN table_b相同的行。

--完全没有联接--给你所有东西的副本,

如果您编写的表完全没有JOIN子句,只是用逗号分隔,那么您将得到第一个表的每一行都写在第二个表的每一行旁边,并以每一种可能的组合表示:

代码语言:javascript
复制
> SELECT * FROM table_b b, table_a;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    3 | row3 | 1    |    2 | row2 |
|    4 | row4 | 1    |    1 | row1 |
|    4 | row4 | 1    |    2 | row2 |
|    5 | row5 | NULL |    1 | row1 |
|    5 | row5 | NULL |    2 | row2 |
+------+------+------+------+------+

(这是我博客上的SQL联接类型的示例)

票数 15
EN

Stack Overflow用户

发布于 2015-12-29 23:37:39

mysql中不存在完全外部联接,您可能需要使用左连接和右连接的组合。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6294778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档