Zde jsou tři příklady použití SQL k nalezení a výběru řádku s minimá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čněme 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 | +---------+-----------+---------+
Možnost 1
Zde je naše první možnost pro výběr řádku s minimální hodnotou z výše uvedené tabulky:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Zde jsme použili MIN()
funkce v rámci dílčího dotazu k nalezení minimální hodnoty a vrátila celý řádek s vnějším dotazem.
Když existuje více řádků s minimální hodnotou
Při použití této metody, pokud existuje více řádků s minimální hodnotou, jsou vráceny všechny.
Předpokládejme, že do tabulky vložíme další řádek se stejným skóre, jako je stávající minimální skóre:
INSERT INTO PetShow VALUES (7, 'Punch', 3);
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 | +---------+-----------+---------+
Vidíme, že Scratch i Punch mají nízké skóre 3.
Spusťte znovu předchozí dotaz, abychom vrátili minimální hodnotu z tohoto sloupce:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
Jsou vráceny oba řádky s minimálními hodnotami.
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 MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Výsledek:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
V SQL Serveru můžeme použít TOP
klauzule:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
A v databázi Oracle můžeme udělat toto:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
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 ASC
LIMIT 1;
Výsledek:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
V SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
A v databázi Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
Výsledek:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Možnost 3
Dalším způsobem, jak vybrat řádek s minimá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).