Manipulation des données avec SQL
Manipulation des données avec SQL
1
Langage de Manipulation de Données (LMD)
•SELECT : permet de définir la liste des colonnes que l'on peut obtenir.
•FROM : n'indique que les noms des tables nécessaires pour obtenir le résultat
souhaité.
•WHERE : définit la condition que doit vérifier un tuple donné pour qu'il fasse
partie du résultat.
Syntaxe :
SELECT col1, col2, … ,coln
FROM nom_table
[WHERE condition];
3
Consultation de données
Syntaxe :
SELECT col1, col2, … ,coln
FROM nom_table
[WHERE condition];
Remarque
•Si on souhaite avoir toutes les colonnes de la table: SELECT * FROM ...
•Si on souhaite avoir toutes les lignes de la table, on ne met pas la clause WHERE.
4
Exemple
• On considère la table Produit suivante :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
80 Disquette 20 24 4 125
80 Disquette 20 24 4 125
2-Afficher les numéros et désignations de produits existants en stock avec une quantité > 20
80 Disquette 20 24 4 125
80 Disquette 20 24 4 125
80 Disquette 20 24 4 125
• Exemple:
Afficher les numéros et désignations de tous les produits.
Les titres des colonnes à afficher seront respectivement:
Numéro et "Nom produit"
• Solution:
Select numprod Numéro, desprod "Nom produit"
From Produit; 10
Spécification d’un critère dans une requête
• La condition est composée généralement de trois termes :
– un nom de colonne,
– un opérateur de comparaison,
– et une constante, une colonne, une liste de valeurs, une expression
ou une requête.
12
Les expressions agrégats
(les fonctions d’agrégation)
13
ORACLE dispose de fonctions agrégats qui s'appliquent à
un ensemble de données :
SELECT Count(*)
FROM Produit
Where Couleur = 'R';
15
COUNT : permet de compter le nombre de lignes
que pourrait retourner une requête
SELECT).
20
Regroupements de lignes
(Agrégats appliquées
par groupe de lignes )
21
Regroupements de lignes
• Il est possible de partitionner (classifier) les résultats d’une requête:
– en regroupant les lignes ayant une même valeur pour la colonne de
partitionnement.
Sous totaux
Groupes
22
• Un groupe est un sous-ensemble des tuples d'une table ayant la même
valeur pour un attribut (ou plusieurs attributs).
• Un groupe est déterminé par la clause GROUP BY suivie du nom de
l'attribut(s) sur lequel s’éffectue le regroupement.
• La clause GROUP BY réarrange la table résultat d'un SELECT par groupe
• Lorsqu'une clause GROUP BY est précisée, on peut utiliser des fonctions
agrégats portant sur les groupes.
Exemple:
Afficher la quantité totale de produits par couleur:
SELECT couleur, SUM(Qte_stk)
FROM produit
GROUP BY couleur;
couleur Qte_stk
R 10 couleur SUM(Qte_stk)
B 20
Utilisation du GROUP BY -> R 35
G 20
B 55
B 35
G 20
R 25 23
Regroupements de lignes
25
Résultat du groupage (GROUP BY) et
du calcul d’agrégats sur chaque groupe
26
SELECT Colonnes_de_partitionnement, Fonction_agréga(Attribut)
FROM ...
[WHERE ...]
GROUP BY Colonnes_de_partitionnement
…
27
Les étapes d’évaluation du WHERE + Group By par le SGBD Oracle
TABLE contenant
TABLE uniquement les
WHERE lignes filtrés
28
Exercice
• On considère la table Produit suivante :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
80 Disquette B 20 24 4 125
29
Solution de l’exercice utilisant WHERE + Group By
TABLE contenant
TABLE uniquement les
WHERE lignes filtrés
Résultat :
couleur SUM(Qte_stk)
B 45
G 42
31
Exercice avec plusieurs colonnes de partitionnement
32
Solution avec plusieurs colonnes de partitionnement
Résultat :
Desprod Couleur COUNT(*)
Souris R 2
Souris B 1
Ordinateur B 1
33
SELECT Colonnes_de_partitionnement, Fonction_agréga(Attribut)
FROM ...
[WHERE ...]
GROUP BY Colonnes_de_partitionnement
…
35
Restriction sur les groupages : clause HAVING
HAVING (Conditions_de_séléction_sur_le_groupement)
36
Les étapes d’évaluation du WHERE + Group By + HAVING
par le SGBD Oracle :
SELECT
Résultat
37
Restriction sur les groupages :
HAVING
SELECT idSer, AVG(salaire), COUNT(*)
FROM EMPLOYE
GROUP BY idSer
HAVING (COUNT(*) > 2);
restriction
idEmp nomEmp
idEmp nomEmp idSer
idSer salaire
salaire du groupage 20
40
Exemple
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
41
Solution
• Afficher la quantité des produits par couleur, si cette quantité est
supérieure à 40 :
SELECT couleur, sum(Qte_stk) "Qte totale par couleur"
FROM produit
Group by couleur;
Having sum (Qte_stk) >= 40;
• Résultat:
Couleur Qte totale par
couleur
B 45
G 42
42
Exemple
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
43
Solution
• Afficher la quantité des produits par couleur, si cette quantité est
supérieure à 40 :
SELECT couleur
FROM produit
Group by couleur;
Having sum (Qte_stk) >= 40;
• Résultat:
Couleur
B
G
44
Exercice
• On considère la table Produit suivante :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
80 Disquette R 20 24 4 125
TABLE
Groupes TABLE contenant les
filtrés lignes filtrées
partitionnées en
HAVING Groupes
SELECT
Résultat
• Afficher la quantité des ordinateurs par couleur, si cette quantité est
supérieure à 40 ou strictement inférieur à 30 :
SELECT couleur, sum(Qte_stk) "Qte Ordinateurs par
couleur"
FROM produit
WHERE Desprod = ‘Ordinateur’
Group by couleur;
46
Solution utilisant WHERE + Group By + HAVING
• Afficher la quantité des ordinateurs par couleur, si cette quantité est
supérieure à 40 ou strictement inférieur à 30 :
SELECT couleur, sum(Qte_stk) "Qte Ordinateurs par couleur"
FROM produit
WHERE Desprod = ‘Ordinateur’
Group by couleur;
Having ( (sum (Qte_stk) >= 40) OR (sum (Qte_stk) < 30) );
B 41
G 22
47
Requêtes multi-tabulaires
48
Requêtes multi-tabulaires
• Dans la majorité des cas, on doit combiner des
informations venant de plusieurs tables.
49
Syntaxe
50
Produit cartésien
de plusieurs tables
51
Rappel : Produit cartésien de deux Tables
Le produit cartésien de deux tables R1 et R2 :
• est une table R définie sur l'union (la concaténation)
des colonnes de R1 et de R2.
R = Produit ( R1, R2 )
R1 R2
52
Exemple de Produit cartésien de deux Tables
A1 A2 B1 B2 B3
R1 R2 a 17 16 10 96
A1 A2
B1 B2 B3
a 17 22 11 69
a 17
16 10 96 b 10 16 10 96
b 10
22 11 69 b 10 22 11 69
c 58
c 58 16 10 96
c 58 22 11 69
53
Produit cartésien
de plusieurs tables
SELECT liste_de_colonnes
FROM table1 , … , tablen
22 11 69 c 58 16 10 96
c 58
c 58 22 11 69
55
Jointure de plusieurs tables
56
Jointure de plusieurs tables
• La jointure permet de combiner des lignes issues à partir de
plusieurs tables
58
La jointure simple
•Pour effectuer une jointure, il faut spécifier :
– Les noms des tables, dans la clause FROM, séparés par des
virgules.
– La condition de jointure dans la clause WHERE.
– Les noms de colonnes doivent être préfixés par les noms de tables
pour éviter toute ambiguïté.
60
Exercice
En utilisant les tables:
CLIENT(nclt, nom, age, adresse) et
COMMANDE(nclt, numprod, qte , date),
trouver la liste des numprods commandés par le client ‘Isimm’ ?
61
Solution
En utilisant les tables:
CLIENT(nclt, nom, age, adresse) et
COMMANDE(nclt, numprod, qte , date),
trouver la liste des numprods commandés par le client ‘Isimm’ ?
SELECT numprod
FROM Client, Commande
WHERE nom = ‘Isimm’ AND
[Link] = [Link]
62
Exemple avec des variables ALIAS
63
Auto-jointure
64
Auto-jointure
(table jointe avec elle-même)
65
Exercice
Magasin (Nummag, adresse, Surface)
Produit (Numprod, Desprod, …., prix, Nummag#)
66
Solution (Auto-jointure)
Magasin (Nummag, adresse, Surface)
Produit (Numprod, Desprod, Couleur, Poids, Qte_stk,
Qte_seuil; prix, Nummag#)
68
Exercice : Auto-jointure (suite)
En utilisant les tables:
CLIENT(nclt, nom, age, adresse) et
COMMANDE(nclt, numprod, qte , date),
Problème :
Exemple de Réponse (42, 42) (42, 57) (57,42) … 69
Exercice Auto-jointure : Solution
Trouver les paires de nclts qui ont commandé un
même produit ?
Problème :
Exemple de Réponse (42, 42) (42, 57) (57,42) …
Solution :
SELECT [Link], [Link]
FROM Commande c1, Commande c2
WHERE [Link] = [Link] AND
[Link] < [Link]
70
JOINTURE + WHERE +
GROUP BY…
71
Exercice (JOINTURE + WHERE + GROUP BY…)
Produit (numprod, Desprod, Couleur, …)
CLIENT(nclt, nom, age, adresse) et
COMMANDE(nclt*, numprod*, qte , date),
72
Produit (numprod, Desprod, couleur, …)
CLIENT(nclt, nom, age, adresse) et
COMMANDE(nclt, numprod, qte , date),
73
Les requêtes imbriquées
74
Les requêtes imbriquées
(sous-requêtes)
Syntaxe :
SELECT …
FROM …
WHERE (col1, …, coln ) opérateur ( SELECT col1,…, coln
FROM . . .
WHERE . . . ) ;
75
Les requêtes imbriquées
(sous-requêtes)
Syntaxe :
SELECT …
FROM …
WHERE (col1, …, coln ) opérateur ( SELECT col1,…, coln
FROM . . .
WHERE . . . ) ;
76
Les requêtes imbriquées
(sous-requêtes)
Syntaxe :
SELECT …
FROM …
WHERE (col1, …, coln ) opérateur ( SELECT col1,…, coln
FROM . . .
WHERE . . . ) ;
77
Les requêtes imbriquées simples
Syntaxe :
SELECT …
FROM …
WHERE (col1, …, coln ) opérateur ( SELECT col1,…, coln
FROM . . .
WHERE . . . ) ;
Exemple
Afficher les numéros des produits de même couleur que le produit numéro 100 :
SELECT numprod
FROM produit
Where couleur = (SELECT couleur
FROM produit
WHERE numprod = 100);
79
Rappel : Requêtes imbriquées simples
Syntaxe :
SELECT …
FROM …
WHERE (col1, …, coln ) opérateur ( SELECT col1,…, coln
FROM . . .
WHERE . . . ) ;
81
Requêtes imbriquées synchronisées :
Une sous-requête est synchronisée si elle manipule des
colonnes d'une table du niveau supérieur
Les alias des tables sont utiles pour pouvoir manipuler des colonnes
de tables de différents niveaux.
82
Requêtes imbriquées synchronisées
La forme générale d'une sous-requête synchronisée est la suivante :
Très important:
Une sous-requête synchronisée est exécutée (par le SGBD) une fois
pour Les alias ligne
chaque des tables sontpar
extrait utiles pour pouvoir
la requête manipuler
de niveau des colonnes
supérieur
de tables de différents niveaux.
83
Exemple de Requêtes imbriquées synchronisées :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
Résultat attendu:
…?
84
Exemple de Requêtes imbriquées synchronisées :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
Résultat attendu:
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
SELECT *
FROM PRODUIT Alias1
WHERE [Link] >= (SELECT MAX([Link])
FROM PRODUIT Alias2
WHERE [Link] =
[Link] );
Résultat :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
Très important:
Une sous-requête synchronisée est exécutée (par le SGBD) une fois
pour chaque ligne extrait par la requête de niveau supérieur
Résultat :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
Exercice:
Afficher les avions dont le nombre d'heures de vol (nbHVol) est supérieur au
nombre d'heures de vol moyen des avions de leur compagnie ?
Rappel :
Une sous-requête synchronisée est exécutée (par le SGBD) une fois
pour chaque ligne extrait par la requête de niveau supérieur
88
Solution : Requêtes imbriquées synchronisées
compagnie
Afficher les avions dont le nombre d'heures de vol (nbHVol) est supérieur au
nombre d'heures de vol moyen des avions de leur compagnie:
SELECT *
FROM Avions A1
WHERE [Link] > ( SELECT AVG([Link])
FROM Avions A2
WHERE [Link] = [Link]
);
89
Exercice 2 : Requêtes imbriquées synchronisées
90
Les opérateurs multilignes
(Sous-requête avec plusieurs lignes)
91
Les requêtes imbriquées
(sous-requêtes)
Syntaxe :
SELECT …
FROM …
WHERE (col1, …, coln ) opérateur ( SELECT col1,…, coln
FROM . . .
WHERE . . . ) ;
SELECT numprod
FROM produit
WHERE couleur IN (SELECT couleur
FROM produit
WHERE UPPER(desprod) = 'ORDINATEUR');
93
Test d'appartenance
SELECT listeColonnes
FROM listeTables
WHERE colonne [ NOT ] IN (SELECT ...
FROM ...
[ WHERE ...] ) ;
Exemple :
Client (nclt, nom, age, adresse) et
Commande (nclt, numprod, qte , date),
Les clients qui n'ont pas commandé de produits ?
SELECT nclt
FROM Client
WHERE nclt NOT IN ( SELECT nclt FROM Commande ) ;
94
L’opérateur ALL
x >= ALL ( sous-requête ) :
x est plus grande (ou égale) à chaque valeur
du résultat de la sous-requête
Exemple:
Commande (nclt, numprod, qte , date),
SELECT numprod
FROM Commande
WHERE qte >= ALL ( SELECT qte FROM Commande)
95
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
SELECT *
FROM produit
Where Qte_stk >= ALL (SELECT Qte_stk
FROM produit
WHERE couleur = 'R') ;
Résultat:
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
SELECT *
FROM produit
Where Qte_stk >= ( SELECT MAX(Qte_stk)
FROM produit
WHERE couleur = 'R') ;
Résultat:
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix
98
La Division
99
Rappel sur La Division
Définition:
Notation:
R = Division ( R1, R2 )
R = (R1 R2)
100
Exemple de division
R = Division ( R1, R2 )
Tous les tuples de R concaténés à chacun des tuples de R2 doivent
appartenir à R1
R1
A B
a x
b x R2 R
b y B A
c y x b
d z y e
e x
e y
e z
101
R = Division ( R1, R2 )
Tous les tuples de R concaténés à chacun des tuples de R2 doivent
appartenir à R1
R1
A B
a x
b x R2 R
b y B A
c y x b
d z y e
e x
e y
Division : réponse aux questions contenant les
termes: «… tous … / …chacun … / … chaque …
e z
« Lignes de R1 associés à tous ceux de R2 »
Requête : quelles sont les valeurs de A liées à toutes les valeurs de R2.B
102
R = Division ( R1, R2 )
Tous les tuples de R concaténés à chacun des tuples de R2 doivent
appartenir à R1
R1
A B
a x
b x R2 R
b y B A
c y x b
d z y e
e x
e y
e z
il n'existe pas d'opérateur de division
dans SQL
103
Division SQL utilisant Group by
R = Division ( R1, R2 ) : Tous les tuples de R concaténés à chacun des
tuples de R2 doivent appartenir à R1
R1
A B
a x
b x R2 R
b y B A
c y x b
d z y e
e x
SELECT A
e y FROM R1, R2 WHERE (R1.B = R2.B)
e z GROUP BY A
HAVING COUNT (B) = ( SELECT COUNT (B) FROM R2 ) ;
1. Groupement des lignes de R1 par valeur de A
2. Calcul du nombre de valeurs distinctes de B dans chaque groupe
3. Égalité avec le nombre de valeurs distinctes de B dans R2
104
Exemple de requête SQL de Division utilisant Group by
Produit (numprod, …, Couleur, …)
CLIENT(nclt, …, …) et
COMMANDE(nclt*, numprod*, date, …)
Afficher les clients qui ont commandé tous les produits de couleur rouges ?
105
Exemple de requête SQL de Division utilisant GROUP BY
Produit (numprod, …, Couleur, …)
CLIENT(nclt, …, …) et
COMMANDE(nclt*, numprod*, date, …)
Afficher les clients qui ont commandé tous les produits de couleur rouges ?
SELECT c.*
FROM CLIENT c, COMMANDE cmd, Produit p
WHERE [Link] = [Link] AND [Link] = [Link]
AND Couleur = ‘Rouge’
GROUP BY nclt % On regroupe par nclt les commandes de produits rouges %
% puis, on compte le nombre de produits de couleur rouges par groupe et on compare %
107
Jointure (Rappel)
Pays nom Capitale Populatio surface
JO Année Lieu pays n
1896 Athène Grèce Irlande Dublin 3 70
SELECT liste_de_colonnes
FROM table1 JOIN table2 ON <Condition de jointure >
Les Jointures : une autre Syntaxe
(ORACLE)
Pays nom Capitale Population surface
JO Année Lieu pays
1896 Athène Grèce Irlande Dublin 3 70
SELECT liste_de_colonnes
FROM table1 [ {LEFT | RIGHT | FULL}
OUTER ] JOIN table2
ON <Condition de
jointure >
111
La jointure externe
(récupération des lignes qui ne se joignent pas)
112
Jointure externe (à gauche)
Pays nom Capitale Population surface
JO Année Lieu pays
1896 Athène Grèce Irlande Dublin 3 70
FROM JO RIGHT
NULL OUTER JOIN PAYS
NULL ON [Link]
Autriche Vienne =
[Link] NULL Suisse Berne
116
Jointure externe (FULL)
Pays Nom Capitale Population surface
JO Année Lieu pays
1896 Athène Grèce Irlande Dublin 3 70
117
Jointure externe (FULL)
Pays Nom Capitale Population surface
JO Année Lieu pays Irlande Dublin 3 70
1896 Athène Grèce
Autriche Vienne 8 83
1900 Paris France
Royaume Londre 36 244
1904 St Louis USA Uni
1908 Londre Royaum Suisse Berne 7 41
e Uni
USA Washington 189 441
1900
SELECT année, Pariscapitale
lieu, pays, NULL NULL
NULL
FROM JO FULL OUTER NULL
JOIN PAYS Irlande Dublin =
ON [Link]
[Link] NULL Autriche Vienne
118
NULL NULL Suisse Berne