2013-04-14 183 views
1

首先在SELECT列列表之前評估A WHERE。結果如下:在WHERE子句中使用列別名

SELECT l_n AS last_name FROM contacts WHERE last_name > 'J';

不能工作。
下面的工作:

SELECT * FROM (SELECT l_n AS last_name FROM contacts) tmp WHERE last_name > 'J';

我的問題是:這也列爲一個子查詢?如果是的話,如果我想避免使用子查詢,是否有另一種方法呢?

+1

退房HAVING關鍵字 – sashkello

+0

@sashkello:好'HAVING'工作! – Cratylus

+3

您只能在GROUP BY,ORDER BY或HAVING子句中使用列別名。 – Damith

回答

-1

是的,這裏是......

SELECT l_n AS last_name FROM contacts HAVING last_name > 'J'; 

請我的,你的查詢會帶來所有的結果(全掃描),然後在HAVING子句通過您的標準進行篩選。

如果您關心性能,應該使用子查詢。或者說:

SELECT l_n AS last_name FROM contacts HAVING l_n > 'J'; 

[編輯]

嘿夥計,是的,它的工作原理,沒有聚集功能。這裏是一個例子:

mysql> select * from blah; 
+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | renato | 
| 2 | rodrigo | 
+----+---------+ 
2 rows in set (0.00 sec) 


mysql> select id as a1, name as a2 from blah having a1 > 1; 
+----+---------+ 
| a1 | a2  | 
+----+---------+ 
| 2 | rodrigo | 
+----+---------+ 
1 row in set (0.00 sec) 

我的數據庫是一個5.5.29-0ubuntu0.12.04.2。

+0

我試過這樣並得到'[column]在HAVING子句中無效,因爲它不包含在聚合函數或GROUP BY子句中。',你確定我們可以使用HAVING而不使用聚合函數嗎? –

3

對於「這是否也被歸類爲子查詢」這個問題,答案是肯定的。對於避免子查詢的問題,最簡單的方法是在查詢的where子句中使用實際的列名稱。