只是一个小的MySQL语句示例:
SELECT m.nameMarket nm, m.idCity idc, c.cityname cn
FROM markets m
LEFT JOIN cities c ON m.idCity = c.idCity
按预期工作。为什么两者都不起作用(使用Join-Statement中Select-Clause中的别名):
SELECT m.nameMarket nm, m.idCity idc, c.cityname cn
FROM markets m
LEFT JOIN cities c ON idc = c.idCity
OR:
SELECT m.nameMarket nm, m.idCity idc, c.cityname cn
FROM markets m
LEFT JOIN cities c ON m.idc = c.idCity
或者我是否可以在Join语句中不使用列别名? (我很困惑,因为我也可以在语句中使用表别名,就像在第一个SQL代码中一样)。
第二个问题是:Left Join中语句的顺序是否相关?即:
SELECT m.nameMarket nm, m.idCity idc, c.cityname cn
FROM markets m
LEFT JOIN cities c ON m.idCity = c.idCity
SELECT m.nameMarket nm, m.idCity idc, c.cityname cn
FROM markets m
LEFT JOIN cities c ON c.idCity = m.idCity
我的意思是结果是一样的,但有没有速度/性能问题或与之相关的其他问题? 感谢
答案 0 :(得分:1)
考虑何时选择某些内容并将其别名。直到你选择它才会存在(例如,如果它是某个东西的子集)。那么,对一个不存在的别名进行连接是否有意义?它基本上是最后一个应用于整个语句的东西。
表已经存在 - 因此使用别名引用它是有意义的。但是,通常,您必须单独引用以在查询期间再次引用该表。如果最终在同一个表上进行多个连接,这可以防止出现歧义。
订单是否重要?好吧,查询优化器将尝试各种排列并选择最佳排列。所以不,它不应该。
答案 1 :(得分:1)
为什么两者都不起作用(使用Join-Statement中Select-Clause中的别名)?
正如您所发现的,SELECT
子句中的列别名在其他子句中不起作用。在某些RDBMS中,它们在ORDER BY
子句中工作,在WHERE
子句中较少见,但大多数情况下它们都没有。原因很简单,因为数据库引擎在SELECT
子句中没有查看或分配别名,直到查询的执行很晚。唯一的例外是子查询。
左连接语句的顺序是否相关?
我的意思是结果是一样的,但有没有速度/性能问题或与之相关的其他问题?
我希望数据库引擎能够完全相同地解析查询。我甚至会说数据库引擎中有一个错误,如果它没有。
启动MySQL查询分析器并使用EXPLAIN
命令查看执行计划。它们应该完全相同。