SQL语句中,为什么where子句不能使用列别名,而order by却可以

当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 语句的执行顺序

  1.  FROM JOIN ON 
  2.  where语句(结合条件)                   
  3.  GROUP BY      
  4.  HAVING 
  5.  SELECT DISTINCT TOP() 
  6.  ORDER BY

 

由select语句的执行顺序,我们可以发现在where子句执行的时候,取别名的语句还没执行,即该别名不存在,自然就不能使用了,而order by的时候别名就已经命名好了。

我们还可以知道:如果在from子句中指定了表别名,那么它所在的select 语句中其他子句都必须使用表别名来代替原始的表名,因为from子句是select语句中最先被执行的。

1000

GS

北京 | php攻城狮

创作 35 粉丝 2

fighting