Bài toán
Liệt kê tên nhân viên duy nhất (DISTINCT) làm việc tại một công ty cụ thể.
Ví dụ
Tạo bảng (sửa typo trong nguồn: archar → VARCHAR, thiếu dấu cách):
CREATE TABLE DemoTable642 (
EmployeeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(100),
EmployeeCompanyName VARCHAR(100)
);
INSERT INTO DemoTable642(EmployeeName, EmployeeCompanyName) VALUES
('John', 'Google'), ('Carol', 'Microsoft'), ('John', 'Amazon'),
('Carol', 'Google'), ('John', 'Flipkart');
Dữ liệu: John làm tại 3 công ty, Carol làm tại 2 công ty (Google, Microsoft).
Truy vấn nhân viên tại Google:
SELECT EmployeeName
FROM DemoTable642
WHERE EmployeeCompanyName = 'Google'
GROUP BY EmployeeName;
Kết quả:
+--------------+
| EmployeeName |
+--------------+
| John |
| Carol |
+--------------+
Giải thích
WHERElọc công ty Google trước.GROUP BY EmployeeNamegom trùng tên (John xuất hiện 1 lần dù có thể nhiều record).- Tương đương
SELECT DISTINCT EmployeeName ... WHERE ....
Mở rộng: Thống kê số công ty mỗi nhân viên
SELECT EmployeeName, COUNT(DISTINCT EmployeeCompanyName) AS company_count
FROM DemoTable642
GROUP BY EmployeeName
ORDER BY company_count DESC;
Kết quả: John (3), Carol (2).
Lưu ý GROUP BY
- MySQL cho phép SELECT cột không trong GROUP BY (non-aggregated) nhưng giá trị không xác định (chế độ ONLY_FULL_GROUP_BY báo lỗi).
- Luôn liệt kê đầy đủ cột non-aggregated trong GROUP BY.
GROUP BYngầm sắp xếp (implicit sort) trong MySQL cũ, MySQL 8.0+ không đảm bảo → luôn dùngORDER BYtường minh.