Quand il n’y a qu’une table – comme par exemple pour la requête sélectionnant les films dont le genre est « Drame » – l’interprétation est simple : on parcourt les lignes de la table Fil
Trang 1titre année id_realisateur genre
Les pleins pouvoirs 1997 20 Policier
Film
id nom prénom année_naissance
30 Dutronc Jacques
Artiste
Impitoyable 21 Little Bill Dagget
Les pleins pouvoirs 21 Le président
Rôle
Figure 10.1 — Un échantillon de la baseFilms
10.1 SÉLECTIONS
Les requêtes les plus simples –et les plus courantes– sont celles qui recherchent, dans une table, des lignes satisfaisant un ou plusieurs critères de sélection Par exemple,
on recherche les titres des films du genre « Drame »
mysql> SELECT titre
-> FROM Film
-> WHERE genre = ’Drame’;
+ -+
+ -+
+ -+
2 rows in set (0.02 sec)
La structure de base d’une requête SQL comprend trois clauses SELECT, FROM et WHERE
• FROM indique la (ou les) tables dans lesquelles on trouve les attributs utiles à
la requête Un attribut peut être« utile » de deux manières (non exclusives) :
(1) on souhaite afficher son contenu via SELECT, (2) on souhaite qu’il ait une valeur particulière (une constante ou la valeur d’un autre attribut) via WHERE.
• SELECT indique la liste des attributs constituant le résultat
Trang 2• WHERE indique les conditions que doivent satisfaire les lignes de la table pour faire partie du résultat
La clause WHERE est optionnelle : toutes les lignes de la tables sont sélectionnées
si elle est omise Voici donc la plus simple des requêtes : elle affiche toute la table mysql> SELECT * FROM Film;
+ -+ -+ -+ -+
| titre | annee | id_realisateur | genre |
+ -+ -+ -+ -+
| Les pleins pouvoirs | 1997 | 20 | Policier |
+ -+ -+ -+ -+
Un des problèmes rencontrés quand on commence à utiliser SQL (et même beaucoup plus tard ) est de bien comprendre ce que signifie une requête, quelle que soit sa complexité Quand il n’y a qu’une table – comme par exemple pour la requête sélectionnant les films dont le genre est « Drame » – l’interprétation est simple : on
parcourt les lignes de la table Film Pour chaque ligne, si l’attribut genre a pour valeur
« Drame », on place l’attribut titre dans le résultat Même si cette interprétation peut paraître élémentaire, elle devient très utile quand on a plusieurs tables dans le
FROM Une remarque en passant : il s’agit d’une manière d’expliquer la requête, ce qui
ne signifie pas du tout que MySQL l’exécute de cette façon.
REMARQUE –Rappelons que, sous Unix, MySQL distingue majuscules et minuscules dans
le nom des tables.
10.1.1 Renommage, fonctions et constantes
Le résultat d’une requête SQL est toujours une table On peut considérer en première
approche que le calcul consiste à « découper », horizontalement et verticalement, la table indiquée dans le FROM On peut aussi :
• renommer les attributs ;
• appliquer des fonctions aux attributs de chaque ligne ;
• introduire des constantes
Fonctions MySQL
Les fonctions applicables aux valeurs des attributs sont par exemple les opérations arithmétiques (+, *, ) pour les attributs numériques, les manipulations de chaînes
de caractères (concaténation, sous-chaînes, mise en majuscules, ) MySQL propose
un ensemble très riche de fonctions (voir annexe B) Nous proposons quelques exemples ci-dessous
• Donner la longueur des titres des films
Trang 3mysql> SELECT LENGTH(titre) FROM Film;
+ -+
| LENGTH(titre) |
+ -+
+ -+
4 rows in set (0.00 sec)
Pour faciliter l’analyse syntaxique d’une requête, MySQL interdit tout blanc entre le nom de la fonction et la parenthèse ouvrante
• Donner les 3 premières lettres du titre, concaténées avec l’année
mysql> SELECT CONCAT(SUBSTRING(titre,1,3),annee) FROM Film;
+ -+
| CONCAT(SUBSTRING(titre,1,3),annee) |
+ -+
+ -+
La norme SQL préconise «|| » pour exprimer la concaténation, mais MySQL
a choisi d’utiliser ce symbole pour le « ou » logique
• Donner le nom des artistes et leur âge (arrondi grosièrement)
mysql> SELECT nom, YEAR(SYSDATE()) - annee_naissance FROM Artiste; + -+ -+
| nom | YEAR(SYSDATE()) - annee_naissance |
+ -+ -+
+ -+ -+
Les fonctions de manipulation de date constituent (avec celles consacrées aux chaînes de caractères) une large partie des fonctions MySQL SYSDATE() donne la date courante, au format standard AAAA-MM-JJ HH:MM:SS, et YEAR() renvoie l’année
• Finalement, on peut utiliser SQL pour exécuter des fonctions, sans sélection-ner des lignes dans une table Dans ce cas, le FROM est inutile (il s’agit d’une spécificité de MySQL) La requête suivante ajoute 3 mois à la date courante,
à l’aide de la fonction DATE_ADD()
Trang 4mysql> select DATE_ADD(NOW(), INTERVAL 3 MONTH);
+ -+
| DATE_ADD(NOW(), INTERVAL 3 MONTH) |
+ -+
+ -+
Renommage
Les noms des attributs sont par défaut ceux indiqués dans la clause SELECT, même en présence d’expressions complexes L’expression YEAR(SYSDATE()) -annee_naissance peut donc tenir lieu de nom d’attribut pour le résultat, ce qui est peu pratique Pour renommer les attributs, on utilise le mot-clé AS Ce mot-clé est optionnel pour MySQL
mysql> SELECT nom, YEAR(SYSDATE()) - annee_naissance AS age FROM Artiste; + -+ -+
| nom | age |
+ -+ -+
| Eastwood | 70 |
| Hackman | 70 |
| Pialat | 75 |
| Dutronc | NULL |
| Kurosawa | 90 |
+ -+ -+
On remarque que le calcul, appliqué à un NULL, donne un NULL Nous revien-drons sur la gestion des NULL plus loin
Constantes
On peut combiner, dans la clause SELECT, les noms des attributs de la table du FROM
avec des constantes, ou littéraux, dont la valeur sera donc identique sur chaque ligne
du résultat Voici deux exemples, le second créant une ancre HTML à partir du contenu de la table
mysql> SELECT ’Cette ligne correspond au film ’, titre FROM Film;
+ -+ -+
| Cette ligne correspond au film | titre |
+ -+ -+
| Cette ligne correspond au film | Impitoyable |
| Cette ligne correspond au film | Van Gogh |
| Cette ligne correspond au film | Kagemusha |
| Cette ligne correspond au film | Les pleins pouvoirs |
+ -+ -+
Trang 5mysql> SELECT CONCAT(’<a href="Acteur.php?nom=’,
-> nom, ’">Nom</a>’) AS AncreActeur FROM Artiste;
+ -+
+ -+
| <a href="Acteur.php?nom=Eastwood">Nom</a> |
| <a href="Acteur.php?nom=Hackman">Nom</a> |
| <a href="Acteur.php?nom=Pialat">Nom</a> |
| <a href="Acteur.php?nom=Dutronc">Nom</a> |
| <a href="Acteur.php?nom=Kurosawa">Nom</a> |
+ -+
On peut introduire des apostrophes doubles (") dans une chaỵne de caractères encadrée par des guillemets simples
10.1.2 La clauseDISTINCT
L’utilisation des clés permet d’éviter les doublons dans les tables stockées, mais il peuvent apparaỵtre dans le résultat d’une requête La clause DISTINCT, placée après
le SELECT, permet de supprimer ces doublons Voici deux exemples, avec et sans DISTINCT
mysql> SELECT annee_naissance FROM Artiste;
+ -+
| annee_naissance |
+ -+
+ -+
mysql> SELECT DISTINCT annee_naissance FROM Artiste;
+ -+
| annee_naissance |
+ -+
+ -+
On trouve deux fois la valeur 1930 dans le premier résultat, et une seule fois dans
le second Il est également intéressant de constater que le second résultat est présenté
en ordre croissant De fait, la clause DISTINCT implique un tri préalable des lignes
du résultat qui rassemble les doublons et permet de les éliminer facilement Une conséquence, dont il faut savoir tenir compte, est que l’élimination des doublons peut être une opération cỏteuse si le résultat est de taille importante