關(guān)于MySQL表中沒(méi)有主鍵時(shí)如何找到重復(fù)的數(shù)據(jù)
問(wèn)題描述
有一次遇到這樣一個(gè)面試題,說(shuō)如果一個(gè)表中沒(méi)有主鍵,如何找到里面重復(fù)的數(shù)據(jù)?
表數(shù)據(jù)如下:
表結(jié)構(gòu)如下:
針對(duì)以上問(wèn)題,有以下幾種解決方案
解決方案
1. 使用 GROUP BY 分組查詢法
利用 GROUP BY 分組查詢語(yǔ)句來(lái)分組聚合,然后篩選出出現(xiàn)次數(shù)大于1的重復(fù)記錄。例如:
SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1;
該語(yǔ)句將按照 column1、column2、column3 分組,統(tǒng)計(jì)每個(gè)分組的數(shù)量,然后取出數(shù)量大于 1 的分組。該方法比較簡(jiǎn)單,但是如果表中記錄較多,可能查詢效率較低。
2. 使用子查詢法
使用子查詢獲得重復(fù)的記錄,例如:
SELECT * FROM table_name WHERE (column1, column2, column3) IN (SELECT column1, column2, column3 FROM table_name GROUP BY column1, column2, column3 HAVING COUNT(*) > 1)
該語(yǔ)句子查詢部分統(tǒng)計(jì)每個(gè)不同的 column1、column2、column3 分組,然后再用 IN 子句將重復(fù)記錄選出來(lái)。
3. 使用連接查詢法
使用連接查詢,將表和本身連接起來(lái),并比較來(lái)判斷重復(fù)。例如:
SELECT a.* FROM table_name a INNER JOIN (SELECT column1, column2, column3 FROM table_name GROUP BY column1, column2, column3 HAVING COUNT(*) > 1) b ON a.column1 = b.column1 AND a.column2 = b.column2 AND a.column3 = b.column3
該語(yǔ)句以列 column1、column2、column3 分組,找出出現(xiàn)兩次以上的重復(fù)記錄,并與原表進(jìn)行連接查詢。
4. 使用去重后比較條數(shù)法
將表中所有列的值連接成一個(gè)字符串,再將這個(gè)字符串進(jìn)行快速 MD5 哈希,用 count() 函數(shù)來(lái)計(jì)算每個(gè)哈希值出現(xiàn)的次數(shù),如果某個(gè)哈希值出現(xiàn)次數(shù)大于 1,那么這些記錄就是重復(fù)的。例如:
SELECT COUNT(*), MD5(CONCAT_WS('|', column_1, column_2, column_3, column_4, ..., column_n)) FROM table_name GROUP BY MD5(CONCAT_WS('|', column_1, column_2, column_3, column_4, ..., column_n)) HAVING COUNT(*) > 1
5. 使用子查詢法計(jì)算重復(fù)次數(shù)
使用子查詢先計(jì)算出每個(gè)記錄重復(fù)的次數(shù),然后取出重復(fù)次數(shù)大于 1 的記錄。例如:
SELECT a.* FROM table_name a, (SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1) b WHERE a.column1 = b.column1 AND a.column2 = b.column2 AND a.column3 = b.column3
該語(yǔ)句計(jì)算出每個(gè) column1、column2、column3 分組中出現(xiàn)的次數(shù),然后篩選出出現(xiàn)次數(shù)大于 1 的記錄。
6. 對(duì)多列使用 DISTINCT 子句法
使用 DISTINCT 子句來(lái)去除重復(fù)的數(shù)據(jù),例如:
SELECT DISTINCT column1, column2, column3 FROM table_name
該語(yǔ)句將按照 column1、column2、column3 去重,只取出不同的記錄。如果存在重復(fù)數(shù)據(jù),那么就會(huì)取出重復(fù)數(shù)據(jù)。
7. 查找輸入數(shù)據(jù)相同的記錄法
這種方法就是找到輸入的記錄與某些記錄是相同的,這些記錄就是重復(fù)記錄。例如:
SELECT * FROM table_name WHERE column1='value1' AND column2='value2' AND column3='value3'
該語(yǔ)句將根據(jù)表中每個(gè)過(guò)濾條件來(lái)查找重復(fù)記錄。
8. 根據(jù)下標(biāo)去重
該方法是通過(guò)打印出所有的鍵值,找出重復(fù)的鍵并去重。例如:
SELECT DISTINCT SUBSTRING_INDEX(column_string,',',1) AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(column_string,',',2),',',-1) AS column2, SUBSTRING_INDEX(column_string,',',-1) AS column3 FROM (SELECT CONCAT(column1,',',column2,',',column3) AS column_string FROM table_name) AS table_alias
該語(yǔ)句將 SELECT CONCAT(column1,',',column2,',',column3) AS column_string FROM table_name 產(chǎn)生的結(jié)果進(jìn)行處理,將 column1、column2、column3 分開(kāi),然后再按照去重不同列的方法進(jìn)行處理。
9. 手動(dòng)輸入表的列名法
該方法是通過(guò)手動(dòng)輸入要查詢的列名,然后進(jìn)行查找。例如:
SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1;
10. 使用 ROW_NUMBER() OVER() 分配行號(hào)
該方法基于 ROW_NUMBER() OVER() 分配行號(hào)來(lái)找到重復(fù)的記錄。例如:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY column1, column2, column3 ORDER BY column1, column2, column3) AS rn FROM table_name ) t WHERE t.rn > 1
該語(yǔ)句將按照 column1、column2、column3 分組,為每組結(jié)果分配一個(gè)行號(hào)并選出行號(hào)大于 1 的結(jié)果。這種方法適用于較新的 MySQL 版本和較大的表。
到此這篇關(guān)于關(guān)于MySQL表中沒(méi)有主鍵時(shí)如何找到重復(fù)的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)MySQL重復(fù)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊QT添加MySQL驅(qū)動(dòng)依賴的問(wèn)題
這篇文章主要介紹了QT添加MySQL驅(qū)動(dòng)依賴的問(wèn)題,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02在EF中使用MySQL的方法及常見(jiàn)問(wèn)題
這篇文章主要介紹了在EF中使用MySQL的方法及常見(jiàn)問(wèn)題 的相關(guān)資料,需要的朋友可以參考下2016-06-06MySQL為什么要避免大事務(wù)以及大事務(wù)解決的方法
這篇文章主要介紹了MySQL為什么要避免大事務(wù)以及大事務(wù)解決的方法,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下2020-08-08Mysql中Insert into xxx on duplicate key update問(wèn)題
在看代碼的過(guò)程中碰到了這一用法,不太理解,google了一下。它的意義其實(shí)是如果在insert語(yǔ)句末尾制定了on duplicate key update語(yǔ)句的話,則當(dāng)插入行會(huì)導(dǎo)致一個(gè)unique索引或者primary key中出現(xiàn)重復(fù)值,則執(zhí)行update中的語(yǔ)句,否則才插入新行2012-08-08如何設(shè)計(jì)高效合理的MySQL查詢語(yǔ)句
合理的MySQL查詢語(yǔ)句可以讓我們的MySQL數(shù)據(jù)庫(kù)效率更高,那么如何設(shè)計(jì)高效合理的查詢語(yǔ)句就成為了擺在我們面前的問(wèn)題。2015-08-08MySQL表LEFT JOIN左連接與RIGHT JOIN右連接的實(shí)例教程
這篇文章主要介紹了MySQL表LEFT JOIN左連接與RIGHT JOIN右連接的實(shí)例教程,表連接操作是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-12-12如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫(kù)密碼
這篇文章主要介紹了如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫(kù)密碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-068種手動(dòng)和自動(dòng)備份MySQL數(shù)據(jù)庫(kù)的方法
作為流行的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng),MySQL的使用者眾多,為了維護(hù)數(shù)據(jù)安全性,數(shù)據(jù)備份是必不可少的。本文就為大家介紹幾種適用于企業(yè)的數(shù)據(jù)備份方法,需要的朋友可以參考下2018-10-10