388 Chapitre 10. Récapitulatif SQL titre année id_realisateur genre Impitoyable 1992 20 Western Van Gogh 1990 29 Drame Kagemusha 1980 68 Drame Les pleins pouvoirs 1997 20 Policier Film id nom prénom année_naissance 20 Eastwood Clint 1930 21 Hackman Gene 1930 29 Pialat Maurice 1925 30 Dutronc Jacques 68 Kurosawa Akira 1910 Artiste titre id_acteur nom_rôle Impitoyable 20 William Munny Impitoyable 21 Little Bill Dagget Van Gogh 30 Van Gogh Les pleins pouvoirs 21 Le président Rôle Figure 10.1 — Un échantillon de la base Films 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’; + + | titre | + + | Van Gogh | | Kagemusha | + + 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. 10.1 Sélections 389 • 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 | + + + + + | Impitoyable | 1992 | 20 | Western | | Van Gogh | 1990 | 29 | Drame | | Kagemusha | 1980 | 68 | Drame | | 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. 390 Chapitre 10. Récapitulatif SQL mysql> SELECT LENGTH(titre) FROM Film; + + | LENGTH(titre) | + + |11| |8| |9| |19| + + 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) | + + | Imp1992 | | Van1990 | | Kag1980 | | Les1997 | + + 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 | + + + | Eastwood | 74 | | Hackman | 74 | | Pialat | 79 | | Dutronc | NULL | | Kurosawa | 94 | + + + 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’aidedelafonctionDATE_ADD(). 10.1 Sélections 391 mysql> select DATE_ADD(NOW(), INTERVAL 3 MONTH); + + | DATE_ADD(NOW(), INTERVAL 3 MONTH) | + + | 2005-02-23 18:43:01 | + + 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 | + + + 392 Chapitre 10. Récapitulatif SQL mysql> SELECT CONCAT(’<a href="Acteur.php?nom=’, -> nom, ’">Nom</a>’) AS AncreActeur FROM Artiste; + + | AncreActeur | + + | <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 clause DISTINCT 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 | + + | 1930 | | 1930 | | 1925 | | NULL | | 1910 | + + mysql> SELECT DISTINCT annee_naissance FROM Artiste; + + | annee_naissance | + + | NULL | | 1910 | | 1925 | | 1930 | + + 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 coûteuse si le résultat est de taille importante. . 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. ). 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. 390 Chapitre 10. Récapitulatif SQL mysql& gt;. + On peut introduire des apostrophes doubles (") dans une chaîne de caractères encadrée par des guillemets simples. 10.1.2 La clause DISTINCT L’utilisation des clés permet d’éviter les doublons