Sử dụng từ khóa DISTINCT để loại bỏ các hàng trùng lặp trong kết quả truy vấn.
Cú pháp
SELECT DISTINCT tên_cột FROM tên_bảng;
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE selectUniqueValue (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(20),
-> Age INT
-> );
Query OK, 0 rows affected (0.64 sec)
Chèn dữ liệu (có trùng Age):
mysql> INSERT INTO selectUniqueValue(Name, Age) VALUES
-> ('John', 21), ('Carol', 21), ('Sam', 22), ('Mike', 22),
-> ('David', 22), ('Larry', 23), ('Bob', 23), ('Maxwell', 22), ('Robert', 21);
Xem dữ liệu gốc (9 hàng):
mysql> SELECT * FROM selectUniqueValue;
+----+---------+------+ | Id | Name | Age | +----+---------+------+ | 1 | John | 21 | | 2 | Carol | 21 | | 3 | Sam | 22 | | 4 | Mike | 22 | | 5 | David | 22 | | 6 | Larry | 23 | | 7 | Bob | 23 | | 8 | Maxwell | 22 | | 9 | Robert | 21 | +----+---------+------+
Lấy các tuổi duy nhất:
mysql> SELECT DISTINCT Age FROM selectUniqueValue;
+------+ | Age | +------+ | 21 | | 22 | | 23 | +------+
DISTINCT trên nhiều cột
SELECT DISTINCT Name, Age FROM selectUniqueValue;
Trả về các cặp (Name, Age) duy nhất — trong ví dụ này 9 hàng vì Name đều khác nhau.
Kết hợp với COUNT
SELECT COUNT(DISTINCT Age) FROM selectUniqueValue; -- Kết quả: 3
DISTINCT vs GROUP BY
| Đặc điểm | DISTINCT | GROUP BY |
|---|---|---|
| Mục đích | Loại bỏ hàng trùng | Nhóm dữ liệu + tổng hợp |
| Hiệu năng | Tương đương (MySQL tối ưu hóa) | Tương đương |
| Có thể dùng hàm tổng hợp | Không trực tiếp | Có (SUM, COUNT, AVG...) |
| Sắp xếp mặc định | Có (theo cột DISTINCT) | Có (theo cột GROUP BY) |
Mẹo: SELECT DISTINCT * loại bỏ hàng trùng lặp hoàn toàn (tất cả cột giống nhau).