一、查詢不重複數據
MySQL有distinct、group by和having等實現查詢不重複數據的方法,但實際上它們的實現機制並不完全一致,需根據實際場景選擇最優解。
1. Distinct方法
SELECT DISTINCT column FROM table;
該方法適用於篩選單個欄位不重複數據的場景,例如:
SELECT DISTINCT name FROM students;
這將返回去重後所有不同的名字。
2. Group By方法
SELECT column1, column2, ... FROM table GROUP BY column1, column2, ...;
該方法適用於篩選多個欄位不重複數據的場景,例如:
SELECT name, age FROM students GROUP BY name, age;
這將返回去重後所有不同的姓名和對應年齡。
3. Having方法
SELECT column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING condition;
該方法適用於篩選多個欄位不重複數據並需要指定條件的場景,例如:
SELECT name, age FROM students GROUP BY name, age HAVING COUNT(*) > 1;
這將返回去重後所有重複的姓名和對應年齡。
二、刪除重複數據
MySQL可以使用三種方法實現刪除重複數據:去重查詢+臨時表、子查詢和自聯接。
1. 去重查詢+臨時表
首先使用去重查詢構建一個臨時表,再根據臨時表的唯一鍵刪除重複行:
CREATE TABLE temp_table SELECT DISTINCT * FROM table; ALTER TABLE temp_table ADD UNIQUE INDEX unique_index (column1, column2, ...); DELETE t1 FROM table t1, temp_table t2 WHERE t1.column1=t2.column1 AND t1.column2=t2.column2 ...;
2. 子查詢
使用子查詢篩選出重複行的主鍵值,再根據主鍵值刪除重複行:
DELETE FROM table WHERE id IN (SELECT id FROM (SELECT id, column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING COUNT(*) > 1) as temp_table);
3. 自聯接
使用自聯接查找重複數據的主鍵值,並根據主鍵值刪除重複行:
DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.column1=t2.column1 AND t1.column2=t2.column2 ...;
三、保留一條重複數據
MySQL中可以使用多種方法保留一條重複數據:使用子查詢、臨時表、內聯接等,具體需根據數據特徵和查詢效率選取。
1. 子查詢
使用子查詢篩選出重複行中的最小/最大ID值,並將其餘ID值刪除:
DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY column1, column2 ...);
2. 臨時表
使用臨時表構建一份保留一條數據的副本,並將其餘數據刪除:
CREATE TABLE temp_table SELECT MIN(id) as id, column1, column2, ... FROM table GROUP BY column1, column2 ...; DELETE t1 FROM table t1 LEFT JOIN temp_table on t1.id=temp_table.id WHERE temp_table.id IS NULL;
3. 內聯接
使用內聯接查詢保留一條數據:
DELETE t1 FROM table t1 INNER JOIN table t2 ON t1.column1=t2.column1 AND t1.column2=t2.column2 ... WHERE t1.id > t2.id;
四、小結
MySQL去重複保留一條數據,常用的方法有查詢不重複數據、刪除重複數據和保留一條重複數據三種,每種方法有多種實現方式,需根據具體場景選取最優解。
原創文章,作者:JDDR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136575.html