一. with as 简介:
with as其实就是一个子查询, 使用它可以增强sql的可读性,同时因为该查询只执行一次,并将结果存储在用户临时表空间中,
可以多次引用,增强性能。
二. with as 用法:
with as学名为公用表表达式 - CTE, 使用它需要注意以下几点:
1. cte后面必须直接跟使用cte的sql语句, 如:select、insert、update,否则cte将失效
with temp as (
select * from xxx
)
select * from temp;
2. cte后面可以跟其他的cte,但只能使用一个with,多个cte中间使用逗号分隔:
with temp1 as (
select * from xxx
),
temp2 as(
select * from yyy
)
select x.* from temp1 x, temp2 y where x.id = y.id
三. with as 实战:
查询出部门的总薪水大于所有部门平均总薪水的部门:
部门表s_dept, 员工表s_emp;
-- step1:查询出部门名和部门的总薪水
with dept_costs as(
select a.name,sum(b.salary) dept_total
from
s_dept a,s_emp b
where a.id=b.dept_id
group by a.name
),
-- step2:利用上一个with查询的结果,计算部门的平均总薪水
avg_costs as(
select sum(dept_total)/count(*) dept_avg
from dept_costs
)
-- step3:从两个with查询中比较并且输出查询结果
select name,dept_total
from dept_costs
where
dept_total > (
select dept_avg from avg_costs
)
order by name;