SELECT Name, doB, Age CURDATE( ) , (
YEAR( CURDATE( ) ) - YEAR( F )
) - ( RIGHT( CURDATE( ) , 5 ) < RIGHT( F, 5 ) ) AS Ages
SELECT Name, DoB, Ages WHERE Age=20 As Age
FROM Table_
ORDER BY N
如果我只想显示20岁时人的名字,如果Age列是临时列,我在哪里放where AGES=20
?
- 编辑 - 原始查询是:
SELECT N, F, CURDATE( ) ,
( YEAR( CURDATE( ) ) - YEAR( F ) )
- ( RIGHT( CURDATE( ) , 5 ) < RIGHT( F, 5 ) ) AS Age
FROM edad_ LIMIT 0 , 30
答案 0 :(得分:2)
我无法对你的查询做出正面或反面。
但是要回答你的问题,WHERE
子句中不允许派生列的谓词,但它可以包含在HAVING
子句中。例如:
SELECT t.DoB
, TIMESTAMPDIFF(YEAR, t.DoB, CURDATE()) AS age
FROM mytable t
HAVING age = 20
BUT ... 的
了解性能问题。请注意,在检索并准备好所有行之后,在查询处理中很晚才应用HAVING子句。它更像是对返回的行的过滤器,而WHERE子句充当对检索到的行的过滤器,在查询的早期处理过。
对于大型集合的性能,我们通常希望从索引范围扫描中受益,因此我们在本机列上使用等效谓词。 (如果有合适的索引可用。)
例如,如果DoB上的索引可用:
SELECT t.DoB
, TIMESTAMPDIFF(YEAR, t.DoB, CURDATE()) AS age
FROM mytable t
WHERE t.DoB >= CURDATE() + INTERVAL -21 YEAR
AND t.DoB < CURDATE() + INTERVAL -20 YEAR
(注意:您可能需要将>=
替换为>
并将<
替换为<=
,以便在边缘情况下按照您希望的方式运行年龄计算CURDATE与DoB完全相差20年或完全是21年。)