Her er tre eksempler, der bruger SQL til at finde og vælge rækken med den maksimale værdi i en given kolonne.
Eksemplerne fungerer i de fleste større RDBMS'er, inklusive MySQL, MariaDB, PostgreSQL, SQLite, Oracle og SQL Server.
Eksempeldata
Vi starter med følgende data:
SELECT * FROM PetShow;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Valgmulighed 1
Her er et eksempel på valg af rækken med den maksimale værdi fra Score
kolonne i ovenstående tabel:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Vi brugte MAX()
funktion i en underforespørgsel for at finde den maksimale værdi og returnerede hele rækken med den ydre forespørgsel.
Når der er flere rækker med den maksimale værdi
Ved hjælp af denne metode, hvis der er mere end én række med maks. værdi, returneres alle.
Antag, at vi indsætter en anden række i vores tabel med samme score som den eksisterende max score:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Vores tabel ser nu sådan ud:
+---------+-----------+---------+ | 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 | +---------+-----------+---------+
Vi kan se, at både Wag og Purr har fået den højeste score på 85.
Lad os køre den forrige forespørgsel igen for at returnere den maksimale værdi fra den kolonne:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Begge rækker med de maksimale værdier returneres som forventet.
Vi kan begrænse resultatsættet til kun én række, hvis det kræves. Den nøjagtige kode vil afhænge af det RDBMS, der bruges.
LIMIT
klausul kan bruges med RDBS'er såsom PostgreSQL, MariaDB, MySQL og SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
I SQL Server kan vi bruge TOP
klausul:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Og i Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Valgmulighed 2
Hvis vi kun vil have én række returneret, kan vi faktisk fjerne det meste af den anden kode og bare få den første række ud af de bestilte resultater:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
I SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Og i Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Valgmulighed 3
En anden måde at vælge rækken med den maksimale værdi på er at slutte sig til tabellen på sig selv, sådan her:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Som med det tidligere eksempel kan vi begrænse resultaterne til én række (eller et andet tal), hvis det kræves.