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? Show
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 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ặ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 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ặ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 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 |