Comment utiliser les expressions CASE dans SQL

De Get Docs
Aller à :navigation, rechercher

Introduction

Les langages de programmation comportent généralement des instructions conditionnelles, qui sont des commandes qui exécutent une action spécifiée jusqu'à ce qu'une certaine condition soit remplie. Une instruction conditionnelle courante est l'instruction if, then, else, qui suit généralement cette logique :

if condition=true

    then action A

    else action B

La logique de cette déclaration se traduit dans le langage suivant : "Si condition est vraie, alors effectuez action A. Sinon (else), effectuez action B."

Les expressions CASE sont une fonctionnalité du langage SQL (Structured Query Language) qui vous permet d'appliquer une logique similaire aux requêtes de base de données et de définir des conditions sur la manière dont vous souhaitez renvoyer ou afficher les valeurs dans votre ensemble de résultats.

Dans ce didacticiel, vous apprendrez à utiliser l'expression CASE pour définir des conditions sur vos données à l'aide de WHEN, THEN, ELSE et [X141X ] mots-clés.

Conditions préalables

Pour terminer ce tutoriel, vous aurez besoin de :

  • Un serveur exécutant Ubuntu 20.04, avec un utilisateur non root avec des privilèges administratifs sudo et un pare-feu activé. Suivez notre Configuration initiale du serveur avec Ubuntu 20.04 pour commencer.
  • MySQL installé et sécurisé sur le serveur. Suivez notre guide Comment installer MySQL sur Ubuntu 20.04 pour le configurer. Ce guide suppose que vous avez également configuré un utilisateur MySQL non root, comme indiqué à l'Étape 3 de ce guide.

Remarque : Veuillez noter que de nombreux systèmes de gestion de bases de données relationnelles utilisent leurs propres implémentations uniques de SQL. Bien que les commandes décrites dans ce didacticiel fonctionnent sur la plupart des SGBDR, la syntaxe exacte ou la sortie peuvent différer si vous les testez sur un système autre que MySQL.


Pour vous exercer à utiliser les expressions CASE dans ce didacticiel, vous aurez besoin d'une base de données et d'une table contenant des exemples de données. Si vous n'en avez pas de prêt à insérer, vous pouvez lire la section suivante Connexion à MySQL et configuration d'un exemple de base de données pour apprendre à créer une base de données et une table. Ce didacticiel fera référence à cet exemple de base de données et de table tout au long.

Vous pouvez également utiliser un terminal interactif intégré à cette page pour tester les exemples de requêtes de ce didacticiel. Cliquez sur le bouton Launch an Interactive Terminal! suivant pour commencer.

Lancez une borne interactive !

Connexion à MySQL et configuration d'un exemple de base de données

Si votre base de données SQL s'exécute sur un serveur distant, connectez-vous en SSH à votre serveur depuis votre machine locale :

ssh [email protected]_server_ip

Ensuite, ouvrez l'invite MySQL, en remplaçant sammy par les informations de votre compte utilisateur MySQL. Si vous utilisez la borne interactive embarquée sur cette page, notez que le mot de passe à utiliser lorsque vous y êtes invité est le mot secret :

mysql -u sammy -p

Créez une base de données nommée caseDB :

CREATE DATABASE caseDB;

Si la base de données a été créée avec succès, vous recevrez le résultat suivant :

OutputQuery OK, 1 row affected (0.01 sec)

Pour sélectionner la base de données caseDB, exécutez l'instruction USE suivante :

USE caseDB;
OutputDatabase changed

Après avoir sélectionné la base de données, créez une table à l'intérieur de celle-ci. Pour les exemples de ce didacticiel, nous allons créer une table contenant des données sur les dix albums les plus vendus de tous les temps. Ce tableau contiendra les six colonnes suivantes :

  • music_id : affiche les valeurs du type de données int et servira de clé primaire [1] de la table, ce qui signifie que chaque valeur de cette colonne fonctionnera comme un identifiant unique pour son rangée.
  • artist_name : stocke le nom de chaque artiste en utilisant le type de données varchar avec un maximum de 30 caractères.
  • album_name : utilise le type de données varchar, encore une fois avec un maximum de 30 caractères pour contenir les noms de chaque album.
  • release_date : suit la date de sortie de chaque album à l'aide du type de données DATE, qui utilise le format de date YYYY-MM-DD.
  • genre_type : affiche la classification de genre pour chaque album en utilisant le type de données varchar avec un maximum de 25 caractères.
  • copies_sold : utilise le type de données decimal pour stocker le nombre total d'exemplaires d'albums vendus par millions. Cette colonne spécifie une précision de quatre avec une échelle de un, ce qui signifie que les valeurs de cette colonne peuvent avoir quatre chiffres, l'un de ces chiffres étant à droite de la virgule décimale.

Créez une table nommée top_albums qui contient chacune de ces colonnes en exécutant la commande CREATE TABLE suivante :

CREATE TABLE top_albums (
music_id int, 
artist_name varchar(30),
album_name varchar(30), 
release_date DATE,
genre_type varchar(25),
copies_sold decimal(4,1),
PRIMARY KEY (music_id)
); 

Insérez ensuite quelques exemples de données dans le tableau vide :

INSERT INTO top_albums
(music_id, artist_name, album_name, release_date, genre_type, copies_sold)
VALUES
(1, 'Michael Jackson', 'Thriller', '1982-11-30', 'Pop', 49.2),
(2, 'Eagles', 'Hotel California', '1976-12-08', 'Soft Rock', 31.5),
(3, 'Pink Floyd', 'The Dark Side of the Moon', '1973-03-01', 'Progressive Rock', 21.7),
(4, 'Shania Twain', 'Come On Over', '1997-11-04', 'Country', 29.6),
(5, 'AC/DC', 'Back in Black', '1980-07-25', 'Hard Rock', 29.5),
(6, 'Whitney Houston', 'The Bodyguard', '1992-11-25', 'R&B', 32.4),
(7, 'Fleetwood Mac', 'Rumours', '1977-02-04', 'Soft Rock', 27.9),
(8, 'Meat Loaf', 'Bat Out of Hell', '1977-10-11', 'Hard Rock', 21.7),
(9, 'Eagles', 'Their Greatest Hits 1971-1975', '1976-02-17', 'Country Rock', 41.2),
(10, 'Bee Gees', 'Saturday Night Fever', '1977-11-15', 'Disco', 21.6);
OutputQuery OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

Une fois que vous avez inséré les données, vous êtes prêt à commencer à utiliser les expressions CASE dans SQL.

Présentation de la syntaxe des expressions CASE

Les expressions CASE vous permettent de définir des conditions pour vos données et d'utiliser une logique similaire aux instructions if-then pour rechercher vos données, comparer les valeurs et évaluer si elles correspondent comme « vraies » aux conditions que vous avez définies. . Voici un exemple de syntaxe générale pour une expression CASE :

Syntaxe des expressions CASE

. . .
CASE 
    WHEN condition_1 THEN outcome_1
    WHEN condition_2 THEN outcome_2
    WHEN condition_3 THEN outcome_3
    ELSE else_outcome
END 
. . .

En fonction du nombre de conditions que vous souhaitez définir pour vos données, vous inclurez également les mots clés suivants dans une expression CASE :

  • WHEN : ce mot-clé évalue et compare les valeurs de données que vous avez dans votre tableau aux conditions ou critères que vous avez définis. WHEN est comparable à if dans une instruction if-then-else typique.
  • THEN : ce mot-clé filtre chaque condition que vous avez éventuellement définie si une valeur particulière ne répond pas aux critères.
  • ELSE : si la valeur de données ne répond à aucune des conditions que vous avez définies après avoir parcouru chaque instruction WHEN et THEN, ce mot-clé peut être utilisé pour spécifier la condition finale dans laquelle il peut être classé.
  • END : pour exécuter avec succès l'expression CASE et définir vos conditions, vous devez terminer par le mot-clé END.

Avec cette compréhension de la structure et de la syntaxe des expressions CASE, vous êtes prêt à commencer à vous entraîner avec les exemples de données.

Utilisation des expressions CASE

Imaginez que vous êtes un DJ préparant une setlist pour la célébration du 65e anniversaire de votre excentrique tante Carol. Vous savez que ses goûts sont difficiles à cerner, alors vous décidez de faire des recherches sur les dix albums les plus vendus de tous les temps pour éclairer certaines de vos décisions musicales.

Tout d'abord, passez en revue la liste que vous avez compilée dans le tableau top_albums en exécutant SELECT et le symbole * pour afficher toutes les données de chaque colonne :

SELECT * FROM top_albums;
Output+----------+-----------------+-------------------------------+--------------+------------------+-------------+
| music_id | artist_name     | album_name                    | release_date | genre_type       | copies_sold |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
|        1 | Michael Jackson | Thriller                      | 1982-11-30   | Pop              |        49.2 |
|        2 | Eagles          | Hotel California              | 1976-12-08   | Soft Rock        |        31.5 |
|        3 | Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Progressive Rock |        21.7 |
|        4 | Shania Twain    | Come On Over                  | 1997-11-04   | Country          |        29.6 |
|        5 | AC/DC           | Back in Black                 | 1980-07-25   | Hard Rock        |        29.5 |
|        6 | Whitney Houston | The Bodyguard                 | 1992-11-25   | R&B              |        32.4 |
|        7 | Fleetwood Mac   | Rumours                       | 1977-02-04   | Soft Rock        |        27.9 |
|        8 | Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Hard Rock        |        21.7 |
|        9 | Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Country Rock     |        41.2 |
|       10 | Bee Gees        | Saturday Night Fever          | 1977-11-15   | Disco            |        21.6 |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
10 rows in set (0.00 sec)

Depuis que tante Carol est née en 1957, elle a apprécié beaucoup de tubes des années 70 et 80 dans sa jeunesse. Vous savez qu'elle est une grande fan de pop, de soft rock et de disco, vous voulez donc les classer en priorité sur votre setlist.

Vous pouvez le faire en utilisant l'expression CASE pour définir une condition de « priorité élevée » pour ces genres particuliers en recherchant ces valeurs de données dans la colonne genre_type. La requête suivante fait cela et crée un alias pour la colonne résultante créée par l'expression CASE, en la nommant priority. Cette requête inclut également artist_name, album_name et release_date pour plus de contexte. N'oubliez pas d'utiliser le mot clé END pour compléter votre expression CASE complète :

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Pop' THEN 'High Priority' 
WHEN genre_type = 'Soft Rock' THEN 'High Priority'
WHEN genre_type = 'Disco' THEN 'High Priority'
END AS priority
FROM top_albums;
Output+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | priority      |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | NULL          |
| Shania Twain    | Come On Over                  | 1997-11-04   | NULL          |
| AC/DC           | Back in Black                 | 1980-07-25   | NULL          |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | NULL          |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | NULL          |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | NULL          |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

Même si cette sortie reflète les conditions que vous avez définies pour ces types de genre High Priority, puisque vous avez omis le mot-clé ELSE, cela se traduit par des valeurs de données inconnues ou manquantes appelées valeurs NULL. . Bien que le mot-clé ELSE ne soit pas nécessaire si vos valeurs de données remplissent toutes les conditions que vous avez définies dans l'expression CASE, il est utile pour toutes les données résiduelles afin qu'elles puissent être correctement classées sous une seule état.

Pour cette requête suivante, écrivez la même expression CASE, mais cette fois définissez une condition avec le mot-clé ELSE. Dans l'exemple suivant, l'argument ELSE étiquette toutes les valeurs de données non prioritaires pour genre_type comme « Peut-être » :

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Pop' THEN 'High Priority' 
WHEN genre_type = 'Soft Rock' THEN 'High Priority'
WHEN genre_type = 'Disco' THEN 'High Priority'
ELSE 'Maybe'
END AS priority
FROM top_albums;
[sceondary_label Output]
+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | priority      |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Maybe         |
| Shania Twain    | Come On Over                  | 1997-11-04   | Maybe         |
| AC/DC           | Back in Black                 | 1980-07-25   | Maybe         |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | Maybe         |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Maybe         |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Maybe         |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

Cette sortie est maintenant beaucoup plus représentative des conditions que vous avez définies pour les albums avec la priorité la plus élevée et ceux qui n'en ont pas. Même si cela aide à prioriser les quatre meilleurs albums - Thriller, Hotel California, Rumours et Saturday Night Fever - vous êtes convaincu qu'il doit y avoir plus de variété sur cette set-list. Mais vous devrez également en persuader tante Carol.

Vous décidez de réaliser une petite expérience et demandez à tante Carol d'élargir sa palette musicale et d'écouter les albums restants. Vous ne fournissez aucun contexte sur les albums et lui demandez de les noter honnêtement comme "Mellow", "Fun" ou "Boring". Une fois qu'elle a terminé, elle vous remet une liste manuscrite avec ses scores. Vous disposez maintenant des informations nécessaires pour définir les conditions de votre requête comme suit :

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Hard Rock' THEN 'Boring' 
WHEN genre_type = 'Country Rock' THEN 'Mellow'
WHEN genre_type = 'Progressive Rock' THEN 'Fun'
WHEN genre_type = 'Country' THEN 'Fun'
WHEN genre_type = 'R&B' THEN 'Boring'
ELSE 'High Priority' 
END AS score
FROM top_albums;
Output
+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | score         |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Fun           |
| Shania Twain    | Come On Over                  | 1997-11-04   | Fun           |
| AC/DC           | Back in Black                 | 1980-07-25   | Boring        |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | Boring        |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Boring        |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Mellow        |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

Sur la base de cette sortie, tante Carol semble ouverte à de nouveaux sons, et vous êtes agréablement surpris par sa partition pour Pink Floyd. Mais vous êtes un peu déçu de son manque d'intérêt pour les excellents airs d'AC/DC, Meat Loaf et Whitney Houston.

Tante Carol peut être plus flexible si vous pouvez lui montrer que certains albums sont objectivement plus populaires que d'autres, alors vous décidez d'apporter quelques chiffres pour influencer la décision. Le fait est que ce sont les dix meilleurs albums car ils se sont vendus à des millions d'exemplaires aux fans au fil des décennies. Par conséquent, pour cette prochaine requête, vous allez créer une nouvelle expression CASE qui définit un score basé sur les données numériques de copies_sold des albums qui ont été vendus jusqu'à présent.

Vous utiliserez l'expression CASE pour définir des conditions pour les albums se vendant à au moins 35 millions d'exemplaires comme "meilleurs", ceux avec 25 millions comme "excellents", ceux avec 20 millions comme "bons" et rien de moins que cela comme "médiocre" comme dans l'exemple suivant :

SELECT artist_name, album_name, release_date, CASE WHEN copies_sold >35.0 THEN 'best'
WHEN copies_sold >25.0 THEN 'great'
WHEN copies_sold >20.0 THEN 'good'
ELSE 'mediocre' END AS score FROM top_albums;
Output+-----------------+-------------------------------+--------------+-------+
| artist_name     | album_name                    | release_date | score |
+-----------------+-------------------------------+--------------+-------+
| Michael Jackson | Thriller                      | 1982-11-30   | best  |
| Eagles          | Hotel California              | 1976-12-08   | great |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | good  |
| Shania Twain    | Come On Over                  | 1997-11-04   | great |
| AC/DC           | Back in Black                 | 1980-07-25   | great |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | great |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | great |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | good  |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | best  |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | good  |
+-----------------+-------------------------------+--------------+-------+
10 rows in set (0.00 sec)

Sur la base de cette sortie, aucun album n'a été classé comme "médiocre" puisqu'ils se sont chacun vendus à plus de 20 millions d'exemplaires. Cependant, certains albums se démarquent des autres en fonction des partitions. Vous pouvez maintenant fournir à tante Carol des preuves solides pour jouer AC/DC ou Whitney Houston puisque leurs albums se sont vendus à plus de 25 millions d'exemplaires, ce qui en fait deux des plus grandes œuvres musicales du marché.

Vous savez maintenant comment utiliser l'expression CASE pour définir des conditions à des fins diverses et avec des valeurs de données alphanumériques et numériques. En outre, comment CASE utilise la logique if-then pour comparer ces valeurs et générer les réponses en fonction des conditions souhaitées.

Conclusion

Comprendre comment utiliser l'expression CASE peut vous aider à affiner vos données selon les conditions que vous avez définies. Que vous souhaitiez définir des priorités différentes pour certaines valeurs ou les noter en fonction de critères d'opinion populaire ou de chiffres, il est flexible selon vos besoins. Si vous souhaitez en savoir plus sur les autres façons de manipuler les valeurs de données dans vos ensembles de résultats, consultez notre guide sur les fonctions CAST et les expressions de concaténation.