我意识到MySQL并没有要求我为此查询中的自然连接操作的结果提供别名:
SELECT * FROM TABLE1 NATURAL JOIN TABLE2
,
但是并不是表派生的表,因此需要别名?
对于这个问题,这确实是一个后续问题:Every derived table must have its own alias - when is something a derived table?,我被告知那个' new'查询的FROM部分中的表是派生表,因此它们需要别名。
如果它确实不需要别名,我将如何在子查询中引用这个新表:SELECT * FROM TABLE1 NATURAL JOIN TABLE2 WHERE NOT EXISTS (SELECT * FROM TABLE1 WHERE attribute1='thenewtable'.attribute2)
?
答案 0 :(得分:1)
首先,不要使用NATURAL JOIN
。这是一个等待发生的错误。
为什么呢?因为它只是使用相同的名称列组合表。例如,我的所有表中经常都有CreatedAt
列,我从不想将它用于连接。使用USING
子句非常非常优先,因为这会列出明确使用的列。
请注意,如果NATURAL JOIN
使用明确定义的外键关系,我会感觉更好。但是,它忽略了明确定义的外键关系。
在任何情况下,您的问题的答案是您仍然可以使用查询中定义的表别名来引用表中的列。所以,你可以写:
select table1.col1, table2.col2
from table1 natural join
table2;
在这种情况下,表名是他们自己的别名(我通常会使用表缩写的显式别名,例如t1
和t2
)。
关于派生表的引用是关于FROM
子句中的子查询,它需要别名。查询中的FROM
子句中没有子查询。
SELECT *
与NATURAL JOIN
的优势在于它删除了重复的列名称。但是,我不认为这是使用该语法的一个很好的理由。