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

Lấy giá trị MAX của cột và gán cho tất cả dòng khác trong cùng cột MySQL


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+.