SQL连接 - 为什么这个简单的连接工作,尽管语法没有意义?

时间:2013-09-02 08:27:24

标签: mysql sql join

我已经阅读了很多关于MySQL连接的教程和图形表示,但它们对我来说仍然没有意义。

我现在正在尝试打字,他们正在工作,但我不知道他们是如何工作的。

拿这组表

images                           squares
----------------------------     ----------------------------------
image_id |  name | square_id     square_id |  latitude |  longitude
----------------------------     ----------------------------------
1         someImg    14          1            42.333      24.232
2         newImg     3           2            38.322      49.2320
3         blandImg   76          3            11.2345     99.4323
...                              ...
n                                n

这是一对多关系 - 一个方格可以有很多图像,但图像只能有一个方格。

现在我运行这个简单的连接,但我根本不理解它的语法......

SELECT images.image_id 
FROM squares
LEFT JOIN images ON images.square_id=squares.square_id 
WHERE images.square_id=711464;

现在,这确实有效,让我感到惊讶。它会显示方形范围内的图像列表。

但我很难理解ON语法。

  • ON完全做了什么?

  • 是否显示两个表的关联方式?

然而,SELECT images.image_id FROM squares主要是没有意义的。

如何在一个表格中选择一个字段,而在另一个表格中选择FROM

4 个答案:

答案 0 :(得分:3)

让我们从FROM子句开始,其中包含以下内容:

FROM squares LEFT JOIN images ON images.square_id=squares.square_id 

(这不仅仅是FROM squares) 这定义了数据的来源。您指定了两个表squaresimages,因此它们都是查询将处理的数据的来源。 接下来,使用on语法来解释这些表如何相互关联。 images.square_id=squares.square_id表示:images表中的一行与squares表中的行相关,当且仅当square_id的字段images的值为square_id时} row等于squares表的字段images的值。此时,结果的每一行都是squares表中的一行和LEFT JOIN表中的一行的组合(此时我将忽略WHERE)。

接下来,您有WHERE images.square_id=711464 子句

square_id

这意味着,从结果集中的行中,只得到那些来自images表的结果行的711464字段的值恰好是{{1} }。

最后是SELECT部分。

SELECT images.image_id

这意味着,从结果集中的行(square行和images行的组合)中,只取出来自{的image_id字段{1}}表。

答案 1 :(得分:1)

您应该这样阅读查询:

SELECT images.image_id FROM
    squares LEFT JOIN images
        ON images.square_id=squares.square_id
WHERE
    images.square_id=711464

因此,您首先将squares表与images表一起加入images中的条目,这些条目与square_id表中的squares相同。因此,ON语法实际上是指定应该连接两个表的条​​件。

然后,您使用WHERE进行过滤,该过滤将使用square_id=711464

的条目

请注意,当您执行SELECT时,您已经加入了两个表,这两个表将包含组合字段:

images
--------------------------------------------------
square_id | latitude | longitude | image_id | name
--------------------------------------------------

因此,您可以从结果表格中选择square_id

答案 2 :(得分:0)

更像是:

SELECT images.image_id FROM (squares LEFT JOIN images ON images.square_id=squares.square_id WHERE images.square_id=711464)

所以你不要从另一个表中选择一个字段 - 它更像是从括号中的语句创建一个新的临时表(实际上有多个表中的列),然后在这个表上执行SELECT

是的,ON定义了表的关联方式(例如使用外键)

答案 3 :(得分:0)

SELECT [COLUMNS] --First Line Of Code - say it as 1
FROM --Second Line Of Code -- say it as 2 
[Table1] Join [table2] On [Criteria] --say it as 3
Where [Some More Criteria] --Say it as 4

每当一个

Select Column From 

完成它从3获取数据,这是多个表或单个表的集合。

加载数据后,执行过滤数据的where条件。 数据过滤后,Select语句将被执行。

在你的情况下: Left Join将执行并生成包含6列的表。基于加入标准。比将执行标准来过滤数据。

只有在此之后才会执行Select语句。

关于使用表名作为前缀是为了避免列名中的冲突。

P.S:这是为了您的理解,实际上数据加载不会发生。要准确了解查询的执行方式,您需要了解数据库引擎。 截至目前,编写查询并保留数据库引擎进行规划。

随着经验的到来。

快乐编码