with as的语法
Oracle WITH AS是一种SQL语法,用于在一个查询中定义一个临时的命名结果集,并在查询中引用该结果集,它是Oracle中实现递归查询的一种方式。当一次查询需要多次引用同一个子查询时,使用WITH AS语法可以便于编写和维护SQL查询语句。
一个别名:
with tmp as (select * from tb_name)
多个别名:
with
tmp as (select * from tb_name),
tmp2 as (select * from tb_name2),
tmp3 as (select * from tb_name3),
…
示例说明:
--相当于建了个e临时表
with e as (select * from scott.emp e where e.empno=7499)
select * from e;
--相当于建了e、d临时表
with
e as (select * from scott.emp),
d as (select * from scott.dept)
select * from e, d where e.deptno = d.deptno;
其实就是把一大堆重复用到的sql语句放在with as里面,取一个别名,后面的查询就可以用它,这样对于大批量的sql语句起到一个优化的作用,而且清楚明了。
with语句增加了sql的易读性,如果构造了多个子查询,结构会更清晰;一次分析,多次使用;
with 语句中的生成的临时表实际是在内存中的,运行速度还是比较快的,如果数据量巨大,要考虑你的内存是否抗的住!
WITH子句相关总结
- 在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。
- 最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来。
- 如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子句中定义的查询名。(至少一个with查询的name未被引用,解决方法是移除未被引用的with查询),注意:只要后面有引用的就可以,不一定非要在主查询中引用,比如后面的with查询也引用了,也是可以的。
- 前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句。
Oracle WITH AS用法优点缺点分析
优点
- 提高查询效率:使用WITH AS语法可以提高SQL查询效率。因为在多次使用同一个子查询时,如果每次都重新执行该子查询,会造成SQL语句的冗余和性能底下。而使用WITH AS可以将该子查询的结果集存储在内存中,并在多次引用时直接使用它,避免重复执行子查询,从而大大提高SQL查询效率。
- 简化SQL语句:使用WITH AS语法可以让SQL语句更易于编写和维护。当在一个查询中需要多次引用同一个子查询结果集时,不使用WITH AS语法需要在SQL语句中多次复制子查询的代码,而使用WITH AS可以将子查询的结果集给命名为一个临时表,并在后续查询中仅仅需要引用这一个表,从而避免了多次复制和粘贴的操作,使SQL语句更为简洁。
- 支持递归查询:WITH AS语法支持递归查询,是一种实现树形结构查询的有效手段。通过建立递归查询的一个公共表达式,使得在同一个查询中实现多个层次或深度的查询,简化了查询的逻辑实现,使得SQL查询变得更加易于理解和处理。
缺点
- 内存占用较高:在WITH AS语法中,子查询的结果集会被存储在内存中,如果该子查询结果集较大,会占用大量的内存资源,导致内存使用率较高,如果处理大量复杂的数据,可能会导致内存不足的问题。
- 可读性较差:尤其是当WITH AS语法的数据表达比较复杂的时候,SQL语句的可读性会比较差,阅读、理解、维护难度较大。所以,对需要复杂嵌套的SQL语句,需要慎重使用WITH AS语法。