我试图弄清楚减/运算符的工作原理。 不知怎的,我在网上找不到任何有用的东西。 "减去" operator用于返回第一个语句中不属于第二个语句的所有行。但它究竟是如何做到的呢?
有人可以告诉我这是如何做的"一步一步"?
答案 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中的一个集合操作,其他包括UNION
,UNION ALL
和INTERSECT
。
这就是他们所做的:
示例数据:
<强> EMPLOYEE
强>
ID NAME SALARY AGE
1 Alice 5000 23
2 Joe 1000 25
3 Raj 2000 28
4 Pam 1500 32
<强> 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 强>:
仅返回结果集之间的常见记录。
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返回记录:
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
IN集理论
说A={A,B,C,D}
,B={B,X,Y,Z}
所以A-B={A,C,D}
- left join
sql
答案 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 }
这澄清了吗?