【MySQL】求差集

项目的数据库从Oracle更换到了MySQL,导致很多sql需要重写,其中有一个sql是需要求两个结果的差集(不要问我为什么不在Java代码里处理,问就是老板不让这么干),百度到一个大佬的文章,其中分析的很到位,但是那个sql在实际使用中有一定的局限性,个人认为它实际上并不是完全的求差集(如果左表有部分数据在右表没有的话,则这一部分数据查不出来,可能有些大佬说不可能存在这种情况,那可能是你的业务没有涉及到),sql语句和链接我也会贴在文末,有感兴趣的大佬可以去看看;另外本文的sql执行效率在数据量比较大的情况下也没有验证过,如果有哪位大佬有条件,可以验证一下告知一下小弟;

  1. 先来创建两个表和数据
    CREATE TABLE `test1` (
      `id` int NOT NULL,
      `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
      `age` int DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    
    CREATE TABLE `test2` (
      `id` int NOT NULL,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      `age` int DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    
    INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (1, 't11', 10);
    INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (2, 't12', 11);
    INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (3, 't13', 12);
    
    INSERT INTO `test`.`test2` (`id`, `name`, `age`) VALUES (1, 't21', 20);
    INSERT INTO `test`.`test2` (`id`, `name`, `age`) VALUES (4, 't24', 24);
    INSERT INTO `test`.`test2` (`id`, `name`, `age`) VALUES (5, 't25', 25);
    
  2. 根据数据分析,那么差集应该是id等于2,3,4,5的数据 
  3. 直接查出各自缺的那部分,再UNION合并即可
    SELECT
    	t1.*
    FROM
    	test1 t1
    	LEFT JOIN test2 t2 ON t1.id = t2.id 
    WHERE
    	t2.id IS NULL
    UNION
    SELECT
    	t2.*
    FROM
    	test1 t1
    	right JOIN test2 t2 ON t1.id = t2.id 
    WHERE
    	t1.id IS NULL

    以上就是获取两个差集的整个过程了,如果有哪位大佬有更好的思路,欢迎指正;
    以下是另一位大佬的求差集的sql和链接,有兴趣的朋友可以去看看;
    select id FROM usertable LEFT JOIN
    (select id as i from blog) as t1
    ON usertable.id=t1.i where t1.i IS NULL
    【Mysql】求两个表(查询结果)的差集_编程记录,亲测有效-CSDN博客_mysql求差集
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值