Heim >Datenbank >MySQL-Tutorial >Oracle with子句

Oracle with子句

WBOY
WBOYOriginal
2016-06-07 17:59:061127Durchsuche

以例子学习with: 1.with 2.--查询部门和部门的总薪水 3. dept_costs as ( 4. select d.department_name,sum(e.salary) dept_total 5. from departments d,employees e 6. where d.department_id=e.department_id 7. group by d.department_name 8. ), 9.--利

以例子学习with:

1.with  
2.--查询部门和部门的总薪水   
3.  dept_costs as (  
4.                 select d.department_name,sum(e.salary) dept_total  
5.                   from departments d,employees e  
6.                  where d.department_id=e.department_id  
7.                  group by d.department_name  
8.                 ),  
9.--利用上一个with查询的结果,计算部门的平均总薪水   
10.  avg_costs as (  
11.                select avg(dept_total) dept_avg  
12.                  from dept_costs  
13.                )  
14.--从两个with查询中比较并且输出查询结果   
15.  select *  
16.    from dept_costs  
17.   where dept_total > (select dept_avg from avg_costs)  
18.  order by department_name 
注释:

① 子查询可重用相同或者前一个with查询块,通过select调用(with子句也只能被select调用)

② with子句的查询输出存储到用户临时表空间,一次查询,到处使用

③ 同级select前有多个查询定义,第一个用with,后面的不用with,并且用逗号分割

④ 最后一个with查询块与下面的select调用之间不能用逗号分割,只通过右括号分离,with子句的查询必须括号括起

⑤ 如果定义了with子句,而在查询中不使用,则会报ora-32035错误,只要后面有引用的即可,不一定在select调用,在后with查询块引用也是可以的

⑥ 前面的with子句定义的查询在后面的with子句中可以使用,但是一个with子句内部不能嵌套with子句

⑦ with查询的结果列有别名,引用时候必须使用别名或者*

再来看with的语法
with子句的优点
① with子句有可能会改变执行计划
② with子查询只执行一次,将结果存储在用户的临时表空间,可多次引用,增加性能
③ sql的可读性较强

案例:

-

Ⅰ一般使用方式

1.with  
2.--查询销售部门员工的姓名   
3.  saler_name as (  
4.                 select department_id from departments  where department_name='SALES' order by department_id  
5.                 )  
6.select last_name,first_name  
7.  from employees e  
8. where department_id in (select * from saler_name)  注释:使用with子句,可以在复杂的查询中预先定义好一个结果集,然后在查询中反复使用,不使用会报错。而且with子句获得的是一个临时表,必须采用select from (with查询名)
Ⅱ 在多数子查询中引用,同级可见

1.select last_name  
2.  from (with  
3.--查询销售部门员工的姓名   
4.  saler_name as (  
5.                 select department_id from departments  where department_name='SALES' order by department_id  
6.                 )  
7.select last_name,first_name  
8.  from employees e  
9. where department_id in (select * from
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn