Vấn đề
Muốn truy vấn trả về mỗi FirstName kèm theo giá trị Score lớn nhất của toàn bảng (để so sánh, hiển thị...).
Giải pháp: Subquery trong SELECT
SELECT FirstName, (SELECT MAX(Score) FROM DemoTable) AS Score FROM DemoTable;
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (FirstName VARCHAR(100), Score INT);
mysql> INSERT INTO DemoTable VALUES
('David', 59), ('Chris', 97), ('Bob', 98), ('Carol', 91);
Truy vấn
mysql> SELECT FirstName, (SELECT MAX(Score) FROM DemoTable) AS Score FROM DemoTable;
Kết quả
+-----------+-------+ | FirstName | Score | +-----------+-------+ | David | 98 | | Chris | 98 | | Bob | 98 | | Carol | 98 | +-----------+-------+
Giải thích
- Subquery
(SELECT MAX(Score) FROM DemoTable)chạy 1 lần (hoặc tối ưu hóa), trả về scalar value 98. - Giá trị 98 được gán cho cột Score của **mọi dòng** trong kết quả.
Cách khác: JOIN với derived table
SELECT d.FirstName, m.max_score AS Score FROM DemoTable d CROSS JOIN (SELECT MAX(Score) AS max_score FROM DemoTable) m;
Rõ ràng hơn, dễ đọc, optimizer xử lý tốt.
Nếu muốn CẬP NHẬT dữ liệu (UPDATE)
UPDATE DemoTable SET Score = (SELECT MAX(Score) FROM DemoTable);
Tất cả Score sẽ thành 98.
Lưu ý hiệu năng
- Subquery scalar trong SELECT: MySQL thường tối ưu chạy 1 lần.
- Với bảng lớn, đảm bảo có index trên Score để MAX() nhanh.
- Không dùng
MAX(Score) OVER ()(window function) trừ MySQL 8.0+.