How To Find Duplicate Values in MySQL

  MySQL    —  2019, May 30    

Bài viết này sẽ hướng dẫn bạn cách tìm các dữ liệu trùng lặp trong 1 hoặc nhiều cột.

Mở đầu

Trùng lặp dữ liệu xảy ra rất nhiều trong database với nhiều lý do khác nhau. Việc tìm ra dữ liệu trùng lặp là 1 nhiệm vụ quan trọng mà bạn phải đối mặt khi làm việc với database.

Để mô tả điều này, chúng ta sẽ tạo ra 1 bảng contacts với 4 cột: id, first_name, last_name, và email.

CREATE TABLE contacts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(255) NOT NULL
);

Và thêm vào 1 số bản ghi:

INSERT INTO contacts (first_name,last_name,email) 
VALUES ('Carine ','Schmitt','[email protected]'),
       ('Jean','King','[email protected]'),
       ('Peter','Ferguson','[email protected]'),
       ('Janine ','Labrune','[email protected]'),
       ('Jonas ','Bergulfsen','[email protected]'),
       ('Janine ','Labrune','[email protected]'),
       ('Susan','Nelson','[email protected]'),
       ('Zbyszek ','Piestrzeniewicz','[email protected]'),
       ('Roland','Keitel','[email protected]'),
       ('Julie','Murphy','[email protected]'),
       ('Kwai','Lee','[email protected]'),
       ('Jean','King','[email protected]'),
       ('Susan','Nelson','[email protected]'),
       ('Roland','Keitel','[email protected]');
SELECT 
    *
FROM
    contacts;

MySQL find duplicate values - Sample Data

Trong bảng contacts có 1 vài bản ghi trùng nhau ở các cột first_name, last_name, email, và bây giờ nhiệm vụ là phải tìm ra các bản ghi trùng nhau đó.

Tìm dữ liệu trùng nhau trong 1 cột

Chúng ta sẽ sử dụng truy vấn sau để tìm các dữ liệu trùng nhau trong 1 cột:

SELECT 
    col, 
    COUNT(col)
FROM
    table_name
GROUP BY col
HAVING COUNT(col) > 1;

Dữ liệu được coi là trùng lặp khi nó xuất hiện nhiều hơn 1 lần trong bảng. Trong lệnh này, chúng ta sử dụng mệnh đề GROUP BY với hàm COUNT để đếm số dữ liệu ở cột đã chọn (col). Điều kiện trong mệnh đề HAVING gồm các rows với số đếm lớn hơn 1 - chính là dữ liệu trùng lặp.

Truy vấn sau giúp bạn tìm ra tất cả dữ liệu trùng lặp email:

SELECT 
    email, 
    COUNT(email)
FROM
    contacts
GROUP BY email
HAVING COUNT(email) > 1;

Kết quả truy vấn:

MySQL find duplicate values example

Bạn thấy đấy, một số rows đã trùng lặp email.

Tìm dữ liệu trùng lặp trong nhiều cột

Bạn có thể sử dụng qeury sau:

SELECT 
    col1, COUNT(col1),
    col2, COUNT(col2),
    ...
 
FROM
    table_name
GROUP BY 
    col1, 
    col2, ...
HAVING 
       (COUNT(col1) > 1) AND 
       (COUNT(col2) > 1) AND 
       ...

Các rows được cho là trùng lặp khi kết hợp các cột là trùng lặp, do đó chúng ta sử dụng toán tử AND trong mệnh đề HAVING.

Ví dụ, tìm các rows trùng lặp giá trị ở cột first_name, last_name, email chúng ta sử dụng truy vấn sau:

SELECT 
    first_name, COUNT(first_name),
    last_name,  COUNT(last_name),
    email,      COUNT(email)
FROM
    contacts
GROUP BY 
    first_name , 
    last_name , 
    email
HAVING  COUNT(first_name) > 1
    AND COUNT(last_name) > 1
    AND COUNT(email) > 1;

Kết quả:

MySQL find duplicate values on multiple columns