oracle高级sql续1

被选择的列数和列的数据类型必须是与所有用在查询中的SELECT语句一致。列的名字不必相同。
联合运算在所有被选择的列上进行。
在做重复检查的时候不忽略空(NULL)值。
IN运算有比UNION运算高的优先级。
在默认情况下,输出以SELECT子句的第一列的升序排序。

全联合(UNION ALL)运算
用全联合运算从多个查询中返回所有行。
原则

和联合不同,重复的行不被过滤,并且默认情况下输出不排序。
不能使用DISTINCT关键字。
使用:

Select statement union | union all Select statement;

[b]1.2.intersect交集操作[/b]
相交运算
用相交运算返回多个查询中所有的公共行。 无重复行。
原则

在查询中被 SELECT 语句选择的列数和数据类型必须与在查询中所使用的所有的 SELTCT 语句中的一样,但列的名字不必一样。
相交的表的倒序排序不改变结果。
相交不忽略空值。
使用:

Select statement intersect all Select statement;

[b]1.3. minus差集操作[/b]
相减运算
用相减运算返回由第一个查询返回的行,那些行不出现在第二个查询中 (第一个SELECT语句减第二个SELECT语句)。
原则

在查询中被SELECT语句选择的列数和数据类型必须与在查询中所使用的所有的SELTCT语句中的一样,但列的名字不必一样。
对于MINUS运算,在WHERE子句中所有的列都必须在SELECT子句中。


集合运算的原则
在两个SELECT列表中的表达式必须在数目上和数据类型上相匹配
可以用圆括号改变执行的顺序
ORDER BY子句:–只能出现在语句的最后–从第一个SELECT语句接收列名、别名,或者位置记号

注:除了UNION ALL,重复行自动被清除
在结果中的列名是第一个查询中出现的列名
除了UNION ALL,默认情况下按升序顺序输出
[b]2.exists和not exists的使用[/b]
[i]2.1. exists的使用[/i]
Exists用于只能用于子查询,可以替代in,若匹配到结果,则退出内部查询,并将条件标志为true,传回全部结果资料,in不管匹配到匹配不到都全部匹配完毕,使用exists可以将子查询结果定为常量,不影响查询效果,而且效率高。如查询所有销售部门员工的姓名,对比如下:
IN is often better if the results of the subquery are very small
When you write a query using the IN clause, you're telling the rule-based optimizer that you want the inner query to drive the outer query.
When you write EXISTS in a where clause, you're telling the optimizer that you want the outer query to be run first, using each value to fetch a value from the inner query.
In many cases, EXISTS is better because it requires you to specify a join condition, which can invoke an INDEX scan. However, IN is often better if the results of the subquery are very small. You usually want to run the query that returns the smaller set of results first.


In和exists对比:
若子查询结果集比较小,优先使用in,若外层查询比子查询小,优先使用exists。因为若用in,则oracle会优先查询子查询,然后匹配外层查询,若使用exists,则oracle会优先查询外层表,然后再与内层表匹配。最优化匹配原则,拿最小记录匹配大记录。
使用in

select last_name, title
from s_emp
where dept_id in
(select id
from s_dept
where name='Sales');


使用exists

select last_name,title
from s_emp e
where exists
(select 'x' --把查询结果定为constant,提高效率
from s_dept s where s.id=e.dept_id and s.name='Sales');

[i]2.2 not exists的使用[/i]
与exists 含义相反,也在子查询中使用,取出不满足条件的,与not in的含义不怎么一样,其他一样。如查询不在销售部的员工姓名

select last_name,title
from s_emp e
where not exists
(select 'x' --把查询结果定为constant,提高效率
from s_dept s where s.id=e.dept_id and s.name='Sales');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值