Aller au contenu

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;
renvoie l’affichage :

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;
renvoie l’aïŹƒchage :

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 :

  1. Quelle requĂȘte permet d’aïŹƒcher tous les noms de commune?
  2. Quelle requĂȘte permet d’aïŹƒcher tous les noms de commune et leur population?
  3. Quelle requĂȘte permet d’aïŹƒcher tous les noms de commune et leur population, classĂ© par ordre croissant de population?
  4. 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;
2.
SELECT Nom_ville,Population
FROM communes;
3.
SELECT Nom_ville,Population
FROM communes  
ORDER BY Population;
4.
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.

  1. Quelle requĂȘte permet d’aïŹƒcher le nom des communes dont le nombre d’élus municipaux est strictement infĂ©rieur Ă  10?
  2. 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?
  3. 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;
2.
SELECT Nom_ville
FROM communes 
WHERE Nb_elus_municipaux <10 AND Population<=100;
3.
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.

  1. Quelle requĂȘte permet d’afficher le nom des communes dans lesquelles il y a eu un deuxiĂšme tour?
  2. 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 ;
2.
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.

  1. Quelle requĂȘte permet d’aïŹƒcher le nom des communes dont le nom commence par Roncherolles?
  2. 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 %";
2.
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.

  1. Quelle requĂȘte permet d’afficher le nombre total d’élus de toutes les communes?
  2. Quelle requĂȘte permet d’afficher la moyenne du nombre d’habitants dans les communes?
  3. 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;
2.
SELECT AVG(Population)
FROM communes;
3.
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 :

  1. Quelle requĂȘte permet d’afficher l’auteur du livre dont le titre est « 1984 »?
  2. Quelle requĂȘte permet d’afficher tous les auteurs qui ont publiĂ© un livre avant 1960 (strictement)?
  3. Quelle requĂȘte permet d’afficher tous les titres des livres publiĂ©s par Pierre Boulle?
  4. 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";
2.
SELECT nom
FROM livres
JOIN auteurs ON livres.idAuteur = auteurs.id 
WHERE ann_publi <1960;
3.
SELECT titre
FROM livres
JOIN auteurs ON livres.idAuteur = auteurs.id 
WHERE UPPER(nom)= boulle;
4.
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
  1. Indiquez la requĂȘte permettant de supprimer le livre "Fondation" de la relation Livres .
  2. Indiquez la requĂȘte permettant de supprimer tous les livres d’Alain Damasio de la relation Livres .
  3. 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";
2.
DELETE FROM livres
WHERE idAuteur = 9;
3.
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
  1. Indiquez la requĂȘte permettant de renommer le livre "Fondation" en "Fondation - Tome 1" dans la relation Livres .
  2. 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";
2.
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 :

  1. La liste des titres des représentations.
  2. La liste des titres des représentations ayant lieu au "théùtre allissa".
  3. La liste des noms des musiciens et des titres des représentations auxquelles ils participent.
  4. La liste des titres des représentations, les lieux et les tarifs du 25/07/2008.
  5. Le nombre des musiciens qui participent à la représentations n°20.
  6. Les représentations et leurs dates dont le tarif ne dépasse pas 20 euros.
RĂ©ponse

1.

SELECT titreRep
FROM representation; 
2.
SELECT titreRep
FROM representation  
WHERE lieu = "théùtre allissa";
3.
SELECT nom, titreRep
FROM representation
JOIN musicien ON representation.numRep = musicien.numRep;
4.
SELECT titreRep, lieu, tarif
FROM representation
JOIN programmer ON representation.numRep = programmer.numRep 
WHERE date= "25/07/2008";
5.
SELECT COUNT(*)
FROM musicien where numRep = 20 ;
6.
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 :

  1. L’insertion du ïŹlm "The Raid" avec le code numĂ©ro 12.
  2. L’insertion de client numĂ©ro 124 qui s’appelle Jean Talu (les autres informations sur ce client ne sont pas connues).
  3. La suppression du ïŹlm "Dans la peau de John Malkovitch".
  4. Le renommage du ïŹlm "Boulevard de la Mort" en "Death Proof".
RĂ©ponse

1.

INSERT  INTO  films 
VALUES  (12, "The Raid");
2.
INSERT  INTO  clients 
VALUES  (124, "Jean", « Talu »,NULL,NULL,NULL);
3.
DELETE FROM films
WHERE nomfilm = "Dans la peau de John Malkovitch";
4.
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 :

  1. Les numéros de chambres avec TV.
  2. Les numéros de chambres et leurs capacités.
  3. La capacitĂ© thĂ©orique d’accueil de l’hĂŽtel.
  4. Le prix par personne des chambres avec TV.
  5. Les numéros des chambres et le numéro des clients ayant réservé des chambres pour le 09/02/2004.
  6. Les numéros des chambres coûtant au maximum 80 Euro, ou ayant un bain et valant au maximum 120 Euro.
  7. Les Nom, Prénoms et adresses des clients dans le noms commencent par « D ».
  8. Le nombre de chambres dont le prix est entre 85 et 120 Euro.
  9. Les noms des clients n’ayant pas ïŹxĂ© la date de dĂ©part.
RĂ©ponse

1.

SELECT numChambre
FROM chambre 
WHERE equipement = "TV";
2.
SELECT numChambre, nbrPers
FROM chambre;
3.
SELECT SUM(nbrPers)
FROM chambre;
4.
SELECT prix/nbrpers
FROM chambre 
WHERE equipement = "TV";
5.
SELECT numChambre, numClient
FROM reservation 
WHERE dateArr = "09/02/2004";
6.
SELECT numChambre
FROM chambre 
WHERE prix ≀ 80 OR (confort = "Bain" AND prix ≀ 120);
7.
SELECT nom, prenom, adresse
FROM client 
WHERE nom = "D%";
8.
SELECT COUNT(*)
FROM chambre 
WHERE 85 ≀ prix ≀ 120;
9.
SELECT nom
FROM client
JOIN reservation ON client.numcClient = reservation.numClient 
WHERE dateDep IS NULL;