【问题标题】:What is the name of the table resulting from a natural join?自然连接产生的表的名称是什么?
【发布时间】:2016-07-23 00:22:14
【问题描述】:

我意识到 MySQL 并没有要求我为这个查询中的自然连接操作的结果提供别名: SELECT * FROM TABLE1 NATURAL JOIN TABLE2, 但不是说表是派生表,因此需要别名吗? 这确实是这个问题的后续问题:Every derived table must have its own alias - when is something a derived table?,在那里我被告知查询的 FROM 部分中的“新”表是派生表,因此它们需要别名。 如果它确实不需要别名,我将如何在这样的子查询中引用这个新表:SELECT * FROM TABLE1 NATURAL JOIN TABLE2 WHERE NOT EXISTS (SELECT * FROM TABLE1 WHERE attribute1='thenewtable'.attribute2)

【问题讨论】:

  • 没有。这就是SELECT 1SELECT * FROM (SELECT 1) 之间的区别,比如说
  • 选择查询中的记录集不是新表。该查询是否具有联接或者是否具有联接,都没有关系。至于您似乎在尝试什么,您也许可以简单地使用一个简单的 where 子句 where attribute1 <> attribute2
  • 也许很有趣?事实证明,“自然加入”“不太好”。我建议阅读一些赞成的 cmets。 - Difference between natural join and inner join.

标签: mysql sql join


【解决方案1】:

首先,不要使用NATURAL JOIN。这是一个等待发生的错误。

为什么?因为它只是使用相同的 names 列组合表。例如,我的所有表中经常有一个CreatedAt 列,我不想将它用于连接。改用USING 子句是非常、非常、非常首选的,因为它列出了明确使用的列。

请注意,如果NATURAL JOIN 使用明确定义的外键关系,我会感觉更好。但是,它忽略了明确定义的外键关系。

无论如何,您的问题的答案是您仍然可以使用查询中定义的表别名来引用表中的列。所以,你可以写:

select table1.col1, table2.col2
from table1 natural join
     table2;

在这种情况下,表名是它们自己的别名(我通常会使用显式别名,即表缩写,例如 t1t2)。

关于派生表的引用是关于FROM 子句中的子查询,它需要别名。您的查询中的FROM 子句中没有子查询。

SELECT *NATURAL JOIN 的优点是它可以删除重复的列名。但是,我认为这不是使用该语法的好理由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多