
上QQ阅读APP看书,第一时间看更新
1.6 在WHERE子句中使用别名来引用列
问题
在结果集中,你已经使用别名提供了含义更明确的列名,但还想使用
WHERE
子句将某些行排除在外。为此,你在WHERE
子句中引用了别名,但以失败告终。select sal as salary, comm as commission from emp where salary < 5000
解决方案
将查询作为内嵌视图来引用列的别名。
1 select * 2 from ( 3 select sal as salary, comm as commission 4 from emp 5 ) x 6 where salary < 5000
讨论
在这个简单的实例中,可以在
WHERE
子句中直接引用COMM
或SAL
,这样就无须使用内嵌视图了。上述解决方案演示了在WHERE
子句中引用如下内容时,需要做什么。- 聚合函数
- 标量子查询
- 窗口函数
- 别名
将提供别名的查询放在内嵌视图中,就可以在外部查询中引用列的别名。为什么要这样做呢?这是由于
WHERE
子句是在SELECT
子句之前评估的,因此,对于前面说明问题时列举的查询,在评估其中的WHERE
子句时,还没有别名SALARY
和COMMISSION
。这些别名在WHERE
子句处理完毕后才存在。然而,FROM
子句是在WHERE
子句之前评估的。如果将查询放在FROM
子句中,那么将在最外层的WHERE
子句执行前生成该查询的结果,这样一来,最外层的WHERE
子句就能够“看到”别名了。在列名不是太好时,这种技巧很有用。在本解决方案中,内嵌视图被指定了别名
X
。并非所有数据库都要求给内嵌视图指定别名,但对于某些数据库而言,确实应该如此。不过,所有数据库都允许这样做。