Cours 3 SGBD GEII 2021
Cours 3 SGBD GEII 2021
Cours 3 SGBD GEII 2021
1
Cours : les commandes SQL
La commande SELECT:
L’utilisation la plus courante de SQL consiste à lire des données issues de la base de données. Cela s’effectue
grâce à la commande SELECT, qui retourne des enregistrements dans un tableau de résultat. Cette commande
peut sélectionner une ou plusieurs colonnes d’une table.
Commande basique
L’utilisation basique de cette commande s’effectue de la manière suivante :
SELECT nom_du_champ FROM nom_du_tableau
Cette requête va sélectionner (SELECT) le champ « nom_du_champ » provenant (FROM) du tableau appelé «
nom_du_tableau ».
Exemple
Imaginons une base de données appelée « client » qui contient des informations sur les clients d’une entreprise.
Table « client » :
Si l’on veut avoir la liste de toutes les villes des clients, il suffit d’effectuer la requête suivante :
SELECT ville FROM client
Résultat :
Afficher plusieurs colonnes
Avec la même table client il est possible de lire plusieurs colonnes à la fois. Il suffit tout simplement de
séparer les noms des champs souhaités par une virgule. Pour obtenir les prénoms et les noms des clients il
faut alors faire la requête suivante:
SELECT prenom, nom
FROM client
Résultat :
prenom Nom
Pierre Dupond
Sabrina Durand
Julien Martin
David Bernard
Marie Leroy
2
Afficher toutes les colonnes d’un tableau
Il est possible de retourner automatiquement toutes les colonnes d’un tableau sans avoir à connaître le nom
de toutes les colonnes. Au lieu de lister toutes les colonnes, il faut simplement utiliser le caractère « * »
(étoile). C’est un joker qui permet de sélectionner toutes les colonnes. Il s’utilise de la manière suivante :
SELECT * FROM client
Cette requête retourne exactement les mêmes colonnes qu’il y a dans la base de données. Dans notre cas, le résultat
sera donc :
identifiant prenom nom Ville
1 Pierre Dupond Paris
2 Sabrina Durand Nantes
3 Julien Martin Lyon
4 David Bernard Marseille
5 Marie Leroy Grenoble
SQL DISTINCT
L’utilisation de la commande SELECT en SQL permet de lire toutes les données d’une ou plusieurs colonnes.
Cette commande peut potentiellement afficher des lignes en doubles. Pour éviter des redondances dans les
résultats il faut simplement ajouter DISTINCT après le mot SELECT.
Commande basique
L’utilisation basique de cette commande consiste alors à effectuer la requête suivante :
SELECT DISTINCT ma_colonne FROM nom_du_tableau
Exemple
Prenons le cas concret d’une table « client » qui contient des noms et prénoms :
identifiant prenom Nom
1 Pierre Dupond
2 Sabrina Bernard
3 David Durand
4 Pierre Leroy
5 Marie Leroy
En utilisant seulement SELECT tous les noms sont retournés, or la table contient plusieurs fois le même
prénom (cf. Pierre). Pour sélectionner uniquement les prénoms uniques il faut utiliser la requête suivante :
3
SELECT DISTINCT prenom FROM client
Résultat :
Ce résultat affiche volontairement qu’une seule fois le prénom « Pierre » grâce à l’utilisation de la
commande DISTINCT qui n’affiche que les résultats distincts.
L’utilisation de la commande DISTINCT est très pratique pour éviter les résultats en doubles. Cependant, pour
optimiser les performances il est préférable d’utiliser la commande SQL GROUP BY lorsque c’est possible.
SQL AS (alias)
Dans le langage SQL il est possible d’utiliser des alias pour renommer temporairement une colonne ou une
table dans une requête. Cette astuce est particulièrement utile pour faciliter la lecture des requêtes.
Alias sur une colonne
Permet de renommer le nom d’une colonne dans les résultats d’une requête SQL. C’est pratique pour avoir un
nom facilement identifiable dans une application qui doit ensuite exploiter les résultats d’une recherche.
Alias sur une table
Permet d’attribuer un autre nom à une table dans une requête SQL. Cela peut aider à avoir des noms plus
court, plus simple et plus facilement compréhensible. Ceci est particulièrement vrai lorsqu’il y a des
jointures.
Syntaxe
Alias sur une colonne
La syntaxe pour renommer une colonne de colonne1 à c1 est la suivante :
SELECT colonne1 AS c1, colonne2
FROM `table`
A noter : à choisir il est préférable d’utiliser la commande « AS » pour que ce soit plus explicite (plus simple
à lire qu’un simple espace), d’autant plus que c’est recommandé dans le standard ISO pour concevoir une
requête SQL.
Alias sur une table
La syntaxe pour renommer une table dans une requête est la suivante :
SELECT *
FROM `nom_table` AS t1
Exemple
Renommer une colonne
Imaginons un site d’e-commerce qui possède une table de produits. Ces produits sont disponibles dans une
même table dans plusieurs langues, dont le français. Le nom du produit peut ainsi être disponible dans la
colonne « nom_fr_fr », « nom_en_gb » ou « nom_en_us ». Pour utiliser l’un ou l’autre des titres dans le
reste de l’application sans avoir à se soucier du nom de la colonne, il est possible de renommer la colonne
4
de son choix avec un nom générique. Dans notre cas, la requête pourra ressemble à ceci :
SELECT p_id, p_nom_fr_fr AS nom, p_description_fr_fr AS description,
p_prix_euro AS prix
FROM `produit`
Résultat :
id nom description Prix
1 Ecran Ecran de grandes tailles. 399.99
2 Clavier Clavier sans fil. 27
3 Souris Souris sans fil. 24
4 Ordinateur portable Grande autonomie et et sacoche offerte. 700
Imaginons que les produits du site e-commerce soit répartis dans des catégories. Pour récupérer la liste des
produits en même temps que la catégorie auquel il appartient il est possible d’utiliser une requête SQL avec
une jointure. Cette requête peut utiliser des alias pour éviter d’utiliser à chaque fois le nom des tables.
Cette astuce est encore plus pratique lorsqu’il y a des noms de tables encore plus compliqués et lorsqu’il
y a beaucoup de jointures.
SQL WHERE
La commande WHERE dans une requête SQL permet d’extraire les lignes d’une base de données qui respectent
une condition. Cela permet d’obtenir uniquement les informations désirées.
Syntaxe
La commande WHERE s’utilise en complément à une requête utilisant SELECT. La façon la plus
simple de l’utiliser est la suivante :
SELECT nom_colonnes FROM nom_table
WHERE condition
Exemple
Imaginons une base de données appelée « client » qui contient le nom des clients, le nombre de
commandes qu’ils ont effectués et leur ville :
id nom nbr_commande Ville
1 Paul 3 Paris
2 Maurice 0 Rennes
3 Joséphine 1 Toulouse
5
4 Gérard 7 Paris
Pour obtenir seulement la liste des clients qui habitent à Paris, il faut effectuer la requête suivante :
SELECT *
FROM client
WHERE ville = 'paris'
Résultat :
id nom nbr_commande nbr_commande
1 Paul 3 Paris
4 Gérard 7 Paris
Attention : dans notre cas tout est en minuscule donc il n’y a pas eu de problème. Cependant, si une table
est sensible à la casse, il faut faire attention aux majuscules et minuscules.
Opérateurs de comparaisons
Il existe plusieurs opérateurs de comparaisons. La liste ci-jointe présente quelques uns des
opérateurs les plus couramment utilisés.
Opérateur Description
= Égale
<> Pas égale
!= Pas égale
> Supérieur à
< Inférieur à
>= Supérieur ou égale à
<= Inférieur ou égale à
IN Liste de plusieurs valeurs possible
BETWEEN Valeur comprise dans un intervalle donnée (utile pour les nombres ou dates)
LIKE Recherche en spécifiant le début, milieu ou fin d'un mot.
IS NULL Valeur est nulle
IS NOT NULL Valeur n'est pas nulle
6
SELECT nom_colonnes FROM nom_table WHERE condition1 OR condition2
Ces opérateurs peuvent être combinés à l’infini et mélangés. L’exemple ci-dessous filtre les résultats de la table «
nom_table » si condition1 ET condition2 OU condition3 est vrai :
SELECT nom_colonnes FROM nom_table
WHERE condition1 AND (condition2 OR condition3)
Attention : il faut penser à utiliser des parenthèses lorsque c’est nécessaire. Cela permet d’éviter les erreurs car et ça
améliore la lecture d’une requête par un humain.
Exemple de données
Pour illustrer les prochaines commandes, nous allons considérer la table « produit » suivante :
Opérateur AND
L’opérateur AND permet de joindre plusieurs conditions dans une requête. En gardant la même table que
précédemment, pour filtrer uniquement les produits informatique qui sont presque en rupture de stock (moins
de 20 produits disponible) il faut exécuter la requête suivante :
SELECT * FROM produit
WHERE categorie = 'informatique' AND stock < 20
Résultat :
id nom categorie stock Prix
1 ordinateur informatique 5 950
3 souris informatique 16 30
Opérateur OR
Pour filtrer les données pour avoir uniquement les données sur les produits « ordinateur » ou
« clavier » il faut effectuer la recherche suivante :
SELECT * FROM produit
WHERE nom = 'ordinateur' OR nom = 'clavier'
Résultats :
Combiner AND et OR
7
Il ne faut pas oublier que les opérateurs peuvent être combinés pour effectuer de puissantes recherche. Il
est possible de filtrer les produits « informatique » avec un stock inférieur à 20 et les produits « fourniture
» avec un stock inférieur à 200 avec la recherche suivante :
SELECT * FROM produit
WHERE ( categorie = 'informatique' AND stock < 20 ) OR ( categorie =
'fourniture' AND stock < 200 )
Résultats :
SQL IN
L’opérateur logique IN dans SQL s’utilise avec la commande WHERE pour vérifier si une colonne est égale à
une des valeurs comprises dans set de valeurs déterminés. C’est une méthode simple pour vérifier si une
colonne est égale à une valeur OU une autre valeur OU une autre valeur et ainsi de suite, sans avoir à utiliser de
multiple fois l’opérateur OR.
Syntaxe
Pour chercher toutes les lignes où la colonne « nom_colonne » est égale à ‘valeur 1′ OU ‘valeur 2′ ou
‘valeur 3′, il est possible d’utiliser la syntaxe suivante :
SELECT nom_colonne FROM table
WHERE nom_colonne IN ( valeur1, valeur2, valeur3, ... )
A savoir : entre les parenthèses il n’y a pas de limite du nombre d’arguments. Il est possible
d’ajouter encore d’autres valeurs.
Cette syntaxe peut être associée à l’opérateur NOT pour recherche toutes les lignes qui ne sont pas égales à
l’une des valeurs stipulées.
Simplicité de l’opérateur IN
La syntaxe utilisée avec l’opérateur est plus simple que d’utiliser une succession d’opérateur OR.
Pour le montrer concrètement avec un exemple, voici 2 requêtes qui retournerons les mêmes résultats,
l’une utilise l’opérateur IN, tandis que l’autre utilise plusieurs OR.
8
Requête équivalent avec l’opérateur IN
SELECT prenom FROM utilisateur
WHERE prenom IN ( 'Maurice', 'Marie', 'Thimoté' )
Exemple
Imaginons une table « adresse » qui contient une liste d’adresse associée à des utilisateurs d’une
application.
Si l’ont souhaite obtenir les enregistrements des adresses de Paris et de Graimbouville, il est
possible d’utiliser la requête suivante :
SELECT *
FROM adresse
WHERE addr_ville IN ( 'Paris', 'Graimbouville' )
Résultats :
L’opérateur BETWEEN est utilisé dans une requête SQL pour sélectionner un intervalle de données dans
une requête utilisant WHERE. L’intervalle peut être constitué de chaînes de caractères, de nombres ou de
dates. L’exemple le plus concret consiste par exemple à récupérer uniquement les enregistrements entre 2
dates définies.
Syntaxe
9
La requête suivante retournera toutes les lignes dont la valeur de la colonne « nom_colonne » sera comprise
entre valeur1 et valeur2.
Imaginons une table « utilisateur » qui contient les membres d’une application en ligne.
id nom date_inscription
1 Maurice 2012•03•02
2 Simon 2012•03•05
3 Chloé 2012•04•14
4 Marie 2012•04•15
5 Clémentine 2012•04•26
Si l’ont souhaite obtenir les membres qui se sont inscrit entre le 1 avril 2012 et le 20 avril 2012 il est
possible d’effectuer la requête suivante :
SELECT *
FROM utilisateur
WHERE date_inscription BETWEEN ’2012-04-01′ AND ’2012-04-20′
Résultat :
id nom date_inscription
3 Chloé 2012•04•14
4 Marie 2012•04•15
Si l’ont souhaite obtenir tous les résultats dont l’identifiant n’est pas situé entre 4 et 10, il faudra alors
utiliser la requête suivante :
SELECT *
FROM utilisateur
WHERE id NOT BETWEEN 4 AND 10
Résultat :
id nom date_inscription
1 Maurice 2012•03•02
2 Simon 2012•03•05
3 Chloé 2012•04•14
SQL LIKE
L’opérateur LIKE est utilisé dans la clause WHERE des requêtes SQL. Ce mot-clé permet d’effectuer une
recherche sur un modèle particulier. Il est par exemple possible de rechercher les enregistrements dont la
10
valeur d’une colonne commence par telle ou telle lettre. Les modèles de recherches sont multiple.
Syntaxe
Dans cet exemple le « modèle » n’a pas été défini, mais il ressemble très généralement à l’un des
exemples suivants :
• LIKE ‘%a’ : le caractère « % » est un caractère joker qui remplace tous les autres caractères. Ainsi, ce
modèle permet de rechercher toutes les chaines de caractère qui se termine par un
« a ».
• LIKE ‘a%’ : ce modèle permet de rechercher toutes les lignes de « colonne » qui commence par un
« a ».
• LIKE ‘%a%’ : ce modèle est utilisé pour rechercher tous les enregistrement qui utilisent le
caractère « a ».
• LIKE ‘pa%on’ : ce modèle permet de rechercher les chaines qui commence par « pa » et qui se
terminent par « on », comme « pantalon » ou « pardon ».
• LIKE ‘a_c’ : peu utilisé, le caractère « _ » (underscore) peut être remplacé par n’importe quel
caractère, mais un seul caractère uniquement (alors que le symbole pourcentage « % » peut être
remplacé par un nombre incalculable de caractères . Ainsi, ce modèle permet de retourner les lignes «
aac », « abc » ou même « azc ».
Exemple
Imaginons une table « client » qui contient les enregistrement d’utilisateurs :
id nom ville
1 Léon Lyon
2 Odette Nice
3 Vivien Nantes
4 Etienne Lille
Si l’on souhaite obtenir uniquement les clients des villes qui commencent par un « N », il est
possible d’utiliser la requête suivante :
SELECT *
FROM client
WHERE ville LIKE 'N%'
id nom ville
2 Odette Nice
11
3 Vivien Nantes
SELECT *
FROM client
WHERE ville LIKE '%e'
Résultat :
id nom ville
2 Odette Nice
4 Etienne Lille
Dans le langage SQL, l’opérateur IS permet de filtrer les résultats qui contiennent la valeur NULL. Cet
opérateur est indispensable car la valeur NULL est une valeur inconnue et ne peut par conséquent pas être
filtrée par les opérateurs de comparaison (cf. égal, inférieur, supérieur ou différent).
Syntaxe
Pour filtrer les résultats où les champs d’une colonne sont à NULL il convient d’utiliser la
syntaxe suivante :
SELECT *
FROM `table`
WHERE nom_colonne IS NULL
A l’inverse, pour filtrer les résultats et obtenir uniquement les enregistrements qui ne sont pas null, il
convient d’utiliser la syntaxe suivante :
SELECT *
FROM `table`
WHERE nom_colonne IS NOT NULL
A savoir : l’opérateur IS retourne en réalité un booléen, c’est à dire une valeur TRUE si la condition est
vrai ou FALSE si la condition n’est pas respectée. Cet opérateur est souvent utilisé avec la condition
WHERE mais peut aussi trouvé son utilité lorsqu’une sous-requête est utilisée.
Exemple
Imaginons une application qui possède une table contenant les utilisateurs. Cette table possède 2 colonnes
pour associer les adresses de livraison et de facturation à un utilisateur (grâce à une clé étrangère). Si cet
utilisateur n’a pas d’adresse de facturation ou de livraison, alors le champ reste à NULL.
12
Table « utilisateur » :
Il est possible d’obtenir la liste des utilisateurs qui ne possèdent pas d’adresse de livraison en utilisant
la requête SQL suivante :
SELECT *
FROM `utilisateur`
WHERE `fk_adresse_livraison_id` IS NULL
Résultat :
Les enregistrements retournés montrent bien que seul les utilisateurs ayant la valeur NULL pour le champ
de l’adresse de livraison.
Pour obtenir uniquement les utilisateurs qui possèdent une adresse de livraison il convient de lancer la
requête SQL suivante :
SELECT *
FROM `utilisateur`
WHERE `fk_adresse_livraison_id` IS NOT NULL
Résultat :
Les lignes retournées sont exclusivement celles qui n’ont pas une valeur NULL pour le champ de
l’adresse de livraison.
SQL GROUP BY
La commande GROUP BY est utilisée en SQL pour grouper plusieurs résultats et utiliser une fonction de
totaux sur un groupe de résultat. Sur une table qui contient toutes les ventes d’un magasin, il est par exemple
13
possible de lister et regrouper les ventes par clients identiques et d’obtenir le coût total des achats pour
chaque client.
A noter : cette commande doit toujours s’utiliser après la commande WHERE et avant la commande HAVING.
Exemple d’utilisation
Prenons en considération une table « achat » qui résume les ventes d’une boutique :
Ce tableau contient une colonne qui sert d’identifiant pour chaque ligne, une autre qui contient le nom
du client, le coût de la vente et la date d’achat.
Pour obtenir le coût total de chaque client en regroupant les commandes des mêmes clients, il faut utiliser
la requête suivante :
SELECT client, SUM(tarif) FROM achat
GROUP BY client
La fonction SUM() permet d’additionner la valeur de chaque tarif pour un même client. Le résultat
sera donc le suivant :
client SUM(tarif)
Pierre 262
Simon 47
Marie 38
La manière simple de comprendre le GROUP BY c’est tout simplement d’assimiler qu’il va éviter de présenter
plusieurs fois les mêmes lignes. C’est une méthode pour éviter les doublons.
Juste à titre informatif, voici ce qu’on obtient de la requête sans utiliser GROUP BY.
Requête :
14
SELECT client, SUM(tarif)
FROM achat
Résultat :
client SUM(tarif)
Pierre 262
Simon 47
Marie 38
Marie 38
Pierre 262
Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs enregistrements, il s’agit
des fonctions d’agrégations statistiques, les principales sont les suivantes :
• AVG() pour calculer la moyenne d’un set de valeur. Permet de connaître le prix du panier moyen
pour de chaque client
• COUNT() pour compter le nombre de lignes concernées. Permet de savoir combien d’achats a été
effectué par chaque client
• MAX() pour récupérer la plus haute valeur. Pratique pour savoir l’achat le plus cher
• MIN() pour récupérer la plus petite valeur. Utile par exemple pour connaître la date du premier achat
d’un client
• SUM() pour calculer la somme de plusieurs lignes. Permet par exemple de connaître le total de tous
les achats d’un client
Ces petites fonctions se révèlent rapidement indispensable pour travailler sur des données.
SQL HAVING
La condition HAVING en SQL est presque similaire à WHERE à la seule différence que HAVING
permet de filtrer en utilisant des fonctions telles que SUM(), COUNT(), AVG(), MIN() ou MAX().
Syntaxe
Cela permet donc de SÉLECTIONNER les colonnes DE la table « nom_table » en GROUPANT les lignes
qui ont des valeurs identiques sur la colonne « colonne1″ et que la condition de HAVING soit respectée.
Important : HAVING est très souvent utilisé en même temps que GROUP BY bien que ce ne soit pas
obligatoire.
Exemple
15
Pour utiliser un exemple concret, imaginons une table « achat » qui contient les achats de différents clients
avec le coût du panier pour chaque achat.
Si dans cette table on souhaite récupérer la liste des clients qui ont commandé plus de 40€, toute
commandes confondu alors il est possible d’utiliser la requête suivante :
SELECT client, SUM(tarif) FROM achat
GROUP BY client
HAVING SUM(tarif) > 40
Résultat :
client SUM(tarif)
Pierre 162
Simon 47
La cliente « Marie » a cumulée 38€ d’achat (un achat de 18€ et un autre de 20€) ce qui est inférieur à la limite de
40€ imposée par HAVING. En conséquent cette ligne n’est pas affichée dans le résultat.
SQL ORDER BY
La commande ORDER BY permet de trier les lignes dans un résultat d’une requête SQL. Il est possible de
trier les données sur une ou plusieurs colonnes, par ordre ascendant ou descendant.
Syntaxe
Une requête où l’ont souhaite filtrer l’ordre des résultats utilise la commande ORDER BY de la sorte :
SELECT colonne1, colonne2 FROM table
ORDER BY colonne1
Par défaut les résultats sont classés par ordre ascendant, toutefois il est possible d’inverser l’ordre en
utilisant le suffixe DESC après le nom de la colonne. Par ailleurs, il est possible de trier sur plusieurs
colonnes en les séparant par une virgule. Une requête plus élaboré ressemblerais alors cela :
SELECT colonne1, colonne2, colonne3 FROM table
ORDER BY colonne1 DESC, colonne2 ASC
16
A noter : il n’est pas obligé d’utiliser le suffixe « ASC » sachant que les résultats sont toujours classé par ordre
ascendant par défaut. Toutefois, c’est plus pratique pour mieux s’y retrouver, surtout si on a oublié l’ordre par
défaut.
Exemple
Pour l’ensemble de nos exemple, nous allons prendre un base « utilisateur » de test, qui contient les
données suivantes :
Pour récupérer la liste de ces utilisateurs par ordre alphabétique du nom de famille, il est possible
d’utiliser la requête suivante :
SELECT *
FROM utilisateur ORDER BY nom
Résultat :
id nom prenom date_inscription tarif_total
4 Dubois Chloé 2012•02•16 98
5 Dubois Simon 2012•02•23 27
2 Dupond Fabrice 2012•02•07 65
1 Durand Maurice 2012•02•05 145
3 Durand Fabienne 2012•02•13 90
En utilisant deux méthodes de tri, il est possible de retourner les utilisateurs par ordre alphabétique ET pour
ceux qui ont le même nom de famille, les trier par ordre décroissant d’inscription. La requête serait alors la
suivante :
SELECT *
FROM utilisateur
ORDER BY nom, date_inscription DESC
Résultat :
17
2 Dupond Fabrice 2012•02•07 65
3 Durand Fabienne 2012•02•13 90
1 Durand Maurice 2012•02•05 145
SQL LIMIT
La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre maximum de résultats que
l’ont souhaite obtenir. Cette clause est souvent associé à un OFFSET, c’est-à-dire effectuer un décalage sur
le jeu de résultat. Ces 2 clauses permettent par exemple d’effectuer des système de pagination (exemple :
récupérer les 10 articles de la page 4).
ATTENTION : selon le système de gestion de base de données, la syntaxe ne sera pas pareil. Ce tutoriel
va donc présenter la syntaxe pour MySQL et pour PostgreSQL.
Syntaxe simple
La syntaxe commune aux principales système de gestion de bases de données est la suivante :
SELECT *
FROM table LIMIT 10
Cette requête permet de récupérer seulement les 10 premiers résultats d’une table. Bien entendu, si la table
contient moins de 10 résultats, alors la requête retournera toutes les lignes.
Bon à savoir : la bonne pratique lorsque l’on utilise LIMIT consiste à utiliser également la clause
ORDER BY pour s’assurer que quoi qu’il en soit ce sont toujours les bonnes données qui sont présentées.
En effet, si le système de tri est non spécifié, alors il est en principe inconnu et les résultats peuvent être
imprévisible.
L’offset est une méthode simple de décaler les lignes à obtenir. La syntaxe pour utiliser une limite et un
offset est la suivante :
SELECT *
FROM table
LIMIT 10 OFFSET 5
Cette requête permet de récupérer les résultats 6 à 15 (car l’OFFSET commence toujours à 0). A titre
d’exemple, pour récupérer les résultats 16 à 25 il faudrait donc utiliser: LIMIT 10 OFFSET 15
18
SELECT *
FROM table LIMIT 5, 10;
Cette requête retourne les enregistrements 6 à 15 d’une table. Le premier nombre est l’OFFSET
tandis que le suivant est la limite.
Bon à savoir : pour une bonne compatibilité, MySQL accepte également la syntaxe LIMIT nombre
OFFSET nombre. En conséquent, dans la conception d’une application utilisant MySQL il est préférable
d’utiliser cette syntaxe car c’est potentiellement plus facile de migrer vers un autre système de gestion de
base de données sans avoir à ré-écrire toutes les requêtes.
Performance
Ce dernier chapitre est destiné à un public averti. Il n’est pas nécessaire de le comprendre
entièrement, mais simplement d’avoir compris les grandes lignes.
Certains développeurs pensent à tort que l’utilisation de LIMIT permet de réduire le temps d’exécution d’une
requête. Or, le temps d’exécution est sensiblement le même car la requête va permettre de récupérer toutes les
lignes (donc temps d’exécution identique) PUIS seulement les résultats définit par LIMIT et OFFSET seront
retournés. Au mieux, utiliser LIMIT permet de réduire le temps d’affichage car il y a moins de lignes à
afficher.
SQL CASE
Dans le langage SQL, la commande « CASE … WHEN … » permet d’utiliser des conditions de type « si /
sinon » (cf. if / else) similaire à un langage de programmation pour retourner un résultat disponible entre
plusieurs possibilités. Le CASE peut être utilisé dans n’importe quelle instruction ou clause, telle que
SELECT, UPDATE, DELETE, WHERE, ORDER BY ou HAVING.
Syntaxe
CASE a
WHEN 1 THEN 'un'
WHEN 2 THEN 'deux'
WHEN 3 THEN 'trois'
ELSE 'autre'
END
Dans cet exemple les valeurs contenus dans la colonne « a » sont comparé à 1, 2 ou 3. Si la
condition est vrai, alors la valeur située après le THEN sera retournée.
19
A noter : la condition ELSE est facultative et sert de ramasse-miette. Si les conditions précédentes ne sont
pas respectées alors ce sera la valeur du ELSE qui sera retournée par défaut.
Il est possible d’établir des conditions plus complexes pour récupérer un résultat ou un autre. Cela
s’effectue en utilisant la syntaxe suivante :
CASE
WHEN a=b THEN 'A égal à B'
WHEN a>b THEN 'A supérieur à B'
ELSE 'A inférieur à B'
END
Dans cet exemple les colonnes « a », « b » et « c » peuvent contenir des valeurs numériques. Lorsqu’elles
sont respectées, les conditions booléennes permettent de rentrer dans l’une ou l’autre des conditions.
Il est possible de reproduire le premier exemple présenté sur cette page en utilisant la syntaxe
suivante :
CASE
WHEN a=1 THEN 'un'
END
Exemple
Pour présenter le CASE dans le langage SQL il est possible d’imaginer une base de données utilisées par
un site de vente en ligne. Dans cette base il y a une table contenant les achats, cette table contient le nom
des produits, le prix unitaire, la quantité achetée et une colonne consacrée à une marge fictive sur certains
produits.
Table « achat » :
Il est possible d’effectuer une requête qui va afficher un message personnalisé en fonction de la valeur de
la marge. Le message sera différent selon que la marge soit égale à 1, supérieur à 1 ou inférieure à 1. La
requête peut se présenter de la façon suivante :
20
SELECT id, nom, marge_pourcentage, prix_unitaire, quantite, CASE
WHEN marge_pourcentage=1 THEN 'Prix ordinaire'
WHEN marge_pourcentage>1 THEN 'Prix supérieur à la normale' ELSE 'Prix
inférieur à la normale'
END
FROM `achat`
Résultat :
Ce résultat montre qu’il est possible d’afficher facilement des messages personnalisés selon des
conditions simples.
21
Afficher un prix unitaire différent selon une condition
Avec un CASE il est aussi possible d’utiliser des requêtes plus élaborées. Imaginons
maintenant que nous souhaitions multiplier le prix unitaire par 2 si la marge est
supérieur à 1, la diviser par 2 si la marge est inférieure à 1 et laisser le prix unitaire tel
quel si la marge est égale à 1. C’est possible grâce à la requête SQL :
SELECT id, nom, marge_pourcentage, prix_unitaire, quantite, CASE
WHEN marge_pourcentage=1 THEN prix_unitaire WHEN marge_pourcentage>1 THEN
prix_unitaire*2 ELSE prix_unitaire/2
END
FROM `achat`
Résultat :
22
SELECT id, nom, marge_pourcentage, prix_unitaire, quantite, CASE quantite
WHEN 0 THEN 'Erreur'
WHEN 1 THEN 'Offre de -5% pour le prochain achat' WHEN 2 THEN 'Offre de -6%
pour le prochain achat' WHEN 3 THEN 'Offre de -8% pour le prochain achat' ELSE
'Offre de -10% pour le prochain achat'
END
FROM `achat`
Résultat :
id nom surcharge prix_unitaire quantite CASE
1 Produit A 1.3 6 3 Offre de •8% pour le prochain achat
2 Produit B 1.5 8 2 Offre de •6% pour le prochain achat
3 Produit C 0.75 7 4 Offre de •10% pour le prochain achat
4 Produit D 1 15 2 Offre de •6% pour le prochain achat
Astuce : la condition ELSE peut parfois être utilisée pour gérer les erreurs.
UPDATE avec CASE
Comme cela a été expliqué au début, il est aussi possible d’utiliser le CASE à la suite de
la commande SET d’un UPDATE pour mettre à jour une colonne avec une données
spécifique selon une règle. Imaginons par exemple que l’ont souhaite offrir un produit
pour tous les achats qui ont une surcharge inférieur à 1 et que l’ont souhaite retirer un
produit pour tous les achats avec une surcharge supérieur à 1. Il est possible d’utiliser la
requête SQL suivante :
UPDATE `achat` SET `quantite` = (
CASE
WHEN `surcharge` < 1 THEN `quantite` + 1 WHEN `surcharge` > 1 THEN `quantite`
- 1 ELSE quantite
END
)
23