正文
mysql怎么求差集 mysql 求差集
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
mysql数据库如何做这样的差集查询?
select URL from TABLEA
where url not in (select URL from TABLEB where APP_NAME=TABLEA.APP_NAME)
mysql两表汇总后再得到两表的交集和差集,请问怎么实现?
CREATE TABLE A (
`C1` VARCHAR(10),
`C2` VARCHAR(10),
`C3` VARCHAR(10),
`C4` VARCHAR(10),
`C5` INT
);
INSERT INTO A
SELECT '华北', '辽宁', '沈阳', '20020202', 2 UNION ALL
SELECT '华东', '山东', '青岛', '18020133', 3 UNION ALL
SELECT '华北', '北京', '北京', '7193', 7 UNION ALL
SELECT '华北', '北京', '北京', '8358', 5 UNION ALL
SELECT '华北', '北京', '北京', '9773', 8 UNION ALL
SELECT '华东', '山东', '青岛', '18020133', 5 ;
CREATE TABLE B (
`C1` VARCHAR(10),
`C2` VARCHAR(10),
`C3` VARCHAR(10),
`C4` VARCHAR(10),
`C5` INT
);
INSERT INTO B
SELECT '华北', '辽宁', '沈阳', '20020202', 5 UNION ALL
SELECT '华东', '山东', '青岛', '18020133', 6 UNION ALL
SELECT '华北', '北京', '北京', '7193', 2 UNION ALL
SELECT '华东', '甘肃', '兰州', '7364', 3 UNION ALL
SELECT '华东', '湖北', '武汉', '7512', 7 UNION ALL
SELECT '华东', '湖北', '武汉', '7512', 2 UNION ALL
SELECT '华东', '江苏', '常州', '7582', 5 UNION ALL
SELECT '华东', '江苏', '淮安', '7670', 7;
SELECT
IFNULL(A.`C1`, B.`C1`) AS `区域`,
IFNULL(A.`C2`, B.`C2`) AS `省份`,
IFNULL(A.`C3`, B.`C3`) AS `城市`,
IFNULL(A.`C4`, B.`C4`) AS `编码`,
SUM(A.`C5`) AS `表A销量`,
SUM(B.`C5`) AS `表B销量`
FROM
A LEFT JOIN B
ON (
A.`C1` = B.`C1` AND
A.`C2` = B.`C2` AND
A.`C3` = B.`C3` AND
A.`C4` = B.`C4`
)
GROUP BY
IFNULL(A.`C1`, B.`C1`),
IFNULL(A.`C2`, B.`C2`),
IFNULL(A.`C3`, B.`C3`),
IFNULL(A.`C4`, B.`C4`)
UNION
SELECT
IFNULL(A.`C1`, B.`C1`) AS `区域`,
IFNULL(A.`C2`, B.`C2`) AS `省份`,
IFNULL(A.`C3`, B.`C3`) AS `城市`,
IFNULL(A.`C4`, B.`C4`) AS `编码`,
SUM(A.`C5`) AS `表A销量`,
SUM(B.`C5`) AS `表B销量`
FROM
A RIGHT JOIN B
ON (
A.`C1` = B.`C1` AND
A.`C2` = B.`C2` AND
A.`C3` = B.`C3` AND
A.`C4` = B.`C4`
)
GROUP BY
IFNULL(A.`C1`, B.`C1`),
IFNULL(A.`C2`, B.`C2`),
IFNULL(A.`C3`, B.`C3`),
IFNULL(A.`C4`, B.`C4`);
+------+------+------+----------+---------+---------+
| 区域 | 省份 | 城市 | 编码 | 表A销量 | 表B销量 |
+------+------+------+----------+---------+---------+
| 华北 | 辽宁 | 沈阳 | 20020202 | 2 | 5 |
| 华北 | 北京 | 北京 | 7193 | 7 | 2 |
| 华北 | 北京 | 北京 | 8358 | 5 | NULL |
| 华北 | 北京 | 北京 | 9773 | 8 | NULL |
| 华东 | 山东 | 青岛 | 18020133 | 8 | 12 |
| 华东 | 甘肃 | 兰州 | 7364 | NULL | 3 |
| 华东 | 湖北 | 武汉 | 7512 | NULL | 9 |
| 华东 | 江苏 | 常州 | 7582 | NULL | 5 |
| 华东 | 江苏 | 淮安 | 7670 | NULL | 7 |
+------+------+------+----------+---------+---------+
9 rows in set (0.00 sec)
求如何用mysql实现计算上下两条记录的差
方法挺多的,很多是采用排序直接对等连接,这样对于主键聚集索引比较快的。
----
我提供的不是排序对等
方式,而是大范围连接检索最小距离的方式。
SELECT
A.FID,A.Fnum,MIN(A.Fid-B.Fid)
as
差值
FROM
test.cte
A
INNER
JOIN
test.cte
B
on(A.FIDB.FID)
GROUP
BY
A.FID,A.Fnum
ORDER
BY
A.Fid
Desc
---
执行结果:
FID
Fnum
差值
-------------------------
'9323',
'10',
'14'
'9309',
'10',
'1'
'9308',
'10',
'47'
'9261',
'10',
'31'
'9230',
'10',
'23'
'9207',
'10',
'16'
'9191',
'10',
'26'
'9165',
'10',
'14'
MYSQL如何得到补集.当然是要最高效率的方案
让group by 使用索引而不创建临时表mysql怎么求差集,
使用索引的前提条件是:所有GROUP BY列引用同一索引的属性,并且索引按顺序保存其关键字(B-树索引,不是HASH索引)
至于DISTINCT 和GROUP BY哪个效率更高?
理论上 DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作还要为其mysql怎么求差集他聚集函数进行准备工作。从这一点上将,GROUP BY操作做的工作应该比DISTINCT所做的工作要多一些。
但是实际上,DISTINCT操作,它会读取了所有记录;GROUP BY需要读取的记录数量与分组的组数量一样多,比实际存在的记录数目要少很多。
mysql里面求两个表的差集
只是查询,不做删除吧:
SELECT * FROM 表1 WHERE name NOT IN (
SELECT name FROM 表2
)
关于mysql怎么求差集和mysql 求差集的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。