2014-04-03 60 views
0

只是一個小的MySQL語句示例:MySQL:在Join語句和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 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 

我的意思是,結果是一樣的,但沒有任何速度/性能問題或其他什麼東西有關呢? 謝謝

回答

1

爲什麼兩者都不能在這裏工作(在Join-Statement中的Select-Classes中使用別名)?

正如您發現的那樣,SELECT子句中的列別名在其他子句中不起作用。在一些RDBMS中,他們在ORDER BY條款中工作,在WHERE條款中不常用,但大多數情況下他們不這樣做。原因僅僅是因爲數據庫引擎在查詢執行後才查看或分配SELECT子句中的別名。唯一的例外是在子查詢中。

Left Join中語句的順序是否相關?

我的意思是結果是一樣的,但有沒有速度/性能問題或其他相關的東西?

我希望數據庫引擎能夠解析查詢完全一樣。我甚至會說數據庫引擎中有一個錯誤,如果沒有的話。

啓動MySQL查詢分析器,並使用EXPLAIN命令查看執行計劃。它們應該是相同的。

+0

'說明,好:-) – tim

1

想想你什麼時候選擇一些東西或別名。在你選擇它之前它不存在(如果它是某個子集的話)。那麼,對不存在的別名進行連接是否有意義?它基本上是運行時應用於整個陳述的最後一件事。

一張表已經存在 - 所以用別名引用它是有意義的。然而,通常你必須做一個單獨的引用來在查詢期間再次引用該表。這可以防止最終在同一個表上執行多個連接時出現歧義。

而且命令是否重要?那麼,查詢優化器將嘗試各種排列,並選擇最好的排列。所以不,不應該。

+0

感謝您的回答,正如我以前所想的那樣。 – tim