Académique Documents
Professionnel Documents
Culture Documents
On souhaite trouver les titres de tous les livres publiés après 1990 dans
la base de données. Une telle requête peut s'écrire en SQL:
titre
Les Robots
1984
...
1 / 11
17 - Requêtes SQL et mises à jour
Clause WHERE
Par exemple, si l'on souhaite afficher les titres de tous les livres
publiés par Dargaud entre 1970 et 1980, on pourra écrire :
titre
Autre exemple, pour trouver les titres des livres qui contiennent le mot
Astérix dans le titre, une telle requête s'écrira :
titre
Astérix le Gaulois
Astérix et Cléopâtre
Astérix légionnaire
...
2 / 11
17 - Requêtes SQL et mises à jour
Clause SELECT
La clause SELECT peut prendre trois formes. La première est celle où l'on
liste explicitement les attributs que l'on désire renvoyer. Si on veut
renvoyer les titres et l'ISBN des livres publiés après 1990, on écrira
ceci :
titre isbn
1984 978-0151660346
... ...
le_titre num_serie
1984 978-0151660346
... ...
3 / 11
17 - Requêtes SQL et mises à jour
La seconde forme de la clause SELECT est celle que l'on utilise lorsqu'on
veut conserver toutes les colonnes. En effet, il serait fastidieux d'écrire
toutes les colonnes d'une table. On peut utiliser à cette fin le symbole *
qui signifie "toutes les colonnes de la table".
total
10
total
10
4 / 11
17 - Requêtes SQL et mises à jour
somme
421337
moyenne
2007.49871374
L'ordre des résultats peut être modifié entre deux exécutions de la même
requête. Si l'on désire obtenir les résultats dans un ordre particulier, on
peut utiliser la clause ORDER BY en fin de requête.
Supposons maintenant que l'on souhaite connaître toutes les années dans
lesquelles un livre a été publié. La requête
nous donne toutes les années, mais la même année peut apparaître plusieurs
fois. Si on souhaite retirer les doublons d'un résultat, le mot clé
DISTINCT peut être ajouté à la clause SELECT.
5 / 11
17 - Requêtes SQL et mises à jour
Jointure
On souhaiterait obtenir une grande table dont les colonnes sont celles de
la table emprunt et celle de la table livre, en réunissant les lignes ayant
le même isbn. Cela peut être fait au moyen de la directive JOIN.
Cette requête crée la jointure des deux tables. Chaque ligne est le
résultat de la fusion de deux lignes ayant le même ISBN. Le choix de ces
lignes est donné par la condition de jointure indiquée par le mot clé ON.
La condition indique au SGBD dans quel cas deux lignes doivent être
fusionnées.
Ici, on joint les lignes pour lesquelles les ISBN sont égaux. La notation
nom_de_table.attribut permet de différencier entre deux attributs portant
le même nom.
La jointure peut être combinée avec les clauses SELECT et WHERE. Par
exemple, si on souhaite afficher uniquement les titres et les dates des
livres empruntés qui sont à rendre avant le 1er février 2020, on peut
écrire la requête suivante :
titre retour
Iliade 2020-01-17
Odyssée 2020-01-23
6 / 11
17 - Requêtes SQL et mises à jour
Il est possible de créer dans une requête un alias pour un nom de table au
moyen du mot clé AS, comme pour le renommage de colonne. La requête
précédente peut être réécrite de la manière suivante :
Suppression de lignes
7 / 11
17 - Requêtes SQL et mises à jour
Mise à jour
Par exemple, si l'utilisateur John Doe souhaite mettre à jour son adresse
mail, on écrit ceci :
8 / 11
17 - Requêtes SQL et mises à jour
Requêtes imbriquées
SELECT * FROM (SELECT * FROM livre WHERE annee >= 1990) AS tmp
WHERE tmp.annee <= 2000;
La requête ci-dessus calcule d'abord une table intermédiaire nommée tmp qui
liste les livres publiés après 1990. Suite à quoi, la table tmp est
refiltrée pour ne garder que les livres pour lesquels l'année est
inférieure à 2000.
Une autre manière d'imbriquer les requêtes consiste à utiliser une
sous-requête dans la clause WHERE. En effet, le langage SQL identifie les
valeurs scalaires et les tables à une seule case telles que celles
renvoyées par les fonctions d'agrégation. Par exemple, si on souhaite
afficher les titres des livres dont l'année est la plus ancienne dans la
base, on pourra écrire :
SELECT titre FROM livre WHERE annee = (SELECT MIN(annee) FROM livre);
9 / 11
17 - Requêtes SQL et mises à jour
Exercice 1
Soit la base de données de la bibliothèque définie au début du chapitre.
Donner le code SQL de chacune des requêtes ci-dessous.
a. Tous les titres de livre.
b. Tous les noms d'usager.
c. Tous les noms d'usager en retirant les doublons.
d. Les titres des livres publiés avant 1980.
e. Les titres des livres dont le titre contient la lettre 'A'.
f. Les isbn des livres à rendre pour le 01/01/2020.
g. Les noms d'auteurs triés par ordre alphabétique.
h. Les noms d'usagers vivant dans le 12e ou 13e arrondissement de Paris
(codes postaux 75012 et 75013).
i. Les noms et adresses des usagers n'habitant pas dans une rue. (la
chaîne "Rue" ne doit pas apparaître dans l'adresse).
j. Les années et titres des livres publiés lors d'une année bissextile.
On rappelle que ce sont les années divisibles par 4, mais pas celles
divisibles par 100 sauf si elles sont divisibles par 400.
Exercice 2
Soit la base de données de la bibliothèque définie au début du chapitre.
Donner le code SQL de chacune des requêtes ci-dessous.
a. Le titre des livres empruntés.
b. Le titre des livres empruntés à rendre avant le 31/03/2020.
c. Le nom et prénom de l'auteur du livre '1984'.
d. Le nom et le prénom des usagers ayant emprunté des livres, sans
doublons (i.e. si un usager a emprunté plusieurs livres, il ne doit
apparaître qu'une fois dans le résultat).
e. Même requête que précédemment, avec les noms triés par ordre
alphabétique.
f. Les titre des livres publiés strictement avant 'Dune'.
g. Les noms et prénoms des auteurs des livres trouvés à la question
précédente.
h. Comme la question précédente, en retirant les doublons.
i. Le nombre de résultats trouvés à la question précédente.
10 / 11
17 - Requêtes SQL et mises à jour
Exercice 3
Soit la base de données de la bibliothèque définie au début du chapitre.
Formuler simplement en francais les requêtes SQL suivantes.
d. SELECT l.titre
FROM livre AS l
WHERE l.isbn IN (SELECT isbn FROM livres WHERE annee > 1990);
11 / 11