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? Show
Các từ khóa khác biệt và khác biệtDistinctrow 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 _10Hã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ênChú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 theoTrê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 _15Kế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 _16Lý 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ặpHà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 haidept_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ómBạ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ệtTừ 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ặpMộ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 theoSử 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ặpDistinct 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ặpNhư 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.
|