我已经阅读了很多关于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
?
答案 0 :(得分: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
表中的一行与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:这是为了您的理解,实际上数据加载不会发生。要准确了解查询的执行方式,您需要了解数据库引擎。 截至目前,编写查询并保留数据库引擎进行规划。
随着经验的到来。
快乐编码