比较SQL中的两个表

SQL中的数据比较是每个数据库开发人员偶尔会遇到的一项常见任务。幸运的是,数据比较有各种各样的格式,如文字比较、布尔比较等。

但是,您可能遇到的真实数据比较场景之一是两个表之间的比较。它在数据验证、错误识别、复制或确保数据完整性等任务中起着至关重要的作用。

在本教程中,我们将探讨用于比较SQL中的两个数据库表的各种方法和技术。

示例数据设置

在深入研究每个方法之前,让我们先设置一个基本的数据设置以进行演示。

我们有两个表,其中包含示例数据,如示例所示。

表1示例:

下面包含创建第一个表和在表中插入样例数据的查询:

创建表sample_tb1

INT主键AUTO_INCREMENT;

first_name VARCHAR (50),

last_name VARCHAR (50),

部门VARCHAR (50),

salary DECIMAL(10,2)

);

INSERT INTO sample_tb1 (first_name, last_name, department, salary)



('Penelope', 'Chase', 'HR', 55000.00),

(“马修”,“凯奇”,“IT”,600.00),

(' jennifer ', 'Davis', 'Finance', 500.00),

(“柯尔斯顿”,“福塞特”,“IT”,62000.00),

('Cameron', 'costner', 'Finance', 48000.00);

 

这将创建一个名为“sample_tb1”的新表,其中包含姓名、部门和工资等各种信息。

结果表如下:

表2示例:

让我们继续创建两个示例表。假设这是第一个表的备份副本。我们可以创建表并插入样例数据,如下所示:

创建表sample_tb2

INT主键AUTO_INCREMENT;

first_name VARCHAR (50),

last_name VARCHAR (50),

部门VARCHAR (50),

salary DECIMAL(10,2)

);

INSERT INTO sample_tb2 (first_name, last_name, department, salary)



('Penelope', 'Chase', 'HR', 55000.00),

(“马修”,“凯奇”,“IT”,600.00),

(' jennifer ', 'Davis', 'Finance', 500.00),

(“柯尔斯顿”,“福塞特”,“IT”,62000.00),

('Audrey', 'Dean', 'Finance', 48000.00);

 

这将创建一个表,并插入前面查询中指定的样例数据。结果表如下:

使用Except比较两个表

在SQL中比较两个表的最常用方法之一是使用EXCEPT操作符。这将查找在第一个表中存在但在第二个表中不存在的行。

我们可以使用它与示例表进行如下比较:

SELECT *

从sample_tb1

除了

SELECT *

从sample_tb2;

 

在本例中,EXCEPT操作符返回第一个查询(sample_tb1)中没有出现在第二个查询(sample_tb2)中的所有不同的行。

使用Union比较两个表

我们可以使用的第二个方法是UNION操作符与GROUP BY子句结合使用。这有助于识别存在于一个表中的记录,而不存在于另一个表中,同时保留重复的记录。

以下面演示的查询为例:

选择

employee_id,

first_name、

last_name、

部门,

工资



(

选择

employee_id,

first_name、

last_name、

部门,

工资



sample_tb1

UNION ALL

选择

employee_id,

first_name、

last_name、

部门,

工资



sample_tb2

)作为组合数据

集团

employee_id,

first_name、

last_name、

部门,

工资



count (*) = 1;

 

在给定的示例中,我们使用UNION ALL操作符组合来自两个表的数据,同时保留重复项。

然后使用GROUP BY子句按所有列对合并后的数据进行分组。最后,我们使用HAVING子句来确保只选择计数为1(没有重复)的记录。

输出:

这种方法稍微复杂一些,但它提供了更好的洞察力,因为您可以获得两个表中缺失的实际数据。

使用内连接比较两个表

如果您一直在思考,为什么不使用INNER JOIN呢?你就对了。我们可以使用INNER JOIN来比较表并找到公共记录。

以以下查询为例:

选择

sample_tb1。*



sample_tb1

内部连接sample_tb2 ON

sample_tb1。Employee_id = sample_tb2.employee_id;

 

在本例中,我们使用SQL INNER JOIN根据给定列查找两个表中存在的记录。虽然这是有效的,但有时可能会产生误导,因为您不确定数据是否确实丢失或存在于两个表中或仅存在于一个表中。

结论

在本教程中,我们学习了可以用来比较SQL中的两个表的所有方法和技术。