Oto trzy przykłady użycia SQL do znalezienia i wybrania wiersza z minimalną wartością w danej kolumnie.
Przykłady działają w większości głównych RDBMS, w tym MySQL, MariaDB, PostgreSQL, SQLite, Oracle i SQL Server.
Przykładowe dane
Zacznijmy od następujących danych:
SELECT * FROM PetShow;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | +---------+-----------+---------+
Opcja 1
Oto nasza pierwsza opcja wyboru wiersza z minimalną wartością z powyższej tabeli:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Tutaj użyliśmy MIN()
funkcji w podzapytaniu, aby znaleźć minimalną wartość, i zwróciła cały wiersz z zapytaniem zewnętrznym.
Gdy istnieje wiele wierszy z minimalną wartością
Używając tej metody, jeśli istnieje wiele wierszy z minimalną wartością, wszystkie zostaną zwrócone.
Załóżmy, że wstawiamy do naszej tabeli kolejny wiersz z takim samym wynikiem, jak istniejący wynik minimalny:
INSERT INTO PetShow VALUES (7, 'Punch', 3);
SELECT * FROM PetShow;
Nasz stół wygląda teraz tak:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Widzimy, że zarówno Scratch, jak i Punch mają niski wynik 3.
Uruchommy ponownie poprzednie zapytanie, aby zwrócić minimalną wartość z tej kolumny:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
Zwracane są oba wiersze z wartościami minimalnymi.
W razie potrzeby możemy ograniczyć zestaw wyników tylko do jednego wiersza. Dokładny kod będzie zależał od używanego RDBMS.
LIMIT
Klauzula może być używana z bazami danych RDBS, takimi jak PostgreSQL, MariaDB, MySQL i SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Wynik:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
W SQL Server możemy użyć TOP
klauzula:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
A w Oracle Database możemy to zrobić:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Opcja 2
Jeśli chcemy, aby zwrócono tylko jeden wiersz, możemy faktycznie pozbyć się większości pozostałego kodu i po prostu uzyskać pierwszy wiersz z uporządkowanych wyników:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
LIMIT 1;
Wynik:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
W SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
A w bazie danych Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Opcja 3
Innym sposobem wybrania wiersza z minimalną wartością jest samo dołączenie do tabeli, w ten sposób:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Podobnie jak w poprzednim przykładzie, w razie potrzeby możemy ograniczyć wyniki do jednego wiersza (lub innej liczby).