为什么在JOIN USING子句中使用括号

时间:2019-06-09 15:34:13

标签: mysql sql

从下面的代码示例中,为什么我需要在JOIN子句中使用括号(),例如在JOIN PUBLISHER USING(Publisher_Code)中使用?

我知道不使用括号会返回错误,但是我想知道机器本身是如何读取此语句的。

SELECT 
Book_Title as 'Title',
Publisher_Name
FROM BOOK
JOIN PUBLISHER USING (Publisher_Code)
JOIN WROTE USING (Book_Code)
JOIN AUTHOR USING (Author_Num)
group by  Boo, k_Title, Publisher_Name
having count(distinct concat(LastName,FirstName)) = 2

谢谢!

3 个答案:

答案 0 :(得分:2)

为避免歧义。假设您做到了:

from a join
     b
     using c, d

SQL不会知道您打算使用哪个?

from a join
     b
     using (c, d)

或:

from a join
     b
     using c cross join
     d

因此,该标准要求使用括号。

答案 1 :(得分:1)

语法是ISO的一部分,它是通过以下方式定义的:

  

Lexical elements - BNF

<named columns join> ::=
USING <left paren> <join column list> <right paren>

答案 2 :(得分:1)

Table1 JOIN Table2 ON <expr>的语法接受ON之后的任何表达式。该表达式可以包含比较和布尔项。表达式不需要带括号。

Table1 JOIN Table2 USING (<column-list>)的语法不接受表达式,仅接受 tuple ,其中是括号内的列列表。可以理解,从逻辑上讲,这等效于一系列用AND分隔的布尔术语,其中每个术语比较两个表中相同名称的列。

Table1 JOIN Table2 ON Table1.ColumnA = Table2.ColumnA
                  AND Table1.ColumnB = Table2.ColumnB

相同
Table1 JOIN Table2 USING (ColumnA, ColumnB)

但是它也与具有元组比较的表达式相同:

Table1 JOIN Table2 ON (Table1.ColumnA, Table1.ColumnB) = (Table2.ColumnA, Table2.ColumnB)

元组比较确实需要括号以使运算符优先级清楚。

现在我们已经看到了元组比较,USING语法看起来更像是它的简化版本。它用于没有表限定符的列名元组。