zoukankan      html  css  js  c++  java
  • SQL语句的MINUS,INTERSECT和UNION ALL

    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

  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4262145.html
Copyright © 2011-2022 走看看