博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL语句的MINUS,INTERSECT和UNION ALL
阅读量:6485 次
发布时间:2019-06-23

本文共 949 字,大约阅读时间需要 3 分钟。

 

SQL语句中的三个keyword:MINUS(减去),INTERSECT(交集)和UNION ALL(并集);

 

关于集合的概念,中学都应该学过,就不多说了.这三个keyword主要是对数据库的查询结果进行操作,正如当中文含义一样:两个查询,MINUS是从第一个查询结果减去第二个查询结果,假设有相交部分就减去相交部分;否则和第一个查询结果没有差别. INTERSECT是两个查询结果的交集,UNION ALL是两个查询的并集;

 

 尽管相同的功能能够用简单SQL语句来实现,可是性能区别很大,有人做过实验:made_order共23万笔记录,charge_detail共17万笔记录:

    SELECT order_id FROM made_order

  MINUS
  SELECT order_id FROM charge_detail
耗时:1.14 sec
  
  SELECT a.order_id FROM made_order a
   WHERE a.order_id NOT exists (
     SELECT order_id
     FROM charge_detail
     WHERE order_id = a.order_id
   )
耗时:18.19 sec
性能相差15.956倍!因此在遇到这样的问题的时候,还是用MINUS,INTERSECT和UNION ALL来解决这个问题,否则面对业务中随处可见的上百万数据量的查询,数据库server还不被咱玩的死翘翘?

PS:应用两个集合的相减,相交和相加时,是有严格要求的:1.两个集合的字段必须明白(用*就不行,报错);2.字段类型和顺序同样(名称能够不同),如:集合1的字段1是NUMBER,字段2是VARCHAR,那么集合2的字段1必须也是NUMBER,字段2必须是VARCHAR;3.不能排序,假设要对结果排序,能够在集合运算后,外面再套一个查询,然后排序,如前面的样例能够改成:

SELECT * FROM

   (SELECT order_id FROM made_order
   MINUS
  SELECT order_id FROM charge_detail)
ORDER BY ORDER_ID ASC

你可能感兴趣的文章
多线程---同步函数的锁是this(转载)
查看>>
百练 2742 统计字符数 解题报告
查看>>
Ubuntu搜狗输入法候选词乱码
查看>>
js中回调函数写法
查看>>
React native android 最常见的10个问题
查看>>
数据结构和算法
查看>>
[pat]1045 Favorite Color Stripe
查看>>
Immutable学习及 React 中的实践
查看>>
【转】性能测试步骤
查看>>
OSI与TCP/IP各层的结构与功能,都有哪些协议
查看>>
Android实例-程序切换到后台及从后台切换到前台
查看>>
spring boot启动定时任务
查看>>
算法 (二分查找算法)
查看>>
java Date 当天时间戳处理
查看>>
linux常用命令-关机、重启
查看>>
iOS开发之调用系统设置
查看>>
初次使用 VUX
查看>>
javascript 字符串转数字的简便写法
查看>>
Spring中jdbcTemplate的用户实例
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>