登录 |  注册
首页 >  数据库 >  MySql基础知识 >  MySQL交集和差集的实现方法

MySQL交集和差集的实现方法

在MySQL中,只支持Union(并集)集合运算,而对于交集Intersect和差集Except并不支持。那么如何才能在MySQL中实现交集和差集呢?


通常在MySQL中,我们可以通过in和not in来间接实现交集和差集,当然也有一定局限性,面对少量数据还可以,但数据量大了效率就会变得很低。

创建table1

/*DDL 信息*/------------  
  
CREATE TABLE `t1` (  
  `id` int(11) NOT NULL,  
  `name` varchar(20) DEFAULT NULL,  
  `age` int(11) DEFAULT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8

创建table2

/*DDL 信息*/------------  
  
CREATE TABLE `t2` (  
  `id` int(11) NOT NULL,  
  `name` varchar(20) DEFAULT NULL,  
  `age` int(11) DEFAULT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8

插入

INSERT INTO t1 VALUES(1,'小王',10);  
INSERT INTO t1 VALUES(2,'小宋',20);  
INSERT INTO t1 VALUES(3,'小白',30);  
INSERT INTO t1 VALUES(4,'hello',40);  
  
  
INSERT INTO t2 VALUES(1,'小王',10);  
INSERT INTO t2 VALUES(2,'小宋',22);  
INSERT INTO t2 VALUES(3,'小肖',31);  
INSERT INTO t2 VALUES(4,'hello',40);

SELECT t1.* FROM t1   
  
id  name    age  
1   小王      10  
2   小宋      20  
3   小白      30  
4   hello   40

SELECT t2.* FROM t2   
  
id  name    age  
1   小王  10  
2   小宋  22  
3   小肖  31  
4   hello   40

使用not in 求差集,但效率低

SELECT t1.* FROM t1   
WHERE   
name NOT IN  
(SELECT name FROM t2)  
  
id  name    age  
3   小白      30

SELECT t1.id, t1.name, t1.age  
FROM t1   
LEFT JOIN t2   
ON t1.id = t2.id  
WHERE t1.name != t2.name  
  
   OR t1.age != t2.age;  
  
  
id  name    age  
2   小宋      20  
3   小白      30

求交集,此时只有id name age 所有都一样才是符合要求的。

SELECT  id,  NAME,  age, COUNT(*)  
    FROM (SELECT id, NAME, age  
        FROM t1  
          
        UNION ALL  
          
        SELECT id, NAME, age  
        FROM t2  
        ) a  
    GROUP BY id, NAME, age  
    HAVING COUNT(*) > 1  
      
    id  NAME    age COUNT(*)  
    1   小王      10  2  
    4   hello   40  2


union all和union的区别

UNION和UNION ALL的功能都是将两个结果集合并为一个,但是这两个关键字不管从使用还是效率上来说,都是有一定区别的。

使用上:

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,而Union All则不会去除重复记录。

2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是将两个结果合并后就返回,并不会进行排序处理。

效率上:

从效率上说,UNION ALL的处理效率要比UNION高很多,所以,如果可以确认合并的两个结果集中,且不包含重复数据和不需要进行排序的话,推荐使用UNION ALL。

上一篇: mysql通配符使用笔记整理
下一篇: postgresql和mysql哪个好
推荐文章
  • mysql只支持一种join算法:Nested-LoopJoin(嵌套循环连接),但Nested-LoopJoin有三种变种:SimpleNested-LoopJoin,IndexNested-LoopJoin,BlockNested-LoopJoin(简单-索引-缓冲区)原理:1.SimpleNe
  • redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化 redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制redis提供两种持久化机制RDB:存储数据结果,关注点在数据AOF:存储操作
  • 通过SQL的执行过程来介绍MySQL的基础结构.     首先有一个user_info表,表里有一个id字段,执行下面这条查询语句:Select * form user_info where i
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是
  • 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
  • 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲