统计2张表中不相同的数据

统计2张表中不相同的数据

参考

SQL中EXISTS的用法

Sql 语句中 IN 和 EXISTS 的区别及应用

MySQL的语句执行顺序

sql逻辑执行顺序

需求

查出了某段时间的系统中微信用户的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;
posted @ 2020-01-16 20:04  没有理由不会呀  阅读(338)  评论(0编辑  收藏  举报