L'objectif de cet exercice est de passer en revue la plupart des requêtes SQL d'interrogation portant sur une seule table.
On travaillera avec la base de données
disquaire.db
que vous trouverez dans l'archive de ce chapitre. Vous utiliserez le logiciel DB Browser for SQLite ou le logiciel en ligne sqliteonline.com dans lesquels vous aurez au préalable ouvert la base de données en question.
On rappelle que cette base de données possède le schéma relationnel suivant :
Album(id_album INT, titre TEXT, annee INT, dispo BOOL)
Artiste(id_artiste INT, nom TEXT, prenom TEXT)
Artiste_de(#id_artiste INT, #id_album INT)
Client(id_client INT, nom TEXT, prenom TEXT, email TEXT)
Emprunt(#id_client INT, #id_album INT, jour DATE)
On peut aussi représenter graphiquement ce schéma par le diagramme suivant :
Réalisé avec l'application quickdatabasediagrams.com
Q1 : Traduisez par une phrase la requête suivante. Vérifiez ensuite votre réponse en l'exécutant.
SELECT * FROM Album;
Réponse :
Q2 : Traduisez par une phrase la requête suivante. Vérifiez ensuite votre réponse en l'exécutant.
SELECT titre, dispo FROM Album;
Réponse :
Q3 : Écrivez et testez une requête permettant de récupérer uniquement les titres et l'année de sortie de chaque album.
Réponse :
Q4 : Écrivez et testez une requête permettant de récupérer tous les attributs des clients.
Réponse :
Q5 : Écrivez et testez une requête permettant de récupérer uniquement l'id_client, le nom et le prénom de chaque client.
Réponse :
Q6 : Écrivez et testez une requête permettant de récupérer uniquement le nom et le prénom de chaque artiste.
Réponse :
En plus de sélectionner des colonnes, on peut sélectionner certaines lignes en utilisant la clause WHERE
suivie de la condition de sélection.
Q7 : Traduisez par une phrase la requête suivante. Vérifiez ensuite votre réponse en l'exécutant.
SELECT titre FROM Album WHERE dispo=0;
Réponse :
Q8 : Écrivez et testez une requête permettant de récupérer les titres de tous les albums sortis en 2000 ou après.
Résultat attendu : 12 enregistrements.
Réponse :
Q9 Écrivez et testez une requête permettant de récupérer tous les albums sortis en 1970.
Résultat attendu : 3 enregistrements.
Réponse :
Q10 : Écrivez et testez une requête permettant de récupérer les titres de tous les albums sortis avant 1950 ou après 2010.
Résultat attendu : 6 enregistrements.
Réponse :
Q11 : Écrivez et testez une requête permettant de récupérer tous les albums disponibles et sortis avant 1990.
Résultat attendu : 13 enregistrements.
Réponse :
Q12 : Écrivez et testez une requête permettant de récupérer tous les clients dont le nom de famille est "Petit".
Résultat attendu : 2 enregistrements.
Réponse:
Q13 : Écrivez et testez une requête permettant de récupérer tous les clients dont le nom de famille est "Chartier".
Résultat attendu : 0 enregistrements.
Réponse:
Q14 : Écrivez et testez une requête permettant de récupérer les noms des artistes ne possédant pas de prénom.
Résultat attendu : 6 enregistrements.
🆘 Lisez cette page pour savoir comment tester si une valeur est absente avec SQLite : [https://sql.sh/cours/where/is)
Réponse :
On peut trier des données en utilisant ORDER BY
à la fin d'une requête, suivi de l'attribut à trier et de ASC
(pour un tri croissant) ou DESC
(pour un tri décroissant).
Q15 : Traduisez par une phrase la requête suivante. Vérifiez ensuite votre réponse en l'exécutant.
SELECT * FROM Artiste ORDER BY nom ASC;
Réponse :
Q16 : Écrivez et testez une requête permettant de récupérer les albums triés dans l'ordre décroissant de leur année de sortie.
Réponse :
Q17 : Écrivez et testez une requête permettant de récupérer les titres par ordre alphabétique des albums sortis entre 1980 et 2010.
Résultat attendu : 10 enregistrements.
Réponse :
Q18 : Écrivez et testez une requête permettant de récupérer les noms et prénoms de tous les clients, triés par ordre alphabétique des noms.
Réponse :
Q19 : Écrivez et testez une requête permettant de récupérer les noms et prénoms de tous les clients, triés par ordre alphabétique des noms, puis des prénoms en cas de noms identiques.
Vous vérifierez bien que les clients portant le même nom sont bien triés alphabétiquement selon leur prénom (ce qui n'était pas le cas de la précédente requête).
🆘 On peut trier des données selon plusieurs attributs en les écrivant après
ORDER BY
dans l'ordre souhaité et en les séparant par des virgules.
Réponse :
DISTINCT
On peut supprimer les doublons grâce à DISTINCT
.
Q20 : Traduisez par une phrase la requête suivante. Vérifiez ensuite votre réponse en l'exécutant.
SELECT DISTINCT id_client FROM Emprunt;
Réponse :
Q21 : Écrivez et testez une requête permettant de récupérer les titres distincts des albums.
Résultat attendu : 29 enregistrements (car un album était en double).
Réponse :
On peut compter le nombre d'enregistrements (ou tuples) en utilisant la fonction COUNT()
.
Q22 : Traduisez par une phrase la requête suivante. Vérifiez ensuite votre réponse en l'exécutant.
SELECT COUNT(*) AS nbClients FROM Client;
On rappelle que
AS
permet de nommer le résultat de la requête, ici on le nommenbClients
. Essayez d'enlever leAS nbClients
et observez le résultat de la requête.
Réponse :
Q23 : Écrivez et testez une requête permettant de récupérer le nombre d'emprunts en cours, que l'on notera nbEmprunts
.
Résultat attendu : 11.
Réponse :
Q24 : Écrivez et testez une requête permettant de récupérer le nombre de clients ayant le nom "Petit", que l'on notera nbPetit
.
Résultat attendu : 2.
Réponse :
Q25 : Écrivez et testez une requête permettant de récupérer le nombre de titres différents d'albums, que l'on notera nbAlbumsDistincts
.
Résultat attendu : 29.
🆘 Vous lirez la page suivant pour savoir comment faire : https://sql.sh/fonctions/agregation/count.
Réponse :
On peut effectuer des requêtes effectuant des recherches de certains motifs.
Par exemple, on peut chercher tous les clients dont l'adresse email contient le domaine "domaine.net". La requête s'écrirait :
SELECT * FROM Client WHERE email LIKE "%domaine.net%";
Analyse :
=
qui fait une recherche exacte par LIKE
. Ainsi, email LIKE "%domaine.net%"
est évaluée à vrai si et seulement si l'attribut email
correspond au motif "%domaine.net%"
.%
est un joker et peut être substitué par n'importe quelle chaîne de caractères.Q26 : Écrivez et testez une requête permettant de récupérer les titres de tous les albums contenant le mot "Love"
.
Résultat attendu : 2 enregistrements.
Réponse :
Q27 : Écrivez et testez une requête permettant de récupérer le nombre d'albums dont le titre contient la lettre "a"
.
Résultat attendu : 16 enregistrements.
Réponse :
Q28 : Écrivez et testez une requête permettant de récupérer les noms et prénoms de tous les artistes commençant par la lettre "M"
.
Résultat attendu : 3 enregistrements.
Réponse :
On travaillera toujours avec la base de données
disquaire.db
que vous trouverez dans l'archive de ce chapitre. Vous utiliserez le logiciel DB Browser for SQLite ou le logiciel en ligne sqliteonline.com dans lesquels vous aurez au préalable ouvert la base de données en question.
L'exercice précédent portait sur des requêtes ne portant à chaque fois que sur une seule table. C'est malheureusement insuffisant pour chercher certaines informations qui nécessitent de croiser plusieurs tables.
On présente dans cette introdution la notion de jointure qui permet de croiser plusieurs tables. Prenez le temps de lire attentivement cette partie, de tester les requêtes proposées, de les modifier, etc. pour bien comprendre cette notion fondamentale des bases de données relationnelles.
Imaginons que l'on veuille connaître les clients ayant des emprunts en cours. Ces derniers sont ceux présents dans la table Emprunt
et on peut les obtenir avec la requête
SELECT * FROM Emprunt;
qui produit la réponse suivante :
id_client | id_album | jour |
---|---|---|
1 | 5 | 2021-09-10 |
3 | 8 | 2021-08-18 |
3 | 24 | 2021-08-18 |
5 | 25 | 2021-09-12 |
5 | 6 | 2021-10-10 |
9 | 20 | 2021-09-28 |
11 | 14 | 2021-10-08 |
7 | 15 | 2021-10-08 |
7 | 19 | 2021-10-08 |
7 | 16 | 2021-10-15 |
16 | 29 | 2021-10-01 |
Mais ce n'est pas très satisfaisant car on aimerait plutôt afficher les noms, prénoms et adresse email de ces clients plutot que id_client
.
Le problème est que les noms, prénoms, adresses email sont uniquement présents dans la table Client
. Il est nécessaire de faire une jointure entre les deux tables Emprunt
et Client
.
Une jointure consiste à créer toutes les combinaisons de lignes des deux tables ayant un attribut de même valeur (l'attribut id_client
dans notre exemple). Pour effectuer une jointure, on utilise JOIN
!
Ainsi, la requête
SELECT *
FROM Emprunt
JOIN Client ON Emprunt.id_client = Client.id_client;
crée la jointure des deux tables Emprunt
et Client
, représentée ci-dessous.
id_client | id_album | jour | id_client_1 | nom | prenom | |
---|---|---|---|---|---|---|
1 | 5 | 2021-09-10 | 1 | Dupont | Florine | dupont.florine@domaine.net |
3 | 8 | 2021-08-18 | 3 | Marchand | Grégoire | greg.marchand49@music.com |
3 | 24 | 2021-08-18 | 3 | Marchand | Grégoire | greg.marchand49@music.com |
5 | 25 | 2021-09-12 | 5 | Pacot | Jean | jpacot@music.com |
5 | 6 | 2021-10-10 | 5 | Pacot | Jean | jpacot@music.com |
9 | 20 | 2021-09-28 | 9 | Dubois | Philippe | pdubois5@chezmoi.net |
11 | 14 | 2021-10-08 | 11 | Fournier | Marie | mfournier@abc.de |
7 | 15 | 2021-10-08 | 7 | Moreau | Alain | amoreau1@abc.de |
7 | 19 | 2021-10-08 | 7 | Moreau | Alain | amoreau1@abc.de |
7 | 16 | 2021-10-15 | 7 | Moreau | Alain | amoreau1@abc.de |
16 | 29 | 2021-10-01 | 16 | Bernardin | Stéphanie | sbernard1@chezmoi.net |
Analyse :
SELECT * FROM Emprunt JOIN Client
) a permis de recopier toutes les colonnes des deux tables.ON
. Cela permet de fusionner uniquement les lignes vérifiant la condition Emprunt.id_client = Client.id_client
, autrement dit les lignes pour lesquelle l'attribut id_client
est identique donc celles concernant un même client.
Essayez d'enlever le
ON ...
, vous constaterez que toutes les lignes sont fusionnées, ce qui est absurde car une même ligne peut alors correspondre à deux clients distincts.
Ce sont les clés étrangères qui permettent de faire le lien entre les tables, il est donc normal que la condition de jointure fasse intervenir
id_client
(puisque c'est une clé étrangère de la tableEmprunt
qui la lie à la tableClient
).
On peut combiner une jointure avec la clause SELECT
pour n'afficher que ce qui nous intéresse. Par exemple, si on ne veut que les noms, prénoms et adresses email des clients ayant des emprunts en cours ainsi que les albums empruntés et le jour d'emprunt, on peut faire la requête
SELECT Emprunt.id_album, Emprunt.jour, Client.nom, Client.prenom, Client.email
FROM Emprunt
JOIN Client ON Emprunt.id_client = Client.id_client;
qui produit le résultat
id_album | jour | nom | prenom | |
---|---|---|---|---|
5 | 2021-09-10 | Dupont | Florine | dupont.florine@domaine.net |
8 | 2021-08-18 | Marchand | Grégoire | greg.marchand49@music.com |
24 | 2021-08-18 | Marchand | Grégoire | greg.marchand49@music.com |
25 | 2021-09-12 | Pacot | Jean | jpacot@music.com |
6 | 2021-10-10 | Pacot | Jean | jpacot@music.com |
20 | 2021-09-28 | Dubois | Philippe | pdubois5@chezmoi.net |
14 | 2021-10-08 | Fournier | Marie | mfournier@abc.de |
15 | 2021-10-08 | Moreau | Alain | amoreau1@abc.de |
19 | 2021-10-08 | Moreau | Alain | amoreau1@abc.de |
16 | 2021-10-15 | Moreau | Alain | amoreau1@abc.de |
29 | 2021-10-01 | Bernardin | Stéphanie | sbernard1@chezmoi.net |
Plutôt que d'afficher l'id_album
, qui est peu lisible, on peut préférer afficher le titre de l'album. Pour cela, on peut faire une nouvelle jointure :
SELECT Album.titre, Emprunt.jour, Client.nom, Client.prenom, Client.email
FROM Emprunt
JOIN Client ON Emprunt.id_client = Client.id_client
JOIN Album ON Emprunt.id_album = Album.id_album;
Analyse : On a ajouté la dernière ligne qui permet de faire une jointure sur l'attribut id_album
entre la table produite par la requête précédente et la table Album
. Et on a remplacé la première colonne Emprunt.id_album
par Album.titre
pour faire apparaître les titres des albums comme souhaité :
titre | jour | nom | prenom | |
---|---|---|---|---|
Axis : Bold As Love | 2021-09-10 | Dupont | Florine | dupont.florine@domaine.net |
Riding With The King | 2021-08-18 | Marchand | Grégoire | greg.marchand49@music.com |
Continuum | 2021-08-18 | Marchand | Grégoire | greg.marchand49@music.com |
Continuum | 2021-09-12 | Pacot | Jean | jpacot@music.com |
Thriller | 2021-10-10 | Pacot | Jean | jpacot@music.com |
Power Up | 2021-09-28 | Dubois | Philippe | pdubois5@chezmoi.net |
Let It Be | 2021-10-08 | Fournier | Marie | mfournier@abc.de |
44/876 | 2021-10-08 | Moreau | Alain | amoreau1@abc.de |
Songs in the Key of Life | 2021-10-08 | Moreau | Alain | amoreau1@abc.de |
Lady Soul | 2021-10-15 | Moreau | Alain | amoreau1@abc.de |
Leave the Light On | 2021-10-01 | Bernardin | Stéphanie | sbernard1@chezmoi.net |
On peut combiner tout ce qui a été vu précédemment (dans l'exercice 1 par exemple) avec les jointures, on peut par exemple ajouter des conditions. La requête
SELECT Album.titre, Client.nom, Client.prenom, Client.email
FROM Emprunt
JOIN Client ON Emprunt.id_client = Client.id_client
JOIN Album ON Emprunt.id_album = Album.id_album
WHERE Client.nom = "Moreau";
produit le résultat
titre | nom | prenom | |
---|---|---|---|
44/876 | Moreau | Alain | amoreau1@abc.de |
Lady Soul | Moreau | Alain | amoreau1@abc.de |
Songs in the Key of Life | Moreau | Alain | amoreau1@abc.de |
Certaines requêtes peuvent commencer à être assez longues à écrire. Pour réduire leur longueur on peut utiliser des alias pour les noms de table grâce au mot clé AS
.
Ainsi, la requête précédente peut aussi s'écrire
SELECT a.titre, c.nom, c.prenom, c.email
FROM Emprunt AS e
JOIN Client AS c ON e.id_client = c.id_client
JOIN Album AS a ON e.id_album = a.id_album
WHERE c.nom = "Moreau";
Analyse : Emprunt AS e
permet de renommer la table Emprunt
par e
, ce qui permet de raccourcir les écritures du type Emprunt.id_client
en e.id_client
. Idem pour c
et a
qui sont les alias respectifs des tables Client
et Album
.
Q1 : Écrivez et testez une requête permettant de récupérer l'adresse email de chaque client ayant un emprunt en cours.
Résultat attendu : 11 enregistrements (comme un peu au-dessus).
Réponse :
Q2 : Écrivez et testez une requête permettant de récupérer les noms, prénoms et adresses email des clients ayant un emprunt en cours et dont la date d'emprunt est postérieure au 2 octobre 2021.
Résultat attendu : 5 enregistrements.
Réponse :
Q3 : En réalité, l'attribut dispo
(de la table Album
) n'est pas utile car on peut retrouver tous les albums empruntés avec une jointure. En supposant que l'attribut dispo
n'existe pas, écrivez et testez une requête permettant de récupérer le titre de tous les albums empruntés.
Résultat attendu : 11 enregistrements.
Réponse :
Q4 : Toujours sans utiliser l'attribut dispo
, écrivez et testez une requête permettant de récupérer le titre de tous les albums empruntés par le client dont l'attribut id_client
vaut 7.
Résultat attendu : 3 enregistrements.
Réponse :
Q5 : Toujours sans utiliser l'attribut dispo
, écrivez et testez une requête permettant de récupérer le nom, le prénom et le titre de tous les albums empruntés par le client dont l'attribut id_client
vaut 7.
Résultat attendu : 3 enregistrements (comme à la question précédenet, le client en question est Alain Moreau).
Réponse :
Q6 : Écrivez et testez une requête permettant de récupérer les titres ainsi que les noms et prénoms des artistes de chaque album.
Résultat attendu : 34 enregistrements.
Réponse :
Q7 : Écrivez et testez une requête permettant de récupérer les titres et l'année de sortie de tous les albums de Michael Jackson.
Résultat attendu : 3 enregistrements.
Réponse :
Q8 : Écrivez et testez une requête permettant de récupérer les titres et l'année de sortie de tous les albums de Sting, rangés par ordre croissant d'année de sortie.
Résultat attendu : 3 enregistrements.
Réponse :
Q9 : Écrivez et testez une requête permettant de récupérer les noms et prénoms des artistes de l'album initulé "Don't Explain"
.
Résultat attendu : 2 enregistrements.
Réponse :
... sur une base de données des prix Nobel.
Lien vers l'activité : https://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial
Correction disponible ici : https://github.com/jisaw/sqlzoo-solutions/blob/master/select-from-nobel.sql
... sur une base de données sur les pays du monde.
Lien vers l'activité : https://sqlzoo.net/wiki/SUM_and_COUNT
Correction disponible ici : https://github.com/jisaw/sqlzoo-solutions/blob/master/sum-and-count.sql
... sur une base de données sur l'Euro 2012.
Lien vers l'activité : https://sqlzoo.net/wiki/The_JOIN_operation
Attention : Vous pouvez vous arrêter à la question 8. En effet, à partir de la question 9, il s'agit d'utiliser la clause
GROUP BY
qui n'est pas au programme de Terminale NSI (mais libre à vous de vous y intéresser ou pas).
Correction disponible ici : https://github.com/jisaw/sqlzoo-solutions/blob/master/join.sql
Les données stockées dans une base de données n'ont pas vocation à être figées, elles peuvent être modifiées au cours du temps grâce à des requêtes de mise à jour de la base de donnnées.
Nous allons voir les requêtes permettant d'ajouter des données à une table, de modifier les données d'une table et de supprimer les données d'une table.
Avant cela, faisons une petite digression sur la création de tables dans une base de données.
CREATE TABLE
La création d'une base de données n'est pas au programme de Terminale NSI. Néanmoins, connaître les requêtes permettant de créer une table permet de mieux appréhender les requêtes de mise à jour que l'on verra ensuite.
Créer une base de données consiste à créer les tables de la base. Pour créer une table, on utilise CREATE TABLE
.
Pour créer la table Artiste
correspondant à la relation suivante :
Artiste(id_artiste INT, nom TEXT, prenom TEXT)
on peut exécuter cette commande SQL :
CREATE TABLE Artiste (
id_artiste INTEGER PRIMARY KEY,
nom TEXT,
prenom TEXT
);
Remarque : On a bien précisé le nom et le type de chaque attribut, et indiqué avec PRIMARY KEY
quelle était notre clé primaire.
Q1 : Ouvrez DB Browser for SQLite ou sqliteonline.com :
si vous utilisez DB Browser for SQLite, cliquez sur "Nouvelle Base de Données" puis appelez-la bac.db
et validez. Fermez ensuite la fenêtre de l'assistant de création de table. Vous êtes désormais prêt pour la suite !
si vous utilisez sqliteonline.com, remplacez la requête dans la fenêtre SQL par DROP TABLE demo;
pour effacer la table demo
présente au départ. Vous êtes désormais prêt pour la suite !
Q2 : Écrivez la requête permettant de créer une table Note
correspondant à la relation suivante. Vous vérifierez ensuite dans la structure de la base de données que la table a bien été créée avec les bons attributs et les bons types.
Note(id_eleve INT, nom TEXT, prenom TEXT, maths INT, anglais INT, info INT)
Réponse :
INSERT INTO ... VALUES
Pour insérer des enregistrements (= des lignes) dans une table, on utilise la commande INSERT INTO ... VALUES
Pour insérer les 3 enregistrements suivants dans la table Artiste
.
id_artiste | nom | prenom |
---|---|---|
1 | Clapton | Éric |
2 | Mayall | John |
3 | Hendrix | Jimi |
on écrit la requête
INSERT INTO Artiste VALUES (1, 'Clapton', 'Éric'),
(2, 'Mayall', 'John'),
(3, 'Hendrix', 'Jimi');
Analyse :
INSERT INTO
(que l'on traduit par "insérer dans") on indique le nom de la table (ici Note
) dans laquelle on veut insérer des données ;VALUES
les enregistrements que l'on veut insérer, ces derniers étant séparés par des virgules s'il y en a plusieurs (on n'oublie pas le ;
pour terminer) ;CREATE TABLE
. Néanmoins, il est possible de les passer dans un ordre différent comme on l'explique juste en-dessous.Si on désire passer les valeurs des enregistrements dans un ordre différent de celui de la création de la table, il suffit de préciser l'ordre juste après le nom de la table :
INSERT INTO Artiste (prenom, nom, id_artiste) VALUES ('John', 'Mayer', 4);
Pour voir le code SQL qui a permi de créer la base de données du disquaire, vous pouvez suivre ce lien. Regardez notamment comment on a lié les tables avec les clés étrangères en utilisant
REFERENCES
et comment on définit la réunion de plusieurs attributs comme clé primaire. Vous constaterez également que l'on n'a pas utilisé le typeTEXT
pour le domaine des attributs de type "texte". Enfin, vous trouverez dans ce fichier .sql les ordres d'insertions des différents enregistrements de chaque table.
Q3 : Écrivez la requête permettant d'insérer les trois enregistrements suivants dans la table Note
.
id_eleve | nom | prenom | maths | anglais | info |
---|---|---|---|---|---|
1 | Marchand | Alice | 14 | 13 | 11 |
2 | Muller | Marie | 10 | 18 | 17 |
3 | Prenel | Laura | 13 | 14 | 15 |
Réponse :
Q4 : Écrivez et testez une requête permettant d'afficher tous les enregistrements de la table Note
afin de vérifier que les données ont bien été ajoutées.
Réponse :
Q5 : Écrivez et testez la requête permettant d'ajouter l'enregistrement (3, 'Dupont', 'Arthur', 18, 14, 13)
à la table Note
. Quelle est l'erreur provoquée ? Expliquez-la (voir Chapitre 1 si nécessaire).
Réponse :
Q6 : Écrivez et testez une requête permettant d'ajouter l'enregistrement concernant Arthur mais avec la clé primaire id_eleve
égale à 4. Vous vérifierez que l'enregistrement a bien été ajouté !
Réponse :
À ce stade, vous devriez obtenir la table Note
suivante :
id_eleve | nom | prenom | maths | anglais | info |
---|---|---|---|---|---|
1 | Marchand | Alice | 14 | 13 | 11 |
2 | Muller | Marie | 10 | 18 | 17 |
3 | Prenel | Laura | 13 | 14 | 15 |
4 | Dupont | Arthur | 18 | 14 | 13 |
UPDATE ... SET
Il est possible de modifier des valeurs existantes dans une table, avec UPDATE
.
Dans la table Client
, le client
id_client | nom | prenom | |
---|---|---|---|
4 | Michel | Valérie | vmichel5@monmail.com |
a changé d'adresse email. Pour modifier cette adresse dans la table Client
, on peut écrire :
UPDATE Client SET email = 'valerie.michel@email.fr'
WHERE id_client = 4;
Analyse :
UPDATE
on indique le nom de la table dans laquelle on veut modifier une valeur (ici Client
) ;SET
puis une expression de la forme attribut = valeur
qui permet de définir une nouvel valeur valeur
pour l'attribut attribut
(ici 'valerie.michel@email.fr'
est la nouvelle valeur de l'attribut email
) ;WHERE
la condition permettant de sélectionner les enregistrements sur lesquels la modification doit être apportée (ici une seule ligne car la condition id_client = 4
ne correspond qu'à un seul enregistrement).Q7 : Il y a eu une erreur dans la saisie de l'élève numéro 3 : son prénom n'est pas Laura mais Laure. Écrivez et testez une requête permettant d'effectuer la correction. Vous vérifierez que la modification a bien été effectuée !.
Réponse :
Q8 : Un autre erreur a été détectée : les notes de Mathématiques et d'Anglais de Marchand Alice ont été inversées. Écrivez et testez une requête permettant d'effectuer la correction. Vous vérifierez que la modification a bien été effectuée !.
🆘 Vous lirez la page suivant pour savoir comment modifier plusieurs valeurs simultanément avec
UPDATE ... SET
: https://sql.sh/cours/update.
Réponse :
Q9 : Pour des raisons d'équité entre établissement, il a été décidé que les notes de mathématiques de tous les élèves devaient augmenter d'un point. Écrivez et testez une requête permettant d'effectuer la correction. Vous vérifierez que la modification a bien été effectuée !.
🆘 Pour ajouter un nombre à une valeur, on peut procéder comme en Python pour ajouter un nombre à une variable.
Réponse :
À ce stade, vous devriez obtenir la table Note
suivante :
id_eleve | nom | prenom | maths | anglais | info |
---|---|---|---|---|---|
1 | Marchand | Alice | 14 | 14 | 11 |
2 | Muller | Marie | 11 | 18 | 17 |
3 | Prenel | Laure | 14 | 14 | 15 |
4 | Dupont | Arthur | 19 | 14 | 13 |
Il est possible de supprimer une ligne d'une table en utilisant DELETE
.
Le client Marchand Grégoire a rendu l'album Continuum
(dont l'attribut id_album
vaut 25) qu'il avait emprunté. Il faut supprimer la ligne correspondante dans la table Emprunt
:
id_client | id_album | jour |
---|---|---|
1 | 5 | 2021-09-10 |
3 | 8 | 2021-08-18 |
3 | 24 | 2021-08-18 |
5 | 25 | 2021-09-12 |
5 | 6 | 2021-10-10 |
9 | 20 | 2021-09-28 |
11 | 14 | 2021-10-08 |
7 | 15 | 2021-10-08 |
7 | 19 | 2021-10-08 |
7 | 16 | 2021-10-15 |
16 | 29 | 2021-10-01 |
Pour cela, on peut écrire l'ordre suivant :
DELETE FROM Emprunt
WHERE id_album = 25;
Analyse :
DELETE
on indique dans quelle table on veut supprimer une ligne avec FROM [nom_table]
;WHERE
la condition permettant de sélectionner les enregistrements à supprimer (ici une seule ligne est supprimée car la condition id_album = 25
ne correspond qu'à un seul enregistrement).On peut vérifier que la ligne correspondante a bien été supprimée de la table Emprunt
:
SELECT * FROM Emprunt;
id_client | id_album | jour |
---|---|---|
1 | 5 | 2021-09-10 |
3 | 8 | 2021-08-18 |
3 | 24 | 2021-08-18 |
5 | 6 | 2021-10-10 |
9 | 20 | 2021-09-28 |
11 | 14 | 2021-10-08 |
7 | 15 | 2021-10-08 |
7 | 19 | 2021-10-08 |
7 | 16 | 2021-10-15 |
16 | 29 | 2021-10-01 |
Remarque : Avec le schéma de la base de données il faut aussi mettre à jour la table Album
puisque l'album en question est à nouveau disponible. La requête de mise à jour suivante permet de faire cela :
UPDATE Album
SET dispo = 1
WHERE id_album = 25;
Q10 : L'élève Muller Marie ne devrait pas faire partie de la table Note
car elle ne fait pas partie du même lycée que les autres élèves. Écrivez et testez une requête permettant de supprimer la ligne correspondante. Vous vérifierez que la suppression a bien été effectuée !
Réponse :
On travaillera à nouveau avec la base de données
disquaire.db
que vous trouverez dans l'archive de ce chapitre. Vous utiliserez le logiciel DB Browser for SQLite ou le logiciel en ligne sqliteonline.com dans lesquels vous aurez au préalable ouvert la base de données en question.
Q1 : Le prénom du client "Robert Pascal" a mal été saisi dans la base de données. En effet, son prénom n'est pas Pascal mais Pascale. Écrivez et testez une requête permettant corriger cette erreur. Vous vérifierez que la correction a bien été effectuée !
Réponse :
Q2 : Un titre d'album a mal été saisi dans la base de données. Il faut remplacer Riding With The King par Riding with the King. Écrivez et testez une requête permettant corriger cette erreur. Vous vérifierez que la correction a bien été effectuée !
Réponse :
Q3 : Le client "Durand Julien" souhaite que les informations personnelles le concernant soient supprimées de la base de données (c'est son droit avec le RGPD). Écrivez et testez la requête permettant d'effectuer ces suppressions. Vous vérifierez que la suppression a bien été effectuée !
Réponse :
Q4 : Essayez de supprimer le client "Dupont Florine". Quelle est l'erreur provoquée ? Expliquez-la (voir Chapitre 1 si nécessaire).
Réponse :
On veut créer une base de données baseHopital.db
qui contiendra les trois tables suivantes (les clés primaires sont en gras) :
On suppose que les dates sont données sous la forme jj-mm-aaaa
.
Q1 : Donner les commandes SQLite permettant de créer ces tables.
Réponse :
Q2 : On a oublié une colonne pour noter les codes postaux des patients. Donner la commande SQLite permettant cet ajout.
🆘 Vous lirez la page suivant pour savoir comment ajouter une colonne à une table avec
ALTER TABLE
: https://sql.sh/cours/alter-table. Cette commande n'est a priori pas au exigible en Terminale NSI !
Réponse :
Q3 : Mme Anne Wizeunid, née en 2000 et demeurant 3 rue des Pignons Verts 12345 Avonelit doit être enregistrée comme patiente. Donner la commande SQLite correspondante.
Réponse :
Q4 : Le patient numéro 100 a changé de genre et est maintenant une femme. Donner la commande SQLite modifiant en conséquence ses données.
Réponse :
Q5 : Par souci d'économie, la direction décide de se passer des médecins spécialisés en épidémiologie. Donner la commande permettant de supprimer leurs fiches.
Réponse :
Q6 : Donner la requête permettant d'obtenir la liste des prénoms et noms des patientes habitant le Finistère triées dans l'ordre croissant des âges.
Réponse :
Q7 : Donner la liste des patient(e)s ayant été examiné(e)s par un(e) psychiatre en avril 2020.
Réponse :
Vous utiliserez le site développé par Nicolas Revéret, un grand merci à lui pour cette ressource !
Rendez-vous sur la page https://nreveret.forge.apps.education.fr/exercices_bdd/ qui vous permettra de vous frotter à des exercices complets mais aussi de réviser de manière ciblée certaines notions.
Références :
Germain BECKER, Lycée Mounier, ANGERS
Ressource éducative libre distribuée sous Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International
Voir en ligne : info-mounier.fr/terminale_nsi/base_de_donnees/langage-sql-exercices.php