Database
 sql >> Base de données >  >> RDS >> Database

SQL MIN() pour les débutants

En SQL, le MIN() function est une fonction d'agrégation qui renvoie la valeur minimale dans une expression donnée.

Vous trouverez ci-dessous quelques exemples de base pour montrer comment cela fonctionne.

Exemple de tableau

Supposons que nous ayons le tableau suivant :

SELECT * FROM Products;

Résultat :

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

Exemple

Voici un exemple simple pour illustrer.

SELECT MIN(ProductPrice)
FROM Products;

Résultat :

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

Dans ce cas, les informations de prix sont stockées dans le ProductPrice colonne, et nous la passons donc comme argument au MIN() fonction, qui calcule ensuite et renvoie le résultat.

Utiliser des alias de colonne

Vous remarquerez que les résultats précédents n'incluent pas de nom de colonne. Il faut s'y attendre, car le MIN() La fonction ne renvoie aucune colonne. Vous pouvez facilement fournir un nom de colonne en attribuant un alias.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Résultat :

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

Résultats filtrés

Le MIN() La fonction opère sur les lignes renvoyées par la requête. Donc si vous filtrez les résultats, le résultat de MIN() reflétera cela.

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

Résultat :

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

Dans ce cas, 11,99 est le prix minimum de tous les produits proposés par le fournisseur spécifié.

NULL Valeurs

Le MIN() la fonction ignore tout NULL valeurs. Dans notre exemple de tableau ci-dessus, numéro de produit 6 a NULL dans son ProductPrice colonne, mais cela a été ignoré dans notre MIN() exemple.

En fonction de votre SGBD et de vos paramètres, vous pouvez ou non voir un avertissement indiquant que NULL les valeurs ont été éliminées dans le jeu de résultats.

Voici un exemple de ce que vous pourriez voir :

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Résultat :

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

Tout cela nous indique que la colonne contenait au moins un NULL valeur, et qu'elle a été ignorée lors du calcul des résultats.

Données de date/heure

Vous pouvez utiliser MIN() sur les valeurs de date/heure.

Supposons que nous ayons le tableau suivant :

SELECT PetName, DOB 
FROM Pets;

Résultat :

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

Nous pouvons utiliser MIN() pour trouver la date de naissance minimum (DOB ).

SELECT MIN(DOB) AS MinDOB
FROM Pets;

Résultat :

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

Encore une fois, il ignore NULL valeurs.

Données de personnage

Lorsqu'il est utilisé avec des colonnes de données de caractères, MIN() trouve la valeur la plus basse dans la séquence de tri.

Exemple :

SELECT MIN(ProductName) AS MinimumProductName
FROM Products;

Résultat :

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

Le DISTINCT Mot clé

Votre SGBD peut autoriser le DISTINCT mot-clé à utiliser avec le MIN() une fonction. Si c'est le cas, c'est probablement pour se conformer à la norme ISO SQL.

Par conséquent, vous pourrez peut-être faire ceci :

SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;

Résultat :

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

Mais cela n'aura aucun impact sur les résultats.

Le DISTINCT le mot-clé peut être très utile lorsqu'il est utilisé avec d'autres contextes (par exemple avec le COUNT() fonction), mais elle n'a aucune signification lorsqu'elle est utilisée avec MIN() . Le DISTINCT le mot-clé supprime les doublons, mais dans le cas de MIN() cela ne fera aucune différence car MIN() renvoie le même résultat quel que soit le nombre de lignes partageant la même valeur minimale.

Fonctions de la fenêtre

Selon votre SGBD, vous pourrez peut-être utiliser un OVER clause avec votre MIN() fonction pour créer une fonction de fenêtre.

Une fonction de fenêtre effectue une opération de type agrégat sur un ensemble de lignes de requête. Il produit un résultat pour chaque ligne de requête. Cela contraste avec une opération d'agrégation, qui regroupe les lignes de requête en une seule ligne de résultat.

Voici un exemple pour illustrer le concept.

Nous avons déjà vu les Products table. Notre base de données possède également un Customers table, et elle contient les données suivantes :

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

Nous pouvons récupérer des données à partir de ces tables et les présenter sous la forme d'un ensemble de résultats à l'aide d'une jointure.

On peut aussi utiliser le MIN() fonction avec le OVER clause pour appliquer une fonction de fenêtre aux données.

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

Résultat :

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

Dans ce cas, nous avons utilisé le OVER clause avec notre MIN() fonction pour partitionner le résultat par nom de fournisseur.

Ce faisant, nous avons pu renvoyer des informations sur les prix de chaque produit, ainsi que le prix minimum pour tous les produits de ce fournisseur donné. Ce prix minimum change à mesure que le fournisseur change (à moins que plusieurs fournisseurs aient le même prix minimum), mais reste le même pour tous les produits du même fournisseur.

Ce concept peut également être appliqué à d'autres fonctions d'agrégation en SQL, telles que SUM() , AVG() , MAX() , et COUNT() .