MySQL交集和差集的实现方法
2668
2019-11-04 22:51:34
在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。
原文链接: https://www.yukx.com/bingningm/article/details/957.html 优科学习网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中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
-
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲