Database
 sql >> Database >  >> RDS >> Database

SQL MAX() per principianti

In SQL, il MAX() function è una funzione aggregata che restituisce il valore massimo in una determinata espressione.

Di seguito sono riportati alcuni esempi di base per dimostrare come funziona.

Tabella di esempio

Supponiamo di avere la seguente tabella:

SELECT * FROM Products;

Risultato:

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

Esempio

Possiamo usare la seguente query per ottenere il prezzo massimo da quella tabella.

SELECT MAX(ProductPrice)
FROM Products;

Risultato:

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

In questo caso, le informazioni sul prezzo sono memorizzate nel ProductPrice colonna, e quindi lo passiamo come argomento a MAX() funzione, che quindi calcola e restituisce il risultato.

Utilizzo degli alias di colonna

Noterai che i risultati precedenti non includono un nome di colonna. Alcuni DBMS possono utilizzare qualcosa come MAX(ProductPrice) come nome della colonna. Questo è prevedibile, perché MAX() la funzione non restituisce alcuna colonna. Puoi facilmente fornire un nome di colonna assegnando un alias.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Risultato:

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

Risultati filtrati

Il MAX() La funzione opera sulle righe restituite dalla query. Quindi, se filtri i risultati, il risultato di MAX() lo rifletterà.

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

Risultato:

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

In questo caso, 25,99 è il prezzo massimo su tutti i prodotti offerti dal fornitore specificato.

NULL Valori

Il MAX() la funzione ignora qualsiasi NULL valori. Nella nostra tabella di esempio sopra, il numero del prodotto 6 ha NULL nel suo ProductPrice colonna, ma è stata ignorata nel nostro MAX() esempio.

A seconda del tuo DBMS e delle tue impostazioni, potresti visualizzare o meno un avviso che NULL i valori sono stati eliminati nel set di risultati.

Ecco un esempio di ciò che potresti vedere:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Risultato:

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

Tutto questo ci dice è che la colonna conteneva almeno un NULL valore e che è stato ignorato durante il calcolo dei risultati.

Dati data/ora

Puoi usare MAX() sui valori di data/ora.

Supponiamo di avere la seguente tabella:

SELECT PetName, DOB 
FROM Pets;

Risultato:

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

Possiamo usare MAX() per trovare la data massima di nascita (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Risultato:

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

Questa sarebbe la data di nascita dell'animale più giovane. Come accennato, ignora qualsiasi NULL valori.

Dati sui personaggi

Se utilizzato con colonne di dati carattere, MAX() trova il valore più alto nella sequenza di confronto.

Esempio:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Risultato:

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

Il DISTINCT Parola chiave

Il tuo DBMS potrebbe consentire il DISTINCT parola chiave da utilizzare con MAX() funzione. Se è così, probabilmente è per conformarsi allo standard ISO SQL.

Pertanto, potresti essere in grado di farlo:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Risultato:

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

Ma non avrà alcun impatto sui risultati.

Il DISTINCT la parola chiave può essere molto utile se utilizzata con altri contesti (ad es. con COUNT() funzione), ma non ha significato se usato con MAX() . Il DISTINCT la parola chiave rimuove i duplicati, ma nel caso di MAX() non farà alcuna differenza perché MAX() restituisce lo stesso risultato indipendentemente dal numero di righe che condividono lo stesso valore massimo.

Funzioni della finestra

A seconda del tuo DBMS, potresti essere in grado di utilizzare un OVER clausola con il tuo MAX() funzione per creare una funzione finestra.

Una funzione finestra esegue un'operazione di tipo aggregato su un insieme di righe di query. Produce un risultato per ogni riga di query. Ciò è in contrasto con un'operazione di aggregazione, che raggruppa le righe di query in un'unica riga di risultati.

Ecco un esempio per dimostrare il concetto.

Abbiamo già visto i Products tavolo. Il nostro database ha anche un Customers tabella e contiene i seguenti dati:

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

Possiamo recuperare i dati da queste tabelle e presentarli come un set di risultati utilizzando un join.

Possiamo anche usare il MAX() funzione con il OVER clausola per applicare una funzione finestra ai dati.

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

Risultato:

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

In questo caso abbiamo usato il OVER clausola con il nostro MAX() funzione per partizionare il risultato in base al nome del fornitore.

In questo modo, siamo stati in grado di restituire le informazioni sui prezzi per ciascun prodotto, nonché il prezzo massimo per tutti i prodotti di quel determinato fornitore. Questo prezzo massimo cambia al variare del fornitore (a meno che più fornitori non abbiano lo stesso prezzo massimo), ma rimane lo stesso per tutti i prodotti dello stesso fornitore.

Questo concetto può essere applicato anche ad altre funzioni aggregate in SQL, come SUM() , MIN() , AVG() e COUNT() .