EXISTS/NOT EXISTS
EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
SQL EXISTS 语法
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
EXISTS 可以与 NOT 一同使用,查找出不符合查询语句的记录.
INTERSECT/EXCEPT
比较两个查询的结果,返回非重复行。
EXCEPT 从左侧输入查询返回非由右侧输入查询输出的非重复行。
INTERSECT 返回由左右双侧输入查询运算符输出的非重复行。
若要合并两个使用 EXCEPT 或 INTERSECT 的查询的结果集,请遵循以下基本规则:
所有查询中的列数和列的顺序必须相同。
数据类型必须兼容。
语法
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
比较
查询结果上EXCEPT = NOT EXISTS,INTERSECT = EXISTS,但是EXCEPT / INTERSECT的「查询开销」会比NOT EXISTS / EXISTS大很多。except自动去重复,not in / not exists不会。
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的 (https://www.cnblogs.com/liyasong/p/sql_in_exists.html)