使用SQL中的MINUS操作符

MINUS 返回第一个查询中存在但第二个查询中不存在的行。
列必须相同。
减轻重量。
Oracle/PostgreSQL 支持。
MySQL 使用 NOTEXISTS 代替。
SQL Server 使用 EXCEPT 来代替。
性能较差,使用大表时要小心。
如果为空,也可以添加左连接来做出决定。
示例: Oracle,2 02 3 -01 ,选择table1 获取table2 中没有的ID, 如果年龄>3 0,结果可能会很慢。
MySQL,2 02 3 -01 ,使用 t1 .id IS NULL 选择 ID 不在表 2 中的表 1 SQL Server,2 02 3 -01 ,使用 EXCEPT 直接查找差异集。
记得添加索引。

SQL中的minus.

说实话,Minis用起来还是挺好玩的。
上次我处理公司内部员工数据时差点被它搞砸了。
当时有两张表,一张叫current_employees,一张叫recent_leaves。
我想看看current_employees中明确有哪一组哥们,但是recent_leaves表中没有留下任何记录——说白了,我想找出那些没有离开但之前没有请过假的员工(这个需求有点奇怪,但这就是客户要求的)。

我的SQL是这样写的:
sql 选择员工 ID、姓名 来自当前员工 减号 选择员工 ID、姓名 来自最近的叶子;
结果,返回了几个ID。
我当时就想,这些人到底是怎么回事? 后来查了一下,他们受雇时间很短,没有机会请假。
这个例子说明,Minis操作非常适合寻找这种“漏网之鱼”。

但请注意,此操作对列名和顺序有非常严格的要求。
我的一个朋友在编写代码时颠倒了列的顺序。
结果Minis直接报错说类型不匹配。
这个教训太深刻了——你必须让两个查询的列名、顺序和数据类型完全相同,否则它们根本无法运行。

有趣的是,并不是所有的数据库都支持Minis操作。
我已经运行过几次Oracle和PostgreSQL,它们都工作正常。
但在MySQL 8 .0以下的版本中,直接报语法错误。
我个人没有在这方面运行过SQL Server,但我建议您在使用之前确认版本兼容性。

另一个陷阱是 NULL 的处理。
Minis操作对于NULL来说非常有趣。
它将 NULL 视为不相等。
例如,如果你检查两个表,一个员工的名字是“张三”,另一个是NULL,Minis会认为两者不同。
这个功能有时很烦人,但也可以解决一些棘手的需求。

在使用Minis操作时,我通常会先用EXPLAIN运行它,看看两个查询的执行计划是否相同。
有时你会发现两个看似相同的查询由于使用不同的索引而执行结果却截然不同。
当我处理大数据量的场景时,正是因为这个细节,我能够将查询时间从几分钟缩短到几秒。

归根结底,Minis运算是一个寻找差异集的工具。
如果使用得当,它可以帮助您发现其他人看不到的数据关系。
但在使用之前,需要想清楚列对齐和NULL处理的细节,否则很容易陷入困境。

oracle中intersect,minus用法

等等,还有一件事。
昨天我在地铁上看到一则广告,说新手机拍照非常清晰。
当我旁边的人接电话时,手机屏幕在阳光下显得一片空白。
在那里他说这款手机非常好,拍照也很棒,但是电池需要每天充电两次。
可以看出,无论这款手机拍照能力有多好,用一段时间就会被搁置。
看起来像是Oracle中很少使用的函数。
你知道它,但你不一定每天都使用它。

SQL中expect的用法

啊...这个...等等...真的没有...我记得清楚...
也许我想问EXCEPT,对...嗯...这个...在SQL中...例如...2 02 2 年...我在一个叫上海的城市做了一个项目...我用了这个...
想想...有两个表...例如orders1 1 和record2 orders1 月2 ...2 0orders...2 02 2 年2 月的orders...多少...假设orders1 有1 000...orders2 有9 8 0...
现在...你想知道...嗯...哪些订单在 order1 ...不在 order2 ...
然后你可以使用 EXCEPT... 编写查询...像这样...
sql 选择订单 ID 来自订单1 除了 选择订单 ID 来自订单2 ;
这个SQL...会找到...那些order_id在orders1 中...但不在orders2 中...
后来发现...EXCEPT也会自动去重...比如一个order_id在orders1 中出现了两次...但在orders2 中只出现了一次...那么结果中就只剩下一个...
而且...使用两个EXCE列类型数据...否则会出错...
我认为从根本上来说...这个操作...在比较数据的时候很方便...查找差异...
嗯...就是这样...