in 和 exists 的区别:
A in/exists B ,exist 会遍历 A中的id,in是直接去内存中对比数据,所以length(A)比length(B)小的话,用exists快,否则用in。
子查询和多表联接的区别:
子查询都可以用多表联接实现,但是一般用多表联接比较好,因为执行快,容易理解。子查询也有优势:能与insert、update、delete联用。
With as 的用法:
例子:
with test1 as(select * from A),test2 as(select * from B)
select * from B where B.id in(select id from test1)
union all select * from test2
其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它,只做一次查询,反复使用,提高语言的运行效率,更加简洁容易理解。
1、同级只能定义with关键字只能使用一次,多个用逗号分割。
2、如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子句中定义的查询名。(至少一个with查询的name未被引用,解决方法是移除未被引用的with查询),注意:只要后面有引用的就可以,不一定非要在主查询中引用,比如后面的with查询也引用了,也是可以的。
3、前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句。
4、例子中union all,如果不加all,union会自动去除重复数据;有all,不会去重。
sql的执行顺序:
https://www.cnblogs.com/qanholas/archive/2010/10/24/1859924.html
case when then else end