1. Giới thiệu
Trong SQL, khi truy vấn dữ liệu từ cơ sở dữ liệu bằng câu lệnh SELECT, có thể xảy ra trường hợp dữ liệu bị trùng lặp do một số giá trị hoặc bản ghi xuất hiện nhiều lần. Để loại bỏ các bản ghi trùng lặp trong kết quả truy vấn, chúng ta sử dụng từ khóa DISTINCT. Từ khóa này giúp bạn chỉ lấy ra các giá trị hoặc bản ghi duy nhất trong tập dữ liệu, giúp kết quả trở nên rõ ràng và dễ hiểu hơn.
Trong bài viết này, chúng ta sẽ cùng tìm hiểu về từ khóa DISTINCT trong MySQL, cách sử dụng, chi tiết các chức năng, và các ví dụ cụ thể để áp dụng trong thực tế.
2. SQL SELECT DISTINCT là gì?
SELECT DISTINCT trong SQL được sử dụng để loại bỏ các bản ghi trùng lặp và chỉ trả về các giá trị duy nhất từ một hoặc nhiều cột trong một bảng.
Cú pháp:
SELECT DISTINCT column1, column2, ...
FROM table_name;Trong đó:
column1, column2, ...: Là tên các cột bạn muốn truy vấn.table_name: Là tên của bảng chứa dữ liệu.
Từ khóa DISTINCT thường được sử dụng trong các trường hợp khi bạn chỉ muốn lấy danh sách các giá trị không bị lặp lại, ví dụ như danh sách tên khách hàng, phòng ban, thành phố hoặc các loại dữ liệu khác có khả năng bị trùng lặp.
3. Cách sử dụng SQL SELECT DISTINCT
a. Sử dụng SELECT DISTINCT với một cột
Bạn có thể sử dụng DISTINCT để truy vấn một cột và loại bỏ các giá trị trùng lặp.
Ví dụ:
Giả sử chúng ta có một bảng employees như sau:
| id | first_name | last_name | department |
|---|---|---|---|
| 1 | John | Doe | Sales |
| 2 | Jane | Smith | Sales |
| 3 | Sarah | Johnson | Marketing |
| 4 | Mike | Brown | Marketing |
| 5 | Robert | Lee | Sales |
Bây giờ, để truy vấn danh sách các phòng ban (department) không trùng lặp, bạn có thể sử dụng SELECT DISTINCT như sau:
SELECT DISTINCT department
FROM employees;Kết quả:
| department |
|---|
| Sales |
| Marketing |
b. Sử dụng SELECT DISTINCT với nhiều cột
SELECT DISTINCT cũng có thể được sử dụng để truy vấn nhiều cột. Trong trường hợp này, SQL sẽ chỉ loại bỏ các bản ghi bị trùng lặp về tất cả các cột được chỉ định.
Ví dụ:
Nếu bạn muốn lấy các cặp first_name và department không trùng lặp trong bảng employees, bạn có thể làm như sau:
SELECT DISTINCT first_name, department
FROM employees;Kết quả:
| first_name | department |
|---|---|
| John | Sales |
| Jane | Sales |
| Sarah | Marketing |
| Mike | Marketing |
| Robert | Sales |
Như vậy, kết quả chỉ loại bỏ những dòng có cùng giá trị cho tất cả các cột được chỉ định trong SELECT.
c. Kết hợp DISTINCT với các câu lệnh khác
Bạn có thể kết hợp DISTINCT với các câu lệnh khác như WHERE, ORDER BY, và COUNT() để lấy dữ liệu theo những điều kiện cụ thể và sắp xếp kết quả.
Ví dụ 1: Sử dụng DISTINCT với WHERE
Giả sử bạn chỉ muốn lấy danh sách phòng ban (department) duy nhất mà nhân viên trong đó có họ "Doe", bạn có thể thêm điều kiện WHERE như sau:
SELECT DISTINCT department
FROM employees
WHERE last_name = 'Doe';Kết quả:
| department |
|---|
| Sales |
Ví dụ 2: Sử dụng DISTINCT với ORDER BY
Để lấy danh sách các phòng ban không trùng lặp và sắp xếp theo thứ tự chữ cái, bạn có thể sử dụng ORDER BY:
SELECT DISTINCT department
FROM employees
ORDER BY department ASC;Kết quả:
| department |
|---|
| Marketing |
| Sales |
Ví dụ 3: Sử dụng DISTINCT với COUNT()
Bạn cũng có thể kết hợp DISTINCT với hàm COUNT() để đếm số lượng các giá trị duy nhất trong một cột.
Ví dụ: Đếm số lượng các phòng ban khác nhau trong bảng employees:
SELECT COUNT(DISTINCT department)
FROM employees;Kết quả:
| COUNT(DISTINCT department) |
|---|
| 2 |
4. Một số lưu ý khi sử dụng SELECT DISTINCT
a. DISTINCT không hoạt động với toàn bộ hàng mà chỉ với các cột được chỉ định
Khi sử dụng DISTINCT với nhiều cột, SQL sẽ chỉ loại bỏ các bản ghi nếu tất cả các giá trị trong các cột được chọn đều trùng lặp.
b. Hiệu suất của SELECT DISTINCT
Khi làm việc với các bảng dữ liệu lớn, việc sử dụng DISTINCT có thể gây ảnh hưởng đến hiệu suất vì MySQL cần phải duyệt qua tất cả các bản ghi để loại bỏ các bản ghi trùng lặp. Bạn nên xem xét cẩn thận việc sử dụng DISTINCT khi dữ liệu lớn hoặc tìm cách tối ưu hóa truy vấn của bạn.
c. Không thể sử dụng DISTINCT với GROUP BY
DISTINCT và GROUP BY đều được sử dụng để lọc các kết quả trùng lặp, nhưng không thể kết hợp chúng lại trong cùng một câu lệnh. Thay vào đó, bạn có thể chọn dùng một trong hai phương pháp tùy thuộc vào yêu cầu.
5. Các ví dụ về SQL SELECT DISTINCT
Ví dụ 1: Lấy danh sách các thành phố duy nhất của khách hàng trong bảng customers
SELECT DISTINCT city
FROM customers;Ví dụ 2: Lấy danh sách các sản phẩm không trùng lặp trong bảng products
SELECT DISTINCT product_name
FROM products;Ví dụ 3: Đếm số lượng nhà cung cấp duy nhất trong bảng suppliers
SELECT COUNT(DISTINCT supplier_name)
FROM suppliers;Ví dụ 4: Lấy danh sách các sản phẩm duy nhất được bán tại cửa hàng nhưng chỉ hiển thị những sản phẩm có giá lớn hơn 100
SELECT DISTINCT product_name
FROM products
WHERE price > 100;6. Kết luận
SELECT DISTINCT là một công cụ quan trọng trong SQL, giúp bạn loại bỏ các giá trị trùng lặp và làm sạch kết quả truy vấn. Nó đặc biệt hữu ích khi bạn cần lấy các giá trị duy nhất từ cơ sở dữ liệu như danh sách khách hàng, các phòng ban, các sản phẩm, hay bất kỳ dữ liệu nào có thể bị lặp lại.
Tuy nhiên, bạn cần cẩn thận khi sử dụng DISTINCT trên các bảng lớn, vì nó có thể làm giảm hiệu suất. Hiểu rõ cú pháp và cách sử dụng SELECT DISTINCT sẽ giúp bạn tối ưu hóa truy vấn và xử lý dữ liệu một cách hiệu quả trong MySQL.
Hãy thử áp dụng các kiến thức này trong các bài tập và dự án thực tế của bạn trên CodeTutHub để nắm vững hơn về SQL!








