在WHERE子句中使用列别名

时间:2013-04-14 12:03:57

标签: mysql sql select subquery where

WHERE列列表之前首先评估SELECT。结果如下:

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';

我的问题是:这也被归类为子查询吗?如果是的话,如果我想避免使用子查询,还有另一种选择吗?

2 个答案:

答案 0 :(得分:3)

对于这个问题,"这也被归类为子查询",答案是肯定的。对于避免子查询的问题,最简单的方法是在查询的where子句中使用实际的列名。

答案 1 :(得分:-1)

是的,这是......

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

请记住,您的查询将带来所有结果(完整扫描),然后按照您对“条件”的条件进行过滤。

如果您担心性能,则应使用子查询。或者更确切地说:

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。