Xóa hàng trùng lặp MySQL

Giải pháp để xóa các hàng trùng lặp khỏi tập kết quả của bạn là đưa từ khóa riêng biệt vào câu lệnh chọn của bạn. Nó yêu cầu công cụ truy vấn loại bỏ các bản sao để tạo ra một tập kết quả trong đó mỗi hàng là duy nhất. Bạn có biết rằng nhóm theo mệnh đề cũng có thể được sử dụng để loại bỏ các bản sao không?

Các từ khóa khác biệt và khác biệt

Từ khóa riêng biệt xuất hiện trực tiếp sau CHỌN trong câu lệnh truy vấn và thay thế từ khóa tất cả tùy chọn, là từ khóa mặc định. Distinctrow là bí danh cho khác biệt và tạo ra kết quả chính xác như nhau

    SELECT [ALL | DISTINCT | DISTINCTROW ]
    select_expr
    [FROM table_references
    [WHERE where_condition]

Để minh họa cách thức hoạt động của nó, hãy chọn một số dữ liệu từ bảng sau, trong đó có danh sách các loại trái cây và màu sắc của chúng

Tên

màu

táo

màu đỏ

táo

màu xanh lá

táo

màu vàng

chuối

màu vàng

chuối

màu xanh lá

giống nho

màu đỏ

giống nho

trắng

Truy vấn sau sẽ lấy tất cả các tên trái cây từ bảng và liệt kê chúng theo thứ tự bảng chữ cái

SELECT name
FROM fruits;

Không có thông tin về màu sắc, chúng tôi có bội số của từng loại trái cây

Tên

táo

táo

táo

chuối

chuối

giống nho

giống nho

Bây giờ, hãy thử truy vấn lại với từ khóa riêng biệt

SELECT DISTINCT name
FROM fruits;

Đúng như dự đoán, giờ đây chúng ta chỉ có một ví dụ về mỗi loại trái cây

Tên

táo

chuối

giống nho

Giá như nó luôn dễ dàng như vậy. Một tìm kiếm nhanh trên Internet về cụm từ “sqlloại bỏ các giá trị trùng lặp” cho thấy rằng có nhiều cách để loại bỏ các giá trị trùng lặp hơn là chèn từ khóa riêng biệt vào các câu lệnh CHỌN của bạn

Khi nào các hàng trùng lặp không phải là các hàng trùng lặp

Một vấn đề mà từ khóa riêng biệt không giải quyết được là đôi khi việc loại bỏ các từ trùng lặp tạo ra kết quả sai lệch. Quan sát tình huống sau

Khách hàng muốn tạo danh sách nhân viên của họ để tạo một số thống kê. Đây là một số SQL để làm điều đó

SELECT name,
       gender,       
       salary
FROM employees
ORDER BY name;

Thật kỳ lạ, điều này tạo ra các hàng trùng lặp cho “Kristen Ruegg”

Tên

giới tính

lương

Allan Smithie

m

4900

Barbara Breitenmoser

f

(VÔ GIÁ TRỊ)

Jon Simpson

m

4500

Kirsten Ruegg

f

5600

Kristen Ruegg

f

5600

Peter Jonson

m

5200

Ralph Teller

m

5100

Khách hàng trả lời rằng họ không muốn trùng lặp, vì vậy nhà phát triển thêm từ khóa riêng biệt đáng tin cậy vào câu lệnh CHỌN. Điều này tạo ra kết quả mong muốn, ngoại trừ một chi tiết nhỏ. Có hai nhân viên trùng tên. Việc thêm từ khóa riêng biệt đã tạo ra kết quả không chính xác bằng cách xóa một hàng hợp lệ. Bao gồm số emp_id_number duy nhất vào danh sách trường xác nhận rằng thực sự có hai Kristen Rueggs

SELECT name,
       gender,       
       salary,
       emp_id_number
FROM employees
ORDER BY name;

Đây là dữ liệu được đề cập hiển thị emp_id_numbers duy nhất

Tên

giới tính

lương

emp_id_number

Kirsten Ruegg

f

5600

3462

Kristen Ruegg

f

5600

2223

Đạo đức của câu chuyện là thế này. Khi sử dụng từ khóa riêng biệt, hãy đảm bảo rằng bạn không vô tình xóa dữ liệu hợp lệ

So sánh khác biệt với nhóm theo

Sử dụng khác biệt về mặt logic tương đương với sử dụng nhóm theo trên tất cả các cột được chọn không có chức năng tổng hợp. Đối với truy vấn như vậy, hãy nhóm theo chỉ tạo danh sách các giá trị nhóm riêng biệt. Khi hiển thị và nhóm theo một cột, truy vấn sẽ tạo ra các giá trị riêng biệt trong cột đó. Tuy nhiên, nếu bạn hiển thị và nhóm theo nhiều cột, truy vấn sẽ tạo ra các kết hợp giá trị riêng biệt trong mỗi cột. Ví dụ: truy vấn sau đây tạo ra tập hợp các hàng giống như truy vấn SELECT riêng biệt đầu tiên của chúng tôi đã làm

SELECT name 
FROM fruits 
GROUP BY name;

Tương tự, câu lệnh sau đây tạo ra kết quả giống như câu lệnh SELECT riêng biệt của chúng tôi đã làm trên bảng nhân viên

SELECT name,
       gender,       
       salary 
FROM employees
GROUP BY name;

Một sự khác biệt giữa khác biệt và nhóm theo là nhóm theo nguyên nhân sắp xếp hàng. Vì thế

SELECT name,
       gender,       
       salary 
FROM employees
GROUP BY name;

…cũng giống như

________số 8_______

Đếm trùng lặp

Distinct có thể được sử dụng với hàm COUNT() để đếm xem một cột chứa bao nhiêu giá trị riêng biệt. COUNT(biểu thức riêng biệt) đếm số giá trị khác NULL (duy nhất) của biểu thức đã cho. Biểu thức có thể là tên cột để đếm số lượng giá trị khác NULL riêng biệt trong cột

Đây là dữ liệu bảng nhân viên đầy đủ

Tôi

dept_id

giới tính

Tên

lương

emp_id_number

1

2

m

Jon Simpson

4500

1234

2

4

f

Barbara Breitenmoser

(VÔ GIÁ TRỊ)

9999

3

3

f

Kirsten Ruegg

5600

3462

4

1

m

Ralph Teller

5100

6543

5

2

m

Peter Jonson

5200

9747

6

2

m

Allan Smithie

4900

6853

7

4

f

Kirsten Ruegg

5600

2223

8

3

f

Kirsten Ruegg

4400

2765

Áp dụng chức năng Đếm riêng biệt trên trường tên sẽ tạo ra sáu tên duy nhất

SELECT Count(DISTINCT name)
FROM employees;

Đếm (tên DISTINCT)

6

Cũng có thể đưa ra một danh sách các biểu thức được phân tách bằng dấu phẩy. Trong trường hợp này, COUNT() trả về số lượng kết hợp giá trị riêng biệt không chứa giá trị NULL. Truy vấn sau đây đếm số hàng riêng biệt mà cả tên và lương đều không phải là NULL

SELECT name
FROM fruits;
0

Đếm(DISTINCT tên, lương)

6

Bạn cũng có thể nhóm số lượng trùng lặp cho mỗi nhóm bằng cách sử dụng một chút toán học kết hợp với mệnh đề nhóm theo. Đây là một truy vấn để đếm các tên trùng lặp cho từng bộ phận

SELECT name
FROM fruits;
1

dept_id

tên trùng lặp

1

0

2

0

3

1

4

0

Các truy vấn này giúp bạn mô tả mức độ trùng lặp nhưng không cho bạn biết giá trị nào bị trùng lặp. Để xem tên nào trùng lặp trong bảng nhân viên, hãy sử dụng truy vấn tóm tắt hiển thị các giá trị không phải là duy nhất cùng với số lượng

SELECT name
FROM fruits;
2

dept_id

Tên

tên_đếm

2

Allan Smithie

1

4

Barbara Breitenmoser

1

2

Jon Simpson

1

3

Kirsten Ruegg

2

4

Kirsten Ruegg

1

2

Peter Jonson

1

1

Ralph Teller

1

Vì chúng tôi chỉ quan tâm đến các bản sao, nên chúng tôi có thể lọc ra mọi thứ khác bằng cách sử dụng mệnh đề HAVING. Nó giống như mệnh đề WHERE, ngoại trừ việc nó được sử dụng với nhóm theo để thu hẹp kết quả

SELECT name
FROM fruits;
3

Bây giờ chúng ta có thể xem tên nào bị trùng lặp, cũng như có bao nhiêu tên

dept_id

Tên

tên_đếm

3

Kirsten Ruegg

2

Hiển thị các giá trị tối thiểu hoặc tối đa của mỗi nhóm trong các hàng trùng lặp

Như chúng ta đã thấy trong ví dụ trước, mệnh đề group by khiến các hàm tổng hợp được áp dụng cho từng giá trị duy nhất trong danh sách trường. Bạn nên lưu ý rằng các cột không có trong danh sách nhóm theo trường không nhất thiết phải thuộc cùng một hàng với các giá trị được tổng hợp. Một ví dụ chắc chắn là theo thứ tự ở đây. Truy vấn sau hiển thị mức lương cao nhất cho mỗi bộ phận

SELECT name
FROM fruits;
4

Mục đích là để hiển thị thông tin về cá nhân kiếm được mức lương cao nhất. Tuy nhiên, đó không phải là những gì được trả lại ở đây

dept_id

Tên

giới tính

max_salary

1

Ralph Teller

m

5100

2

Jon Simpson

m

5200

3

Kirsten Ruegg

f

5600

4

Barbara Breitenmoser

f

5600

Vấn đề là tiền lương là trường tổng hợp duy nhất vì hàm tổng hợp Max() được áp dụng cho nó. Do đó, các giá trị tên và giới tính gặp phải đối với từng nhóm theo trường là những gì được hiển thị. Nhìn vào bảng, bạn sẽ thấy, trong khi Ralph Teller là thành viên duy nhất của bộ phận 1 thì Jon Simpson chỉ kiếm được 4500 USD. Peter Jonson thực sự là chủ sở hữu của sự khác biệt đó, nhưng công cụ truy vấn đã chọn tên và giới tính mà nó bắt gặp có dept_id là 2

Giải pháp là nối các kết quả GROUP_BY với bảng gốc bằng cách sử dụng các trường được nhóm. Trong trường hợp này, chúng tôi chỉ có một trường và đó là mức lương

SELECT name
FROM fruits;
5

Bây giờ các trường tên và giới tính thuộc về người kiếm được mức lương cao nhất

dept_id

Tên

giới tính

max_salary

1

Ralph Teller

m

5100

2

Peter Jonson

m

5200

3

Kirsten Ruegg

f

5600

4

Kirsten Ruegg

f

5600

Có những kỹ thuật khác không được đề cập, chẳng hạn như việc sử dụng các bảng tạm thời và SQL động. Dưới đây là thông tin chuyên sâu hơn về cách xóa các bản ghi trùng lặp. Bài viết này thảo luận chi tiết hơn về mệnh đề nhóm by và HAVING

Làm cách nào để xóa các hàng trùng lặp trong MySQL?

Cách xóa các hàng trùng lặp trong MySQL .
lựa chọn 1. Xóa các hàng trùng lặp bằng INNER JOIN
Lựa chọn 2. Xóa các hàng trùng lặp bằng bảng trung gian
Tùy chọn 3. Xóa các hàng trùng lặp bằng ROW_NUMBER()

Làm cách nào để xóa các hàng trùng lặp?

Xóa các giá trị trùng lặp .
Chọn phạm vi ô có giá trị trùng lặp mà bạn muốn xóa. Mẹo. Xóa mọi đường viền hoặc tổng phụ khỏi dữ liệu của bạn trước khi thử xóa các mục trùng lặp
Bấm vào Dữ liệu > Loại bỏ các mục trùng lặp, rồi bên dưới Cột, chọn hoặc bỏ chọn các cột mà bạn muốn loại bỏ các mục trùng lặp. .
Nhấp vào OK