25. WITH子句
子查询可以简化SQL语句的编写,不过如果使用不当的话子查询会降低系统性能,为了避免子查询带来的性能问题,除了需要优化SQL语句之外还需要尽量降低使用子查询的次数。
比如下面的子查询用来取得系统中所有年龄或者工资与Tom相同的人员
SELECT * FROM T_Person WHERE FAge=(SELECT FAge FROM T_Person WHERE FName='TOM') OR FSalary=(SELECT FSalary FROM T_Person WHERE FName='TOM')
SQL提供了WITH子句用于为子查询定义一个别名,这样就可以通过这个别名来引用这个子查询了,也就是实现“一次定义多次使用”。使用WITH子句来改造上面的SQL语句:
WITH person_tom AS ( SELECT * FROM T_Person WHERE FName='TOM' ) SELECT * FROM T_Person WHERE FAge=person_tom.FAge OR FSalary=person_tom.FSalary
可以看到WITH子句的格式为: WITH 别名 AS (子查询)。还可以在WITH语句中为子查询中的列定义别名,定义的方式就是在子查询别名后列出参数名列表
WITH person_tom(F1,F2,F3) AS ( SELECT FAge,FName,FSalary FROM T_Person WHERE FName='TOM' ) SELECT * FROM T_Person WHERE FAge=person_tom.F1 OR FSalary=person_tom.F3