Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL lấy hàng lương cao nhất và thấp nhất (MIN/MAX + UNION ALL)

Để 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 1 trong subquery.
  • Index trên EmployeeSalary giúp MAX/MIN nhanh (index scan cuối/đầu).