MySQL:连接类型的快速分解

MySQL:连接类型的快速分解,mysql,join,Mysql,Join,我想要一个MySQL连接类型的快速细分。我知道这些,其余的我不知道它们是什么意思 逗号分隔(这到底是什么缩写?):从a、b中选择*其中b.id=a.beeId和… 显示来自a的信息,即使b中没有匹配项:SELECT*from a LEFT OUTER JOIN b ON b.id=a.beeId其中… 我见过其他连接,但想知道是什么使它们不同,什么是内部的/外部的,添加左侧的是否会改变事情 我已经知道联接是如何工作的,我只是想知道是否有其他类型的联接,或者它们是否只是获得相同结果的不同方式。

我想要一个MySQL连接类型的快速细分。我知道这些,其余的我不知道它们是什么意思

  • 逗号分隔(这到底是什么缩写?):
    从a、b中选择*其中b.id=a.beeId和…
  • 显示来自a的信息,即使b中没有匹配项:
    SELECT*from a LEFT OUTER JOIN b ON b.id=a.beeId其中…
我见过其他连接,但想知道是什么使它们不同,什么是
内部的
/
外部的
,添加
左侧的
是否会改变事情


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

根据您的评论,在 每种类型的第一行都简要说明了联接类型

  • JOIN:当两个表中至少有一个匹配项时返回行
  • 左联接:返回左表中的所有行,即使右表中没有匹配项
  • 右联接:返回右表中的所有行,即使左表中没有匹配项
  • 完全联接:当其中一个表中存在匹配项时返回行
结束编辑

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

SELECT * FROM a, b WHERE b.id = a.beeId AND ...
从表a和表b中选择每个记录,并用逗号分隔表,这也可以在列中使用,如

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

关于mySQL连接和左连接的一些简单教程和解释,请看一下Tizag的mySQL教程。您还可以查看关于连接的更多信息,这些信息也非常好


我希望这能帮助您

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

我有两个这样的表:

> 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 |
+------+------+------+
内部联接关心两个表

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

> 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    |
+------+------+------+------+------+
如果颠倒顺序,则内部联接没有区别,因为它关心两个表:

> 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 JOIN关心您给它的第一个表,而不太关心第二个表,因此您总是从第一个表中获取行,即使第二个表中没有对应的行:

> 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 |
+------+------+------+------+------+
在上面,您可以看到表a的所有行,即使其中一些行与表b中的任何行都不匹配,但并非表b的所有行—只有与表a中的某些行匹配的行

如果我们颠倒表的顺序,左连接的行为将不同:

> 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 |
+------+------+------+------+------+
现在我们得到表_b的所有行,但只得到表_a的匹配行

右联接只关心第二个表

a RIGHT JOIN b
获取与
b LEFT JOIN a
完全相同的行。唯一的区别是列的默认顺序

> 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 |
+------+------+------+------+------+
这与我们在左连接部分看到的
表b左连接表a
中的行相同

同样地:

> 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 |
+------+------+------+------+------+
表a左联接表b
的行相同

完全不加入将为您提供所有内容的副本

如果您在编写表时根本没有JOIN子句,只是用逗号分隔,那么第一个表的每一行都会以每种可能的组合写入第二个表的每一行旁边:

> 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 |
+------+------+------+------+------+

(这是我的博文)

碰巧我已经知道了这一切。我实际上是在寻找连接的类型。对不起,我不清楚我所知道的。但我不是为了快速总结而寻找冗长的文档。答案中的另一个参考。。。可能更多的是你想要的,伙计。编辑+1。我不像有些人那样对学校有偏见。也许我没有看到太多不好的一面,也许这只是一场“圣战”。另外,我编辑了W3Schools的内容,希望你不介意,但请随意编辑你喜欢的内容。所有这些被接受的答案中的视觉效果都很好,但有些实际上是相同连接的变体。这是一个很好的选择。谢谢乔治,我一点也不介意,只要编辑是正确的!我相信人们需要找到适合自己的资源,或多或少的信息,大量的例子,或者没有。W3Schools有准确和简洁,它们往往也有很好的例子,Tizag也类似。别着急,mysql中没有完全连接,所以这些链接不是很有用。@Anu这个答案与大多数答案中的碎片不完整描述相同。它实际上并没有说作为输入函数的输出是什么。请参阅提议副本中的几乎所有答案&我在两页上的评论。请看我的答案。PS我昨天才看到这个(当然在&)还有更多相关的帖子。)