Liste des séquences
SELECT est la seule commande du SQL permettant d'interroger une base de données. Il existe d'autres commandes pour manipuler les données (ajouter, modifier), manipuler les structures (bases, vues, tables), gérer les utilisateurs et leurs droits, créer des procédures stockées.
Le résultat d'un SELECT est appelé un jeu d'enregistrements (recordset en anglais).
A partir du schéma relationnel ci-dessus, représentant la base d'un vendeur de logiciels (et qui va nous accompagner tout au long de ce cours), affichez l'ensemble de la table Produit.
Au lieu d'afficher toutes les colonnes (ou champs), on veut afficher uniquement le nom et le prénom (c'est à dire les colonnes qui ont été coloriées en orange sur le schéma ci-dessous).
usr_id | usr_name | usr_first_name | usr_login | usr_password | usr_year_study | ... |
1 | PASTORE | Sébastien | spastore | *********** | 6 | |
540 | DETEST | Ysser | testeleve1 | *********** | 1 | |
539 | DUBUISSON | Christophe | cdubuisson | *********** | 2 | |
538 | BONVALOT | Romain | rbonvalot | *********** | 2 | |
537 | LUCK | Florent | fluck | *********** | 1 | |
536 | TRAN | Alexandre | atran | *********** | 2 | |
534 | ESQUIROL | Georges | gesquirol | *********** | 6 | |
533 | LEGRAND | Marie-Pierre | mplegrand | *********** | 6 | |
532 | TEXTORIS | André | atextoris | *********** | 6 | |
... |
On utilise pour ça :
usr_first_name | usr_name |
Sébastien | PASTORE |
Ysser | DETEST |
Christophe | DUBUISSON |
Romain | BONVALOT |
Florent | LUCK |
Alexandre | TRAN |
Georges | ESQUIROL |
Marie-Pierre | LEGRAND |
Rémi | FORT |
... | ... |
A partir de la base "vendeur de logiciels", affichez le nom et le prénom des clients.
Très utile pour clarifier l'affichage ou exploiter les données dans un langage de programmation :
Prenom | Nom |
Sébastien | PASTORE |
Ysser | DETEST |
Christophe | DUBUISSON |
Romain | BONVALOT |
Florent | LUCK |
Alexandre | TRAN |
Georges | ESQUIROL |
Marie-Pierre | LEGRAND |
Rémi | FORT |
... | ... |
Le AS est facultatif, on peut donc écrire :
Pr�nom | Nom |
Sébastien | PASTORE |
Ysser | DETEST |
Christophe | DUBUISSON |
Romain | BONVALOT |
Florent | LUCK |
Alexandre | TRAN |
Georges | ESQUIROL |
Marie-Pierre | LEGRAND |
Rémi | FORT |
... | ... |
A partir de la base "vendeur de logiciels", affichez le nom et le prénom des clients, en les renommant sans le C final.
Au lieu d'afficher tous les enregistrements (ou
lignes), on veut afficher uniquement les utilisateurs qui s'appellent
Romain (en orange sur la capture
ci-dessous).
usr_id | usr_name | usr_first_name | usr_login | usr_password | usr_year_study | ... |
1 | PASTORE | Sébastien | spastore | *********** | 6 | |
540 | DETEST | Ysser | testeleve1 | *********** | 1 | |
539 | DUBUISSON | Christophe | cdubuisson | *********** | 2 | |
538 | BONVALOT | Romain | rbonvalot | *********** | 2 | |
537 | LUCK | Florent | fluck | *********** | 1 | |
536 | TRAN | Alexandre | atran | *********** | 2 | |
534 | ESQUIROL | Georges | gesquirol | *********** | 6 | |
533 | LEGRAND | Marie-Pierre | mplegrand | *********** | 6 | |
532 | TEXTORIS | André | atextoris | *********** | 6 | |
... |
On utilise pour ça la clause WHERE :
Prenom | Nom |
Romain | BONVALOT |
Romain | DUMAS |
Romain | DI FELICE |
Romain | BARIAL |
Romain | VIALA |
Romain | CONSTANT |
Romain | SICAUD |
Romain | VANDERHAEGHEN |
Romain | Chaix |
La condition WHERE est suivie de n'importe quelle expression booléenne, c'est à dire qui a pour résultat "vrai" ou "faux". Par exemple :
A partir de la base "vendeur de logiciels", affichez les clients qui habitent New-York.
Affichez les produits de catégorie n°5.
Pour que les résultats soient triés, on utilise la clause ORDER BY, et les paramètres ASC (pour un tri croissant, ascendant en anglais) ou DESC (pour un tri décroissant, descendant en anglais). Par exemple :
Prenom | Nom |
Isis | ABD RABO |
Chakib | ABDALLAH |
Hasna | ABDELADIM |
Malik | ABDESSLEM |
Nathaniel | ABENSOUR |
Olivier | Abran |
Morad | ACHACHERA |
Mimouna | ADDA-BENAMEUR |
Ophélie | ADOLPHE |
... | ... |
Prenom | Nom |
Ilies | ZIAMARI |
Florent | ZAMUNER |
Detest | Ysser |
Ibrahim | YILDIRIM |
Anthony | XUEREF |
Mehdi | WEIBEL |
Louis | VOLLEKINDT |
Matthieu | VOIGNIER |
Mickaël | VOGEL |
... | ... |
Le tri par défaut est croissant, on n'est donc pas obligé de préciser ASC. Par exemple :
Prenom | Nom |
Isis | ABD RABO |
Chakib | ABDALLAH |
Hasna | ABDELADIM |
Malik | ABDESSLEM |
Nathaniel | ABENSOUR |
Olivier | Abran |
Morad | ACHACHERA |
Mimouna | ADDA-BENAMEUR |
Ophélie | ADOLPHE |
... | ... |
Cela revient au même de trier sur le nom original du champ (usr_name), sur le nom renommé (Nom) ou sur la position du champ dans le SELECT (2).
On peut enchaîner plusieurs tris. Par exemple : utilisateurs nés en février, triés sur la date d'anniversaire. Pour ceux qui sont nés le même jour, on veut un classement par nom :
usr_date_of_birth | Prenom | Nom |
1994-02-01 | Ilyes | BALI |
1998-02-01 | Husam | TOUBAL |
1994-02-03 | Baptiste | Messines |
1991-02-06 | Edouard | CABOT-REVERSAC |
1992-02-07 | Robin | MARCOT |
1988-02-08 | Aurore | BENGUIGUI |
2019-02-09 | Nathaël | COSTES |
1994-02-11 | Florian | SANDRAL |
1991-02-12 | Adrien | BERTHIER |
... | ... | ... |
A partir de la base "vendeur de logiciels", affichez les produits triés par nom de produit.
Affichez les clients triés par ville. Dans une même ville, les clients sont triés par nom, puis par prénom s'il y a des noms identiques.
Si je regarde la table des petites annonces, je vois qu'il n'y figure que le numéro de l'utilisateur qui a déposé l'annonce, mais pas son nom ni son prénom. C'est normal : si on stockait son nom et son prénom pour chaque petite annonce, on l'aurait en plusieurs exemplaires. C'est ce qu'on appelle la redondance, et on essaie la plupart du temps de l'éviter dans les bases de données (ça fait perdre de la mémoire et ça rend les mises à jour plus difficiles).
ann_id | ann_user_id | ann_titre | ann_prix | ann_texte | ann_is_html | ann_date_depot |
204 | 442 | <script>alert('Je suis un boulet')</script> | test | test | 0 | 2015-01-27 00:16:27 |
206 | 401 | Vend ordinateur | 150€ | Je vend un ordinateur fixe de la marque HP, possède un lecteur de carte mémoire, 3 port USB frontaux et 6 a l'arrière, lecteur CD/DVD, écran, clavier, souris et son tapis inclus. Vous pouvez le tester en Salle C352, c'est celui au fond à coté de la fenêtre. | 0 | 2015-10-27 12:22:56 |
Toutefois, je peux afficher cette information puisque le nom et le prénom sont stockés dans la table user, et que ces deux tables sont reliées par le numéro de l'utilisateur qui a déposé l'annonce :
usr_id | usr_first_name | usr_name | ann_user_id | ann_titre |
442 | Steeven | Thein | 442 | <script>alert('Je suis un boulet')</script> |
401 | Florent | VALAY | 401 | Vend ordinateur |
Notez bien l'importance du WHERE usr_id = ann_user_id
.
Si vous l'oubliez, vous obtenez des résultats incohérents (remarquez
que chaque annonce a été affichée à côté de chaque utilisateur : SQL a
fait toutes les combinaisons possibles, c'est ce qu'on appelle un produit
cartésien et c'est rarement ce qu'on souhaite) :
usr_id | usr_first_name | usr_name | ann_user_id | ann_titre |
1 | Sébastien | PASTORE | 442 | <script>alert('Je suis un boulet')</script> |
1 | Sébastien | PASTORE | 401 | Vend ordinateur |
77 | Ysser | DETEST | 442 | <script>alert('Je suis un boulet')</script> |
77 | Ysser | DETEST | 401 | Vend ordinateur |
76 | Christophe | DUBUISSON | 442 | <script>alert('Je suis un boulet')</script> |
76 | Christophe | DUBUISSON | 401 | Vend ordinateur |
75 | Romain | BONVALOT | 442 | <script>alert('Je suis un boulet')</script> |
75 | Romain | BONVALOT | 401 | Vend ordinateur |
74 | Florent | LUCK | 442 | <script>alert('Je suis un boulet')</script> |
... | ... | ... | ... | ... |
A partir de la base "vendeur de logiciels", affichez les noms des produits, suivi du nom de la catégorie correspondante (jointure avec deux tables).
Affichez les noms et prénoms des clients, suivi des noms des produits qu'ils ont achetés (jointure avec trois tables).
Parfois, on est susceptible d'écrire une requête qui répond plusieurs fois la même réponse. Par exemple : qui a déposé une annonce ?
usr_first_name | usr_name |
Steeven | Thein |
Florent | VALAY |
Pour éviter que la même réponse soit donnée deux fois, on utilise la clause DISTINCT.
usr_first_name | usr_name |
Steeven | Thein |
Florent | VALAY |
Il faut arriver à savoir quand le DISTINCT est obligatoire ou non, sinon vous serez pénalisés à l'examen. Essayez donc d'évaluer si la requête risque de multiplier les résultats ou pas. Par exemple :
Dans quelle ville y a-t-il des clients ?
A quelle catégorie appartient le produit Access 2010 ?.
Quelles sont les catégories des produits achetés par Eric WANG ?
On peut affecter une valeur spéciale à un champ : la valeur NULL.
A ne pas confondre avec une chaîne de caractères vide :
champ=""
, une valeur NULL se teste avec champ IS NULL
. Une chaîne non vide se teste avec champ <> ""
, une valeur non nulle se teste avec champ IS NOT NULL
.Quand on construit une base de données, on doit préciser pour chaque champ s'il peut recevoir la valeur NULL ou pas démonstration.
On n'est pas obligé d'afficher des champs bruts, on peut afficher des expressions basées (ou non) sur les champs.
Une que j'utilise souvent est pour améliorer l'affichage du nom et du prénom :
Nom |
Sébastien PASTORE |
Georges ESQUIROL |
Marie-Pierre LEGRAND |
Alexa STROZZI |
Gilles GIRARD |
Georghy FUSCO |
Véronique GAUBERT |
Stéphane LOFFREDA |
Judes Gisors |
Michael DEBORT |
Sophie PERIERAS |
Afficher l'année de naissance d'une personne (remarquez le IS NOT NULL qui permet de n'afficher que les utilisateurs dont on connaît la date de naissance) :
usr_login | annee de naissance |
yayache | 1998 |
pbarbin | 1997 |
ybarembaum | 1998 |
gbeolet | 1998 |
ebord | 1999 |
cbringuier | 1997 |
fcasalta | 1997 |
acassagnearu | 1998 |
dchecconi | 1998 |
... | ... |
Afficher un prix TTC à partir d'un prix hors taxe : SELECT prix_HT * 1.196 FROM produits ;
Afficher le numéro des produits et le mois auquel ils ont été achetés.
Afficher le nom et le prénom des clients dans une seule colonne, séparés par un espace.
Parfois, on a besoin d'utiliser SELECT simplement pour évaluer une expression, sans aller chercher des données dans une table.
L'utilisation la plus courante est pour vérifier le fonctionnement des fonctions SQL. Par exemple, pour vérifier des fonctions de date ou de cryptage :
CURDATE() |
2016-10-31 |
NOW() |
2016-10-31 20:55:56 |
PASSWORD('mypassword') |
*FABE5482D5AADF36D028AC443D117BE1180B9725 |
Très utile pour les recherches, LIKE permet de comparer des chaînes entre elles en utilisant des caractères jokers, c'est à dire des caractères qui remplacent un ou plusieurs caractères.
% remplace 0, 1 ou plusieurs caractères. Par exemple :
champ like "méd%"
est vrai pour les champs ayant la valeur méd, médecin, médical, médée, etc.champ like "%test%"
est vrai pour les champs ayant la valeur greatest hits, test, contest, testament, etc._ (underscore) remplace 1 caractère. Par exemple :
champ like "par_"
est vrai pour les champs ayant la valeur part, pars, pare, etc.champ like "199_-12-31"
est vrai pour les champs ayant la valeur 1990-12-31, 1991-12-31, ... 1999-12-31.Pour compliquer un peu : sous Access, le % s'écrit * et le _ s'écrit ? (respectant ainsi le formalisme des caractères jokers sous DOS, et dans l'explorateur de fichiers en général).