有時候我們在使用sql數據庫的時候,想去掉重復數據,怎么去掉呢,下面來分享一下方法
我們在這里使用的數據庫是 mysql
創建表
首先我們創建一個 student 表
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(0) NOT NULL, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `age` int(0) NULL DEFAULT NULL, `agx` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
插入數據
INSERT INTO `student` VALUES (1, '哈哈', 19, '男'); INSERT INTO `student` VALUES (2, '哈哈', 19, '女'); INSERT INTO `student` VALUES (3, '哈哈', 56, '女'); INSERT INTO `student` VALUES (4, '哈哈哈哈', 63, '男');
使用sql找出需要保留的數據
我們保留 name 和 age 重復的數據(id 值最小的)
SELECT min(id),name,age FROM `student` GROUP BY `name`,age
刪除重復的數據
DELETE FROM student WHERE id NOT IN (SELECT min_id FROM (SELECT min(id) as min_id FROM `student` GROUP BY `name`,age) as a)
注:
如果使用
DELETE FROM student WHERE id NOT IN (SELECT min(id) as min_id FROM `student` GROUP BY `name`,age)
在語法上看是沒問題的,但是在 MySQL中會出先 1093 - You can't specify target table 'student' for update in FROM clause 錯誤,但是在 mssql與oracle都沒有這個問題。