
文章插圖
初始化實(shí)驗(yàn)環(huán)境明確需求查找重復(fù)的數(shù)據(jù)查找要保留的數(shù)據(jù)刪除重復(fù)的數(shù)據(jù)方法一方法二方法三寫法1寫法2總結(jié)
MySQL中經(jīng)常會遇到重復(fù)的數(shù)據(jù),那么當(dāng)我們遇到重復(fù)的時(shí)候的時(shí)候,如果定位哪些數(shù)據(jù)是有重復(fù)的記錄?如何刪除重復(fù)的數(shù)據(jù)?我們該怎么做呢?接下來我們一步步來分析一下遇到這樣的情況后,該如何處理 。
咋辦呢?
初始化實(shí)驗(yàn)環(huán)境我們創(chuàng)建一個(gè)簡單的表user_info,然后基于這個(gè)表進(jìn)行分析重復(fù)數(shù)據(jù)的處理情況 。其中的id為自增主鍵,name、sex、age三個(gè)列是我們判斷是否為重復(fù)數(shù)據(jù)的key,如果這三列的值相同,則認(rèn)為這行數(shù)據(jù)為重復(fù)數(shù)據(jù) 。建表語句如下:
CREATE TABLE `user_info` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`sex` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,`remark` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;初始化數(shù)據(jù)如下:
INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (1, 'A', '男', 22, '第一個(gè)A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (2, 'B', '女', 33, '第一個(gè)B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (3, 'C', '男', 44, '第一個(gè)C');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (4, 'D', '女', 55, '第一個(gè)D');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (5, 'A', '男', 22, '第二個(gè)A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (6, 'B', '女', 33, '第二個(gè)B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (7, 'C', '男', 44, '第二個(gè)C');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (8, 'D', '女', 55, '第二個(gè)D');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (9, 'E', '男', 18, '第一個(gè)E');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (10, 'A', '男', 22, '第三個(gè)A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (11, 'B', '女', 33, '第三個(gè)B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (12, 'F', '男', 15, '第一個(gè)F');最后表中數(shù)據(jù)如下:
初始化的測試數(shù)據(jù)
明確需求假設(shè)我們的要求是保留重復(fù)數(shù)據(jù)中,第一次出現(xiàn)的數(shù)據(jù),后面出現(xiàn)的數(shù)據(jù)不保留 。
也就是我們的上面的這個(gè)表中每一組重復(fù)數(shù)據(jù)中id最小的一行數(shù)據(jù)需要保留,其他比較大的id的重復(fù)的數(shù)據(jù)行需要被刪除 。當(dāng)然如果是要保留id行最大的一行數(shù)據(jù)最為最后的數(shù)據(jù)行也是可以了,只要在查詢的時(shí)候,稍微修改一下SQL語句的min(id)或max(id)函數(shù)即可 。
開整
查找重復(fù)的數(shù)據(jù)基于前面我們初始化的實(shí)驗(yàn)數(shù)據(jù),首先我們要查詢出那些數(shù)據(jù)是有重復(fù)數(shù)據(jù)的行,通過下面的SQL語句,可以得到結(jié)果:其中有重復(fù)數(shù)據(jù)的是name值為A、B、C、D的四種類型的數(shù)據(jù) 。使用如下SQL可以查詢出來那些數(shù)據(jù)行有重復(fù)記錄,并統(tǒng)計(jì)出重新出現(xiàn)的次數(shù) 。
select name, sex, age,count(*) as count -- 數(shù)據(jù)重復(fù)出現(xiàn)的次數(shù)from user_info group by name, sex, age having count(*) > 1;重復(fù)數(shù)據(jù)在表中的統(tǒng)計(jì)結(jié)果如下:
數(shù)據(jù)重復(fù)的統(tǒng)計(jì)情況
查找要保留的數(shù)據(jù)上面我們知道該如何查詢哪些數(shù)據(jù)是重復(fù)數(shù)據(jù)了,那么我們需要保留的數(shù)據(jù)是哪些?使用下面的SQL既可以獲取到我們要保留的數(shù)據(jù)行:
select * from user_info where id in (select min(id) from user_info group by name, sex, age);結(jié)果如下:
每組重復(fù)數(shù)據(jù)中,id值最小的數(shù)據(jù)行
上面的結(jié)果就是我們需要最后留下來的數(shù)據(jù) 。這里包含了非重復(fù)的時(shí)候和每一組重復(fù)的數(shù)據(jù)中id最小的數(shù)據(jù)行 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時(shí)就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 數(shù)據(jù)同步工具操作方法 同步數(shù)據(jù)在哪里找
- 數(shù)據(jù)庫遷移的兩種方法 oracle數(shù)據(jù)庫遷移方案對比
- java連接數(shù)據(jù)庫步驟 java連接mysql數(shù)據(jù)庫代碼
- 兩種調(diào)用Excel函數(shù)的操作方法 vb調(diào)用excel數(shù)據(jù)百度搜索
- 網(wǎng)絡(luò)測速檢查軟件 怎么測試數(shù)據(jù)流量的網(wǎng)速
- 誤刪excel文件數(shù)據(jù)恢復(fù)方法 wps表格數(shù)據(jù)恢復(fù)方法
- 不收費(fèi)的數(shù)據(jù)恢復(fù)軟件推薦 免費(fèi)手機(jī)數(shù)據(jù)恢復(fù)軟件APP
- 兩個(gè)excel表快速核對 常用的excel數(shù)據(jù)比對工具
- redis保證和數(shù)據(jù)庫事務(wù)一致 redis和mysql數(shù)據(jù)同步原理
- 網(wǎng)頁連接mysql數(shù)據(jù)庫 jsp連接mysql設(shè)置
