Université Abdelhamid Mehri, Constantine 2
Faculté NTIC Département MI 2ème Année MI Année Universitaire 2019-2020
Introduction aux Bases de Données
F. Magra-Benchikha
Chapitre 3
Manipulation de BDs relationnelles : Langage SQL
Plan de la présentation Le langage SQL
1. Introduction
2. Le langage LDD
2.1. Création d'une BD
2.2. Création de tables
2.3. Suppression de table
2.4. Modification de table
3. Le langage LMD
3.1. Recherche des données (SELECT)
• Expression de la projection
• Expression de la restriction
• Expression du produit cartésien
• Expression de la jointure
• Les sous requêtes
• Expression des opérations ensemblistes
• Les fonctions de calcul et les agrégats
• Expression de la division
• Tri des données
3.2. Insertion, Modification, Suppression de tuples
4. Application récapitulative
2
Le langage SQL Introduction
Les SGBD relationnels proposent un langage de requêtes appelé SQL (Stuctured Query
Language) supporté par tous les SGBDs micro (access) ou professionnels (Oracle).
SQL est le langage d’accès normalisé aux bases de données relationnelles.
SQL a été standardisé par l’ANSI en 1986 puis par l’ISO en 1989, 1992, 1999, 2003 et 2008.
Ces standards successifs ont étendu les capacités du langage.
la norme SQL-92 nommée SQL2 est la plus répondue et la plus supportée par les SGBDs.
Le modèle relationnel comporte essentiellement :
• Langage de définition des données (LDD) : qui permet de créer une table (CREATE TABLE),
supprimer une table (DROP TABLE), modifier une table (ALTER TABLE) et créer des vues
externes (CREATE VUE).
• Langage de manipulation de données (LMD): qui permet d’interroger une base de
données (SELECT), insérer des tuples (INSERT INTO), modifier des tuples (UPDATE),
supprimer des tuples (DELETE).
• Langage pour le contrôle des données : qui permet par exemple d'attribuer des droits
d'accès (GRANT).
3
La langage LDD Création et suppression de BD
Création d'une base de données:
Une BD est définie par son schéma. SQL propose donc de créer ce schéma avant de définir
ses composants grâce à la commande CREATE et de le supprimer avec la commande DROP.
Dans MySQL :
Création d'une BD:
CREATE DATABASE <nom_base>;
Exemple : Création de la base de données Gestion_stock :
CREATE DATABASE Gestion_stock;
Suppression d'une BD:
DROP DATABASE <nom_base>;
Exemple : Suppression de la base de données Gestion_stock :
DROP DATABASE Gestion_stock;
4
La langage LDD Création de table
Création de table : (CREATE TABLE)
Cette opération produit une table vide (c.-à-d. sans ligne ou tuple).
CREATE TABLE < nom de la table >
( < nom_colonne 1 > < type_colonne 1 > [DEFAULT <valeur>] [ <contraintes_attribut1>],
< nom de colonne 2 > < type de la colonne 2 > [DEFAULT <valeur>] [<contrainte d'attribut 2>] ,
...
< nom de colonne N > < type de la colonne N > [DEFAULT <valeur>] [<contrainte d'attribut N>] ,
<Contraintes_table>)
NB : Les définitions optionnelles sont mises entre crochets.
Quelques domaines ou types d'attributs
Type de donnée Syntaxe
Alphanumérique CHAR(n)
Alphanumérique VARCHAR(n)
Numérique INTEGER
Numérique SMALLINT
Numérique FLOAT
Temps DATE
Temps TIME
Temps TIMESTAMP
5
La langage LDD Création de table
Contraintes d'attribut/table
Contrainte Syntaxe
Contrainte de valeur nulle impossible NOT NULL
Contrainte d'unicité d'attributs PRIMARY KEY (<attribut>+)
contrainte référentielle [FOREIGN KEY (<colonne référençante>)]
REFERENCES <table référencée> [(<colonne
référencée>+)]
contrainte générale ou de domaine CHECK (<condition>)
6
La langage LDD Création de table
Création de table : Exemple
Création des tables de la base de données Gestion_stock :
PRODUIT (code_prod, nom_prod, prix)
DEPOT (id_dep, adr)
STOCK (code_prod*, code_dep*, qté-stock)
CREATE TABLE Produit (
code_prod int NOT NULL,
nom_prod varchar (15) NOT NULL,
prix float ,
PRIMARY KEY (code_prod) )
CREATE TABLE Depot(
id_dep int NOT NULL ,
adr varchar (15),
PRIMARY KEY (id_dep) ) )
CREATE TABLE Stock (
code_prod int NOT NULL REFERENCES Produit(code_prod),
code_dep int NOT NULL,
qté_stock int NOT NULL DEFAULT 50,
PRIMARY KEY (code_prod, code_dep),
FOREIGN KEY (code_dep) REFERENCES Depot (id_dep),
CHECK (qté_stock > 10) )
7
La langage LDD Suppression et modification de table
Suppression de table : (DROP TABLE)
Une table peut être supprimée avec la commande DROP TABLE. Une fois, supprimée, la
table devient inconnue et son contenu est perdu.
Exemple:
DROP TABLE CLIENT
Modification de table : (ALTER TABLE) (Voir application en TP)
Une table peut être modifiée en ajoutant de nouveaux attributs, en supprimant des
attributs ou en les modifiant par la commande ALTER TABLE.
ALTER TABLE <nom_table> ADD ... -- permet d'ajouter une colonne ou une contrainte
ALTER TABLE <nom_table > DROP ... -- permet de supprimer une colonne ou une contrainte
ALTER TABLE <nom_table > MODIFY ... -- permettent de modifier une colonne
8
La langage LMD Interrogation de BD
Recherche de données: (SELECT)
La commande de recherche des données SELECT est à la base du langage SQL
Toutes les opérations de l'algèbre relationnelle sont exprimées grâce à cette commande.
Sa syntaxe générale est la suivante:
SELECT [ALL|DISTINCT] <att1> [ , [ALL|DISTINCT] <att2>, [ALL|DISTINCT] <att3>, ... ] | *
FROM <Table1> [ , <Table2>, <Table3><, ... ]
[WHERE <conditions de sélection et/ou de jointure>]
[GROUP BY <att1> [ , <att2>, ... ] [HAVING <conditions de selection>]]
[(UNION│INTERSECT│MINUS [ALL]) <commande SELECT>]
[ORDER BY < att1> [ASC | DESC] [, <att2> [ASC | DESC], ...];
NB : Seules les clauses SELECT et FROM sont obligatoires
9
La langage LMD Interrogation de BD
1. Expression de la projection
SELECT [ALL|DISTINCT] <att1> [ , [ALL|DISTINCT] <att2>, [ALL|DISTINCT] <att3>, ... ] | *
FROM <Table>
* : lister tous les attributs de la table référencée dans la clause FROM.
DISTINCT : permet d'éliminer du résultat les tuples en double. En effet, SQL n’élimine
pas automatiquement les doubles, à moins que cela soit explicitement demandé par le mot
clé DISTINCT, l’option par défaut étant ALL.
Il est possible d’appliquer des fonctions de calculs sur les colonnes extraites. Ces
fonctions sont les opérations arithmétiques (+, –, * et / ) ou des fonctions scalaires
prédéfinies telles que ROUND, MOD,…..
10
La langage LMD Interrogation de BD
Expression de la projection : Exemples
On considère une extension de la BD du chapitre 2.
Produit (code_prod, nom_prod, prix)
Stock (code_prod*, code_dep*, qté_stock)
Depot (id_dep, adr)
Requête 1 : Lister le code et le prix de tous les produits
SELECT code_prod, prix
FROM Produit
Requête 2 : Lister le code et le prix en Euro de tous les produits
SELECT code_prod, prix/11
FROM Produit
Requête 3 : Lister le nom de tous les produits
/* Il est possible d'avoir des produits de même nom (doublons)*/
SELECT DISTINCT nom_prod
FROM Produit
11
La langage LMD Interrogation de BD
2. Expression de la selection
Toute sélection est une combinaison d’une restriction suivie d’une projection. Une
sélection s’exprime comme une projection avec en plus une condition de recherche
spécifiée dans la clause FROM selon la syntaxe suivante :
SELECT [ALL|DISTINCT] <att1> [ , [ALL|DISTINCT] <att2>, [ALL|DISTINCT] <att3>, ... ] | *
FROM <Table>
WHERE <condition(s) de sélection>
La condition de selection peut être un prédicat élémentaire ou bien une expression
booléenne utilisant les opérateurs booléens (AND, OR, XOR, NOT). Voici le calcul de la
valeur d’une condition de recherche :
AND OR (OU) VRAI FAUX inconnu XOR (OU
VRAI FAUX Inconnu VRAI FAUX inconnu
(ET) Exclusif)
VRAI VRAI VRAI VRAI
VRAI VRAI FAUX inconnu VRAI FAUX VRAI inconnu
FAUX VRAI FAUX inconnu
FAUX FAUX FAUX FAUX FAUX VRAI FAUX inconnu
inconnu VRAI inconnu inconnu inconnu inconnu inconnu inconnu
inconnu inconnu FAUX inconnu
NOT
VRAI FAUX inconnu
(NON)
FAUX VRAI inconnu
12
La langage LMD Interrogation de BD
Expression de la selection: Quelques prédicats élémentaires
Prédicat Syntaxe Exemple Commentaire
Prédicat de comparaison =| ≠| < | > | <=|>= ….WHERE prix>100 /
Prédicat d'intervalle BETWEEN … AND …WHERE numéro Les bornes de l'intervalle
BETWEEN 12 AND 20 sont généralement
incluses.
Prédicat de comparaison LIKE / NOT LIKE …WHERE nom LIKE 'D%' LIKE permet de vérifier
de texte qu'une chaîne de
caractères est conforme
à un modèle contenant
'_ 'et/ou '% '
Prédicat de Nullité IS NULL/ IS NOT NULL … WHERE prix IS NULL IS NULL teste l'absence
de valeur qui peut être
assimilée à une valeur
inconnue.
Prédicat d'appartenance IN /NOT IN … WHERE année IN tester si la valeur d’un
(2016, 2015) terme appartient
(/n'appartient pas)
à une liste de constantes.
13
La langage LMD Interrogation de BD
Expression de la restriction: Exemples
Requête 4 : Lister les produits (code, Requête 5 : Lister le code des produits
nom et prix) de prix >100 DA. dont la quantité en stock est entre 50 et
200.
SELECT *
FROM Produit SELECT code_prod
WHERE prix>100 FROM Produit
WHERE prix BETWEEN 50 AND 200
Requête 6: Lister le nom des produits Requête 7: Lister le code des produits
commençant par la lettre 'B' et dont stockés dans les dépôts 'D1', 'D2' ou 'D3'.
le prix est inconnu.
SELECT code_prod
SELECT nom_prod FROM Stock
FROM Produit WHERE code_dep IN ('D1', 'D2', 'D3')
WHERE prix IS NULL
AND nom_prod LIKE 'B%'
14
La langage LMD Interrogation de BD
3. Expression du produit cartésien
Le produit cartésien s’exprime en incluant plusieurs relations dans la clause FROM.
SELECT [ALL|DISTINCT] <att1> [ , [ALL|DISTINCT] <att2>, [ALL|DISTINCT] <att3>, ... ] | *
FROM <Table1> , <Table2> [ , <Table3>, ... ]
Exemple :
SELECT *
FROM Produit, Stock
15
La langage LMD Interrogation de BD
4. Expression de la jointure
La jointure peut être exprimée de deux façons différentes :
1. En utilisant la restriction sur le produit cartésien,
2. En utilisant les requêtes imbriquées (voir plus loin dans le chapitre)
Expression de la jointure en utilisant la Restriction sur le Produit Cartésien
Dans la clause FROM on spécifie la (les) condition(s) de jointure.
SELECT [ALL|DISTINCT] att1 [ , [ALL|DISTINCT] att2, [ALL|DISTINCT] att3, ... ] | *
FROM <Table1> , <Table2> [ , <Table3>, ... ]
WHERE <condition(s) de jointure>
NB : La combinaison des opérations de jointures, restrictions et projections peut être
effectuée à l’intérieur d’un même bloc SELECT.
Définition d'un alias : Un alias est un nom de remplacement, que l’on donne de manière
temporaire (le temps d’une requête) à une table pour faciliter l'expression de la requête.
16
La langage LMD Interrogation de BD
Expression de la jointure en utilisant la restriction sur le Produit Cartésien : Exemples
Requête 8: Lister l'adresse des dépôts stockant le produit 100.
SELECT adr
FROM Stock S, Dépôt D (ou Stock AS S, Dépot AS D)
WHERE S.code_dep = D.id_dep AND code_produit = 100
Requête 9: Lister le nom des produits (sans doublons) stockés dans les dépôt D1 ou D2
SELECT DISTINCT nom_prod
FROM Produit P, Stock S
WHERE Produit.code_prod = Stock.code_prod AND code_dep IN ('D1', 'D2')
Requête 10: Donner les produits (code et nom) stockés dans le dépôt d'adresse "BlocA Etage2
Salle4" en quantité supérieure à 100.
SELECT code_prod, nom_prod
FROM Produit P, Stock S, Dépôt D
AND P.code_prod= S.code_prod
AND D.id_dep = S.code_dep
AND adr LIKE 'BlocA Etage2 Salle4 '
AND qté_stock > 100
17
La langage LMD Interrogation de BD
5. Les sous-requêtes
SQL permet l’imbrication de sous-questions notamment dans la clause WHERE. Une sous-
question est une requête à l'intérieur d'une requête (ou une requête imbriquée dans une
autre requête).
5.1. Sous-requête au niveau de WHERE
Un terme dans une condition peut être exprimé par une expression SELECT. On parle de
sous-requête. L'évaluation de ce terme peut être une valeur ou bien une table avec des
tuples. La condition peut être exprimée à l'aide des prédicats IN, NOT IN, ALL, ANY (OU
SOME), EXISTS, NOT EXISTS ou CONTAINS.
Toute sous-requête peut elle-même invoquer des sous-requêtes, si bien qu’il est possible
d’imbriquer des blocs SELECT à plusieurs niveaux.
18
La langage LMD Interrogation de BD
Autres prédicats (1)
Prédicat Forme de la requête Commentaire
IN SELECT <att1>, …. | * Permet de tester la présence d’une valeur
FROM <nom_table> particulière dans un ensemble.
WHERE <att> IN (sous-requête)
NOT IN SELECT <att1>, …. | * Permet de tester l'absence d’une valeur
FROM <nom_table> particulière dans un ensemble.
WHERE <att> NOT IN (sous-
requête)
ALL SELECT att1, …. | * Compare chacune des valeurs de l’ensemble à une
(Quantificateur FROM <nom_table> valeur particulière et retourne ‘VRAI’ si la
universel) WHERE <att> <opérateur> ALL comparaison est évaluée à VRAI pour chacun des
(sous_requête) éléments. Les comparateurs sont : <, <=, >, >=, =,
!=
ANY ou SOME SELECT <att1>, …. | * Compare chacune des valeurs de l’ensemble à une
(Quantificateur FROM <nom_table> valeur particulière et retourne ‘VRAI’ si la
existentiel) WHERE <att> <opérateur> ANY comparaison est évaluée à ‘VRAI’ pour au moins
(sous_requête) un des éléments de l'ensemble.
EXISTS SELECT <att1>, …. | * Retourne ‘VRAI’ si la sous-question (requête
FROM <nom_table> imbriquée) ramène au moins une ligne c-à-d un
WHERE EXISTS (sous-requête) ensemble non vide
19
La langage LMD Interrogation de BD
Autres prédicats (2)
Prédicat Forme de la requête Commentaire
NOT EXISTS SELECT <att1>, …. | * Retourne ‘VRAI’ si la sous-question (requête
FROM <nom_table> imbriquée) ramène un ensemble vide.
WHERE NOT EXISTS (sous-
requête)
CONTAINS SELECT att1, …. | * Retourne 'VRAI' si le résultat de la sous-requête1
(Inclusion FROM <nom_table> (ensemble 1) contient (ou est égal) au résultat de
d'ensemble) WHERE (sous-requête) la sous-requête2 (ensemble 2).
CONTAINS (sous_requête)
NOT CONTAINS SELECT att1, …. | * Retourne 'VRAI' si au moins un élément du
(Non inclusion FROM <nom_table> résultat de la sous-requête1 (ensemble 1)
d'ensemble) WHERE (sous-requête) n'appartient pas au résultat de la sous-requête2
NOT CONTAINS (sous_requête) (ensemble 2).
Remarque : Le prédicat =ANY est équivalent au prédicat IN
Le prédicat <> ALL est équivalent au prédicat NOT IN
20
La langage LMD Interrogation de BD
5.2. Expression de la jointure en utilisant les sous requêtes (requêtes imbriquées)
La jointure peut aussi être exprimée par les requêtes imbriquées en utilisant le prédicat
'IN'.
Requête 11: (Autre expression de la Requête 9)
Donner le nom des produits stockés dans les dépôts D1 ou D2
SELECT nom_prod
FROM Produit
WHERE code_prod IN (SELECT code_prod
FROM Stock
WHERE code_dep IN ('D1', 'D2'))
Requête 12 : (Autre expression de la Requête 10).
Donner les produits (code et nom) stockés dans le dépôt d'adresse "BlocA Etage2 Salle4" en
quantité supérieure à 100.
SELECT code_prod, nom_prod
FROM Produit
WHERE code_prod IN (SELECT code_prod
FROM Stock
WHERE qté_stock > 100
AND code_dep IN (SELECT id_dep
FROM Depot
WHERE adr LIKE ' BlocA Etage2 Salle4 '))
21
La langage LMD Interrogation de BD
5.3. Les sous-requêtes : Plus d'exemples
Requête 13: Lister le nom et le prix des produits non encore stockés.
SELECT nom_prod, prix_prod
FROM Produit
WHERE code_prod NOT IN
(SELECT code_prod
FROM Stock)
Requête 14: Lister le nom du produit le Requête 15 Donner le nom de(s) produit(s)
plus cher (on peut avoir plusieurs produits) dont le prix n'est pas minimal
SELECT nom_prod SELECT nom_prod
FROM Produit FROM Produit
WHERE prix >= ALL WHERE prix > ANY
(SELECT prix (SELECT prix
FROM Produit) FROM Produit)
22
La langage LMD Interrogation de BD
Les sous-requêtes : Plus d'exemples
Requête 16: (Autre expression de la Requête 13)
Lister le nom et le prix des produits non encore stockés.
SELECT nom_prod, prix
FROM Produit Sous-requête qui donne le
WHERE NOT EXISTS stockage du produit i (en
cours de vérification)
(SELECT *
FROM Stock
WHERE code_prod= Produit.code_prod)
Requête 17: Donner les dépôts (code et adresse) des dépôts Sous-requête qui fournit les
quantités de tous les produits
qui stockent chaque produit en quantité supérieure à 50.
stockés dans le dépôt i (en
SELECT id_dep, adr cours de vérification)
FROM Depot D
WHERE 50 < ALL (SELECT qté_stock
FROM Stock
WHERE code_dep = D.id_dep
23
La langage LMD Interrogation de BD
6. Expression des opérations ensemblistes : UNION, INTERSECT et MINUS (ou EXCEPT)
Les opérations ensemblistes sont exprimées en SQL selon la syntaxe suivante:
(SELECT ………
FROM ……
WHERE……)
[UNION | INTERSECT | EXCEPT (MINUS)]
(SELECT ………
FROM ……
WHERE……)
Exemples : Requête 19: (Autre expression de la requête 9)
Requête 18 (Autre expression de la Requête 13) Lister le nom des produits stockés dans les
Lister le nom et le prix des produits non encore dépôt D1 ou D2.
stockés.
(SELECT nom_prod
(SELECT nom_prod, prix FROM Stock S, Produit P
FROM Produit) WHERE S.code_prod= P.code_prod
MINUS AND code_dep = 'D1')
(SELECT nom_prod, prix UNION
FROM Produit (SELECT nom_prod
WHERE code_prod IN FROM Stock S, Produit P
(SELECT code_prod WHERE S.code_prod= P.code_prod
FROM Stock ) WHERE code_dep='D2' )
24
La langage LMD Interrogation de BD
7. Les fonctions de calcul et les agrégats
SQL définit des fonctions de calcul encore appelées des fonctions d'agrégation qui
permettent de calculer un résultat atomique (un entier ou un réel) à partir d'un ensemble
de valeurs. Ces fonctions sont en nombre de 5.
Fonction de calcul Utilité
COUNT compter le nombre d'éléments d’un ensemble
SUM sommer les valeurs d’un ensemble de valeurs
AVG calculer la valeur moyenne d’un ensemble de valeurs
MIN calculer la valeur minimale d’un ensemble de valeurs
MAX calculer la valeur maximale d’un ensemble de valeurs
Exemples :
Requête 20 : (Autre expression de la Requête 14) Requête 21: Donner le prix moyen des
Lister le nom du produit le plus cher. produits.
SELECT nom_prod SELECT AVG(prix)
FROM Produit FROM Produit
WHERE prix = (SELECT MAX(prix)
FROM Produit)
25
La langage LMD Interrogation de BD
Les agrégats :
Un agrégat est un partitionnement horizontal d’une table en sous-tables, en fonction des
valeurs d’un ou de plusieurs attributs de partitionnement, suivi éventuellement de
l’application d’une fonction de calcul à chaque attribut des sous-tables obtenues.
Une sélection (restriction) sur les partitions peut être appliquée en utilisant la clause
HAVING.
SELECT B, [min(A) | max(A) | sum (A) | avg(A) | count(A)]
FROM R1,……
WHERE <condition(s)>
GROUP BY B
[HAVING <conditions de sélection sur les partitions> ]
// B : Un ou plusieurs attributs
A : Attribut différent de B
Remarque:
Les fonctions de calcul ne peuvent être utilisées que dans une clause SELECT ou dans une
clause HAVING.
26
La langage LMD Interrogation de BD
Les agrégats : Exemples
Requête 22: Lister le nombre de produits Requête 23: Lister pour chaque dépôt son code,
stockés dans chaque dépôt. son adresse et le nombre de produits qu'il stocke.
SELECT code_dep, COUNT(code_prod) SELECT id_dep, adr, COUNT(code_prod)
FROM Stock FROM Depot D, Stock S
GROUP BY code_dep WHERE D.id_dep = S.code_dep
GROUP BY code_dep
Requête 24: Lister les dépôts (code et Requête 25 : Donner pour chaque produit, son code,
adresse) qui stockent plus de 20 produits. son nom et sa quantité totale stockée dans
l'entreprise.
SELECT id_dep, adr, COUNT(code_prod)
FROM Depot D, Stock S SELECT code_prod, nom_prod, SUM(qté_stock)
WHERE S.id_dep= S.code_dep FROM Produit P, Stock S
GROUP BY code_dep WHERE P.code_prod = S.code_prod
HAVING COUNT(*) >20 GROUP BY code_prod
27
La langage LMD Interrogation de BD
Les agrégats : Exemples
Requête 26 : (Autre expression de la requête 17)
Donner les dépôts (code et adresse) qui stockent
chaque produit en quantité supérieure à 50.
SELECT id_dep, adr
FROM Depot D, Stock S
WHERE [Link]-dep= S.code_dep
GROUP BY code_dep
HAVING 50 < ALL SET(qté_stock)
28
La langage LMD Interrogation de BD
8. Expression de la division
Expression de la division :
La division est exprimée par le bloc :
GROUP BY
HAVING (SET + CONTAINS)
Requête 27: (Expression de la division)
Lister les produits (code et nom) stockés dans tous les dépôts.
SELECT code_prod, nom_prod Solution avec expression de la
FROM Produit jointure par requête imbriquée
WHERE code_prod IN (SELECT code_prod
FROM Stock
GROUP BY code_prod
HAVING SET(code_dep) CONTAINS (SELECT id_dep
FROM Depot))
OU BIEN :
SELECT code_prod, nom_prod Solution avec expression de la
FROM Produit P, Stock S jointure par restriction sur le
WHERE P.code_prod = S.code_prod produit cartésien
GROUP BY code_prod
HAVING SET (code_dep) CONTAINS (SELECT id_dep FROM Depot))
29
La langage LMD Interrogation de BD
8. Expression de la division
Requête 28: (Expression de la division)
Lister les dépôts (code et adresse) qui stockent au moins tous les produits de prix >100 DA.
SELECT id_dep, adr
FROM Depot
WHERE id-dep IN (SELECT code_dep
FROM Stock
GROUP BY code_dep
HAVING SET(code_prod) CONTAINS (SELECT code_prod FROM Produit
WHERE prix > 100) )
Requête 29: (Expression de la division)
Lister les dépôts (code et adresse) qui stockent plus de 4 produits de prix supérieur à 1000 DA
SELECT id_dep, adr
FROM Depot
WHERE id-dep IN (SELECT code_dep
FROM Stock
WHERE prix>1000
GROUP BY code_dep
HAVING COUNT(code_prod) > 4
30
La langage LMD Interrogation de BD
8. Expression de la division :
Expression de la division en MySql :
(SET + CONTAINS) pour exprimer l'opération de DIVISION dans la clause HAVING ne sont pas
supportés par MySQL. La division doit être exprimée dans MySQL par (NOT EXISTS + NOT
IN) ou bien par COUNT dans la clause HAVING (cela dépendra de la question).
Requête 30: (Autre expression de la requête 27)
Lister les produits (code et nom) stockés dans tous les dépôts.
SELECT code_dep, nom_prod
FROM Produit P
WHERE NOT EXISTS (SELECT code-dep
FROM Depot
WHERE id_dep NOT IN (SELECT code_dep FROM Stock
WHERE code_prod=P.code_prod)
)
OU BIEN :
SELECT code_dep, nom_prod
FROM Produit P
WHERE code_prod IN (SELECT code-prod FROM STOCK
GROUP BY code_prod
HAVING COUNT (code_dep) = (SELECT COUNT (*)
FROM Depot))
31
La langage LMD Interrogation de BD
Expression de la division en MySql :
Requête 31 (Autre expression de la requête 28)
Lister les dépôts (code et adresse) qui stockent au moins tous les produits de prix >100 DA.
SELECT id_dep, adr
FROM Depot D
WHERE NOT EXISTS (SELECT code_prod
FROM Produit
WHERE prix>100
AND code_prod NOT IN ( SELECT code_prod
FROM Stock
WHERE code_dep=D.id_dep)
32
La langage LMD Interrogation de BD
9. Tri du résultat:
Le tri de tout résultat est effectué par la clause ORDER BY sur un ou plusieurs attributs
selon un ordre ascendant (ASC) ou descendant (DESC).
ORDER BY < att1> [ASC | DESC] [, <att2> [ASC | DESC], ...];
Requête 32: Requête 33:
Citer le nom des produits triés par ordre Donner la liste des produits triée par ordre
croissant de leur prix. décroissant de leur stockage dans l'etreprise
SELECT nom_prod SELECT code_prod, nom_prod, SUM(qté_stock)
FROM Produit FROM Produit P, Stock S
ORDER BY prix WHERE P.code_prod = S.code_prod
GROUP BY code_prod
ORDER BY SUM(qté_stock) DESC
33
La langage LMD Interrogation de BDs
Pour finir avec l'interrogation d'une BD :
Principe d'évaluation d'une requête SELECT est le suivant :
1. Évaluation de la clause FROM en faisant le produit cartésien de toutes les relations qui y
apparaissent
2. Évaluation de la clause WHERE qui réalise les restrictions et les jointures
3. Évaluation de la clause GROUP BY qui effectue le partitionnement
4. Évaluation de la clause HAVING qui sélectionne les partitions désirées
5. Évaluation de la clause SELECT qui constitue la projection finale
6. Évaluation de la clause ORDER BY qui trie les tuples du résultat final
Insertion (INSERT INTO) , modification (UPDATE) et suppression (DELETE)
des tuples (Voir TP)
Fin du Chapitre 3
34