SQL经典实例(第2版)
上QQ阅读APP看书,第一时间看更新

1.6 在WHERE子句中使用别名来引用列

  1. 问题

    在结果集中,你已经使用别名提供了含义更明确的列名,但还想使用 WHERE 子句将某些行排除在外。为此,你在 WHERE 子句中引用了别名,但以失败告终。

    select sal as salary, comm as commission
      from emp
     where salary < 5000

     

  2. 解决方案

    将查询作为内嵌视图来引用列的别名。

    1 select *
    2   from (
    3 select sal as salary, comm as commission
    4   from emp
    5        ) x
    6  where salary < 5000

     

  3. 讨论

    在这个简单的实例中,可以在 WHERE 子句中直接引用 COMMSAL,这样就无须使用内嵌视图了。上述解决方案演示了在 WHERE 子句中引用如下内容时,需要做什么。

    • 聚合函数
    • 标量子查询
    • 窗口函数
    • 别名

    将提供别名的查询放在内嵌视图中,就可以在外部查询中引用列的别名。为什么要这样做呢?这是由于 WHERE 子句是在 SELECT 子句之前评估的,因此,对于前面说明问题时列举的查询,在评估其中的 WHERE 子句时,还没有别名 SALARYCOMMISSION。这些别名在 WHERE 子句处理完毕后才存在。然而,FROM 子句是在 WHERE 子句之前评估的。如果将查询放在 FROM 子句中,那么将在最外层的 WHERE 子句执行前生成该查询的结果,这样一来,最外层的 WHERE 子句就能够“看到”别名了。在列名不是太好时,这种技巧很有用。

     在本解决方案中,内嵌视图被指定了别名 X。并非所有数据库都要求给内嵌视图指定别名,但对于某些数据库而言,确实应该如此。不过,所有数据库都允许这样做。