从下面的代码示例中,为什么我需要在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
谢谢!
答案 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的一部分,它是通过以下方式定义的:
<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
语法看起来更像是它的简化版本。它用于没有表限定符的列名元组。