sql >> Databáze >  >> RDS >> Database

SQL MIN() pro začátečníky

V SQL, MIN() funkce je agregační funkce, která vrací minimální hodnotu v daném výrazu.

Níže je uvedeno několik základních příkladů, které demonstrují, jak to funguje.

Ukázková tabulka

Předpokládejme, že máme následující tabulku:

SELECT * FROM Products;

Výsledek:

+-------------+------------+---------------------------------+----------------+-----------------------------------------+
| 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.        |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Příklad

Zde je jednoduchý příklad k demonstraci.

SELECT MIN(ProductPrice)
FROM Products;

Výsledek:

+--------------------+
| (No column name)   |
|--------------------|
| 9.99               |
+--------------------+

V tomto případě jsou informace o ceně uloženy v ProductPrice a tak to předáme jako argument do MIN() funkce, která pak vypočítá a vrátí výsledek.

Použití aliasů sloupců

Všimnete si, že předchozí výsledky neobsahují název sloupce. To se dá očekávat, protože MIN() funkce nevrací žádné sloupce. Název sloupce můžete snadno zadat přiřazením aliasu.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Výsledek:

+----------------+
| MinimumPrice   |
|----------------|
| 9.99           |
+----------------+

Filtrované výsledky

MIN() funkce pracuje na řádcích vrácených dotazem. Pokud tedy filtrujete výsledky, výsledek MIN() to bude odrážet.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products
WHERE VendorId = 1001;

Výsledek:

+----------------+
| MinimumPrice   |
|----------------|
| 11.99          |
+----------------+

V tomto případě je 11,99 minimální cena ze všech produktů nabízených uvedeným prodejcem.

NULL Hodnoty

MIN() funkce ignoruje všechny NULL hodnoty. V naší vzorové tabulce výše číslo produktu 6NULL v jeho ProductPrice sloupec, ale to bylo ignorováno v našem MIN() příklad.

V závislosti na vašem DBMS a vašem nastavení se může nebo nemusí zobrazit varování, že NULL hodnoty byly ze sady výsledků vyloučeny.

Zde je příklad toho, co můžete vidět:

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Výsledek:

+----------------+
| MinimumPrice   |
|----------------|
| 9.99           |
+----------------+
Warning: Null value is eliminated by an aggregate or other SET operation.

To vše nám říká, že sloupec obsahoval alespoň jeden NULL hodnotu a že byla při výpočtu výsledků ignorována.

Datum/čas

Můžete použít MIN() na hodnotách data/času.

Předpokládejme, že máme následující tabulku:

SELECT PetName, DOB 
FROM Pets;

Výsledek:

+-----------+------------+
| 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       |
+-----------+------------+

Můžeme použít MIN() najít minimální datum narození (DOB ).

SELECT MIN(DOB) AS MinDOB
FROM Pets;

Výsledek:

+------------+
| MinDOB     |
|------------|
| 2018-10-01 |
+------------+

Opět ignoruje NULL hodnoty.

Údaje o postavách

Při použití se sloupci znakových dat MIN() najde hodnotu, která je v třídicí posloupnosti nejnižší.

Příklad:

SELECT MIN(ProductName) AS MinimumProductName
FROM Products;

Výsledek:

+---------------------------------+
| MinimumProductName              |
|---------------------------------|
| Bottomless Coffee Mugs (4 Pack) |
+---------------------------------+

DISTINCT Klíčové slovo

Váš DBMS může povolit DISTINCT klíčové slovo, které se má použít s MIN() funkce. Pokud ano, je to pravděpodobně kvůli dodržení standardu ISO SQL.

Proto může být možné provést toto:

SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;

Výsledek:

+----------------+
| MinimumPrice   |
|----------------|
| 9.99           |
+----------------+

Ale nebude to mít žádný vliv na výsledky.

DISTINCT klíčové slovo může být velmi užitečné při použití v jiných kontextech (např. s COUNT() funkce), ale při použití s ​​MIN() nemá žádný význam . DISTINCT klíčové slovo odstraní duplikáty, ale v případě MIN() nebude to dělat žádný rozdíl, protože MIN() vrátí stejný výsledek bez ohledu na to, kolik řádků sdílí stejnou minimální hodnotu.

Funkce okna

V závislosti na vašem DBMS možná budete moci použít OVER klauzule s vaším MIN() funkce pro vytvoření funkce okna.

Funkce okna provádí operaci podobnou agregaci na sadě řádků dotazu. Vytváří výsledek pro každý řádek dotazu. To je na rozdíl od agregované operace, která seskupuje řádky dotazu do jednoho řádku výsledku.

Zde je příklad pro demonstraci konceptu.

Již jsme viděli Products stůl. Naše databáze má také Customers tabulka a obsahuje následující údaje:

+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| 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 |
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+

Můžeme načíst data z těchto tabulek a prezentovat je jako jednu sadu výsledků pomocí spojení.

Můžeme také použít MIN() funkce s OVER klauzule k aplikaci funkce okna na data.

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";

Výsledek:

+---------------+---------------------------------+----------------+---------------------------------+
| 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                           |
+---------------+---------------------------------+----------------+---------------------------------+

V tomto případě jsme použili OVER klauzule s naším MIN() funkce k rozdělení výsledku podle názvu dodavatele.

Díky tomu jsme byli schopni vrátit informace o ceně pro každý produkt a také minimální cenu pro všechny produkty od daného dodavatele. Tato minimální cena se mění se změnou dodavatele (pokud náhodou nemá více dodavatelů stejnou minimální cenu), ale zůstává stejná pro všechny produkty od stejného dodavatele.

Tento koncept lze také aplikovat na další agregační funkce v SQL, jako je SUM() , AVG() , MAX() a COUNT() .


  1. Blockchain:Co to je, jak to funguje a co to znamená pro velká data

  2. Funkce ABS() v Oracle

  3. OFFSET vs. ROW_NUMBER()

  4. MySQL DELETE FROM s poddotazem jako podmínkou