W SQL MIN()
function to funkcja agregująca, która zwraca minimalną wartość w danym wyrażeniu.
Poniżej znajduje się kilka podstawowych przykładów pokazujących, jak to działa.
Przykładowa tabela
Załóżmy, że mamy następującą tabelę:
SELECT * FROM Products;
Wynik:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Przykład
Oto prosty przykład do zademonstrowania.
SELECT MIN(ProductPrice)
FROM Products;
Wynik:
+--------------------+ | (No column name) | |--------------------| | 9.99 | +--------------------+
W takim przypadku informacje o cenie są przechowywane w ProductPrice
kolumna, więc przekazujemy to jako argument do MIN()
funkcja, która następnie oblicza i zwraca wynik.
Korzystanie z aliasów kolumn
Zauważysz, że poprzednie wyniki nie zawierają nazwy kolumny. Należy się tego spodziewać, ponieważ MIN()
funkcja nie zwraca żadnych kolumn. Możesz łatwo podać nazwę kolumny, przypisując alias.
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Wynik:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Przefiltrowane wyniki
MIN()
funkcja działa na wierszach zwróconych przez zapytanie. Więc jeśli filtrujesz wyniki, wynik MIN()
odzwierciedli to.
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products
WHERE VendorId = 1001;
Wynik:
+----------------+ | MinimumPrice | |----------------| | 11.99 | +----------------+
W tym przypadku 11,99 to minimalna cena spośród wszystkich produktów oferowanych przez określonego dostawcę.
NULL
Wartości
MIN()
funkcja ignoruje każdy NULL
wartości. W naszej przykładowej tabeli powyżej numer produktu 6
ma NULL
w swojej ProductPrice
kolumna, ale zostało to zignorowane w naszej MIN()
przykład.
W zależności od systemu DBMS i ustawień możesz, ale nie musisz, zobaczyć ostrzeżenie, że NULL
wartości zostały wyeliminowane w zestawie wyników.
Oto przykład tego, co możesz zobaczyć:
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Wynik:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Wszystko to mówi nam, że kolumna zawierała co najmniej jeden NULL
wartość i że została zignorowana podczas obliczania wyników.
Dane dotyczące daty/godziny
Możesz użyć MIN()
o wartościach daty/czasu.
Załóżmy, że mamy następującą tabelę:
SELECT PetName, DOB
FROM Pets;
Wynik:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
Możemy użyć MIN()
aby znaleźć minimalną datę urodzenia (DOB
).
SELECT MIN(DOB) AS MinDOB
FROM Pets;
Wynik:
+------------+ | MinDOB | |------------| | 2018-10-01 | +------------+
Ponownie, ignoruje NULL
wartości.
Dane postaci
W przypadku użycia z kolumnami danych znakowych MIN()
znajduje najniższą wartość w kolejności sortowania.
Przykład:
SELECT MIN(ProductName) AS MinimumProductName
FROM Products;
Wynik:
+---------------------------------+ | MinimumProductName | |---------------------------------| | Bottomless Coffee Mugs (4 Pack) | +---------------------------------+
DISTINCT
Słowo kluczowe
Twój DBMS może zezwalać na DISTINCT
słowo kluczowe do użycia z MIN()
funkcjonować. Jeśli tak, prawdopodobnie jest to zgodne ze standardem ISO SQL.
Dlatego możesz to zrobić:
SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;
Wynik:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Ale nie będzie to miało wpływu na wyniki.
DISTINCT
słowo kluczowe może być bardzo przydatne w innych kontekstach (np. z COUNT()
funkcja), ale nie ma znaczenia, gdy jest używany z MIN()
. DISTINCT
słowo kluczowe usuwa duplikaty, ale w przypadku MIN()
nie zrobi to żadnej różnicy, ponieważ MIN()
zwraca ten sam wynik, niezależnie od tego, ile wierszy ma tę samą minimalną wartość.
Funkcje okien
W zależności od systemu DBMS możesz użyć OVER
klauzula z Twoją MIN()
funkcji, aby utworzyć funkcję okna.
Funkcja okna wykonuje operację podobną do agregacji na zestawie wierszy zapytania. Daje wynik dla każdego wiersza zapytania. Jest to przeciwieństwo operacji agregującej, która grupuje wiersze zapytań w jeden wiersz wyników.
Oto przykład demonstrujący tę koncepcję.
Widzieliśmy już Products
stół. Nasza baza danych zawiera również Customers
tabeli i zawiera następujące dane:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 1254 | AUS | (415) 413-5182 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
Możemy pobrać dane z tych tabel i przedstawić je jako jeden zestaw wyników za pomocą złączenia.
Możemy również użyć MIN()
funkcja z OVER
klauzula, aby zastosować funkcję okna do danych.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MIN(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Minimum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Minimum Price For This Vendor";
Wynik:
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Minimum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 11.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 11.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 11.99 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+---------------------------------+
W tym przypadku użyliśmy OVER
klauzula z naszą MIN()
funkcja podziału wyniku według nazwy dostawcy.
Dzięki temu byliśmy w stanie zwrócić informacje o cenie dla każdego produktu, a także cenę minimalną dla wszystkich produktów od danego dostawcy. Ta cena minimalna zmienia się wraz ze zmianą dostawcy (chyba że wielu dostawców ma tę samą cenę minimalną), ale pozostaje taka sama dla wszystkich produktów od tego samego dostawcy.
Ta koncepcja może być również zastosowana do innych funkcji agregujących w SQL, takich jak SUM()
, AVG()
, MAX()
i COUNT()
.