WITH子句与子查询
子查询可以简化sql语句的编写,但是,在数据库的优化方面,除了sql语句之外,还要尽量降低使用子查询的次数,比如:子查询取得系统中所有年龄或工资与‘Sun’相同的人员信息
select * from T_Person
where FAge=(select FAge from T_Person where FName='Sun') OR FSalary=(select FSalary from T_Person where FName='Sun')
上面的语句可以实现此功能,但是,子查询被调用了两次,比较消耗系统资源的操作,降低了系统的性能,一个子查询修改其他查询也得修改,造成修改不同步。
上述问题的原因及解决方案:
1.子查询只能在定义的时候使用,多次使用就必须多次定义。
2.sql提供了with子句-----给子查询定义一个别名,这样可以通过别名来引用子查询,实现了一次定义多次使用。
使用WITH子句改造上面的Sql语句:
WITH person_Sun AS
{
select * from T_Person where FName='Sun'
}
select * from T_Person
where FAge=person_Sun .FAge
OR FSalary=person_Sun .FSalary
尤上可知:WITH子句的格式为:
WITH 别名 AS(子查询)
定义好别名就可以在sql中通过别名来引用子查询
还可以在WITH语句中为子查询中的列定义别名,如下代码:
WITH person_Sun(F1,F2,F3) AS
{
SELECT FAge,FName,FSalsry from T_Person where FName=‘Sun’
}
SELECT * from T_Person
where FAg=person_Sun.F1
OR FSalsry=person_Sun.F3