📜  sql 查找两个表之间的缺失值 - SQL (1)

📅  最后修改于: 2023-12-03 15:05:19.018000             🧑  作者: Mango

SQL 查找两个表之间的缺失值

在实际数据处理中,我们常常需要查找两个表之间缺失或者重复的数据,以便进一步处理。

假设我们有两个表:A和B,它们的表结构和数据如下:

CREATE TABLE A (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

CREATE TABLE B (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

INSERT INTO A VALUES (1, 'Tom', 20);
INSERT INTO A VALUES (2, 'John', 25);
INSERT INTO A VALUES (3, 'Mary', 30);

INSERT INTO B VALUES (1, 'Tom', 20);
INSERT INTO B VALUES (3, 'Mary', 28);
INSERT INTO B VALUES (4, 'Bill', 35);
查找A表中B表没有的数据

如果我们想要查找在A表中存在但是B表中不存在的数据,可以采用如下的SQL语句:

SELECT * FROM A WHERE NOT EXISTS (
    SELECT * FROM B WHERE A.id = B.id
);

解释一下上述SQL语句:

NOT EXISTS:表示子查询中是否存在满足条件的记录,如果不存在就返回结果。 SELECT * FROM B WHERE A.id = B.id:子查询,查找在B表中存在的和A表中的记录匹配的所有记录。 WHERE NOT EXISTS:在子查询结果的基础上过滤掉B表存在的记录,就可以得到在A表中但是B表中没有的记录。

执行上述SQL语句,输出结果为:

 id | name | age
----+------+-----
  2 | John |  25

这表示在A表中,id为2的记录在B表中不存在。

查找B表中A表没有的数据

与查找A表中B表没有的数据类似,我们可以采用如下的SQL语句查找B表中A表没有的数据:

SELECT * FROM B WHERE NOT EXISTS (
    SELECT * FROM A WHERE B.id = A.id
);

上述SQL语句与查找A表中B表没有的数据的SQL语句类似,只是将A表和B表的顺序反过来了。执行上述SQL语句,输出结果为:

 id | name | age
----+------+-----
  4 | Bill |  35

这表示在B表中,id为4的记录在A表中不存在。

查找在A表和B表中都存在但是数据不一致的记录

如果我们想要查找在A表和B表中都存在但是数据不一致的记录,可以采用如下的SQL语句:

SELECT A.*, B.* FROM A JOIN B ON A.id = B.id
WHERE A.name <> B.name OR A.age <> B.age;

解释一下上述SQL语句:

JOIN:表示将A表和B表进行连接,ON后面的条件表示根据id进行连接。 WHERE:过滤掉A表和B表数据都一致的记录,只保留数据不一致的记录。

执行上述SQL语句,输出结果为:

 id | name | age | id | name | age 
----+------+-----+----+------+-----
  3 | Mary |  30 |  3 | Mary |  28

这表示在A表和B表中,id为3的记录数据不一致。

总结

通过以上的SQL语句,我们可以方便地查找在两个表之间缺失或者重复的数据。在实际应用场景中,我们可以根据具体情况进行调整,以便达到更好的查询效果。