Le langage SQL
Activité 1 - Un petit jeu pour commencer
Le langage SQL (Structured Query Language) est un langage de requĂȘte permettant de manipuler des bases de donnĂ©es relationnelles.
Rendez vous ici et mener lâenquĂȘte.
RequĂȘtes d'interrogation
Construction d'une requĂȘte simple avec SELECT
...FROM
Lâinstruction de base pour lâinterrogation dâune base de donnĂ©es en SQL est constituĂ©e du mot-clĂ© SELECT
suivi du mot-clé FROM
.
SELECT
permet de sĂ©lectionner les attributs dont il faut aïŹcher les valeurs. Le caractĂšre \(*\) permet dâaïŹcher les valeurs de tous les attributs.FROM
permet de sélectionner la relation à explorer.
Une requĂȘte SQL ïŹnit toujours par un point-virgule ;
Remarque
Le langage SQL nâest pas sensible Ă la casse. nĂ©anmoins, il est coutumier dâĂ©crire les mots-clĂ©s en majuscule.
Exemple
On considĂšre la relation LIVRES ( id , titre, auteur, ann_publi)
Elle contient les éléments suivants :
- Affichage de tous les titres présents dans la relation LIVRES
SELECT titre
FROM livres;
1984
Dune
Fondation
Farenheit 451
Chroniques martiennes
- Affichage de tous les titres et années de publication présents dans la relation LIVRES
SELECT titre, ann_publi
FROM livres;
1984, 1949
Dune, 1965
Fondation, 1951
Farenheit 451, 1953
Chroniques martiennes, 1950
- Affichage de tous les attributs présents dans la relation LIVRES
SELECT *
FROM livres;
renvoie lâaïŹchage :
1, 1984, Orwel, 1949
2, Dune, Herbert, 1965
3, Fondation, Asimov, 1951
4, Farenheit 451, Bradbury 1953
5, Chroniques martiennes, Bradbury, 1950
Rejet des doublons avec DISTINCT
Le mot-clé DISTINCT
permet dâĂ©viter lâaïŹchage de doublons.
Exemple
- Affichage de tous les auteurs dans la relation LIVRES
SELECT auteur
FROM livres;
renvoie lâaffichage :
Orwell
Herbert
Asimov
Bradbury
Bradbury
- Affichage de tous les auteurs dans la relation LIVRES sans les doublons
SELECT DISTINCT auteur
FROM livres;
renvoie lâaffichage :
Orwell
Herbert
Asimov
Bradbury
Le tri avec ORDER BY
Le mot-clé ORDER BY
permet de trier les résultats par ordre croissant.
Pour trier par ordre dĂ©croissant, il faut ajouter lâoption DESC
.
Exemple
- Affichage de tous les auteurs et titre dans la relation LIVRES par ordre croissant de lâattribut auteur
SELECT titre, auteur
FROM livres
ORDER BY auteur;
renvoie lâaffichage :
Fondation, Asimov
Farenheit 451, Bradbury
Chroniques martiennes, Bradbury
Dune, Herbert
1984, Orwell
- Affichage de tous les auteurs et titre dans la relation LIVRES par ordre dĂ©croissant de lâattribut ann_publi
SELECT DISTINCT auteur, titre
FROM livres
ORDER BY ann_publi DESC;
renvoie lâaffichage :
Dune, Herbert
Chroniques martiennes, Bradbury
Fondation, Asimov
Farenheit 451, Bradbury
1984, Orwell
Activité 2 - Relation Communes
On considÚre la relation COMMUNES dont une partie du contenu est représenté ci-dessous :
- Quelle requĂȘte permet dâaïŹcher tous les noms de commune?
- Quelle requĂȘte permet dâaïŹcher tous les noms de commune et leur population?
- Quelle requĂȘte permet dâaïŹcher tous les noms de commune et leur population, classĂ© par ordre croissant de population?
- Quelle requĂȘte permet dâaïŹcher tous les noms de commune et leur population, classĂ© par ordre dĂ©croissant dâĂ©lus municipaux?
RĂ©ponse
1.
SELECT Nom_ville
FROM communes;
SELECT Nom_ville,Population
FROM communes;
SELECT Nom_ville,Population
FROM communesÂ
ORDER BY Population;
SELECT Nom_ville,Population
FROM communesÂ
ORDER BY Nb_elus_municipaux DESC;
RequĂȘte avec une ou plusieurs restrictions
Une restriction est une sĂ©lection de lignes dâune relation, sur la base dâune condition Ă respecter, dĂ©ïŹnie Ă la suite du terme WHERE . Cette condition peut ĂȘtre une combinaison de comparaisons Ă lâaide de AND
, de OR
et de NOT
(attention donc aux parenthĂšses dans ce cas).
Remarque
Nous disposons de tous les opérateurs classiques de comparaison : \(=, <>, >, >=, <, <=\).
Exemple
Reprenons la relation dĂ©ïŹnie dans lâexemple sur la relation LIVRES.
- Affichage de tous les auteurs et titres dont le titre du livre est « 1984 »
SELECT auteur, titre
FROM livres
WHERE titre = '1984';
renvoie lâaffichage :
Orwell, 1984
Affichage de tous les auteurs et titres dont le titre du livre nâest pas « 1984 »
SELECT auteur, titre
FROM livres
WHERE titre <> '1984';
renvoie lâaffichage :
Herbert, Dune
Asimov, Fondation
Bradbury, Farenheit 452
Bradbury, Chroniques martiennes
- Affichage de tous les auteurs et titres dont lâannĂ©e de publication est infĂ©rieure ou Ă©gale Ă 1950
SELECT auteur, titre
FROM livres
WHERE ann_publi <= 1950;
renvoie lâaïŹchage :
Orwell, 1984
Bradbury, Chroniques martiennes
Remarque
Pour les comparaisons de chaĂźnes de caractĂšres, il est important de faire attention Ă la casse. Par dĂ©ïŹnition, un "a" est donc diïŹĂ©rent dâun "A". Pour remĂ©dier Ă ce problĂšme, il existe les fonction UPPER() et LOWER() pour transformer une chaĂźne en respectivement majuscule et minuscule.
SELECT auteur, titre
FROM livres
WHERE UPPER(titre) = "DUNE";
Activité 3 - Recherche conditionnelle de communes #1
On reprend la relation COMMUNES précédente.
- Quelle requĂȘte permet dâaïŹcher le nom des communes dont le nombre dâĂ©lus municipaux est strictement infĂ©rieur Ă 10?
- Quelle requĂȘte permet dâaïŹcher le nom des communes dont le nombre dâĂ©lus municipaux est strictement infĂ©rieur Ă 10 ET dont la population est infĂ©rieure ou Ă©gale Ă 100?
- Quelle requĂȘte permet dâaïŹcher le nombre dâĂ©lus municipaux et la population de la ville de « Cressin-Rochefort »? (NB : affranchissez vous de la casse)
RĂ©ponse
1.
SELECT Nom_ville
FROM communesÂ
WHERE Nb_elus_municipaux <10;
SELECT Nom_ville
FROM communesÂ
WHERE Nb_elus_municipaux <10 AND Population<=100;
SELECT Nb_elus_municipaux, Population
FROM communesÂ
WHERE LOWER(Nom_ville) = « cressin-rochefort »;
Opérateur IS NULL
Une donnée manquante en SQL est repérée par un NULL. Il y a plusieurs raisons, bonnes ou mauvaises, pour avoir des données manquantes, et il est parfois utile de tester leur
présence. Pour cela, nous allons utiliser le terme IS NULL
comme condition.
Au contraire, si lâon veut uniquement les employĂ©s pour lesquels lâinformation est prĂ©sente, nous devrons utiliser la nĂ©gation avec IS NOT NULL
.
Exemple
AïŹchage de tous les auteurs et titres dont lâannĂ©e de publication est connue
SELECT auteur, titre
FROM livres
WHERE ann_publi IS NOT NULL;
renvoie lâaïŹchage :
Orwell, 1984
Herbert, Dune
Asimov, Fondation
Bradbury, Farenheit 451
Bradbury, Chroniques martiennes
Activité 4 - Recherche conditionnelle de communes #2
On reprend la relation COMMUNES précédente.
- Quelle requĂȘte permet dâafficher le nom des communes dans lesquelles il y a eu un deuxiĂšme tour?
- Quelle requĂȘte permet dâafficher le nom des communes dont la population est supĂ©rieure Ă 5 000 habitants et dans lesquelles il y a eu un deuxiĂšme tour?
RĂ©ponse
1.
SELECT Nom_villes
FROM communes
WHERE exprime_deuxieme_tour IS NOT NULLÂ ;
SELECT Nom_villes
FROM communes
WHERE Population > 5000 AND exprime_deuxieme_tour IS NOT NULL;
Opérateur LIKE
LâopĂ©rateur LIKE
permet de rechercher les valeurs contenant une partie seulement de la chaßne de caractÚres. Le caractÚre \(\%\) représente une suite de caractÚres, éventuellement nulle.
Exemple
Affichage de tous les auteurs et titres dont le titre contient le mot « Chronique » (remarquez lâabsence du s ïŹnal)
SELECT auteur, titre
FROM livres
WHERE titre LIKE "%Chronique%";
renvoie lâaïŹchage :
Bradbury, Chroniques martiennes
Activité 5 - Recherche de chaßnes de caractÚres
On reprend la relation COMMUNES précédente.
- Quelle requĂȘte permet dâaïŹcher le nom des communes dont le nom commence par Roncherolles?
- Quelle requĂȘte permet dâaïŹcher le nom des communes dont le nom contient le mot « sur »?
RĂ©ponse
1.
SELECT Nom_villes
FROM communes
WHERE Nom_villes LIKE "Roncherolles %";
SELECT Nom_villes
FROM communes
WHERE Nom_villes LIKE "%sur%";
Fonctions d'agrégation
La fonction dâagrĂ©gation COUNT()
permet de compter le nombre dâenregistrement dans une table.
Exemples
Reprenons la relation dĂ©ïŹnie dans le premier exemple.
- On compte tous les enregistrements présents dans la relation LIVRES.
SELECT COUNT(*)
FROM livres;
renvoie lâaffichage :
5
- On compte tous les enregistrements qui ont lâattribut ann_publi renseignĂ©
SELECT COUNT(ann_publi)
FROM livres;
renvoie lâaffichage :
5
- On compte le nombre dâauteurs diïŹĂ©rents enregistrĂ©s
SELECT COUNT(DISTINCT auteur)
FROM livres;
renvoie lâaffichage :
4
- On compte le nombre dâenregistrements pour lesquels lâannĂ©e de publication est infĂ©rerieure ou Ă©gale Ă 1950
SELECT COUNT(*)
FROM livres
WHERE ann_publi <= 1950;
renvoie lâaffichage :
2
DĂ©finition
- La fonction
SUM(attribut)
permet donc de faire la somme des valeurs non nulles de lâattribut passĂ© en paramĂštre. - La fonction
AVG(attribut)
permet de faire la moyenne des valeurs de lâattribut passĂ© en paramĂštre. - La fonction
MEDIAN(attribut)
permet de faire la mĂ©diane des valeurs de lâattribut passĂ© en paramĂštre. - La fonction
MIN(attribut)
permet dâafficher la valeur minimale de lâattribut passĂ© en paramĂštre. - La fonction
MAX(attribut)
permet dâafficher la valeur maximale de lâattribut passĂ© en paramĂštre.
Exemple
Reprenons la relation dĂ©ïŹnie dans le premier exemple.
On affiche lâannĂ©e de publication la plus petite :
SELECT MIN(ann_publi)
FROM livres;
renvoie lâaffichage :
1949
Activité 6 - Agrégations de communes
On reprend la relation COMMUNES précédente.
- Quelle requĂȘte permet dâafficher le nombre total dâĂ©lus de toutes les communes?
- Quelle requĂȘte permet dâafficher la moyenne du nombre dâhabitants dans les communes?
- Quelle requĂȘte permet dâafficher le nom de la ville avec la population la plus grande pour laquelle il nây a pas de deuxiĂšme tour?
RĂ©ponse
1.
SELECT SUM(Nb_elus_municipaux)
FROM communes;
SELECT AVG(Population)
FROM communes;
SELECT Nom_villes, Max(Population)
FROM communes
WHERE exprime_deuxieme_tour IS NULL;
RequĂȘtes avec jointure
On a vu dans la partie consacrĂ©e au modĂšle relationnel, quâune clĂ© Ă©trangĂšre rĂ©fĂ©rence une clĂ© primaire venant dâune autre table, suivant lâexemple ci-dessous :
Pour représenter le lien entre la clé étrangÚre et la clé primaire, on réalise une jointure .
Une jointure est lâopĂ©ration consistant Ă rapprocher selon une condition les clĂ© primaire et clĂ© Ă©trangĂšre de deux relations.
La syntaxe est :
relation1
JOIN relation2 ON relation1.attribut1 = relation2.attribut2;
La jointure se positionne aprĂšs les clauses SELECT
et FROM
SELECT attribut
FROM relation1
JOIN relation2 ON realtion1.attribut1 = realtion2.attribut2;
Exemple
Suivant le schéma ci-dessus,on écrirait:
SELECT livres
FROM Livres
JOIN Auteurs ON livres.idAuteur = auteurs.id;
Activité 7 - Recherche de livres
On considÚre les deux relations représentés ci-dessous :
- Quelle requĂȘte permet dâafficher lâauteur du livre dont le titre est « 1984 »?
- Quelle requĂȘte permet dâafficher tous les auteurs qui ont publiĂ© un livre avant 1960 (strictement)?
- Quelle requĂȘte permet dâafficher tous les titres des livres publiĂ©s par Pierre Boulle?
- Quelle requĂȘte permet dâafficher lâauteur et le titre de tous les livres publiĂ©s avant 1960 (strictement)?
RĂ©ponse
1.
SELECT nom
FROM livres
JOIN auteurs ON livres.idAuteur = auteurs.idÂ
WHERE titre = "1984";
SELECT nom
FROM livres
JOIN auteurs ON livres.idAuteur = auteurs.id
WHERE ann_publi <1960;
SELECT titre
FROM livres
JOIN auteurs ON livres.idAuteur = auteurs.id
WHERE UPPER(nom)=Â boulle;
SELECT nom,titre
FROM livres
JOIN auteurs ON livres.idAuteur = auteurs.id
WHERE ann_publi < 1960;
RequĂȘtes de manipulation de donnĂ©es
Insertion de données
Lâinstruction de base pour lâinsertion de donnĂ©es dans une base est constituĂ©e du mot-clĂ© INSERT INTO
suivi du mot-clé VALUES
.
INSERT INTO
permet de sélectionner la relation dans laquelle on insÚre les données.VALUES
indique les valeurs qui doivent ĂȘtre insĂ©rĂ©es. Elles sont indiquĂ©es entre deux parenthĂšses.
La syntaxe est :
INSERT INTO relation
VALUES (attribut1 = valeur1, attribut2 = valeur2)
WHERE condition;
Exemple
INSERT INTO Livres VALUES (4, "Les Furtifs", "Damasio", 2019);
- On insĂšre des valeurs dans la relation Livres ;
- lâattribut id prend la valeur 4 ;
- lâattribut titre prend la valeur Les Furtifs ;
- lâattribut auteur prend la valeur Damasio ;
- lâattribut ann_publi prend la valeur 2019 .
Activité 8 - Ajout de livres
Au vu du diagramme relationnel suivant, indiquez les deux requĂȘtes pour insĂ©rer le livre dâAlain Damasio intitulĂ© "La Horde du Contrevent", paru en 2004 et publiĂ© en langue française.
RĂ©ponse
INSERT INTO auteurs VALUES (9, "Damasio", "Alain", français);
INSERT INTO livres VALUES (15, "La Horde du Contrevent", 9, 2004);
ATTENTION : lâordre des requĂȘtes est important !!!
Suppression de données
Lâinstruction de base pour lâinsertion de donnĂ©es dans une base est constituĂ©e du mot-clĂ© DELETE FROM
.
La syntaxe est :
DELETE FROM relation WHERE condition
Activité 9 - Suppression de livres
- Indiquez la requĂȘte permettant de supprimer le livre "Fondation" de la relation Livres .
- Indiquez la requĂȘte permettant de supprimer tous les livres dâAlain Damasio de la relation Livres .
- Indiquez la requĂȘte permettant de supprimer tous les livres Ă©crits avant 1945 de la relation Livres .
RĂ©ponse
1.
DELETE FROM livres
WHERE titre=Â "Fondation";
DELETE FROM livres
WHERE idAuteur = 9;
DELETE FROM livres
WHERE annPubli †1945;
Modification de données
Lâinstruction de base pour la modiïŹcation de donnĂ©es dans une base est constituĂ©e du mot-clĂ© UPDATE
, suivi du mot-clé SET
.
UPDATE
permet de sélectionner la relation dans laquelle on insÚre les données.SET
indique les attributs qui doivent ĂȘtre modiïŹĂ©s, et les valeurs correspondantes.
La syntaxe est :
UPDATE relation
SET attribut = valeur
WHERE condition;
Activité 10 - Renommer des livres
- Indiquez la requĂȘte permettant de renommer le livre "Fondation" en "Fondation - Tome 1" dans la relation Livres .
- Le bibliothĂ©caire de Gonneville-la-Mallet a inscrit par erreur que le livre dâAlain Damasio "La Zone du Dehors" a Ă©tĂ© publiĂ© en 2007, or sa premiĂšre Ă©dition date de 1999. Indiquez la requĂȘte permettant de corriger cette erreur dans la relation Livres .
RĂ©ponse
1.
UPDATE livres SET titre = "Fondation â Tome 1"
WHERE titre = "Fondation";
UPDATE livres SET annPubli = 1999
WHERE titre = "La Zone du Dehors";
Activité 11 - Festivals
Soit la base de donnĂ©es dâun festival de musique : dans une reprĂ©sentation peut participer un ou plusieurs musiciens. Un musicien ne peut participer quâĂ une seule reprĂ©sentation.
- Representation (numRep , titreRep , lieu)
- Musicien (numMus , nom , #numRep)
- Programmer (Date , #numRep, tarif)
Indiquez les requĂȘtes qui permettent dâobtenir :
- La liste des titres des représentations.
- La liste des titres des représentations ayant lieu au "théùtre allissa".
- La liste des noms des musiciens et des titres des représentations auxquelles ils participent.
- La liste des titres des représentations, les lieux et les tarifs du 25/07/2008.
- Le nombre des musiciens qui participent à la représentations n°20.
- Les représentations et leurs dates dont le tarif ne dépasse pas 20 euros.
RĂ©ponse
1.
SELECT titreRep
FROM representation;
SELECT titreRep
FROM representationÂ
WHERE lieu = "théùtre allissa";
SELECT nom, titreRep
FROM representation
JOIN musicien ON representation.numRep = musicien.numRep;
SELECT titreRep, lieu, tarif
FROM representation
JOIN programmer ON representation.numRep = programmer.numRepÂ
WHERE date=Â "25/07/2008";
SELECT COUNT(*)
FROM musicien where numRep = 20Â ;
SELECT titreRep, date
FROM representation
JOIN programmer ON representation.numRep = programmer.numRep
WHERE tarif †20;
Activité 12 - Films
Soit le modĂšle relationnel suivant relatif Ă la gestion des locations de ïŹlms :
- Clients (codecli, prenomcli, nomcli, ruecli, cpcli, villecli)
- Films (codeïŹlm, nomïŹlm)
- Locations (# codecli, # codeïŹlm, datedebut, duree)
Indiquez les requĂȘtes qui permettent dâobtenir :
- Lâinsertion du ïŹlm "The Raid" avec le code numĂ©ro 12.
- Lâinsertion de client numĂ©ro 124 qui sâappelle Jean Talu (les autres informations sur ce client ne sont pas connues).
- La suppression du ïŹlm "Dans la peau de John Malkovitch".
- Le renommage du ïŹlm "Boulevard de la Mort" en "Death Proof".
RĂ©ponse
1.
INSERT INTO films
VALUES (12, "The Raid");
INSERT INTO clients
VALUES (124, "Jean", « Talu »,NULL,NULL,NULL);
DELETE FROM films
WHERE nomfilm = "Dans la peau de John Malkovitch";
UPDATE films SET nomfilm= « Death Proof »
WHERE nomfilm =Â "Boulevard de la Mort";
Activité 13 - HÎtels
Soit la Base de données hÎtel qui contient 3 relations :
- Chambre (numChambre, prix, nbrLit, nbrPers, confort, equipement)
- Client (numClient, nom, prenom, adresse)
- Reservation (# numClient, # numChambre, dateArr, dateDep)
Le contenu de chaque relation est :
Indiquez les requĂȘtes qui permettent dâobtenir :
- Les numéros de chambres avec TV.
- Les numéros de chambres et leurs capacités.
- La capacitĂ© thĂ©orique dâaccueil de lâhĂŽtel.
- Le prix par personne des chambres avec TV.
- Les numéros des chambres et le numéro des clients ayant réservé des chambres pour le 09/02/2004.
- Les numéros des chambres coûtant au maximum 80 Euro, ou ayant un bain et valant au maximum 120 Euro.
- Les Nom, Prénoms et adresses des clients dans le noms commencent par « D ».
- Le nombre de chambres dont le prix est entre 85 et 120 Euro.
- Les noms des clients nâayant pas ïŹxĂ© la date de dĂ©part.
RĂ©ponse
1.
SELECT numChambre
FROM chambre
WHERE equipement = "TV";
SELECT numChambre, nbrPers
FROM chambre;
SELECT SUM(nbrPers)
FROM chambre;
SELECT prix/nbrpers
FROM chambre
WHERE equipement = "TV";
SELECT numChambre, numClient
FROM reservation
WHERE dateArr = "09/02/2004";
SELECT numChambre
FROM chambre
WHERE prix †80 OR (confort = "Bain" AND prix †120);
SELECT nom, prenom, adresse
FROM client
WHERE nom = "D%";
SELECT COUNT(*)
FROM chambre
WHERE 85 †prix †120;
SELECT nom
FROM client
JOIN reservation ON client.numcClient = reservation.numClient
WHERE dateDep IS NULL;