Để lấy **toàn bộ hàng** (không chỉ giá trị) có lương cao nhất và thấp nhất, dùng subquery với MIN(), MAX() kết hợp UNION ALL.
Cú pháp
SELECT * FROM ten_bang
WHERE cot_luong IN (
SELECT MAX(cot_luong) FROM ten_bang
UNION ALL
SELECT MIN(cot_luong) FROM ten_bang
);
UNION ALL: giữ cả hai giá trị (nếu MAX = MIN thì có 2 hàng trùng – khác UNION loại trùng).- Subquery trả về tập 1 cột (lương max và min).
Ví dụ minh họa
mysql> CREATE TABLE DemoTable (
-> EmployeeName VARCHAR(20), EmployeeSalary INT
-> );
mysql> INSERT INTO DemoTable VALUES
-> ('Bob',8800), ('Chris',9800), ('David',7600), ('Sam',9600);
Truy vấn:
mysql> SELECT * FROM DemoTable
-> WHERE EmployeeSalary IN (
-> SELECT MAX(EmployeeSalary) FROM DemoTable
-> UNION ALL
-> SELECT MIN(EmployeeSalary) FROM DemoTable
-> );
Kết quả (Chris 9800 max, David 7600 min):
+--------------+----------------+ | EmployeeName | EmployeeSalary | +--------------+----------------+ | Chris | 9800 | | David | 7600 | +--------------+----------------+
Cách khác (MySQL 8.0+): Window Function
SELECT EmployeeName, EmployeeSalary
FROM (
SELECT *,
MAX(EmployeeSalary) OVER () AS max_sal,
MIN(EmployeeSalary) OVER () AS min_sal
FROM DemoTable
) t
WHERE EmployeeSalary = max_sal OR EmployeeSalary = min_sal;
- Quét bảng 1 lần, hiệu quả hơn trên bảng lớn.
- Trả về tất cả hàng trùng max/min (nếu nhiều người cùng lương cao nhất).
Lưu ý
- Nếu muốn chỉ 1 hàng max và 1 hàng min (tie-break), thêm
ORDER BY EmployeeId LIMIT 1trong subquery. - Index trên
EmployeeSalarygiúp MAX/MIN nhanh (index scan cuối/đầu).