大数据:SQL实现表之间的交集、并集、差集、非交集

大学毕业之后就没认认真真学习过数据库相关的知识,特别是SQL语句,要用到的时候上百度,不用的时候根本不会往这块想,今天有幸面试了一位候选人,期间问了一个如何查询两表的非交集部分,题目其实不难,实现的思路也很多,但说实话如果对一个不经常使用SQL语句的人来说,实现起来还是有点困难的。笔者采用的验证环境是在MySQL系统下。

一、实现

  1. 登录数据库
    首先,登录MySQL的默认数据库test,我们的验证从这里开始。主要涉及3条命令,如下:

    mysql -uroot -p # 在linux环境下登录mysql数据库
    show databases; – 显示mysql下有所有数据库
    use test; – 进入test数据库
    show tables; – 显示test数据库下的所有表
    大数据:SQL实现表之间的交集、并集、差集、非交集

  2. 建表
    为了测试方便,我们把模型简化了,我们就建一个只有3个字段的人员表,ID、Name、Age,其中ID为主键。然后插入相应的数值,建表语句如下:

    mysql> create table tb_a(ID int,Name varchar(255),Age int,PRIMARY KEY (ID));
    mysql> create table tb_b(ID int,Name varchar(255),Age int,PRIMARY KEY (ID));
    mysql> INSERT INTO tb_a VALUES (1,‘Ada’,10);
    mysql> INSERT INTO tb_a VALUES (2,‘Bon’,12);
    mysql> INSERT INTO tb_a VALUES (3,‘Cat’,15);
    mysql> INSERT INTO tb_b VALUES (2,‘Bon’,12);
    mysql> INSERT INTO tb_b VALUES (4,‘Dog’,18);
    mysql> INSERT INTO tb_b VALUES (5,‘Egg’,20);

    最终的表如下:
    大数据:SQL实现表之间的交集、并集、差集、非交集

  3. 实现
    3.1 交集
    JOIN是标准SQL语句解决交集问题的关键字,衍生出INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN等。在这里我们只是用到简单的JOIN…ON…语句,交集命令如下:SELECT a.ID,a.Name,a.Age FROM tb_a AS a JOIN tb_b AS b ON a.ID =b.ID;
    大数据:SQL实现表之间的交集、并集、差集、非交集
    当然除了上面做何种思路,也可以通过IN关键字达到同样目的,代码如下:SELECT * FROM tb_a WHERE ID IN (SELECT ID FROM tb_b);
    大数据:SQL实现表之间的交集、并集、差集、非交集
    3.2 并集
    UNION就是标准的SQL语句解决表合并问题,UNION是去重的,UNION ALL是不去重的,具体代码是:SELECT * FROM tb_a UNION SELECT * FROM tb_b;
    大数据:SQL实现表之间的交集、并集、差集、非交集
    3.3 差集
    由于MySQL不支持EXCEPT字段,所以我们采用NOT IN,思路是先取A中所有记录再过滤掉B中有的记录,具体语句是:SELECT * FROM tb_a WHERE ID NOT IN (SELECT ID FROM tb_b);
    大数据:SQL实现表之间的交集、并集、差集、非交集
    3.4 非交集
    回到本文的出发点,SQL语句中并没有一个关键字是解决非交集问题的,但是通过上面三个功能的实现,我们可以把非交集转换为A-B的差集并上B-A的差集的并集,具体语句是:SELECT * FROM tb_a WHERE ID NOT IN (SELECT ID FROM tb_b) UNION SELECT * FROM tb_b WHERE ID NOT IN (SELECT ID FROM tb_a);
    大数据:SQL实现表之间的交集、并集、差集、非交集
    最后总结一下JOIN相关的内容如下:
    大数据:SQL实现表之间的交集、并集、差集、非交集

参考文献
1.sql求两表的并集、交集、非交集、差集、结果集排序
2.SQL 教程
3.SQL 连接(JOIN)