MySQL:在Join语句和Join Statement命令中使用列别名?

时间:2014-04-03 17:13:10

标签: php mysql join

只是一个小的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

我的意思是结果是一样的,但有没有速度/性能问题或与之相关的其他问题? 感谢

2 个答案:

答案 0 :(得分:1)

考虑何时选择某些内容并将其别名。直到你选择它才会存在(例如,如果它是某个东西的子集)。那么,对一个不存在的别名进行连接是否有意义?它基本上是最后一个应用于整个语句的东西。

表已经存在 - 因此使用别名引用它是有意义的。但是,通常,您必须单独引用以在查询期间再次引用该表。如果最终在同一个表上进行多个连接,这可以防止出现歧义。

订单是否重要?好吧,查询优化器将尝试各种排列并选择最佳排列。所以不,它不应该。

答案 1 :(得分:1)

  

为什么两者都不起作用(使用Join-Statement中Select-Clause中的别名)?

正如您所发现的,SELECT子句中的列别名在其他子句中不起作用。在某些RDBMS中,它们在ORDER BY子句中工作,在WHERE子句中较少见,但大多数情况下它们都没有。原因很简单,因为数据库引擎在SELECT子句中没有查看或分配别名,直到查询的执行很晚。唯一的例外是子查询。

  

左连接语句的顺序是否相关?

     

我的意思是结果是一样的,但有没有速度/性能问题或与之相关的其他问题?

我希望数据库引擎能够完全相同地解析查询。我甚至会说数据库引擎中有一个错误,如果它没有。

启动MySQL查询分析器并使用EXPLAIN命令查看执行计划。它们应该完全相同。