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

SQL MIN() per principianti

In SQL, il MIN() function è una funzione aggregata che restituisce il valore minimo 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

Ecco un semplice esempio da dimostrare.

SELECT MIN(ProductPrice)
FROM Products;

Risultato:

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

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

Utilizzo degli alias di colonna

Noterai che i risultati precedenti non includono un nome di colonna. Questo è prevedibile, perché MIN() la funzione non restituisce alcuna colonna. Puoi facilmente fornire un nome di colonna assegnando un alias.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Risultato:

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

Risultati filtrati

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

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

Risultato:

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

In questo caso, 11,99 è il prezzo minimo di tutti i prodotti offerti dal fornitore specificato.

NULL Valori

Il MIN() 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 MIN() 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 MIN(ProductPrice) AS MinimumPrice
FROM Products;

Risultato:

+----------------+
| MinimumPrice   |
|----------------|
| 9.99           |
+----------------+
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 MIN() 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 MIN() per trovare la data minima di nascita (DOB ).

SELECT MIN(DOB) AS MinDOB
FROM Pets;

Risultato:

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

Di nuovo, ignora NULL valori.

Dati sui personaggi

Se utilizzato con colonne di dati carattere, MIN() trova il valore più basso nella sequenza di ordinamento.

Esempio:

SELECT MIN(ProductName) AS MinimumProductName
FROM Products;

Risultato:

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

Il DISTINCT Parola chiave

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

Pertanto, potresti essere in grado di farlo:

SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;

Risultato:

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

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 MIN() . Il DISTINCT la parola chiave rimuove i duplicati, ma nel caso di MIN() non farà alcuna differenza perché MIN() restituisce lo stesso risultato indipendentemente dal numero di righe che condividono lo stesso valore minimo.

Funzioni della finestra

A seconda del tuo DBMS, potresti essere in grado di utilizzare un OVER clausola con il tuo MIN() 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 MIN() funzione con il OVER clausola per applicare una funzione finestra ai dati.

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

Risultato:

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

In questo caso abbiamo usato il OVER clausola con il nostro MIN() 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 minimo per tutti i prodotti di quel determinato fornitore. Questo prezzo minimo cambia al variare del fornitore (a meno che più fornitori non abbiano lo stesso prezzo minimo), 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() , AVG() , MAX() e COUNT() .