Ето три примера за използване на SQL за намиране и избиране на реда с минималната стойност в дадена колона.
Примерите работят в повечето основни RDBMS, включително MySQL, MariaDB, PostgreSQL, SQLite, Oracle и SQL Server.
Примерни данни
Нека започнем със следните данни:
SELECT * FROM PetShow;
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | +---------+-----------+---------+
Опция 1
Ето първата ни опция за избор на ред с минимална стойност от горната таблица:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Тук използвахме MIN()
функция в рамките на подзаявка, за да намери минималната стойност, и върна целия ред с външната заявка.
Когато има няколко реда с минимална стойност
Използвайки този метод, ако има няколко реда с минимална стойност, всички те се връщат.
Да предположим, че вмъкваме друг ред в нашата таблица със същия резултат като съществуващия минимален резултат:
INSERT INTO PetShow VALUES (7, 'Punch', 3);
SELECT * FROM PetShow;
Нашата таблица сега изглежда така:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Виждаме, че и Scratch, и Punch са получили ниската оценка от 3.
Нека изпълним предишната заявка отново, за да върнем минималната стойност от тази колона:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
И двата реда с минималните стойности се връщат.
Можем да ограничим набора от резултати само до един ред, ако е необходимо. Точният код ще зависи от използваната RDBMS.
LIMIT
Клаузата може да се използва с RDBS, като PostgreSQL, MariaDB, MySQL и SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Резултат:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
В SQL Server можем да използваме TOP
клауза:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
И в Oracle Database можем да направим това:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Опция 2
Ако искаме да се върне само един ред, всъщност можем да премахнем повечето от другия код и просто да извадим първия ред от подредените резултати:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
LIMIT 1;
Резултат:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
В SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
И в Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Опция 3
Друг начин да изберете реда с минимална стойност е да се присъедините към самата таблица, както следва:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Както в предишния пример, можем да ограничим резултатите до един ред (или друго число), ако е необходимо.