Dưới đây là ba ví dụ sử dụng SQL để tìm và chọn hàng có giá trị lớn nhất trong một cột nhất định.
Các ví dụ hoạt động trong hầu hết các RDBMS chính, bao gồm MySQL, MariaDB, PostgreSQL, SQLite, Oracle và SQL Server.
Dữ liệu Mẫu
Chúng tôi sẽ bắt đầu với dữ liệu sau:
SELECT * FROM PetShow;
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Tùy chọn 1
Dưới đây là ví dụ về việc chọn hàng có giá trị lớn nhất từ Score
cột trong bảng trên:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Chúng tôi đã sử dụng MAX()
hàm trong một truy vấn con để tìm giá trị lớn nhất và trả về toàn bộ hàng với truy vấn bên ngoài.
Khi có Nhiều Hàng với Giá trị Tối đa
Sử dụng phương pháp này, nếu có nhiều hơn một hàng có giá trị lớn nhất, thì tất cả chúng đều được trả về.
Giả sử chúng ta chèn một hàng khác vào bảng của mình với cùng điểm với điểm tối đa hiện có:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Bảng của chúng ta bây giờ trông như thế này:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | | 8 | Purr | 85 | +---------+-----------+---------+
Chúng ta có thể thấy rằng cả Wag và Purr đều có số điểm cao nhất là 85.
Hãy chạy lại truy vấn trước đó để trả về giá trị lớn nhất từ cột đó:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Cả hai hàng có giá trị tối đa đều được trả về như mong đợi.
Chúng tôi có thể giới hạn kết quả được đặt thành chỉ một hàng nếu được yêu cầu. Mã chính xác sẽ phụ thuộc vào RDBMS đang được sử dụng.
LIMIT
mệnh đề có thể được sử dụng với RDBS như PostgreSQL, MariaDB, MySQL và SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Kết quả:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Trong SQL Server, chúng ta có thể sử dụng TOP
mệnh đề:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Kết quả:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Và trong Cơ sở dữ liệu Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Kết quả:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Tùy chọn 2
Nếu chúng tôi chỉ muốn trả về một hàng, chúng tôi thực sự có thể loại bỏ hầu hết các mã khác và chỉ lấy hàng đầu tiên trong số các kết quả được sắp xếp:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Trong SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Và trong Cơ sở dữ liệu Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Tùy chọn 3
Một cách khác để chọn hàng có giá trị lớn nhất là tự tham gia vào bảng, như sau:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Kết quả:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Như với ví dụ trước đó, chúng tôi có thể giới hạn kết quả ở một hàng (hoặc một số số khác) nếu được yêu cầu.