Här är tre exempel på hur du använder SQL för att hitta och välja raden med minimivärdet i en given kolumn.
Exemplen fungerar i de flesta större RDBMS, inklusive MySQL, MariaDB, PostgreSQL, SQLite, Oracle och SQL Server.
Exempeldata
Låt oss börja med följande 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 | +---------+-----------+---------+
Alternativ 1
Här är vårt första alternativ för att välja raden med det lägsta värdet från tabellen ovan:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Här använde vi MIN()
funktion inom en underfråga för att hitta minimivärdet och returnerade hela raden med den yttre frågan.
När det finns flera rader med minsta värdet
Med den här metoden, om det finns flera rader med minimivärdet, returneras alla.
Anta att vi infogar en annan rad i vår tabell med samma poäng som den befintliga minimipoängen:
INSERT INTO PetShow VALUES (7, 'Punch', 3);
SELECT * FROM PetShow;
Vår tabell ser nu ut så här:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Vi kan se att både Scratch och Punch har fått den låga poängen 3.
Låt oss köra den föregående frågan igen för att returnera minimivärdet från den kolumnen:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
Båda raderna med minimivärdena returneras.
Vi kan begränsa resultatuppsättningen till bara en rad om det behövs. Den exakta koden beror på det RDBMS som används.
LIMIT
klausul kan användas med RDBS som PostgreSQL, MariaDB, MySQL och SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
I SQL Server kan vi använda TOP
klausul:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Och i Oracle Database kan vi göra detta:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Alternativ 2
Om vi bara vill ha en rad returnerad kan vi faktiskt avskaffa det mesta av den andra koden och bara få den första raden av de beställda resultaten:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
LIMIT 1;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
I SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Och i Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Alternativ 3
Ett annat sätt att välja raden med det lägsta värdet är att gå med i tabellen på sig själv, så här:
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 tidigare exemplet kan vi begränsa resultaten till en rad (eller något annat nummer) om det behövs.