SQL语句中,为什么where子句不能使用列别名,而order by却可以
文章分类:
数据库
6年前
914
0
当select的表达式很长时,我们经常会用as子句为该表达式指定别名,然而却发现无法在Where条件中直接使用该别名作为判断条件.
例如下面的SQL语句:
select id, (c1 + c2) as s from t1 where s > 100
SQL Server 报错: "列名 s 无效"
当然,写成
select id, (c1 + c2) as s from t1 where (c1 + c2) > 100
就没问题了.
可是当表达式复杂时就很繁琐了.
有没有可以在Where中使用这样的列名的办法?
或者有什么其他办法可以解决这类问题呢?
解决方法:
select t2.*
from (select id, (c1 + c2) as c from t1) t2
where c > 100
--或者
select t2.*
from (select id, c = c1+c2 from t1) t2
where c > 100
由于在Where语句不能直接使用列别名,因此我们需要将Sql语句给包装一下
在SQL中,在WHERE子句中引用列别名会出错,这是为什么呢?
因为:SELECT 语句的执行顺序
- FROM JOIN ON
- where语句(结合条件)
- GROUP BY
- HAVING
- SELECT DISTINCT TOP()
- ORDER BY
由select语句的执行顺序,我们可以发现在where子句执行的时候,取别名的语句还没执行,即该别名不存在,自然就不能使用了,而order by的时候别名就已经命名好了。
我们还可以知道:如果在from子句中指定了表别名,那么它所在的select 语句中其他子句都必须使用表别名来代替原始的表名,因为from子句是select语句中最先被执行的。