在批量程序的测试中,经常会涉及到对数据库表的测试,今天我们来介绍一下用sql比较两张表结构相同的表数据是否完全一致的方法。

1、inner join 浅尝

提到比对两张表的数据是否完全相同,很容易想到用inner join关联两张表去比较。Inner join的基本语法是:

select collist from t1 inner join t2 on condition1 and condition2...;

简单理解就是对于t1表中的每一行,将它与t2表的每一行进行比较,检查他们是否满足关联条件,当满足关联条件时,inner join 将返回由t1和t2表中的列组成的新行,当无法满足关联条件时,将返回一个空结果。下面举个例子:

create table t1(id number,name varchar2(10));

insert into t1 values(1, 'A');

insert into t1 values(2, 'B');

insert into t1 values(3, 'C');

insert into t1 values(4, 'D');

select * from t1;

得到t1表数据如下

create table t2(id number,name varchar2(10));

insert into t2 values(1, 'A');

insert into t2 values(2, 'B');

insert into t2 values(3, 'C');

insert into t2 values(4, 'D');

select * from t2;

得到t2表数据如下

t1和t2表结构相同,用inner join做两张表关联,条件是相对应的字段都完全一致。sql语句和结果如下:

select * from t1 inner join t2 on t1.ID=t2.ID and t1.NAME=t2.NAME;

select count(*) from t1 inner join t2 on t1.ID=t2.ID and t1.NAME=t2.NAME;

由上述例子可见,用inner join比较两张表结构完全相同的表,当关联条件为对应字段都相等时,若t1表的条数=t2表的条数=两张表inner join的返回条数,则说明这两张表数据内容是完全一致的。

2、小心数据重复陷阱

以上是用inner join语句时最容易想到的思路,但是我们忽略了一点,inner join原理是对两张表做乘积操作,对于表内有重复数据时候,就会出现漏洞,举例如下:

假设t1表数据如下:

t2表数据如下:

用inner join对两张表做关联操作,条件是相对应字段值都相等,语句和执行结果如下:

select * from t1 inner join t2 on t1.ID=t2.ID and t1.NAME=t2.NAME;

select count(*) from t1 inner join t2 on t1.ID=t2.ID and t1.NAME=t2.NAME;

由此可见,当所对比的两张表内有重复数据时,用最初的inner join 方法直接关联两张表判断数据是否完全一致将会出现问题。

3、一种简单的改进方法

如何解决呢?一种简单的改进方法就是对两张表分别按整行分组,并计算分组的条数,得到t1’和t2’,此时的t1’和t2’是不存在任何重复数据的两张表,再对t1’和t2’用最初的方法通过inner join关联比较。下面举例说明:

对t1分组并求条数,得到t1’,语句和执行结果如下:

select id,name,count(1) as num from t1 group by id,name;

对t2分组并求条数,得到t2’,语句和执行结果如下:

select id,name,count(1) as num from t2 group by id,name;

对t1’和t2’用inner join语句做关联和比较,语句和执行结果如下:

select *

from (select id,name,count(1) as num from t1 group by id,name) table1

inner join (select id,name,count(1) as num from t2 group by id,name) table2 on table1.ID=table2.ID

and table1.name=table2.name

and table1.num=table2.num;

若t1’的条数=t2’的条数=t1’和t2’inner join关联(条件是对应字段值都相等)返回条数,则说明t1和t2表数据完全相同。在上述例子中,可以看到改进后的inner join语句可以判断出t1 和 t2表数据并不完全一致。

4、更多判断语句

其实除了inner join语句外,还有很多种方法可以比较两张表的数据是否完全一致。

如用minus 对两张表做减法,返回t1表减去t2表后的行,返回t2表减去t1表后的行,判断是否返回的内容都为空

select * from t1 minus select * from t2;

select * from t2 minus select * from t1;

如用exists对表中的每一行逐一判断,返回在t1中存在但t2中不存在的行,返回在t2中存但在t1中不存在的行,查看是否返回的内容都为空:

select * from t1

where not exists(select * from t2 where t1.ID=t2.ID and t1.NAME=t2.NAME);

select * from t2

where not exists(select * from t1 where t1.ID=t2.ID and t1.NAME=t2.NAME);

如将t1和t2中的所有字段以字符串的形式拼接起来,判断t1拼接后的字符串是否都在t2中存在,t2拼接后的字符串是否都在t1中存在:

select * from t1 where t1.ID||t1.NAME not in (select t2.ID||t2.NAME from t2);

select * from t2 where t2.ID||t2.NAME not in (select t1.ID||t1.NAME from t1);

值得注意的是,以上三种方法同样也不适用于有重复数据时的情况。但是没关系,通过前文inner join举例,我们已经学会了采用对整行分组求条数得到t1’和t2’的方法,通过对t1’和t2’进行比较,同样可以获得比对t1和t2数据是否完全一致的正确结果。

mysql比对表中数据是否相同_如何用sql比较两张表数据是否一致?相关推荐

  1. mysql比对两张表数据

    如何对两个数据库中的表进行比较 server 和mysql可以这样: insert A表(要插入的字段列表) select 要插入的字段列表 库2.B表 --注意字段的对应.... oracle ex ...

  2. MySQL比较两张表数据相同、不同结果记录

    两张表:水果设备表sb_fruit.系统设备表xt_fruit,比较两张表中相同.不同的数据结果. 自己开始尝试写的方法: (1)设备与系统共有数据: select sb.id,sb.name_idn ...

  3. MySQL同步两张表数据

    一.背景 项目中客户需要一个发布/编辑的功能,数据要存档. 我的方案设计是新建两张表,一张主表用于查询,一张临时表用于增删改. 增删改操作的表命名为XXX_temp,后台管理操作.后台操作完成后需要把 ...

  4. oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据

    两张表数据如下: --2017年 id college score A001 北京大学 670 A002 中国人民大学 646 A003 清华大学 664 A003 清华大学         (定向) ...

  5. Hive 两张表数据验证方案、两张大表如何进行数据验证以及剔除部分字段进行数据验证

    最近的问题是,宽表在上线之前,需要在测试环境进行试跑,试跑结束后如何跟线上正式数据进行比对呢?简单记录一下设计方案. 1.小表数据验证 一些字段比较少的表进行数据验证的方案之前出过 Hive 数据模型 ...

  6. select UNION ALL 合并两张表数据

    select UNION ALL 合并两张表数据 SELECT id,uid FROM table1 t1  UNION ALL SELECT id,uid FROM table2 t2 查出来的结果 ...

  7. MySQL 两张表数据合并

    有一个需求, 需要从数据库中导出两张表的数据到同一个excel中 鉴于是临时的业务需求, 直接使用Navicat 进行查询并导出数据. 数据涉及到三张表 CREATE TABLE `bigdata_q ...

  8. mysql不同服务器数据库查询_不同服务器不同数据库两张表连接查询使用经验

    使用SQL语句连接查询位于两个不同的服务器不同的数据库中的两张表,最初将SQL语句写成以下形式select*fromProduct pinnerjoin opendatasource('SQLOLED ...

  9. SQL 新旧两张表数据对比是否一致

    有新旧两张表结构一样的表,需要对比一下两张表的数据是否一致. 1.首先对比一下数据量 select count(1)from table_new; select count(1)from table_ ...

最新文章

  1. R语言使用subset函数基于组合逻辑筛选dataframe符合条件的数据行(select observations)、并指定需要保留的dataframe数据列或者字段
  2. bootstrap之div居中
  3. linux卸载vs codeblocks,哪个适合linux? GNU make vs cmake vs codeblocks vs qmake
  4. framework调试
  5. IP地址与子网掩码总结
  6. 计算机组装活动口号,广教育、多技能、求发展喜迎计算机系第五届电脑文化节...
  7. JMeter工具使用初探
  8. c语言stanf,stanf
  9. RTX5 | 事件标志组04 - 线程同步(逻辑与)
  10. 2018福建省考c语言成绩查询,福建省公务员考试录用网成绩查询系统:2019福建省考分数查询入口...
  11. ASP.NET 2.0的编译行为
  12. json_encode 转义
  13. 得到常用汉字的拼音首字母
  14. sqlplus连接Oracle 11g 数据库
  15. Windows7 的激活命令小结
  16. 关于数位板电脑绘画——入门篇
  17. mov格式怎么在线转换成mp4格式
  18. xz压缩文件的解压缩过程
  19. vue2 mapEchart示例
  20. maven集成docker插件进行打包镜像并推送私服

热门文章

  1. H5技术实现教程:多屏CSS动画精进技巧
  2. 在 Spyder 中使用包和环境
  3. 96微信编辑器如何调整文章格式?
  4. wifi码系统具备什么功能
  5. BMW X3 xDrive28i隐藏属性“同级唯1”
  6. 蓝桥杯嵌入式第七届省赛——“模拟液位检测告警系统”旧板标准库
  7. CSS 精灵(雪碧图、精灵图)
  8. 关于python注释下面选项描述错误的是_关于Python的分支结构,以下选项中描述错误的是( )。...
  9. linux shell 自动应答y,Shell脚本SSH登陆自动应答
  10. html常用标签及属性,常用英语单词