首先在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';
我的問題是:這也列爲一個子查詢?如果是的話,如果我想避免使用子查詢,是否有另一種方法呢?
首先在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';
我的問題是:這也列爲一個子查詢?如果是的話,如果我想避免使用子查詢,是否有另一種方法呢?
是的,這裏是......
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。
我試過這樣並得到'[column]在HAVING子句中無效,因爲它不包含在聚合函數或GROUP BY子句中。',你確定我們可以使用HAVING而不使用聚合函數嗎? –
對於「這是否也被歸類爲子查詢」這個問題,答案是肯定的。對於避免子查詢的問題,最簡單的方法是在查詢的where子句中使用實際的列名稱。
退房HAVING關鍵字 – sashkello
@sashkello:好'HAVING'工作! – Cratylus
您只能在GROUP BY,ORDER BY或HAVING子句中使用列別名。 – Damith