MySQL 交集和差集的实现方法有多种,其中最常用的是使用 UNION 和 MINUS 运算符。
UNION 运算符可以将两个或多个 SELECT 语句的结果合并在一起,返回不重复的行。它可以用来实现 MySQL 交集,例如:
SELECT * FROM table1 WHERE condition1 UNION SELECT * FROM table2 WHERE condition2;
MINUS 运算符可以将两个或多个 SELECT 语句的结果进行比较,返回在前一个 SELECT 结果中存在而在后一个 SELECT 结果中不存在的行。它可以用来实现 MySQL 差集,例如:
SELECT * FROM table1 WHERE condition1 MINUS SELECT * FROM table2 WHERE condition2;
此外,MySQL 还提供了 EXCEPT 和 INTERSECT 运算符来实现交集和差集。EXCEPT 是 MINUS 的别名;INTERSECT 是 UNION 的别名。使用 EXCEPT 和 INTERSECT 可以使 SQL 语句看起来更加直观易读。例如:
SELECT * FROM table1 WHERE condition1 INTERSECT SELECT * FROM table2 WHERE condition2;
SELECT * FROM table1 WHERE condition1 EXCEPT SELECT * FROM table2 WHERE condition2;
在MySQL中,只支持Union(并集)集合运算,而对于交集Intersect和差集Except并不支持。那么如何才能在MySQL中实现交集和差集呢?
一般在MySQL中,我们可以通过in和not in来间接实现交集和差集,当然也有一定局限性,面对少量数据还可以,但数据量大了效率就会变得很低。
创建table1
------------
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
------------
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 的迁移方案
MySQL FAQ系列整理
原文地址:https://blog.csdn.net/mine_song/article/details/70184072
连接数据库前,请先确认以下事项:您已经创建了数据库 TESTDB.在TESTDB数据库中您已经创建了表 EMPLOYEEEMPLOYEE表字段为 FIRST_...
以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:#!/usr/bin/python# -*- coding: UTF-8 -*-import MySQLdb# 打开数据...
我们知道从MySQL表中使用SQL SELECT 语句来读取数据。 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句...
你可能想知道MySQL以下三种信息:查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。 数据库和数据表的信息: 包含了数...
MySQL Date 函数定义和用法 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。 语法DATE_FORMAT(date,format) date 参数是...
MySQL Date 函数定义和用法 DATE() 函数提取日期或日期/时间表达式的日期部分。 语法DATE(date) date 参数是合法的日期表达式。...
第 24 章 Prolog本章将介绍如何编写嵌入式的 Prolog 解释器。第 19 章中已经展示了编写数据库查询语句编译器的方法,这里我们再...
原文链接:http://www.aosabook.org/en/itk.html作者:Luis Ibanez 和 Brad King译按:原文的二级和三级标题并无章节号,只有字...
18.3. 组件分析Agent (代理)在 Puppet 运行过程之中,第一个提到的组件就是 agent 进程。历史上,这是一个独立的称为puppedd...