在數據遷移中,我們經常需要比較兩個表,以便在一個表中標識另一個表中沒有相應記錄的記錄。
例如,我們有一個新的數據庫,其架構與舊數據庫不同。我們的任務是將所有數據從舊數據庫遷移到新數據庫,並驗證數據是否正確遷移。
要檢查數據,我們必須比較兩個表,一個在新數據庫中,一個在舊數據庫中,並標識不匹配的記錄。
Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;
Union All:對兩個結果集進行並集操作,包括重復行,不進行排序;
假設有兩個表:t1
和t2
。使用以下步驟比較兩個表,並確定不匹配的記錄:
1、首先,使用UNION語句來組合兩個表中的行; 僅包含需要比較的列。返回的結果集用於比較。
-- 語法:MySQL比較兩個表不同的數據 SELECT * FROM t1 UNION ALL SELECT * FROM t2;
-- 創建兩個表 CREATE TABLE t1( id INT auto_increment PRIMARY KEY, title VARCHAR(255) ); CREATE TABLE t2( id INT auto_increment PRIMARY KEY, title VARCHAR(255), note VARCHAR(255) ); -- 給表1、2中插入數據 INSERT INTO t1(title) VALUES ('語文'),('數學'),('量子力學'),('美術'),('計算機'); INSERT INTO t2(id,title) SELECT * FROM t1;
2、然后在用下面方法查詢對比,返回的結果是空的。因為這兩個表:id、title數據是一樣的,且兩個表中其他列的數據為空。
SELECT id,title FROM ( SELECT * FROM t1 UNION ALL SELECT id,title from t2) c GROUP BY c.id HAVING COUNT(*)=1 ORDER BY c.id ;
3、所以在插入一行數據給表2
INSERT INTO t2(title,note) VALUES('new','noe');
在用2的語句查詢對比,有一條返回結果:
可能有人會想,如果只有兩列數據就是id和title,如果title中有數據不同,會有不同的結果呢?那這里在插入一條數據做驗證:
INSERT INTO t2(title) VALUES('new222');
在用2的語句查詢對比,它的返回結果如下: 說明兩個表中,如果相同的列名下,值不同,就會有因為數據不一致,而返回結果記錄。