日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

問題描述

有一次遇到這樣一個面試題,說如果一個表中沒有主鍵,如何找到里面重復的數據?

表數據如下:

 

表結構如下:

 

針對以上問題,有以下幾種解決方案

解決方案

1. 使用 GROUP BY 分組查詢法

利用 GROUP BY 分組查詢語句來分組聚合,然后篩選出出現次數大于1的重復記錄。例如:

sql復制代碼SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1;

該語句將按照 column1、column2、column3 分組,統計每個分組的數量,然后取出數量大于 1 的分組。該方法比較簡單,但是如果表中記錄較多,可能查詢效率較低。

2. 使用子查詢法

使用子查詢獲得重復的記錄,例如:

sql復制代碼SELECT * FROM table_name WHERE (column1, column2, column3) IN (SELECT column1, column2, column3 FROM table_name GROUP BY column1, column2, column3 HAVING COUNT(*) > 1)

該語句子查詢部分統計每個不同的 column1、column2、column3 分組,然后再用 IN 子句將重復記錄選出來。

3. 使用連接查詢法

使用連接查詢,將表和本身連接起來,并比較來判斷重復。例如:

css復制代碼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

該語句以列 column1、column2、column3 分組,找出出現兩次以上的重復記錄,并與原表進行連接查詢。

4. 使用去重后比較條數法

將表中所有列的值連接成一個字符串,再將這個字符串進行快速 MD5 哈希,用 count() 函數來計算每個哈希值出現的次數,如果某個哈希值出現次數大于 1,那么這些記錄就是重復的。例如:

scss復制代碼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. 使用子查詢法計算重復次數

使用子查詢先計算出每個記錄重復的次數,然后取出重復次數大于 1 的記錄。例如:

css復制代碼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

該語句計算出每個 column1、column2、column3 分組中出現的次數,然后篩選出出現次數大于 1 的記錄。

6. 對多列使用 DISTINCT 子句法

使用 DISTINCT 子句來去除重復的數據,例如:

sql復制代碼SELECT DISTINCT column1, column2, column3 FROM table_name

該語句將按照 column1、column2、column3 去重,只取出不同的記錄。如果存在重復數據,那么就會取出重復數據。

7. 查找輸入數據相同的記錄法

這種方法就是找到輸入的記錄與某些記錄是相同的,這些記錄就是重復記錄。例如:

sql復制代碼SELECT * FROM table_name WHERE column1='value1' AND column2='value2' AND column3='value3'

該語句將根據表中每個過濾條件來查找重復記錄。

8. 根據下標去重

該方法是通過打印出所有的鍵值,找出重復的鍵并去重。例如:

sql復制代碼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

該語句將 SELECT CONCAT(column1,',',column2,',',column3) AS column_string FROM table_name 產生的結果進行處理,將 column1、column2、column3 分開,然后再按照去重不同列的方法進行處理。

9. 手動輸入表的列名法

該方法是通過手動輸入要查詢的列名,然后進行查找。例如:

sql復制代碼SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1;

10. 使用 ROW_NUMBER() OVER() 分配行號

該方法基于 ROW_NUMBER() OVER() 分配行號來找到重復的記錄。例如:

sql復制代碼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

該語句將按照 column1、column2、column3 分組,為每組結果分配一個行號并選出行號大于 1 的結果。這種方法適用于較新的 MySQL 版本和較大的表。

分享到:
標簽:MYSQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定