在标准 MySQL 数据库上使用一些代码,我遇到了以下语句:
SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1
Run Code Online (Sandbox Code Playgroud)
让我困惑的是:USING
它是为了什么,它有什么作用?
我的第一个假设是它涉及使用外键或可能的索引,但 DB 模式没有任何外键或索引的指示,期间。
我的 googlefu 使我失败了,可能是因为USING
在网站上的大多数文本中都是如此常见的词。因此,我想知道在我修改此代码和此代码中的多个其他查询之前,DB 专家听到的是否可以阐明它的作用。
在您的查询的上下文中,只要涉及的两个表具有相同的列名来连接,就USING
有助于满足。这就像做一个.JOIN
JOIN
NATURAL JOIN
您的查询
SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1
Run Code Online (Sandbox Code Playgroud)
工作原理相同
SELECT * FROM foo LEFT JOIN bar ON foo.bar_id = bar.bar_id WHERE foo_id = 1
Run Code Online (Sandbox Code Playgroud)
USING(column_list) 子句命名必须存在于两个表中的列列表。如果表 a 和 b 都包含列 c1、c2 和 c3,则以下连接比较两个表中的相应列:
Run Code Online (Sandbox Code Playgroud)a LEFT JOIN b USING (c1,c2,c3)
两个表的 NATURAL [LEFT] JOIN 定义为在语义上等同于 INNER JOIN 或带有 USING 子句的 LEFT JOIN,该子句命名两个表中存在的所有列。
还值得指出的是,如果您使用的是USING
,那么您可能会得到与JOIN
. 阅读以下有关JOIN 文档的引用部分:
MySQL 5.0.12 中的联接处理变化
笔记:
自然连接和使用 USING 的连接(包括外部连接变体)根据 SQL:2003 标准进行处理。目标是根据 SQL:2003 使 MySQL 的语法和语义与 NATURAL JOIN 和 JOIN ... USING 保持一致。但是,连接处理中的这些更改可能会导致某些连接的输出列不同。此外,某些在旧版本(5.0.12 之前)中似乎可以正常工作的查询必须重写以符合标准。
这些变化主要有五个方面:
MySQL 确定 NATURAL 或 USING 连接操作的结果列的方式(以及整个 FROM 子句的结果)。
将 SELECT * 和 SELECT tbl_name.* 扩展为选定列的列表。
NATURAL 或 USING 连接中列名的解析。
将 NATURAL 或 USING 连接转换为 JOIN ... ON。
在 JOIN ... ON 的 ON 条件下解析列名。
最有趣的变化可能是(现在从文档中引用)
LEFT JOIN b USING (c1,c2,c3)
LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
Run Code Online (Sandbox Code Playgroud)
在确定要显示哪些列以进行SELECT *
扩展方面不再完全相同。在USING
加入选择对应列的聚结的值,而ON
加入选择来自所有表的所有列。对于前面的USING
连接,SELECT *
选择以下值:
COALESCE(a.c1,b.c1), COALESCE(a.c2,b.c2), COALESCE(a.c3,b.c3)
Run Code Online (Sandbox Code Playgroud)
对于ON
连接,SELECT *
选择以下值:
a.c1, a.c2, a.c3, b.c1, b.c2, b.c3
Run Code Online (Sandbox Code Playgroud)
使用内部联接,COALESCE(a.c1,b.c1)
与其中之一相同,a.c1
或者b.c1
因为两列将具有相同的值。使用外连接(例如LEFT JOIN
),两列之一可以是NULL
。结果中将省略该列。
归档时间: |
|
查看次数: |
631 次 |
最近记录: |