Hier sind drei Beispiele, die SQL verwenden, um die Zeile mit dem Höchstwert in einer bestimmten Spalte zu finden und auszuwählen.
Die Beispiele funktionieren in den meisten wichtigen RDBMSs, einschließlich MySQL, MariaDB, PostgreSQL, SQLite, Oracle und SQL Server.
Beispieldaten
Wir beginnen mit den folgenden Daten:
SELECT * FROM PetShow;
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Option 1
Hier ist ein Beispiel für die Auswahl der Zeile mit dem Höchstwert aus dem Score
Spalte in der obigen Tabelle:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Wir haben den MAX()
verwendet Funktion innerhalb einer Unterabfrage, um den Maximalwert zu finden, und die gesamte Zeile mit der äußeren Abfrage zurückgegeben.
Wenn es mehrere Zeilen mit dem maximalen Wert gibt
Wenn es bei dieser Methode mehr als eine Zeile mit dem Maximalwert gibt, werden alle zurückgegeben.
Angenommen, wir fügen eine weitere Zeile mit derselben Punktzahl wie die vorhandene maximale Punktzahl in unsere Tabelle ein:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Unsere Tabelle sieht jetzt so aus:
+---------+-----------+---------+ | 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 | +---------+-----------+---------+
Wir können sehen, dass sowohl Wag als auch Purr die höchste Punktzahl von 85 haben.
Lassen Sie uns die vorherige Abfrage erneut ausführen, um den Maximalwert aus dieser Spalte zurückzugeben:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Beide Zeilen mit den Maximalwerten werden wie erwartet zurückgegeben.
Wir können die Ergebnismenge bei Bedarf auf nur eine Zeile beschränken. Der genaue Code hängt vom verwendeten RDBMS ab.
Das LIMIT
-Klausel kann mit RDBSs wie PostgreSQL, MariaDB, MySQL und SQLite verwendet werden:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Ergebnis:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
In SQL Server können wir den TOP
verwenden Klausel:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Ergebnis:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Und in der Oracle-Datenbank:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Ergebnis:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Option 2
Wenn wir wollen, dass nur eine Zeile zurückgegeben wird, können wir tatsächlich auf den größten Teil des anderen Codes verzichten und nur die erste Zeile aus den geordneten Ergebnissen erhalten:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Im SQL-Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Und in der Oracle-Datenbank:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Option 3
Eine andere Möglichkeit, die Zeile mit dem Höchstwert auszuwählen, besteht darin, die Tabelle wie folgt mit sich selbst zu verknüpfen:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Ergebnis:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Wie im vorherigen Beispiel können wir die Ergebnisse bei Bedarf auf eine Zeile (oder eine andere Zahl) beschränken.