Vous êtes sur la page 1sur 72

Langage de manipulation de

données LMD
Manipulation des données dans SQL

Langage de manipulation de données


LMD
• Les commandes du LMD sont :
– INSERT : ajoute des lignes à une table.
– UPDATE : mettre à jour les colonnes d’une table.
– DELETE : suppression d’un ou de plusieurs
enregistrements.
– SELECT : définition de la liste des colonnes que
l’on peut obtenir.
1-Insertion de données
• L’instruction INSERT ajoute des lignes à une table.
Les valeurs à ajouter lors d’une insertion doivent
vérifier les contraintes définies au moment de la
définition des données. Tout enregistrement ne
vérifiant pas les contraintes sera rejeté.
• Il existe deux formes d’insertions de données :
– Insertion des valeurs pour la totalité des valeurs de la table
– Insertion à travers la copie des valeurs des colonnes d'une
autre table
Insertion des valeurs pour la totalité des
valeurs de la table
• Syntaxe :
INSERT INTO nom_table [(les champs de la table)]
VALUES (liste des valeurs) ;
• Les valeurs des colonnes de type caractère ou chaîne de
caractère doivent apparaître entre deux cotes ( ' ' ).
• Remarque :
• Il est possible d’insérer un enregistrement en connaissant
seulement les valeurs de quelques champs. Pour cela , il faut
– Soit indiquer la liste des champs à insérer et leurs valeurs
respectives
– Soit mettre NULL dans la liste de valeurs pour les champs
vides.
• Les champs ayant été créés avec la contrainte Not Null
devront, obligatoirement, avoir des valeurs.
Exemple
Soit la table Produit (Numprod, Desprod, Couleur, Poids, Qte_stk, Qte_seuil, Prix)
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix

100 Ordinateur R 15.2 3 2 100.275

80 Disquette

200 Souris G

Donner la commande permettant de remplir la première ligne de la table


produit.

INSERT INTO produit (Numprod, Desprod, Couleur, Poids, Qte_stk,


Qte_seuil, Prix) VALUES (100, ' Ordinateur', 'R', 15.2, 3, 2, 100.275);
• Dans le cas précédent toutes les colonnes sont
à saisir, on peut donc ne pas spécifier les noms
des colonnes après le nom de la table. La
commande devient :

INSERT INTO produit VALUES (100, ' Ordinateur',


'R', 15.2, 3, 2, 100.275);
• Donner la commande permettant de remplir la deuxième
ligne du tableau précédent.
INSERT INTO produit (Numprod, Desprod) VALUES (80,
'Disquette');
• Donner la commande permettant de remplir la troisième
ligne du tableau précédent.
INSERT INTO produit (Numprod, Desprod, Couleur)
VALUES (200, 'Souris', 'G');
Insertion à travers la copie des
valeurs des colonnes d'une autre
table
• Syntaxe :
INSERT INTO nom_table [(les champs de
la table)] Requête;
• Exemple :
INSERT INTO client (num_clt, nom_clt,
tel_clt) Select * from client_Monastir ;
2- Modification de données
• L'opération de modification consiste à mettre à jour les
colonnes d'une table par de nouvelles valeurs.
• Syntaxe :
UPDATE nom_table
SET col1 = val1 , … , coln = valn
WHERE condition ;
• Remarques :
• Il n'est pas possible de mettre à jour plus qu'une table à la fois.
• La modification des données n’est pas autorisée que si les
contraintes sont toujours valides.
• Les valeurs peuvent être des constantes, des expressions, des
résultats de sous-requêtes ou NULL (pour supprimer la valeur
initiale du champ).
• Si la clause Where n’apparaît pas dans la commande, il s’agit
de mettre à jour tous les enregistrements de la table avec la
même valeur.
Exemple
• Modifier la désignation du produit numéro 80 en Imprimante
UPDATE Produit
SET DesProd = 'Imprimante'
WHERE numProd = 80;
• Majorer de 5% les prix des produits dont le prix est supérieur à
10.
UPDATE Produit
SET Prix = Prix * 1.05
WHERE prix > 10;
• Modifier les quantités de tous les produits avec la valeur 10.
UPDATE produit
SET Qte_stk = 10;
3- Suppression de données
• La commande DELETE permet de supprimer un ou plusieurs
enregistrements d’une table tout en gardant la base cohérente.
Les enregistrements à supprimer sont spécifiés par la condition
de la clause WHERE.
• Syntaxe :
DELETE FROM nom_table
[WHERE condition];
• Exemple :
• Supprimer tous les Produits de couleurs Blanche
DELETE FROM Produit
Where Couleur = 'B';
• Supprimer toutes les lignes de la table Produit
DELETE FROM Produit;
4- Consultation de données
• SQL est basé sur l'utilisation de blocks de qualification dont la structure est
composée principalement de trois éléments :
• 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 n-uplet donné pour qu'il
fasse partie du résultat.
• Syntaxe :
SELECT col1, col2, … ,coln
FROM nom_table
[WHERE condition];
• Remarque
– Si on souhaite avoir toutes les colonnes de la table, on mettra après SELECT *.
– Si on souhaite avoir toutes les lignes de la table, on ne met pas la clause WHERE.
Exemple
• On considère la table Produit suivante :
Numprod Desprod Couleur Poids Qte_stk Qte_seuil Prix

100 Ordinateur R 15.2 3 2 100.275

80 Disquette 20 24 4 125

200 Souris G 30 12 5 200.450


102 Tapis R 0.125 10 5 10

1-Afficher les numéros et désignations de tous les produits


2-Afficher les numéros et désignations de produits existants en stock avec une quantité > 20
3-Afficher les produits existants en stock avec une quantité > 20
4-Afficher les couleurs des différents produits.
Solution
• 1- • 3-
Select numprod, Select *
desprod From produit
From produit; Where qte_stk > 20;

• 2- • 4-
Select numprod, Select distinct couleur
desprod From produit;
From produit
Where qte_stk >20;
4-1.Notion d’alias
• Chaque fois qu'une requête d'interrogation est exécutée, les
noms des colonnes définies dans la structure de la table
apparaissent comme titres de colonnes. On peut modifier ces
noms de colonnes, à l'affichage uniquement, en ajoutant des
ALIAS. Si l’alias est composé de plusieurs mots il faut qu’il
apparaisse entre cotes " ".
• La commande devient :
SELECT col1 [alias 1], col2 [alias 2], … , coln [alias n]
FROM nom_table
[WHERE condition];
• 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;
4-2 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.
• En plus des opérateurs classiques de comparaison ( = , <> , < , > , >= , <= )
ORACLE dispose d'un certain nombre d'opérateurs spécifiques dont
principalement :
– IS NULL : permet de tester si le contenu d'une colonne est une valeur nulle
(indéfinie).
– IN (liste de valeurs): permet de tester si le contenu d'une colonne coïncide avec
l'une des valeurs de la liste.
– BETWEEN V1 and V2 : permet de tester si le contenu d'une colonne est
compris entre les valeurs V1 et V2.
– LIKE chaîne générique : permet de tester si le contenu d'une colonne ressemble
à une chaîne de caractères obtenue à partir de la chaîne générique. La chaîne
générique est une chaîne de caractères qui contient l'un des caractères suivants :
• % : remplace une autre chaîne de caractères qui peut être même une chaîne vide.
• _ : remplace un seul caractère.
• Si la condition est composée de sous conditions, on fait
recours aux opérateurs logiques AND, OR et la négation NOT
(NOT In, NOT Like, NOT Between, Is NOT LIKE)
• Exemple :
• Afficher les numéros de produits dont la couleur n’a pas été
saisie,
• Afficher les produits de couleur Rouge, Bleu ou Gris,
• Afficher les numéros de produits dont le prix est compris entre
100 et 200,
• Afficher les produits dont la désignation commence par 'o',
• Afficher les numéros et désignations des produits dont les
noms commencent par 'o' ou par 's'.
• Afficher les désignations des produits contenant 'r' en
deuxième position de la désignation et existant en stock avec
une quantité > 20.
Solution
1) SELECT * FROM produit WHERE couleur is NULL;

2) SELECT * FROM produit WHERE couleur IN ('R', 'B', 'G');

3) SELECT numprod FROM produit WHERE prix BETWEEN


100 and 200;

4) SELECT * FROM produit WHERE desprod LIKE 'o%';

5) SELECT numprod, desprod FROM produit WHERE


desprod LIKE 'o%' or desprod like 's%';

6) SELECT desprod FROM produit WHERE desprod LIKE


'_r%' and qte_stk>20;
• Remarque
• Il existe une forme de création de tables accompagnée d'une
insertion. Cette forme permet de créer une table et d'y insérer
des données à partir d'une ou plusieurs tables ou vues.
• Syntaxe :
CREATE TABLE nom_table
[ (col1 type [(taille)] [null / not null] ,
col2 type [(taille)] [null / not null] ,
...
coln type [(taille)] [null / not null] ) ]
AS requête ;
• Avec cette forme, la spécification des colonnes n'est pas
obligatoire. La requête est une opération de sélection qui
indique les colonnes sources, les tables auxquelles
appartiennent ces colonnes et éventuellement des critères de
sélection.
• Il est à noter qu’aucune contrainte n’est pour la nouvelle table.
Il faudrait les ajouter ultérieurement.
• Exemple :
• Créer une table contenant uniquement les magasins de Tunis.
CREATE TABLE magasin_tunis
AS SELECT * FROM magasin
WHERE ville = 'Tunis' ;
5-Les fonctions intégrées de
5-1- Les expressions arithmétiques SQL
• Dans les clauses SELECT et WHERE, on peut utiliser des expressions arithmétiques et des
fonctions :
• ABS(n) : permet de calculer la valeur absolue de n.
• CEIL(n) : permet d'avoir le plus petit entier supérieur ou égal à n.
– Ceil(128.3) retourne 129
– Ceil(128.8) retourne 129
• FLOOR(n) : permet d'avoir la partie entière de n.
– FLOOR(128.3) retourne 128
– FLOOR(128.7) retourne 128
• MOD(m,n) : permet d'avoir le reste de la division entière de m par n.
• ROUND(m,n) : arrondit la valeur n à m décimal.
– Round(128.3) retourne 128
– Round(128.8) retourne 129
• POWER(m,n) : permet d'avoir m puissance n
• SIGN(n) : donne –1 si n <0, donne 0 si n=0 et donne 1 si n>1.
• SQRT(n) : permet d'avoir √x.
• TRUNC(m,n) : permet de tronquer la valeur après m décimales.
Si n est négatif, la valeur de m est tronquée avant le point décimal.
– TRUNC(121.371,1) retourne 121.3
– TRUNC(121.371,2) retourne 121.37 TRUNC(121.371,-1) retourne 120
TRUNC(121.371,-2) retourne 100
Exemple
• Afficher la désignation et les prix arrondis en Dinars de tous
les produits
SELECT desprod, ROUND (prix) "Prix en D"
FROM produit;
• En supposant que les numéros des produits sont exactement
sur trois position, afficher les désignations des produits dont le
numéro commence par 1
SELECT desprod FROM Produit Where trunc (numprod,-2) =
100;
• Modifier la table produit de manière à majorer les prix en
dinars.
Update produit
Set prix = CEIL(prix);
• Supprimer tous les produits dont le prix appartient à [100,101[
Delete from Produit
Where floor (prix) = 100;
5-2- Les fonctions s'appliquant aux chaînes de
caractères
• RTRIM (ch) : supprime l'espace à la fin de la chaîne ≠ LTRIM.
• RPAD (ch,n) : ajoute n espaces l'espace à la fin de la chaîne ≠ LPAD.
• INITCAP(ch) : met en majuscule la première lettre de chaque mot de
la chaîne.
• INSTR(ch1,ch2,n,m) : donne la position de la mième occurrence de
ch2 dans ch1 à partir du caractère à la position n.
• LENGTH(ch) : renvoie la longueur d'une chaîne.
• LOWER(ch) : transforme la chaîne ch en minuscule ≠ UPPER.
• SUBSTR(ch,m,n) : permet d'extraire une sous-chaîne de ch qui
commence à partir du caractère à la position m et de longueur n.
• TRANSLATE(ch,ch1,ch2) : permet de transformer dans la chaîne ch
toutes les occurrences de ch1 par ch2.
• Replace(ch, ch1[,ch2]) : remplace une chaîne par une autre dans une
colonne. Si on ne met pas ch2, ch1 va être remplacée par un vide.
ch2

• ch1 : concatène les deux chaînes.
Exemple
• Afficher les numéros des produits correspondants à des souris.
SELECT numprod From Produit Where
upper(ltrim(rtrim(desprod)))=‘SOURIS';
• Supprimer les produits dont la désignation est composée au maximum de 6
caractères.
DELETE FROM Produit
Where lenght (desprod)<=6
• Afficher les désignations des produits avec la première lettre en majuscule
SELECT distinct initcap(lower(desprod)) "désignation" FROM Produit;
• Afficher les numéros et couleurs des produits dont la désignation contient
"er" à partir de la 6ème position.
SELECT numprod, couleur FROM Produit Where
Lower(substr(desprod,6,2))='er';
• Afficher toutes les désignations des produits en remplaçant toute "a" par
"A"
SELECT distinct translate (desprod, 'a', 'A') désignation FROM Produit;
Exemple
• Modifier la table Produit en remplaçant les Scanners en
Imprimantes.
Update Produit
Set desprod = replace (desprod, 'Imprimante', 'scanner');
• Ajouter le champ Propriete de type caractère sur 4 positions formé
des trois premières caractères de la désignation concaténés à la
couleur.
Alter table produit
Add propriete varchar(4);

Update produit
Set propriete= substr (ltrim (desprod),1,3) || couleur;
5-3- Les expressions
s'appliquant à des dates
• ADD_MONTHS(d,n) : permet d'ajouter n mois à la date d
sachant que n est un entier.
• GREATEST(d1,d2) : permet d'avoir la date la plus récente
parmi d1 et d2 ≠ LEAST.
• MONTHS_BETWEEN(d1,d2) : permet d'avoir le nombre
de mois qui se trouvent entre la date d1 et la date d2.
• LAST_DAY(d) : permet d'avoir la date du dernier jour de la
date d.
LAST_DAY('02/01/07') donne : 31/01/07
• SYSDATE : donne la date et l'heure système.
Exemple
• Soit la table Employé (Matricule, Nom, Prenom, Date_nais,
Date_emb)
– On suppose qu’un employé est à la retraite à l’âge de 60 ans,
afficher les noms et prénoms des employés ainsi que leurs dates
de retraite
– En supposant qu’un employé est à la retraite après 30 ans de
service. Afficher les noms et prénoms des employés ainsi que les
dates prévus pour leurs retraites
– En supposant qu’un employé est à la retraite après 30 ans de
service ou à l’age de 60 ans. Afficher les noms et prénoms des
employés ainsi que les dates prévus pour leurs retraites
– Afficher le matricule et l’âge en mois de l’employé lors de son
embauche
– Afficher le matricule et l’âge en années de l’employé lors de son
embauche
– Afficher le matricule et le nombre de jours de travail pendant le
premier mois d’embauche de chaque employé.
Solution
• Select nom, prenom, add_months(date_Nais, 720) "retraite"
From Employe;
• Select nom, prenom, add_months(date_Emb, 360) "retraite"
From Employe;
• Select nom, prenom, least (add_months(date_Nais,720),
add_months(date_Emb, 360)) "retraite"
From Employe;
• Select matricule, months_between(date_Emb, date_Nais) "Age en
Mois" From Employe;
• Select matricule, floor (months_between(date_Emb, date_Nais)/12)
"Age"
From Employe;
• Select matricule, last_day (date_Emb)-date_Emb + 1 "Nombre de
Jours" From Employe;
5-4 Les fonctions de conversion
• TO_CHAR(valeur-date,format-date) /
TO_CHAR(nombre[,format]) : convertit une date ou une
valeur numérique à une chaîne de caractères.
• TO_DATE(valeur-chaîne,format-date) : convertit une
chaîne de caractères représentant une date à une date.
• TO_NUMBER(ch[,format]) : convertit une chaîne de
caractères représentant un nombre en nombre.
Quelques formats de dates
YYYY : Année sans virgule
YY : 2 derniers chiffres de l’année
YEAR : Année en toute lettre
Q : Numéro de trimestre de l’année (1 à 4)
MM : Numéro de mois (1 à 12).
MON : Nom du mois abrégé en 3 lettre
WW : Numéro de semaine de l’année (1 à 52)
W : Numéro de semaine dans le mois
DDD : Numéro du jour dans l’année (1 à 366)
DD : Numéro du jour dans le mois (1 à 31)
D : Numéro du jour dans la semaine (1 à 7)
DAY : Nom du jour sur 9 caractères
DY : Nom du jour abrége en 3 lettres
HH12 : Heure sur 12 heures (1 à 12)
HH24 : Heure sur 24 heures (1 à 24)
M : Minutes (1 à 60)
SS : Secondes (1 à 60)
SSSS : Secondes après minuit
Exemple
• Afficher les employés embauchés pendant l’année en
cours ;
Select * From Employe
Where to_char(date_Emb, 'YYYY') = to_char(sysdate,
'YYYY');
• Afficher les employés ayant au moins 3 ans
d’ancienneté ;
Select * From Employe
Where to_number(to_char(sysdate, 'YYYY'))-
to_number(to_char(date_Emb, 'YYYY'))>=3;
6- Les expressions agrégats (ou
fonctions de groupe)
• ORACLE dispose d'une fonction appelée fonctions
agrégats qui s'appliquent à un ensemble de données :
– AVG : permet d'avoir la moyenne arithmétique d'un
ensemble donné.
– COUNT : permet d'avoir le nombre d'occurrences des
enregistrements.
– MAX : permet d'avoir la valeur maximale dans une colonne.
– MIN : permet d'avoir la valeur minimale dans une colonne.
– SUM : permet d'avoir la somme des éléments.
– STDDEV : permet d'avoir l'écart type.
– VARIANCE : permet d'avoir la variance.
• Chacune de ces fonctions a comme argument un nom de
colonne ou une expression arithmétique. Elles ignorent les
valeurs nulles et par défaut prennent les valeurs multiples pour
des valeurs différentes.
• Pour ne prendre que les valeurs distinctes, il faut ajouter
l'opérateur DISTINCT. Et si l'on veut insister pour prendre
toutes les valeurs qui existent, on doit précéder la colonne ou
l'expression par l'opérateur ALL.
• La fonction COUNT peut prendre comme argument le
caractère * pour connaître le nombre de lignes sélectionnées.
• Remarque
• On ne peut pas mettre une fonction de groupe après la clause
WHERE parce qu'elle s'agit d'une valeur inconnue.
Exemple
• Donner le nombre de produits de couleurs rouge
SELECT Count(*) "Nombre"
FROM Produit
Where Upper(Couleur)='R';
• Afficher la quantité totale en stock des produits de couleur Rouge
SELECT sum(qte_stk) "quantité"
FROM Produit
Where Upper (Couleur) = 'R';
• Afficher la quantité moyenne en stock des produits de couleur Rouge
SELECT avg(qte_stk) "quantité"
FROM Produit
Where upper (Couleur) = 'R';
• Afficher les quantités minimales et maximale des produits en stock
SELECT max(qte_stk) "maximum" , min(qte_stk) "minimum"
FROM Produit;
Tri des résultats
• Pour obtenir un résultat trié, il suffit d'ajouter à la requête SQL
la clause :
• ORDER BY expression [asc / desc]
• Remarque :
Si on ne spécifie pas asc ou desc par défaut le tri est croissant
(asc).
• Exemple :
• Donner la liste des produits ordonnés par ordre croissant de
leurs prix.
SELECT * FROM produit
ORDER BY prix;
• Donner la liste des produits ordonnés par ordre croissant de
leurs prix et décroissant de leurs désignations.
SELECT * FROM produit
ORDER BY prix, desprod desc;
La pseudo-colonne ROWNUM
• La pseudo-colonne ROWNUM retourne un entier indiquant l’ordre
séquentiel de chaque enregistrement extrait par la requête.
• Exemple :
• SQL> select rownum, Numprod, Desprod from produit;

• ROWNUM NUMPROD DESPROD


-------------- --------------- ---------------
1 80 Imprimante
2 200 Souris
3 100 Ordinateur
Les requêtes imbriquées
• Les requêtes imbriquées sont des requêtes à l'intérieur d'autres
requêtes. Ceci se produit lorsque la clause WHERE contient elle-
même une sous requête.
• La sous requête (ou requête/bloc interne) :
– Peut retourner une seule colonne.
– Peut retourner des données : depuis une ou plusieurs lignes.
– La sous requête est typiquement codée comme partie d'un
prédicat utilisant =, lorsqu'elle retourne une seule valeur ou
utilisant IN lorsqu'elle retourne plusieurs valeurs.
• Requêtes imbriquées simples : la requête interne est indépendante –
de la requête externe – dans le sens où elle est complètement
évaluée avant la requête externe qui utilisera ensuite le résultat.
Les requêtes imbriquées
simples
• Syntaxe
SELECT col1, col2, …, coln
FROM table-name
WHERE (col1, col2, …, coln ) opérateur ( SELECT col1, col2, …,
coln
FROM table-name
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);
Exemple
• Afficher les numéros des produits de même couleur qu’un ordinateur
• SELECT numprod
FROM produit
Where couleur IN (SELECT couleur
FROM produit
WHERE upper (ltrim(rtrim(desprod))) = 'ORDINATEUR');
• Afficher les numéros des produits dont la quantité est supérieure à la quantité de
tout produit de couleur rouge
• SELECT numprod
FROM produit
Where qte_stk > all (SELECT Qte_stk
FROM produit
WHERE upper(couleur)='R'); ou
• SELECT numprod
FROM produit
Where qte_stk > (SELECT MAX(Qte_stk)
FROM produit
WHERE upper(couleur)='R');
Classification des résultats
• Il est possible de regrouper (classifier) les résultats obtenus permettant d'avoir
ensemble les lignes ayant une même valeur pour la colonne de classification. La
classification permet aussi d'effectuer un calcul tel que la moyenne ou la somme
des valeurs de chaque groupe et de présenter le résultat sous forme d'une ligne
par groupe.
• Syntaxe Couleur Qte_stk
SELECT R 10 Couleur Qte
totale
FROM B 20 R 35

WHERE G 20 B 55

GROUP BY expression B 35 G 20

HAVING condition R 25

• Exemple La fonction group by


• Afficher la quantité totale de produits par couleur
• SELECT couleur, sum(Qte_stk) "Qte totale"
FROM produit
Group by couleur;
Exemple
• Afficher le nombre de produits par couleur et désignation
SELECT desprod, couleur, count(*) "Nombree totale"
FROM produit
Group by desprod, couleur;
• Afficher la quantité totale des produits, supérieure à 40, par couleur.
SELECT couleur, sum(Qte_stk) "Qte totale"
FROM produit
Group by couleur;
Having sum (Qte_stk)>40;
• Afficher les couleurs des produits ayant une quantité totale > 100
SELECT couleur
FROM produit
Group by couleur
Having sum (Qte_stk)>100;
Les opérateurs ensemblistes
• Union : Elle permet d'avoir les résultats de la première requête
suivis de ceux de la deuxième requête.
• Intersect : Elle permet d'avoir les lignes communes aux résultats
des deux requêtes.
• Minus : Elle permet d'avoir les lignes qui apparaissent dans la
première requête et qui n'apparaissent pas dans la seconde.
• Avec l'utilisation de ces opérateurs :
– Les deux SELECT doivent avoir le même nombre de colonnes.
Ces colonnes doivent être de types compatibles.
– Les doublons sont automatiquement éliminés : Pas de lignes
redondantes dans le résultat.
– Les titres des colonnes résultats sont ceux de la première requête.
Les opérateurs ensemblistes
T1
T1 union T2 T1 Intersect T2
T2 T1 minus T2 T2

Numma Codma Numma Codma


g g g g Numma Codma
10 10 10 10 g g
10 10
20 30 20 20 20 20
40 30 30 30 30
40 40
T1 union T2
T1 intersect T2 T1 minus T2
Nummag
10 Nummag
20 10 Nummag
40 20 40
30 30
Les opérateurs ensemblistes
• Syntaxe
SELECT .... ..
FROM . . . . . .
{ UNION | INTERSECT | MINUS }
SELECT .... ..
FROM . . . . . .
{ UNION | INTERSECT | MINUS }
SELECT .... ..
FROM . . . . . . ;
Exemple
• Afficher les numéros des magasins qui sont à Sfax ou
qui contiennent le produit numéro 100
Select codmag
From produit
Where numprod = 100
UNION
Select nummag
From magasin
Where lower (ltrim(rtrim(adresse)))= 'sfax';
Exemple
• Afficher les numéros des magasins qui sont à
Sfax et qui contiennent le produit numéro 100
Select codmag
From produit
Where numprod = 100
INTERSECT
Select nummag
From magasin
Where lower (ltrim(rtrim(adresse)))= 'sfax';
Exemple
• Afficher les numéros des magasins qui sont à Sfax et
qui ne contiennent pas le produit numéro 100
Select nummag
From magasin
Where lower (ltrim(rtrim(adresse)))= 'sfax'
MINUS
Select codmag
From produit
Where numprod = 100;
La jointure simple
• Elle permet de combiner des enregistrements issues à partir de
deux ou plusieurs tables en vue de retrouver des données
associées.
• Les colonnes utilisées pour faire la jointure doivent être de
même type et de même taille et sont appelés colonnes de
jointure.
• 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é par les noms de tables
pour éviter toute ambiguïté.
• La forme générale d'une requête de jointure est :
SELECT col1 , col2 , …. , coln
FROM table1 ,… . , tablen
Exemple
Magasin (Nummag, adresse, Surface)
Produit (Numprod, Desprod, Couleur, Poids, Qte_stk,
Qte_seuil; Prix, Nummag#)
• Afficher les numéros des produits ainsi que leur adresse de
stockage
Select numprod, adresse
From produit, magasin
Where produit.nummag=magasin.nummag;
• Afficher les adresses des magasins contenant le produit
numéro 100
Select adresse
From produit p, magasin m
Where p.nummag = m.nummag
And p.numprod = 100;
L'autojointure
• Elle consiste à faire une jointure d'une table avec elle-même dans le but de
construire un enregistrement contenant des attributs en provenance de deux
lignes, inter-reliées, cherchées dans la même table. Pour cela il faut créer
un SYNONYME de la table ou utiliser des variables ALIAS.
• Exemple
Trouver la désignation est le prix unitaire des produits dont le prix est
supérieur à celui du produit ordinateur.
• Solution avec synonyme
CREATE SYNONYM prod FOR produit;
Select prod.desprod, prod.prix
From prod, produit
Where produit.desprod='ordinateur' and prod.prix > produit.prix;
• Solution avec ALIAS
Select p1.desprod, p2.prix
From produit p1, produit p2
Where p2.desprod = 'ordinateur' and p1.prix > p2.prix;
La jointure externe
• La jointure externe -de deux tables T1 et T2- est une
jointure particulière retournant le résultat normal d'une
jointure augmenté par tous les enregistrements issues de T1
(respectivement T2) pour lesquels il ne correspond aucune
ligne dans T2 (respectivement T1).
• De point de vue syntaxique, cette opération se formule de la
même façon qu'une jointure classique sauf qu'il faut ajouter
à la condition de la clause WHERE le signe : (+).
• Remarque
• Dans la condition de la jointure, il faut placer le champ « clé
primaire » avant le champ « clé secondaire ».
Exemple
• On considère les tables Produit et ligne_Commande suivantes:
Produit Ligne_commande
Numpro Desprod Couleur Poids Qte_stk Qte_seui Prix Numcde NumProd Qte_cde
d l
100 Ordinateu R 15.2 30 2 100.275 C12 100 3
r
80 Disquette 20 24 4 125 C67 200 20
200 Souris G 30 12 5 200.450

102 Tapis R 0.125 10 5 10

Donner les numéros des produits avec éventuellement les commandes correspondantes
P.numprod CL.numprod
SELECT P.numprod, LC.Numcde
100 C12
FROM Produit P, Ligne_commande LC
80
Where P.numprod = LC.numprod (+);
200 C67

102
Exemple
• Liste des produits non commandés

SELECT P.numprod, count(LC.Numcde)


FROM Produit P, Commande LC
Where P.numprod = LC.numprod (+)
Group by P.numprod
Having count(LC.Numcde) = 0;
Syntaxe Complète de la commande
SELECT
SELECT [ALL|DISTINCT] { [table]* |expr [alias], [expr
[alias]],..}
FROM table [alias], table [alias],...
[WHERE condition]
[GROUP BY expr, expr,...]
[HAVING condition]
[{UNION | INTERSECT | MINUS } SELECT ...]
[ORDER BY {expr|posn} [ASC | DESC], {expr|posn}
[ASC|DESC];

| la barre horizontale indique un choix entre


alternatives
{} choix obligatoire
[] options
Soulignement pour les options par défaut
Manipulation des données à travers
les vues
• La notion de vue permet de manipuler les données autrement qu'à travers
les tables définies dans la base.
• Une vue est une requête sur une ou plusieurs tables fournissant une autre
méthode de présentation des informations.
• L'utilisation des vues permet de :
– Restreindre l'accès à certaines colonnes et certaines lignes d'une table en
autorisant un ou plusieurs utilisateurs à manipuler cette table qu'à travers une
vue.
– Simplifier la tâche de l'utilisateur en le déchargeant de la formulation de
requêtes complexes
• Création d'une vue
– Elle consiste à définir sa structure : son nom, les colonnes qui la composent et
les données qui lui sont rattachées.
– Syntaxe :
CREATE VIEW nom_de_la_vue [(col1 , …..,coln )]
AS requête
[WITH CHECK OPTION] ;
• Remarque
• Si on met WITH CHECK OPTION on ne peut pas :
– Insérer des enregistrements qui ne vérifient pas la condition de la création de la vue.
– Modifier des enregistrements si la modification n'est pas conforme à la condition de la
création de la vue.
• Si on supprime la table de laquelle est issue la vue, la vue sera inutilisable.
• Exemple
• Créer une vue ProdR1 contenant tous les produits de couleur rouge
CREATE View ProdR1
AS Select *
FROM Produit
Where Couleur = 'R';
• Créer une vue ProdR2 contenant tous les produits de couleur rouge
CREATE View ProdR2
AS Select *
FROM Produit
Where Couleur = 'R'
With check option;
• Créer une vue VProd contenant les numéros et les désignations des
produits, leurs prix moyen et leur quantité totale en stock.
CREATE View VProd (num, des, prixmoyen, qte)
AS Select numprod, desprod, AVG(prix), SUM(qte_stk)
FROM Produit
group by numprod, desprod;
• Supression d'une vue
Elle consiste à supprimer du dictionnaire de données la définition
correspondante à cette vue.
• Les données rattachées à la vue restent dans leurs tables.
• Syntaxe :
DROP VIEW nom_de_la_vue ;
• Consultation d'une vue
Toutes les requêtes de consultation possibles sur les tables le sont aussi sur les
vues.
Mise à jour d'une vue
• Si la vue dérive de plusieurs tables ou si sa définition
contient la clause GROUP BY, DISTINCT ou n'importe
quelle fonction de groupe, alors les opérations DELETE,
INSERT et UPDATE sont interdites.
• Si un attribut de la vue est défini comme une expression, cet
attribut ne peut subir d'UPDATE et l'opération INSERT
est interdite sur toute la vue.
• Si un attribut déclaré NOT NULL dans la table de base n'est
pas repris dans la vue alors aucune insertion n'est
autorisée sur cette vue.
• L’instruction : insert into ProdR1 values(110, 'Impriment', 'V', 12, 10.500,
3, 200.530); est valide car il n’y a pas de contrôle sur la condition de la
création de la vue (couleur Rouge), puisqu’elle ne contient pas l’option
"with check option".
• L’instruction : insert into ProdR2 values(110, 'Impriment', 'V', 12, 10.500,
3, 200.530); n’est pas valide car on n’a pas respecté la condition de la
création de la vue (couleur Rouge) ayant l’option "with check option"
puisque la couleur n’est pas rouge.
• L’instruction insert into VProd values(202, 'Impriment', 10.500, 32); n’est
pas valide car la vue contient une fonction de groupe.
• Règles générales pour l'utilisation d'une vue
– La jointure entre une vue groupée et une table est interdite.
– Les colonnes de la vue, obtenues par groupement ne peuvent en aucun cas
figurer dans la clause WHERE de la requête d'interrogation.
– Des anomalies peuvent être détectées si la définition de la vue utilise
DISTINCT, une opération arithmétique, une opération de concaténation de
chaîne de caractères.
Création d'index
• Syntaxe :
CREATE [UNIQUE] INDEX nom_index
ON nom_table [( col1 asc/desc,
… coln asc/desc)] ;
• L'option UNIQUE signifie qu'il ne peut pas y avoir deux enregistrements
dont les valeurs sur les colonnes d'index soient identiques.
• Un index ne peut concerner qu'un seule table à la fois, mais une table peut
avoir plusieurs index.
• Exemple :
CREATE INDEX ind_nom ON client (nomclt asc);
• Remarque :
– Inutile de créer d'index pour des tables de moins de 200 lignes.
– Ne pas créer d'index sur une colonne possédant des valeurs différentes.
– Indexer les colonnes qui interviennent dans les clauses WHERE, GROUP BY et
les colonnes de jointure.
– Pour supprimer un index, il suffit d'utiliser la commande :
DROP INDEX nom_index ;
Correction DS Novembre 2006
• Create table CHERCHEUR (
CHNO number (4) NOT NULL,
CNOM VARCHAR (30) NOT NULL,
GRADE VARCHAR (2) NOT NULL,
STATUT VARCHAR (1),
THEME VARCHAR (30),
DATEREC DATE,
CHEFNO NUMBER (4),
SAL NUMBER (8,3),
PRIME NUMBER (8,3),
EQUIPNO NUMBER (2),
FNO NUMBER (3)
);
Création des clés Primaires
• ALTER table CHERCHEUR
ADD constraint PRK_CHERCHEUR PRIMARY KEY
(CHNO);
• ALTER table EQUIPE
ADD constraint PRK_EQUIPE PRIMARY KEY
(EQUIPNO);
• ALTER table FACULTE
ADD constraint PRK_FACULTE PRIMARY
KEY (FNO);
• ALTER table PUBLICATION
ADD constraint PRK_PUBLICATION PRIMARY KEY
(PID);
• ALTER table PUBLIER
ADD constraint PRK_PUBLIER PRIMARY KEY
(CHNO, PID);
Création des clés Etrangères
• ALTER table CHERCHEUR
ADD constraint FRK1_CHERCHEUR Foreign
KEY (EQUIPNO) References EQUIPE(EQUIPNO);
• ALTER table CHERCHEUR
ADD constraint FRK2_CHERCHEUR Foreign
KEY (FNO) References FACULTE(FNO);
• ALTER table EQUIPE
ADD constraint FRK1_EQUIPE Foreign
KEY (CHNO_RES) References CHERCHEUR(CHNO);
• ALTER table EQUIPE
ADD constraint FRK2_EQUIPE Foreign
KEY (FNO) References FACULTE(FNO);
• ALTER table PUBLIER
ADD (constraint FRK1_PUBLIER Foreign KEY
(CHNO) References CHERCHEUR(CHNO),
constraint FRK2_PUBLIER Foreign KEY (PID)
References PUBLICATION(PID));
CONTRAINTES sur la table
CHERCHEUR
• ALTER TABLE CHERCHEUR
ADD CONSTRAINT UNQ_CNOM UNIQUE (CNOM);

• ALTER TABLE CHERCHEUR


MODIFY DATEREC DEFAULT SYSDATE NOT NULL;

• ALTER TABLE CHERCHEUR


ADD CONSTRAINT Grd check (Grade in ('MA', 'A',
'MC', 'PR'));

• ALTER TABLE CHERCHEUR


ADD CONSTRAINT sta check (Statut in ('P', 'C', 'X'));
CONTRAINTES sur la table Equipe

• ALTER TABLE EQUIPE


ADD CONSTRAINT UNQ_ENOM UNIQUE (ENOM);

• ALTER TABLE EQUIPE


MODIFY ENOM NOT NULL;

• ALTER TABLE EQUIPE


ADD CONSTRAINT CHK_UPP_ENOM CHECK
(ENOM= UPPER(ENOM));
CONTRAINTES sur la table
publication
• ALTER TABLE PUBLICATION
• ADD CONSTRAINT CHK_UPP_PRIX CHECK
(PRIX= ROUND(PRIX,3));
• Les publications dont les titres contiennent la chaîne
modélisation des architectures
• SELECT *
FROM Publication
WHERE ltrim(rtrim(lower(PTITRE))) Like 'modélisation des
architectures ';
• Numéro et nom des équipes ayant plus que 5 chercheurs
permanents
• SELECT equipno, enom
FROM equipe
WHERE equipno in (SELECT equipno FROM chercheur
WHERE statut ='P'
GROUP BY equipno
HAVING (count(*)>=5));
• Les équipes rattachées à la FSEGS
• SELECT equipno, enom
FROM equipe
WHERE fno in (SELECT fno FROM faculte
WHERE ltrim(rtrim(upper(FNOM))) like 'FSEGS');
• Nom et grade des chercheurs permanents de l’ISIMM qui
ont participé à des publications.
SELECT chno, cnom, grade
FROM chercheur
WHERE fno in (SELECT fno FROM faculte
WHERE ltrim(rtrim(upper(FNOM))) Like 'ISIMM')
and statut = 'P'
and chno in (SELECT chno FROM publier);
• Les facultés n’ayant aucune équipe de recherche.
SELECT fno, fnom
FROM faculte
WHERE fno not in (SELECT distinct fno FROM
equipe);
• Les chercheurs qui ont participé dans au moins deux
publications.
SELECT chno, cnom
FROM chercheur
WHERE chno in (SELECT chno
FROM publier
GROUP BY chno HAVING (count(*) > = 2));
• Nombre de fois que le chercheur 1234 est auteur dans
des publications
SELECT count(*) FROM publier
WHERE chno = 1234;
• Etendre horizontalement la table CHERCHEUR par
une nouvelle colonne NBPUBLI désignant le nombre
de publications d’un chercheur.
ALTER TABLE chercheur
ADD nbpubli number(2);
• Remplir cette colonne.
UPDATE chercheur c
SET nbpubli = (SELECT count(*) FROM publier p
WHERE p.chno = c.chno);
Principe de la jointure simple
Produit Magasin

Select Project
produit Nummag, adresse
100 (critère de jointure)

100 Ordinateur … 1 1 Sfax


2 Monastir
3 Tunis
Project
Nummag
(critère de jointure)

Jointure
1 1 Sfax
1 2 Monastir
1 3 Tunis

Select lignes qui ont le même nummag

Sfax