SQL 中 USING 参数的用途是什么?

can*_*eed 7 mysql syntax

在标准 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 专家听到的是否可以阐明它的作用。

Rol*_*DBA 8

在您的查询的上下文中,只要涉及的两个表具有相同的列名来连接,就USING有助于满足。这就像做一个.JOINJOINNATURAL 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)

根据JOIN 语法MySQL 文档

USING(column_list) 子句命名必须存在于两个表中的列列表。如果表 a 和 b 都包含列 c1、c2 和 c3,则以下连接比较两个表中的相应列:

a LEFT JOIN b USING (c1,c2,c3)
Run Code Online (Sandbox Code Playgroud)

两个表的 NATURAL [LEFT] JOIN 定义为在语义上等同于 INNER JOIN 或带有 USING 子句的 LEFT JOIN,该子句命名两个表中存在的所有列。


Mic*_*Sim 6

还值得指出的是,如果您使用的是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。结果中将省略该列。