zoukankan      html  css  js  c++  java
  • 统计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;
    
  • 相关阅读:
    Reactive Extensions (Rx) 入门(5) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(4) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(3) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
    Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要
    Xamarin NuGet 缓存包导致 already added : Landroid/support/annotation/AnimRes 问题解决方案
    Android 系统Action大全
    Xamarin Forms 实现发送通知点击跳转
    如何理解灰度发布
    推荐一款分布式微服务框架 Surging
  • 原文地址:https://www.cnblogs.com/mozq/p/12203031.html
Copyright © 2011-2022 走看看