Zde jsou tři příklady, které používají SQL k nalezení a výběru řádku s maximální hodnotou v daném sloupci.
Příklady fungují ve většině hlavních RDBMS, včetně MySQL, MariaDB, PostgreSQL, SQLite, Oracle a SQL Server.
Ukázková data
Začneme s následujícími údaji:
SELECT * FROM PetShow;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Možnost 1
Zde je příklad výběru řádku s maximální hodnotou z Score
ve výše uvedené tabulce:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Použili jsme MAX()
funkce v rámci dílčího dotazu k nalezení maximální hodnoty a vrátila celý řádek s vnějším dotazem.
Když existuje více řádků s maximální hodnotou
Při použití této metody, pokud existuje více než jeden řádek s maximální hodnotou, jsou vráceny všechny.
Předpokládejme, že do tabulky vložíme další řádek se stejným skóre jako stávající maximální skóre:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Naše tabulka nyní vypadá takto:
+---------+-----------+---------+ | 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 | +---------+-----------+---------+
Můžeme vidět, že Wag i Purr mají nejvyšší skóre 85.
Spusťte znovu předchozí dotaz a vrátíme maximální hodnotu z tohoto sloupce:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Oba řádky s maximálními hodnotami jsou vráceny podle očekávání.
V případě potřeby můžeme sadu výsledků omezit pouze na jeden řádek. Přesný kód bude záviset na používaném RDBMS.
LIMIT
klauzuli lze použít s RDBS, jako je PostgreSQL, MariaDB, MySQL a SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Výsledek:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
V SQL Serveru můžeme použít TOP
klauzule:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Výsledek:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
A v databázi Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Výsledek:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Možnost 2
Pokud chceme vrátit pouze jeden řádek, můžeme se ve skutečnosti zbavit většiny ostatních kódů a získat pouze první řádek z uspořádaných výsledků:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
V SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
A v databázi Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Možnost 3
Dalším způsobem, jak vybrat řádek s maximální hodnotou, je připojit tabulku k sobě, takto:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Stejně jako v předchozím příkladu můžeme v případě potřeby omezit výsledky na jeden řádek (nebo jiné číslo).