关于减/运算符如何工作的说明

时间:2014-05-15 12:26:16

标签: sql

我试图弄清楚减/运算符的工作原理。 不知怎的,我在网上找不到任何有用的东西。 "减去" operator用于返回第一个语句中不属于第二个语句的所有行。但它究竟是如何做到的呢?

有人可以告诉我这是如何做的"一步一步"?

3 个答案:

答案 0 :(得分:1)


注意:以下答案适用于Oracle。见The UNION [ALL], INTERSECT, MINUS Operators

我的SQL只有UNION和UNION ALL。可以使用IN和NOT IN获得INTERSECT和MINUS的结果。请参阅Union, Difference, Intersection, and Division in MySQL [PDF]

在SQL Server中,MINUS称为EXCEPT。见Set Operators (Transact-SQL)


我很惊讶您无法在网上找到与此相关的任何内容。 MINUS是SQL中的一个集合操作,其他包括UNIONUNION ALLINTERSECT

这就是他们所做的:

示例数据

<强> EMPLOYEE

ID  NAME  SALARY  AGE
 1  Alice  5000    23
 2  Joe    1000    25
 3  Raj    2000    28
 4  Pam    1500    32

<强> UNION

Union

在删除重复项后,返回SQL 1与SQL 2中的结果组合在一起的结果。变体UNION ALL不会删除重复项。 UNION ALL具有更好的性能,因为它不执行排序并删除重复(内部)步骤。当所使用的两个SQL的结果互斥时,Union all非常有用。

select * from employee where salary > 1000
union
select * from employee where age > 25

返回所有25岁或以上或有薪水的员工&gt; 1000(满足 条件)

ID  NAME  SALARY  AGE
 1  Alice  5000    23
 3  Raj    2000    28
 4  Pam    1500    32

在上述情况下使用UNION ALL会返回Raj的记录两次,因为UNION ALL不会删除重复项。

select * from employee where salary > 1000
union all
select * from employee where age > 25


ID  NAME  SALARY  AGE
 1  Alice  5000    23
 3  Raj    2000    28
 4  Pam    1500    32
 3  Raj    2000    28

<强> INTERSECT

Intersect

仅返回结果集之间的常见记录。

select * from employee where salary > 1000
intersect
select * from employee where age > 25

仅返回满足两个条件的记录:有工资&gt; 1000和超过25。

ID  NAME  SALARY  AGE
 3  Raj    2000    28
 4  Pam    1500    32

<强> MINUS : 从SQL 2中删除结果后从SQL 1返回记录:

Minus

select * from employee where salary > 1000
intersect
select * from employee where age > 25

返回所有拥有工资&gt;的员工删除超过25岁的员工后1000:

ID  NAME  SALARY  AGE
 1  Alice  5000    23

答案 1 :(得分:0)

这应该给你一个线索!

create table #t(id int)
insert into #t values(1),(2),(3),(4),(5)

create table #t2(id1 int)
insert into #t2 values(2),(5),(6)

select * from #t except select * from #t2

select id from #t left join #t2 on #t.id=#t2.id1 where #t2.id1 is null 

SEE DEMO

IN集理论

A={A,B,C,D}B={B,X,Y,Z}

所以A-B={A,C,D} - left join

中的sql

enter image description here

答案 2 :(得分:0)

假设:

create table U
( x int not null primary key );
insert into U (x) values (1),(2),(3);

create table V
( y int not null primary key );
insert into U (x) values (3),(4);

现在U - V = { 1, 2 }

U - V可表示为:

U中所有在V中都不存在的教堂,即

select x 
from U
where not exists (
    select 1 
    from V
    where V.y = U.x
);

以同样的方式V - U = { 4 }

这澄清了吗?