• 统计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;
    
  • 相关阅读:
    D. Time to Run【构造】
    P3388 割顶 【求割点个数】
    处女座的测验 素数,构造
    处女座与复读机 DP
    求一个分数小数点后指定位数的数字
    安卓开发创建活动,布局,添加按钮,she使用Toast,设菜单,使菜单相关联等操作
    三进制 处女座的砝码 高精度
    上海高校程序设计联赛 D-CSL的字符串 栈模拟
    区间DP经典 石子合并
    区间DP 洛谷P2858牛奶零食
  • 原文地址:https://www.cnblogs.com/mozq/p/12203031.html
Copyright © 2020-2023  润新知