Loại bỏ các hàng trùng lặp khỏi tập kết quả MySQL. Tạp chí cơ sở dữ liệu

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

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

Distinctrow là một bí danh cho khác biệt và mang lại kết quả giống nhau, xuất hiện ngay sau CHỌN trong câu lệnh truy vấn, trong khi khác biệt thay thế từ khóa tất cả tùy chọn mặc định

_10

Hãy chọn một số thông tin từ bảng sau, bao gồm danh sách các loại trái cây và màu sắc của chúng, để minh họa cách thức hoạt động của nó

Tên

màu sắc

táo

màu đỏ

táo

màu xanh lá

táo

màu vàng

trái chuối

màu vàng

trái chuối

màu xanh lá

giống nho

màu đỏ

giống nho

trắng

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

________Đầu tiên

Chúng tôi có bội số của từng loại trái cây ngay cả khi không có thông tin về màu sắc

Tên

táo

táo

táo

trái chuối

trái chuối

giống nho

giống nho

Hãy thử tìm kiếm một lần nữa bằng cách sử dụng từ khóa riêng biệt

SELECT DISTINCT name
FROM fruits;

Đúng như dự đoán, mỗi loại trái cây giờ chỉ xuất hiện một lần

Tên

táo

trái chuối

giống nho

Giá như nó luôn luôn đơn giản. Một tìm kiếm nhanh trên Internet cho "sqlloại bỏ trùng lặp" cho thấy có nhiều bước liên quan đến việc này hơn là chỉ thêm các câu lệnh riêng biệt vào câu lệnh SELECT của bạn

Khi nào các hàng được lặp lại Không phải các hàng được lặp lại?

Một vấn đề mà từ khóa riêng biệt không giải quyết được là việc đôi khi loại bỏ các từ khóa trùng lặp dẫn đến kết quả không chính xác

Đây là một số SQL để thực hiện yêu cầu của khách hàng để tạo danh sách nhân viên của họ nhằm mục đích tạo một số thống kê

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

Thật kỳ lạ là điều này dẫn đến 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 Johnson

m

5200

Ralph Teller

m

5100

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 sau khi khách hàng trả lời rằng họ không muốn trùng lặp, điều này mang lại kết quả mong muốn, ngoại trừ một chi tiết nhỏ. Có hai nhân viên có cùng tên, vì vậy việc xóa một hàng hợp lệ sau khi thêm từ khóa riêng biệt sẽ tạo ra kết quả sai. Thực tế có hai Kristen Rueggs, như được hiển thị bằng cách thêm emp_id_number riêng biệt vào danh sách trường

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

Đây là dữ liệu có liên quan, hiển thị emp_id_numbers riêng biệ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à đảm bảo rằng bạn không vô tình xóa dữ liệu chính xác khi sử dụng từ khóa riêng biệt

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

Trên tất cả các cột được chọn không có hàm tổng hợp, khác biệt tương đương về mặt logic với nhóm theo, chỉ xuất ra danh sách các giá trị nhóm riêng biệt cho một truy vấn như vậy. Truy vấn tạo ra các giá trị riêng biệt trong một cột khi bạn hiển thị và nhóm theo cột đó, nhưng nó tạo ra các kết hợp giá trị riêng biệt trong từng cột khi bạn hiển thị và nhóm theo nhiều cột. Chẳng hạn, truy vấn theo sau cho ra cùng số lượng hàng như truy vấn SELECT riêng biệt đầu tiên của chúng tôi đã làm

_15

Kết quả của câu lệnh tiếp theo giống với kết quả của câu lệnh SELECT khác biệt trên bảng nhân viên

_16

Lý do nhóm theo khác với khác biệt là vì nó gây ra sắp xếp hàng

_16

…cũng giống như

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

Đếm trùng lặp

Hàm COUNT(biểu thức khác biệt) đếm số lượng giá trị khác NULL (duy nhất) của biểu thức đã cho và COUNT(biểu thức khác biệt) đếm số lượng giá trị khác biệt trong biểu thức đã cho. Để đếm số giá trị khác NULL riêng biệt trong cột, biểu thức có thể là tên của cột

Dưới đây là tất cả các chi tiết của bảng nhân viên

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 Johnson

5200

9747

6

2

m

Allan Smithie

4900

6853

7

4

f

Kirsten Ruegg

5600

2223

8

3

f

Kirsten Ruegg

4400

2765

Sáu tên riêng biệt được tạo ra khi trường tên tuân theo hàm Count riêng biệt

SELECT Count(DISTINCT name)
FROM employees;

Đếm (tên DISTINCT)

6

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

________mười

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

6

Đây là một truy vấn để đếm các tên trùng lặp cho từng bộ phận, bạn có thể sử dụng truy vấn này cùng với mệnh đề group by để nhóm số lượng trùng lặp cho mỗi nhóm

SELECT name
FROM fruits;
1

dept_id

tên trùng lặp

1

0

2

0

3

1

4

0

Để 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. Các truy vấn này hỗ trợ bạn mô tả mức độ trùng lặp, nhưng chúng không cho bạn biết giá trị nào bị trùng lặp

________thứ mười hai

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 Johnson

1

1

Ralph Teller

1

Mệnh đề HAVING tương tự như mệnh đề WHERE, ngoại trừ việc nó được sử dụng với nhóm theo để giảm kết quả vì chúng tôi chỉ quan tâm đến các bản sao

SELECT name
FROM fruits;
3

Bây giờ, chúng ta có thể xem có bao nhiêu tên, cùng với tên nào trùng lặp

dept_id

Tên

tên_đếm

3

Kirsten Ruegg

2

Các hàng trùng lặp với các giá trị tối thiểu hoặc tối đa cho mỗi nhóm

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. 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. Truy vấn sau đây hiển thị mức lương cao nhất cho từng bộ phận, vì vậy, một ví dụ chắc chắn là theo thứ tự

SELECT name
FROM fruits;
4

Mặc dù đó không phải là những gì được trả lại ở đây, nhưng mục đích cũng là hiển thị dữ liệu về người có mức lương cao nhất

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 sử dụng trên đó. Do đó, những gì được hiển thị là giá trị tên và giới tính được tìm thấy cho từng nhóm theo trường. 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ó nhận thấy có dept_id là 2, như bạn có thể thấy trong bảng, trong khi Ralph Teller là nhân viên duy nhất của bộ phận 1

Trong trường hợp này, chúng tôi chỉ có một trường và đó là tiền lương, vì vậy giải pháp là nối 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

SELECT name
FROM fruits;
5

Bây giờ, các trường tên và giới tính được dành riêng cho người được trả lương cao nhất

dept_id

Tên

giới tính

max_salary

1

Ralph Teller

m

5100

2

Peter Johnson

m

5200

3

Kirsten Ruegg

f

5600

4

Kirsten Ruegg

f

5600

Đây là thông tin chi tiết hơn về cách loại bỏ các bản ghi trùng lặp 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. Mệnh đề nhóm by và HAVING được đề cập chi tiết hơn trong bài viết này

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 sắc

táo

màu đỏ

táo

màu xanh lá

táo

màu vàng

trái chuối

màu vàng

trái 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

trái chuối

trá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

trái 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,
       gender,       
       salary
FROM employees
ORDER BY name;
4

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
ORDER BY name;
5

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. Kể từ đây

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

…cũng giống như

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

Đế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 từng 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 để loại bỏ các mục trùng lặp khỏi tập kết quả?

Giải pháp để xóa các hàng trùng lặp khỏi tập hợp kết quả của bạn là bao gồm từ khóa riêng biệt trong 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.

Mệnh đề nào được sử dụng để loại bỏ các hàng trùng lặp khỏi tập kết quả?

Trả lời. Từ khóa DISTINCT được sử dụng để xóa các hàng trùng lặp trong bảng.

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()

Từ khóa SQL nào được sử dụng để loại bỏ sự trùng lặp của các hàng khỏi tập kết quả * Xóa CHỌN khác biệt duy nhất?

Từ khóa DISTINCT trong mệnh đề SELECT được sử dụng để loại bỏ các hàng trùng lặp và hiển thị danh sách giá trị duy nhất.