Mệnh đề DISTINCT trong MySQL

Mệnh đề DISTINCT trong MySQL

Trong hướng dẫn này, bạn sẽ học cách sử dụng mệnh đề DISTINCT trong câu lệnh SELECT trong MySQL để loại bỏ các hàng trùng lặp trong một tập kết quả.

Giới thiệu về mệnh đề MySQL DISTINCT

Khi truy vấn dữ liệu từ một bảng, bạn có thể nhận được các hàng trùng lặp. Để loại bỏ các hàng trùng lặp này, bạn sử dụng mệnh đề DISTINCT trong câu lệnh SELECT.

Đây là cú pháp của mệnh đề DISTINCT:

SELECT DISTINCT
    select_list
FROM
    table_name
WHERE 
    search_condition
ORDER BY 
    sort_expression;

Trong cú pháp này, bạn chỉ định một hoặc nhiều cột mà bạn muốn chọn các giá trị riêng biệt sau từ khóa SELECT DISTINCT.

Nếu bạn chỉ định một cột, mệnh đề DISTINCT sẽ đánh giá tính duy nhất của các hàng dựa trên các giá trị của cột đó.

Tuy nhiên, nếu bạn chỉ định hai hoặc nhiều cột, mệnh đề DISTINCT sẽ sử dụng giá trị của các cột này để đánh giá tính duy nhất của các hàng.

Khi thực hiện câu lệnh SELECT với mệnh đề DISTINCT, MySQL đánh giá mệnh đề DISTINCT sau mệnh đề FROM, WHERESELECT và trước mệnh đề ORDER BY:

Mệnh đề DISTINCT trong MySQL

Ví dụ về mệnh đề DISTINCT trong MySQL

Chúng tôi sẽ sử dụng bảng employees từ cơ sở dữ liệu mẫu:

Ví dụ về mệnh đề DISTINCT trong MySQL

Đầu tiên, truy xuất họ của các nhân viên từ bảng employees bằng cách sử dụng câu lệnh SELECT sau:

SELECT 
    lastname
FROM
    employees
ORDER BY 
    lastname;

Đầu ra:

+-----------+
| lastname  |
+-----------+
| Bondur    |
| Bondur    |
| Bott      |
| Bow       |
| Castillo  |
| Firrelli  |
| Firrelli  |
| Fixter    |
....
| Jones     |

| Patterson |
| Patterson |
| Patterson |
| Thompson  |
...
+-----------+
23 rows in set (0.00 sec)

Như được trình bày rõ ràng trong đầu ra, một số nhân viên có cùng họ, ví dụ: Bondur, Firrelli.

Thứ hai, truy xuất họ duy nhất của các nhân viên bằng cách thêm mệnh đề DISTINCT như sau:

SELECT 
    DISTINCT lastname
FROM
    employees
ORDER BY 
    lastname;

Như bạn có thể thấy rõ ràng từ đầu ra, mệnh đề DISTINCT loại bỏ các họ trùng lặp khỏi tập kết quả.

+-----------+
| lastname  |
+-----------+
| Bondur    |
| Bott      |
| Bow       |
| Castillo  |
| Firrelli  |

...
| Nishi     |
| Patterson |
| Thompson  |
| Tseng     |
| Vanauf    |
+-----------+
19 rows in set (0.01 sec)

Mệnh đề DISTINCT trong MySQL và giá trị  NULL

Khi bạn chỉ định một cột có các giá trị NULL trong mệnh đề DISTINCT, mệnh đề DISTINCT sẽ chỉ giữ một giá trị NULL vì nó coi tất cả các giá trị NULL đều giống nhau.

Ví dụ, cột state trong bảng customers có các giá trị NULL.

Ví dụ về mệnh đề DISTINCT trong MySQL

Khi bạn sử dụng mệnh đề DISTINCT để truy xuất các state, bạn sẽ thấy các state riêng biệt và NULL như sau:

SELECT DISTINCT state
FROM customers;

Đầu ra:

+---------------+
| state         |
+---------------+
| NULL          |
| NV            |
| Victoria      |
| CA            |
| NY            |
| PA            |
...
| Co. Cork      |
| Pretoria      |
| NH            |
| Tokyo         |
+---------------+
19 rows in set (0.00 sec)

Mệnh đề DISTINCT trong MySQL với nhiều cột

Khi bạn chỉ định nhiều cột trong mệnh đề DISTINCT, mệnh đề DISTINCT sẽ sử dụng kết hợp các giá trị trong các cột này để xác định tính duy nhất của hàng trong tập kết quả.

Ví dụ: để có được sự kết hợp duy nhất giữa thành phố và tiểu bang từ bảng customers, bạn sử dụng truy vấn sau:

SELECT DISTINCT
    state, city
FROM
    customers
WHERE
    state IS NOT NULL
ORDER BY 
    state, 
    city;

Đầu ra:

+---------------+----------------+
| state         | city           |
+---------------+----------------+
| BC            | Tsawassen      |
| BC            | Vancouver      |
| CA            | Brisbane       |
| CA            | Burbank        |
| CA            | Burlingame     |
| CA            | Glendale       |
| CA            | Los Angeles    |
| CA            | Pasadena       |
| CA            | San Diego      |
...

Nếu không có mệnh đề DISTINCT này, bạn sẽ nhận được sự kết hợp trùng lặp của tiểu bang và thành phố như sau:

SELECT 
    state, city
FROM
    customers
WHERE
    state IS NOT NULL
ORDER BY 
    state , 
    city;

Đầu ra:

+---------------+----------------+
| state         | city           |
+---------------+----------------+
| BC            | Tsawassen      |
| BC            | Vancouver      |
| CA            | Brisbane       |
| CA            | Burbank        |
..
| CA            | San Francisco  |
| CA            | San Francisco  |
...
| MA            | Boston         |
| MA            | Boston         |
| MA            | Brickhaven     |
| MA            | Brickhaven     |
| MA            | Brickhaven     |
...
| NY            | NYC            |
| NY            | NYC            |
| NY            | NYC            |
| NY            | NYC            |
| NY            | NYC            |
...

Tóm lược

  • Sử dụng mệnh đề DISTINCT trong MySQL để loại bỏ các hàng trùng lặp khỏi tập kết quả được trả về bởi mệnh đề SELECT.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *