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

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

V SQL, MAX() funkce je agregační funkce, která vrací maximá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

K získání maximální ceny z této tabulky můžeme použít následující dotaz.

SELECT MAX(ProductPrice)
FROM Products;

Výsledek:

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

V tomto případě jsou informace o ceně uloženy v ProductPrice a tak to předáme jako argument do MAX() 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. Některé DBMS mohou používat něco jako MAX(ProductPrice) jako název sloupce. To se dá očekávat, protože MAX() funkce nevrací žádné sloupce. Název sloupce můžete snadno zadat přiřazením aliasu.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Výsledek:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

Filtrované výsledky

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

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;

Výsledek:

+----------------+
| MaximumPrice   |
|----------------|
| 25.99          |
+----------------+

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

NULL Hodnoty

MAX() 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 MAX() 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 MAX(ProductPrice) AS MaximumPrice
FROM Products;

Výsledek:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+
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 MAX() 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 MAX() zjistit maximální datum narození (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Výsledek:

+------------+
| MaxDOB     |
|------------|
| 2020-11-28 |
+------------+

To by bylo datum narození nejmladšího mazlíčka. Jak již bylo zmíněno, ignoruje všechny NULL hodnoty.

Údaje o postavách

Při použití se sloupci znakových dat MAX() najde hodnotu, která je v porovnávací posloupnosti nejvyšší.

Příklad:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Výsledek:

+----------------------+
| MaximumProductName   |
|----------------------|
| Straw Dog Box        |
+----------------------+

DISTINCT Klíčové slovo

Váš DBMS může povolit DISTINCT klíčové slovo, které se má použít s MAX() 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 MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Výsledek:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

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 ​​MAX() nemá žádný význam . DISTINCT klíčové slovo odstraní duplicity, ale v případě MAX() nebude to dělat žádný rozdíl, protože MAX() vrátí stejný výsledek bez ohledu na to, kolik řádků sdílí stejnou maximální hodnotu.

Funkce okna

V závislosti na vašem DBMS možná budete moci použít OVER klauzule s vaším MAX() 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 MAX() funkce s OVER klauzule k aplikaci funkce okna na data.

SELECT 
    v.VendorName,
    p.ProductName,
    p.ProductPrice,
    MAX(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Maximum Price For This Vendor"
FROM Products p 
INNER JOIN Vendors v 
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Maximum Price For This Vendor";

Výsledek:

+---------------+---------------------------------+----------------+---------------------------------+
| VendorName    | ProductName                     | ProductPrice   | Maximum Price For This Vendor   |
|---------------+---------------------------------+----------------+---------------------------------|
| Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99           | 9.99                            |
| Mars Supplies | Long Weight (green)             | 11.99          | 25.99                           |
| Mars Supplies | Long Weight (blue)              | 14.75          | 25.99                           |
| Mars Supplies | Left handed screwdriver         | 25.99          | 25.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 MAX() 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é maximální cenu pro všechny produkty od daného dodavatele. Tato maximální cena se mění se změnou dodavatele (pokud nemá více dodavatelů stejnou maximá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() , MIN() , AVG() a COUNT() .


  1. prázdný řetězec v orákulu

  2. Jak zkontrolovat, zda existuje trigger v PostgreSQL?

  3. Zavřít nebylo v databázi nikdy explicitně voláno

  4. MySQL Přidat cizí klíč