MINUS,INTERSECT和UNION和UNION ALL 详解

数据库 专栏收录该内容
23 篇文章 0 订阅

MINUS,INTERSECT关键字 可以通过 in  not in esit等实现,那么为什么还需要用到 MINUS,INTERSECT呢?

有人做过实验: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(减去):

用集合表示如下 A={1,2,3,4,5} B={1,2,5}

select a MINUS b  =>c{3,4}

select aa.id from aa MINUS select bb.id from bb;

可以理解为相当于 select aa.id from aa where aa.id not in (select bb.id from bb); 

比如 aa,bb表数据如下:(aa中id为1-8,bb中为 1-4)

 

select aa.id from aa where aa.id not in (select bb.id from bb); 结果为5-8

 

INTERSECT(交集):

用集合表示如下 A={1,2,3,4,5} B={1,2,5}

select a INTERSECT b  =>c{1,2,5}

select aa.id from aa INTERSECTselect bb.id from bb;

可以理解为相当于 select aa.id from aa where aa.id  in (select bb.id from bb);

select aa.id from aa INTERSECTselect bb.id from bb;结果为1-4

UNION 和UNION ALL区别

 

UNION (并集):

 

用集合表示如下 A={1,2,3,4,5} B={1,2,5,6}

select a union b  =>c{1,2,3,4,5,6}

select * from aa union select * from bb;

可以理解为相当于 

(1)先查询aa表所有数据,select aa.id from aa;

(2)再查询bb表中没有id为aa表的数据 select bb.id from bb where   not exists (select aa.id from aa where aa.id=bb.id);

(3)结果集=(1)+(2)

比如  bb表中加入一个id为10的记录

select * from aa union   select * from bb; 结果为 aa表中的1-8,bb表中的10

UNION ALL(并集+公共部分):

 

用集合表示如下 A={1,2,3,4,5} B={1,2,5,6}

select a union all b  =>c{1,2,3,4,5,1,2,5,6}

select * from aa union all select * from bb;

可以理解为相当于 

(1)先查询aa表所有数据,select  aa.id from aa;

(2)再查询bb表的数据 select bb.id from bb;

(3)结果集=(1)+(2)

select * from aa union all  select * from bb; 结果为 aa表中的1-8,bb表中的1-4,10

 

 

 

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值