? ? ? ? ? ? ? ? 梳理一下關(guān)于刪除重復(fù)記錄的邏輯
目錄
前期準(zhǔn)備:建表插入數(shù)據(jù)
1、通過(guò)group by?和count(1)>1找出有重復(fù)的數(shù)據(jù)
?2、通過(guò)每個(gè)分組中的最小id來(lái)去重
????????2.1、添加主鍵id列
????????2.2?去重
????????????????2.2.1、首先找出每個(gè)分組中count(1) >1的數(shù)據(jù)中的最小id【min(id)】,sql語(yǔ)句如下:
?????????????????2.2.2、再將上表和emp表做表連接,sql語(yǔ)句如下:
前期準(zhǔn)備:建表插入數(shù)據(jù)
-- 創(chuàng)建表格emp
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`EMPNO` int(0) NULL DEFAULT NULL,
`ENAME` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`JOB` varchar(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`MGR` int(0) NULL DEFAULT NULL,
`HIREDATE` date NULL DEFAULT NULL,
`SAL` int(0) NULL DEFAULT NULL,
`COMM` int(0) NULL DEFAULT NULL,
`DEPTNO` int(0) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- 插入數(shù)據(jù)
INSERT INTO `emp` VALUES (7566, '瓊斯1', '經(jīng)理', 7839, '1981-04-02', 2975, NULL, 20);
INSERT INTO `emp` VALUES (7654, '馬丁', '售貨員', 7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO `emp` VALUES (7782, '克拉克', '經(jīng)理', 7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO `emp` VALUES (7788, '斯科特', '分析師', 7566, '1987-04-19', 3000, NULL, 20);
INSERT INTO `emp` VALUES (7839, '國(guó)王', '總統(tǒng)', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO `emp` VALUES (7844, '特納', '售貨員', 7698, '1981-09-08', 1500, 0, 30);
INSERT INTO `emp` VALUES (7876, '亞當(dāng)斯', '店員', 7788, '1987-05-23', 1100, NULL, 20);
INSERT INTO `emp` VALUES (7900, '詹姆斯', '店員', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO `emp` VALUES (7902, '福特', '分析師', 7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO `emp` VALUES (7521, '沃德', '售貨員', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO `emp` VALUES (7934, '米勒', '店員', 7782, '1982-01-23', 1300, NULL, 10);
INSERT INTO `emp` VALUES (7499, '艾倫', '售貨員', 7698, '1981-02-20', 1600, 300, 30);
INSERT INTO `emp` VALUES (7698, '布萊克', '經(jīng)理', 7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO `emp` VALUES (7566, '瓊斯', '經(jīng)理', 7839, '1981-04-02', 2975, NULL, 20);
SET FOREIGN_KEY_CHECKS = 1;
表格來(lái)自oracle自帶emp表。
1、通過(guò)group by?和count(1)>1找出有重復(fù)的數(shù)據(jù)
SELECT ename,count(1) FROM emp GROUP BY ename HAVING count(1) >1;
在group by?之后?count(1)> 1代表其分組數(shù)據(jù)是重復(fù)的。
?具體group by?字段根據(jù)實(shí)際情況需求添加。
結(jié)果如下:
?2、通過(guò)每個(gè)分組中的最小id來(lái)去重
????????2.1、添加主鍵id列
由于表格沒(méi)有主鍵列,所以需要新增id自增。
ALTER TABLE emp add id int first; -- 改變表結(jié)構(gòu),增加名為id的列
ALTER table emp MODIFY id int PRIMARY key auto_increment; -- 將id字段設(shè)置為主鍵自增;
????????2.2?去重
??????????2.2.1、首先找出每個(gè)分組中count(1) >1的數(shù)據(jù)中的最小id【min(id)】,sql語(yǔ)句如下:
SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1;
結(jié)果如下:
??????????2.2.2、再將上表和emp表做表連接,sql語(yǔ)句如下:
SELECT t1.*,t2.* from
emp t1
inner join (SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1) t2
on t1.ENAME = t2.ENAME;
結(jié)果如下:
?????????可以看出t1.id和t2.id之間的聯(lián)系,我們只需要?jiǎng)h除t1.id >?t2.id的數(shù)據(jù),只留下每組中id最小的值和count(1)= 1?的數(shù)據(jù)。
????????需要用到MySQL DELETE語(yǔ)句使用INNER JOIN子句,語(yǔ)法如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-482815.html
DELETE a FROM table1 AS a LEFT JOIN table2 AS b ON 連接條件 WHERE 過(guò)濾條件;
????????完整去重sql語(yǔ)句如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-482815.html
DELETE t1 from
emp t1
inner join (SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1) t2
on t1.ENAME = t2.ENAME
where t1.id > t2.id;
到了這里,關(guān)于mysql中去除重復(fù)數(shù)據(jù),只保留一條。的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!