统计2张表中不相同的数据
统计2张表中不相同的数据
参考
需求
查出了某段时间的系统中微信用户的openId和这段时间之前的系统中所有微信用户的openId,根据这2张表统计出这段时间新增的微信用户数量和这段时间内老的微信用户的数量。
思路
表1:这段时间的系统中微信用户的openId
表2:这段时间之前系统中所有微信用户的openId
新增的微信用户数量:查询在表1但是不在表2的openId的数量。
老的微信用户的数量:查询出同时在表1和表2的openId的数量。
统计sql
方式一 not in
SELECT
*
FROM
user1
WHERE
openId NOT IN (SELECT openId FROM user2)
方式二 表连接
SELECT
U1.*
FROM
user1 AS U1
LEFT JOIN user2 AS U2 ON U1.openId = U2.openId
WHERE
U2.openId IS NULL
方式三 相关子查询
如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。相关子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入。
这种方式先查询出外表中的数据,然后将外表中的数据作为条件。
先查询出user1中的所有记录,遍历所有的记录,判断是否符合where中的子查询的条件。
# 使用 EXISTS/ NOT EXISTS 判断结果集是否为空。
SELECT * FROM user1 AS U1
WHERE
NOT EXISTS( SELECT openId FROM user2 AS U2 WHERE U2.openId = U1.openId)
# U1中的一条记录的openId在U2中查不到记录,count(1)=0,符合条件,则将U1中的这条记录当成最后结果返回。
SELECT * FROM user1 AS U1
WHERE
( SELECT COUNT(1) FROM user2 AS U2 WHERE U2.openId = U1.openId) = 0
数据sql
DROP DATABASE IF EXISTS user;
CREATE database user;
use user;
# 表1
DROP TABLE IF EXISTS `user1`;
CREATE TABLE `user1` (
`id` int(11) NOT NULL,
`openId` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `user1` VALUES ('1', '刘备');
INSERT INTO `user1` VALUES ('2', '孙权');
INSERT INTO `user1` VALUES ('3', '曹操');
# 表2
DROP TABLE IF EXISTS `user2`;
CREATE TABLE `user2` (
`id` int(11) NOT NULL,
`openId` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `user2` VALUES ('1', '刘备');
INSERT INTO `user2` VALUES ('2', '孙权');
INSERT INTO `user2` VALUES ('3', '诸葛亮');
INSERT INTO `user2` VALUES ('4', '孙策');
INSERT INTO `user2` VALUES ('5', '关羽');
INSERT INTO `user2` VALUES ('6', '张飞');
# 表3(空表)
DROP TABLE IF EXISTS `user3`;
CREATE TABLE `user3` (
`id` int(11) NOT NULL,
`openId` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;