1

我已经阅读了大量关于 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

4 回答 4

3

让我们从FROM子句开始,它的全部内容是:

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

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

接下来,您有WHERE子句

WHERE images.square_id=711464

这意味着,从结果集中的行中,只需获取square_id来自 images 表的结果行的那部分中字段的值正好是711464.

最后是SELECT部分。

SELECT images.image_id

这意味着,从结果集中的行(square行和images行的组合)中,只取表中的image_id字段images

于 2013-09-02T08:32:44.190 回答
1

您应该这样阅读查询:

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

因此,您首先将squares表与表连接起来,将与表中相同的images条目组合在一起。因此,语法实际上是指定两个表应该连接的条件。imagessquare_idsquaresON

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

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

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

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

于 2013-09-02T08:33:39.520 回答
0

它更像是:

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

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

是的,ON定义了表是如何相关的(例如与外键)

于 2013-09-02T08:34:46.123 回答
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 列的表。基于加入标准。将执行比 Where 条件来过滤数据。

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

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

PS:这是为了您的理解,实际上数据加载不会发生。要准确了解查询是如何执行的,您需要了解 DB Engine。截至目前,编写查询并离开数据库引擎进行规划。

经验带来知识。

快乐编码

于 2013-09-02T08:51:04.683 回答