SELECT pk, c1FROM (SELECT t1.pk, t1.c1FROM t1UNION ALLSELECT t2.pk, t2.c1FROM t2) tGROUP BY pk, c1HAVINGCOUNT(*) =1ORDER BY pk
如果比较中涉及的列中的值相同,则不返回任何行。
MySQL比较两个表的例子
我们来看一个模拟上述步骤的例子。
首先,创建具有相似结构的2个表:
USE testdb;CREATETABLEt1( id int auto_increment primary key, title varchar(255) );CREATETABLEt2( id int auto_increment primary key, title varchar(255), note varchar(255));
其次,在t1和t2表中插入一些数据:
INSERT INTO t1(title)VALUES('row 1'),('row 2'),('row 3');INSERT INTO t2(title,note)SELECT title, 'data migration'FROM t1;
第三,比较两个表的id和title列的值:
SELECT id,titleFROM (SELECT id, title FROM t1UNION ALLSELECT id,title FROM t2) tblGROUP BY id, titleHAVINGcount(*) =1ORDER BY id;
没有行返回,因为没有不匹配的记录。
第四,在t2表中插入一行:
INSERT INTO t2(title,note)VALUES('new row 4','new');
没有行返回,因为没有不匹配的记录。
第四步,在t2表中插入一行:…
INSERT INTO t2(title,note)VALUES('new row 4','new');
第五步,执行查询以再次比较两个表中的title列的值。新行是不匹配的行将会返回。
mysql>SELECT id,titleFROM (SELECT id, title FROM t1UNION ALLSELECT id,title FROM t2) tblGROUP BY id, titleHAVINGcount(*) =1ORDER BY id;+----+-----------+| id | title |+----+-----------+| 4 | new row4 |+----+-----------+1rowinset