如何在 SQL 中查找和刪除重複項

如何在 SQL 中查找和刪除重複項

數據庫設計最佳實踐建議使用 UNIQUE 約束來防止數據庫中出現重複項。但是,當處理設計不佳的數據庫或不干淨的數據時,您可能需要自己查找重複項並手動刪除它們。

繼續閱讀以了解如何在 SQL 數據庫中查找重複項以及如何刪除它們。

創建示例數據庫

出於演示目的,通過運行此 SQL 查詢創建一個名為 Users 的表,其中包含名稱和分數列。

DROP TABLE IF EXISTS Users;

CREATE TABLE Users (
    pk_id int PRIMARY KEY,
    name VARCHAR (16),
    score INT,
);

通過運行此查詢插入一些示例值:

INSERT INTO
    Users(pk_id, name, score)
VALUES
    (1, 'Jane', 20),
    (2, 'John', 13),
    (3, 'Alex', 32),
    (4, 'John', 46),
    (5, 'Jane', 20),
    (6, 'Mary', 34),
    (7, 'Jane', 20),
    (8, 'John', 13)

請注意,其中一些行包含名稱列的重複值。

如果您需要更深入地解釋如何使用 SQL 操作數據庫,請隨時查看這些 SQL 命令和查詢。

使用 GROUP BY 查找重複值

您可以使用 GROUP BY 語句將滿足某些條件的值排列在同一組中。

假設示例表中的名稱必須是唯一的。您可以使用 GROUP BY 對共享相同名稱的行進行分組。

SELECT name, COUNT(name)
FROM Users
GROUP BY name
HAVING COUNT(name) > 1

COUNT 允許您選擇具有多個同名用戶的行。

當您運行此查詢時,數據庫將返回包含 John 和 Jane 的重複行。

從數據庫中刪除重複項

找到重複項後,您可能希望使用 DELETE 語句刪除它們。

對於此示例,運行以下查詢:

WITH cte AS (
    SELECT *
        ROW_NUMBER() OVER (
            PARTITION BY
                name, score
            ORDER BY
                name, score
        ) R
     FROM
        Users
)

DELETE FROM cte
WHERE R > 1;

此查詢使用 CTE 表達式查找重複項,然後刪除除一個之外的所有重複項。

為什麼要刪除重複數據

刪除重複數據不是必須的。但是,它可以讓您釋放重複行使用的空間。

更少的行也意味著查詢可以更快地執行,從而提高性能。使用本教程中的查詢可幫助您從 SQL 數據庫中查找和刪除重複項。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *