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:

shell
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:

idfirst_namelast_namedepartment
1JohnDoeSales
2JaneSmithSales
3SarahJohnsonMarketing
4MikeBrownMarketing
5RobertLeeSales

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:

shell
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_namedepartment không trùng lặp trong bảng employees, bạn có thể làm như sau:

shell
SELECT DISTINCT first_name, department
FROM employees;

Kết quả:

first_namedepartment
JohnSales
JaneSales
SarahMarketing
MikeMarketing
RobertSales

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:

shell
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:

shell
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:

shell
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

DISTINCTGROUP 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

shell
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

shell
SELECT DISTINCT product_name
FROM products;

Ví dụ 3: Đếm số lượng nhà cung cấp duy nhất trong bảng suppliers

shell
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

shell
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!