Vous êtes sur la page 1sur 22

Oracle SQL – PL/SQL

BASES DE DONNEES
ORACLE : SQL – PL/SQL

On se propose d’automatiser la gestion des ventes d’une société de distribution de matériel informatique.
Pour cela nous avons conçu une base de données dont le Modèle Conceptuel des Données (MCD) (ou
Modèle Entity Association(EA)) est :

1,1 Subalterne
EstSuperieurDe
Employe
NumEmploye
0,n Superieur
Nom
Prenom
Fonction
EstRattache
DateEmbauche Departement
1,1
Salaire 1,n NumDept
ComplementSalaire NomDept
NatureComplementSalaire
Gerer >
DateNaissance 0,n
Genre
SitFam 1,1
NbEnfants
Telephone
Email Commande
NumCommande 1,n
DateCommande Contenir >
Client MontantRegle QteCommandee
CodeClient EtatCommande PrixVente
NomClient DateLivraison TauxRemise
Adresse
Ville 1,1 0,n
CodePostal 1,n
Pays Passer >
Telephone
Email
SiteWeb
Produit
Reference
Designation
Depot 0,n Stocker 1,n PrixAchat
CodeDepot MargeMin
QteEnStock
AdresseDepot MargeMax
SeuilStock
VilleDepot

1,1 1,1
Fournisseur
CodeFournisseur 1,n
RaisonSociale Fournir >
Contact
Adresse
Ville
CodePostal
Pays Categorie
1,n
Telephone CodeCategorie Appartenir
Email LibelleCategorie
SiteWeb Description
Illustration

1
Oracle SQL – PL/SQL

2
Oracle SQL – PL/SQL
Requêtes sélection
=========== Extraction d’un ensemble de colonnes d’une table ===========

1-Extraire les informations NumEmploye, Nom et prenom et NumSuperieurr de chaque employé

SELECT NumEmploye, Nom, Prenom, NumSuperieur


FROM Employe;

=========== Extraction de toutes les colonnes d’une table ===========

2-Extraire toutes les informations sur les dépôts.

SELECT *
FROM depot;

=========== Critères de recherche par comparaison. =============

3-Extraire les informations NumEmploye, Nom et prenom des employés dont la fonction est « ingénieur »

SELECT NumEmploye, Nom, Prenom, Fonction


FROM Employe
WHERE lower(Fonction) = 'ingenieur';

4-Extraire les informations NumEmploye, Nom, Prenom et salaire des employes dont le salaire est supérieur à 25000.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Salaire>25000;

5-Extraire les informations NumEmploye, Nom, Prenom et salaire des employes dont le salaire n’est pas inférieur à 50000.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE NOT (Salaire<50000);

=============== Critères de recherche par intervalle ==============

6-Extraire les informations NumEmploye, Nom, Prenom et salaire des employes dont le salaire se trouve dans l’intervalle [15000, 25000].

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Salaire BETWEEN 15000 AND 25000;

7- Extraire les informations NumEmploye, Nom, Prenom et salaire des employes dont le salaire se trouve en dehors de l’intervalle
[15000, 25000]

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Salaire NOT BETWEEN 15000 AND 25000;

3
Oracle SQL – PL/SQL
8- Extraire les informations NumEmploye, Nom, Prenom et salaire des employes dont le salaire est strictement supérieur à 15000 et
strictement inférieur à 25000.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Salaire > 15000 AND Salaire<25000;

9- Extraire les informations NumEmploye, Nom, Prenom et salaire des employes dont le salaire est égal à 15000 ou à 25000.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Salaire = 15000 OR Salaire=25000;

================Conditions de recherche par liste ================

10- Extraire les informations NumEmploye, Nom, Prenom et NumDept des employes dont NumDept appartient à la liste (10, 30, 50).

SELECT NumEmploye, Nom, Prenom, Numdept


FROM Employe
WHERE Numdept IN(10,30,50);

11- Extraire les informations NumEmploye, Nom, Prenom et NumDept des employes dont NumDept n'appartient pas à la liste (10, 30, 50).

SELECT NumEmploye, Nom, Prenom, Numdept


FROM Employe
WHERE Numdept NOT IN(10,30,50);

==========Critères de recherche utilisant un motif ==========

12- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom commence par ‘Mo’.

--Avec opérateur Like


SELECT NumEmploye, Nom, Prenom, Salaire
FROM Employe
WHERE Prenom LIKE 'Mo%';

--Avec Fonction REGEXP_LIKE et Expression régulière


SELECT NumEmploye, Nom, Prenom, Salaire
FROM Employe
WHERE REGEXP_LIKE(Prenom, '^Mo');

13- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom se termine par ‘id'.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Prenom LIKE '%id';

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, 'id$');

14- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom contient la sous chaîne ‘ou’

4
Oracle SQL – PL/SQL
SELECT NumEmploye, Nom, Prenom, Salaire
FROM Employe
WHERE Prenom LIKE '%ou%';

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, 'ou');

15- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom est formé de six caractères et dont les cinq
derniers forment la chaîne ‘atine’.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Prenom LIKE '_atine';

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, '^.{1}atine');

16- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom commence par la lettre F ou T et se termine
par la lettre d ou k.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, '^[FT].*[dk]$');

17- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom commence par la lettre comprise entre L et
T.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, '^[R-T]');

18- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le prénom ne commence pas par une lettre comprise
entre L et T.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, '^[^R-T]');

========= Rechecrche des caractères génériques : Utilisez [ ] =========

19- Afficher les informations NumEmploye, Nom, Prenom et salaire dont le prénom contient le caractère joker « _».

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE Prenom LIKE '%\_%' ESCAPE '\';

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE REGEXP_LIKE(Prenom, '_');

============= Critères de recherche avec comparaison de valeurs NULL =========


5
Oracle SQL – PL/SQL
20- Extraire les informations NumEmploye, Nom, Prenom, Salaire et ComplementSalaire des employes dont ComplementSalaire n’est pas
NULL.

SELECT NumEmploye, Nom, Prenom, Salaire, ComplementSalaire


FROM Employe
WHERE ComplementSalaire is NOT NULL;

============= Opérateurs logiques ==================

21- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes du Departement N°20 et ayant un salaire supérieur 15000.

SELECT NumEmploye, Nom, Prenom, Salaire


FROM Employe
WHERE NumDept = 20 and salaire>15000;

22- Extraire les informations NumEmploye, Nom, Prenom, Salaire, NumDept et Fonction des employés qui font partie du département N°20, ou
qui sont de fonction Ingénieur.

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept, Fonction


FROM Employe
WHERE NumDept = 20 OR UPPER(fonction) = 'INGENIEUR';

========== Priorité des opérateurs logiques ==========

23- Extraire les informations NumEmploye, Nom, Prenom, Salaire, NumDept et Fonction des employes qui font partie du département N°20 et
dont le salaire est supérieur à 15000 ou qui sont de fonction Ingenieur.

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept, Fonction


FROM Employe
WHERE NumDept = 20 AND Salaire > 15000 OR UPPER(fonction) = 'INGENIEUR';

24- Extraire les informations NumEmploye, Nom, Prenom, Salaire, NumDept et Fonction des employes dont le salaire est supérieur à 15000 et
qui soit font partie du département N°20, soit sont de fonction Ingenieur.

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept, Fonction


FROM Employe
WHERE Salaire > 15000 AND (NumDept = 20 OR UPPER(fonction) = 'INGENIEUR');

============ Élimination des doublons à l'aide de DISTINCT =======

25- Extraire les fonctions des différents employés

SELECT Fonction
FROM Employe;

26- Extraire les différentes fonctions des différents employés

SELECT DISTINCT Fonction


FROM Employe;

SELECT UNIQUE Fonction


FROM Employe;

6
Oracle SQL – PL/SQL
========== Tri des lignes à l'aide de ORDER BY=============

27- Extraire les informations NumDept, Fonction, NumEmploye, Nom, Prenom, et Salaire des employes.

SELECT NumDept, Fonction, NumEmploye, Nom, Prenom, Salaire


FROM Employe;

28- Extraire les informations NumDept, Fonction, NumEmploye, Nom, Prenom, et Salaire des employes en classant les lignes par ordre croisant
de Numdept

SELECT NumDept, Fonction, NumEmploye, Nom, Prenom, Salaire


FROM Employe
ORDER BY NumDept ASC;

29- Extraire les informations NumDept, Fonction, NumEmploye, Nom, Prenom, et Salaire des employes en classant les lignes par ordre croisant
de Numdept, puis par ordre décroissant des fonctions.

SELECT NumDept, Fonction, NumEmploye, Nom, Prenom, Salaire


FROM Employe
ORDER BY NumDept, Fonction DESC;

30- Extraire les informations NumDept, Fonction, NumEmploye, Nom, Prenom, et Salaire des employes en classant les lignes par ordre croisant
de Numdept, puis par ordre décroissant des fonctions, et en fin par ordre croissant des noms.

SELECT NumDept, Fonction, NumEmploye, Nom, Prenom, Salaire


FROM Employe
ORDER BY NumDept, Fonction DESC, Nom;

===== Attribution de nom aux colonnes du jeu de résultats : Utilisez la clause AS =====

31- Extraire les informations Numemploye et Nom en attribuant aux colonnes NumEmploye et Nom du jeu des résultats respectivement l'intitulé
"Numéro de l'employé" , et "Nom de l'employé"

SELECT NumEmploye AS "Numero de l'Employe", Nom AS "Nom de l'Employe"


FROM Employe;

=========== Champs calculés ===========

32- Extraire Pour chaque employé son Numéro et la somme de son salaire et de son ComplementSalaire s'il existe.

SELECT NumEmploye, Salaire, ComplementSalaire, (Salaire + NVL(ComplementSalaire, 0)) AS SG


FROM Employe;

33- Extraire pour chaque employé son numéro et son année d’embauche.

SELECT NumEmploye, EXTRACT(YEAR FROM DateEmbauche) AS AnneeEmbauche


FROM Employe;

34- Extraire pour chaque employé son nom et prénom affichés en une même colonne

SELECT NumEmploye, NOM || ' ' ||Prenom AS Identite


FROM Employe;
7
Oracle SQL – PL/SQL
35- Extraire pour chaque employé son numéro et « Première letrre du prénom » suivie d’un point suivi du nom.

SELECT NumEmploye, SUBSTR(Prenom, 0, 1) ||'.' || Nom As Identite


FROM Employe;

36- Calculer le montant de ventes pour chaque produit vendu. Montant=PrixVente*(1-Remise)* QteCommandee (Table DetailsCommande).

( Afficher les informations Reference et Montant)

SELECT Reference, PrixVente * (1-TauxRemise)*QteCommandee AS Montant


FROM detailcommande
ORDER BY Reference;

37- Extraire pour chaque employé son numéro, son nom, son prénom et son ancienneté.

SELECT NumEmploye, Nom, Prenom, ROUND((SYSDATE-DateEmbauche)/365,2) Anciennete


FROM Employe;

38- Extraire pour chaque employé son numéro, son nom, son prénom et son âge d'embauche.

SELECT NumEmploye, Nom, Prenom, ROUND((DateEmbauche-datenaissance)/365,0) AgeEmbauche


FROM Employe;

=========== Utilisation de jointures internes ============

39- Extraire pour chaque employé toutes ses informations ainsi que celles du département dont il fait partie.

SELECT Employe.*, Departement.*


FROM Employe INNER JOIN Departement ON Employe.NumDept = Departement.NumDept;

SELECT E.*, D.*


FROM Employe E INNER JOIN Departement D ON E.NumDept = D.NumDept;

40- Extraire pour chaque employé les informations NumEmploye, Nom , Prenom et NumDept ainsi que le nom de son département.

SELECT E.NumEmploye, E.Nom, E.Prenom, E.NumDept , D.Nom NomDept


FROM Employe E INNER JOIN Departement D ON E.NumDept = D.NumDept;

======== Jointures utilisant des opérateurs autres que « égal » (=) =========

41- Extraire les informations NumClient, Nom, Ville pour lesquels l’ordre alphabétique de la ville vient après celui de la ville ou se trouve le
fournisseur ‘SOS INFO’

SELECT CodeClient, Nom, Ville


FROM Client
WHERE Ville >(SELECT VILLE FROM Fournisseur WHERE UPPER(RaisonSociale) = 'SOS INFO');

========= Utilisation de jointures externes gauches ==========

42-Extraire les informations Reference, Designation, PrixAchat, et PrixVente sur chaque produit qu’il soit vendu on non.

SELECT P.Reference, Designation, PrixAchat, PrixVente


FROM Produit P LEFT JOIN DetailCommande DC ON P.Reference = DC.Reference
8
Oracle SQL – PL/SQL
ORDER BY Reference;

========= Utilisation de jointures externes droites ===========

43- Extraire les informations NumCommande, DateCommande, NumClient, NomClient pour chaque client qu'il ait passé ou nom de commandes

SELECT Clt.CodeClient, Nom, numcommande, DateCommande


FROM Commande cmd RIGHT JOIN Client clt ON cmd.CodeClient = clt.CodeClient
ORDER BY 1;

======== Utilisation d'auto-jointures =============

44- Extraire pour chaque employe son numero, nom prenom ainsi que le numéro, nom et prénom de son supérieur.

SELECT E1.NumEmploye, E1.Nom NomEmploye, E1.Prenom PrenomEmploye, E1.NumSuperieur,


E2.Nom NomSuperieur, E2.Prenom PrenomSuperieur

FROM Employe E1 INNER JOIN EMPLOYE E2 ON E1.NumSuperieur = E2.NumEmploye;

===Jointure de trois tables ou plus====

45- Afficher pour chaque dépôt la liste des produits qui y sont stockés. Les informations à afficher sur les produits sont : CodeDepot,
AdresseDepot, Reference, Designation, et QteEnStock.

SELECT D.CodeDepot, D.AdresseDepot, P.reference, P.Designation, S.QteEnStock


FROM (Depot D INNER JOIN Stock S ON D.CodeDepot = S.CodeDepot) INNER JOIN Produit P ON
S.Reference = P.Reference;

46- Afficher pour chaque employé son numéro, nom et prénom ainsi que les codes et les noms des clients avec lesquels il a traité.

SELECT E.NumEmploye, E.Nom, Prenom, Clt.CodeClient, Clt.Nom


FROM Employe E INNER JOIN Commande Cmd ON E.NumEmploye = Cmd.NumEmploye INNER JOIN Client Clt ON Cmd.CodeClient =
Clt.CodeClient;

47- Afficher pour chaque client son numéro, son nom et la liste des produits qu’ils ont commandés en chaque commande. Les informations à
afficher sur les produits sont CodeProduit, Designation, QteCommandee et PrixVente.

SELECT Clt.CodeClient, Nom, P.Reference, Designation, QteCommandee, PrixVente


FROM Client Clt INNER JOIN Commande Cmd ON Clt.CodeClient = Cmd.CodeClient
INNER JOIN DetailCommande DC ON Cmd.NumCommande = DC.NumCommande
INNER JOIN Produit P ON P.Reference = DC.Reference;

48- Afficher pour chaque client son numéro, son nom, et les noms des catégories des produits qu’ils ont commandés

SELECT Clt.CodeClient, Clt.Nom, Cat.CodeCategorie, Cat.Nom


FROM Client Clt INNER JOIN Commande Cmd on Clt.CodeClient = Cmd.CodeClient
INNER JOIN DetailCommande DC ON Cmd.NumCommande = DC.NumCommande
INNER JOIN Produit P ON DC.Reference = P.Reference
INNER JOIN Categorie Cat ON p.codecategorie=cat.codecategorie;

===Concepts de requêtes avancées===

===Utilisation des fonctions d'agrégation dans la liste de sélection=

9
Oracle SQL – PL/SQL
49- calculer la somme des salaires de tous les employés de la table Employe.

SELECT SUM(Salaire) MasseSalariale


FROM Employe;

50- calculer le salaire moyen de tous les employés de la table Employe.

SELECT AVG(Salaire) SalaireMoyen


FROM Employe;

51- Calculer le salaire moyen et la somme des salaires de tous les employés

SELECT AVG(Salaire) SalaireMoyen, SUM(Salaire) MasseSalariale


FROM Employe;

52- Calculer la somme des complementSalaire des employes de fonction ‘Commercial’.

SELECT SUM(NVL(ComplementSalaire,0)) ComplementSalaireTotal


FROM Employe
WHERE UPPER(Fonction) = 'COMMERCIAL';

===Utilisation de COUNT(*)====

53- Calculer le nombre total d’employés.


SELECT COUNT(NumEmploye) NbEmploye
FROM Employe;
54- Calculer le nombre d’employés ayant un salaire >20000, ainsi que la moyenne de leur salaire.
SELECT COUNT(NumEmploye) NbEmploye, SUM(Salaire) SalaireTotal
FROM Employe
WHERE Salaire>20000;
===Regroupement de lignes à l'aide de GROUP BY===
55- Calculer pour chaque département, le nombre d’employés ainsi que le salaire moyen.
SELECT NumDept, COUNT(NumEmploye) NbEmploye, ROUND(AVG(Salaire),2) SalaireMoyen
FROM Employe
GROUP BY NumDept;
56- Calculer le salaire moyen des employés par année d’embauche. Trier le résultat selon l'année d'embauche.
SELECT EXTRACT(YEAR FROM DateEmbauche) AnneeEmbauche, ROUND(AVG(Salaire),2) SalaireMoyen
FROM Employe
GROUP BY EXTRACT(YEAR FROM DateEmbauche)
ORDER BY AnneeEmbauche;
57- Calculer le total des salaires ainsi que le salaire moyen de chaque fonction en chaque département.
SELECT NumDept, Fonction, SUM(Salaire) TotalSalaires, ROUND(AVG(Salaire),2) SalaireMoyen
FROM Employe
GROUP BY NumDept, Fonction;

===GROUP BY et la clause WHERE===

58- Calculer le salaire moyen par fonction des employés qui ne sont pas du Département Numéro 30 (Direction)
SELECT Fonction, ROUND(AVG(Salaire),2) SalaireMoyen
FROM Employe
WHERE NumDept <>30 --Le filtre est effectué avant le regroupement
GROUP BY Fonction;

10
Oracle SQL – PL/SQL
===Sélection de lignes à l'aide de la clause HAVING===

59- Quels sont les fonctions dont le salaire moyen des employés n’appartenant pas au département 30, dépassent 20000.
SELECT Fonction, ROUND(AVG(Salaire),2) SalaireMoyen
FROM Employe
WHERE NumDept <>30 --Le filtre est effectué avant le regroupement
GROUP BY Fonction
HAVING AVG(Salaire)>20000; --Le filtre est effectué après le regroupement

60- Calculer le salaire moyen des employés de chaque département ayant au moins 5 employés.

SELECT NumDept, AVG(Salaire) AS SalaireMoyen


FROM Employe
GROUP BY NumDep
HAVING COUNT(*) >5
ORDER BY NumDept;

======Imbrication des fonction d'agrégat====

60Bis-Calculer la masse salariale maximale des départements ainsi que la masse salariale globale de tous les employés.

SELECT MAX(SUM(Salaire)) MaxSalarialeDept_Max, SUM(SUM(Salaire)) MasseSalarialeGlobale


FROM Employe
GROUP BY NumDept;

===Combinaison des résultats avec UNION====

61- Afficher les villes des clients et fournisseurs.

SELECT VILLE FROM Client


UNION
SELECT VILLE FROM Fournisseur;

62- Afficher les noms des employés, clients et fournisseurs. Spécifier pour chaque nom son origine

SELECT Nom, 'Employe' AS Origine


FROM Employe
UNION
SELECT Nom , 'Client'
FROM Client
UNION
SELECT RaisonSociale, 'Fournisseur'
FROM Fournisseur;

63- Afficher Les numéros et noms des fournisseurs et des employés

/*
La requête ci-dessous ne s'exécute car les champs numEmploye
et CodeFornisseur ne sont pas de ^type compatible

SELECT NumEmploye AS Numero, Nom


FROM Employe
UNION
SELECT CodeFournisseur, RaisonSociale
FROM Fournisseur;
11
Oracle SQL – PL/SQL
*/

64- Afficher Les villes où se trouvent des clients et des Fournisseurs

SELECT Ville
FROM Client

INTERSECT

SELECT Ville
FROM Fournisseur;

65- Afficher Les villes où on trouve des clients mais pas de Fournisseurs

SELECT Ville
FROM Client

MINUS

SELECT Ville
FROM Fournisseur;

===Principes de base des sous-requêtes===

66- Afficher pour chaque commande les informations NumCommande, DateComande et le plus grand prix de vente des produits qui en font
partie.

--Avec Sous-Requête
SELECT NumCommande, DateCommande,
(SELECT Max(PrixVente)FROM DetailCommande DC
WHERE Cmd.NumCommande = DC.NumCommande) AS PrixVenteMax
FROM Commande Cmd;

--Avec Jointure
SELECT Cmd.NumCommande, DateCommande, Max(PrixVente) AS PrixVenteMax
FROM Commande Cmd INNER JOIN DetailCommande DC
ON Cmd.NumCommande = DC.NumCommande
GROUP BY Cmd.NumCommande, DateCommande
ORDER BY Cmd.NumCommande;

67- Afficher la désignation des produits dont le prix d’achat est égal au prix d’achat du produit dont la désignation est « Imprimante LexMark
500 »

SELECT Designation, PrixAchat


FROM Produit
WHERE PrixAchat =
(SELECT PrixAchat FROM Produit
WHERE UPPER(Designation) = 'IMPRIMANTE LEXMARK 500');

===Types de sous-requête===

12
Oracle SQL – PL/SQL
===Sous-requêtes et alias====

68- Afficher les informations NumEmploye, Nom, et DateEmbauche des employés qui ont été embauché la même année que l’employé de
numéro 16712.

SELECT NumEmploye, Nom, DateEmbauche


FROM Employe
WHERE EXTRACT (YEAR FROM DateEmbauche) =
(SELECT EXTRACT (YEAR FROM DateEmbauche)
FROM Employe
WHERE NumEmploye = 16712);

===Sous-requêtes introduites par IN====

69-Afficher la designation des produits qui sont stockés dans le dépôt ‘DEP001’

SELECT Designation
FROM Produit
WHERE Reference IN
(SELECT Reference
FROM Stock
WHERE CodeDepot = 'DEP001');

===Sous-requêtes introduites par NOT IN====

70-- Afficher la designation des produits qui ne sont pas stockés dans le dépôt ‘DEP001’
SELECT Designation
FROM Produit
WHERE Reference NOT IN
(SELECT Reference
FROM Stock
WHERE CodeDepot = 'DEP001');

71-Afficher pour Chaque employe son Numero et nom ainsi que le salaire moyen de tous les employés
SELECT NumEmploye, Nom, Salaire,
(SELECT AVG(Salaire)
FROM Employe) AS SalaireMoyen
FROM Employe;

72-Afficher pour Chaque employe sa reference, son nom , Salaire, NumDept ainsi que le salaire moyen des employés de son département.

SELECT NumEmploye, Nom, Salaire,NumDept,


ROUND((SELECT AVG(Salaire)
FROM Employe E2
WHERE E1.NumDept = E2.NumDept),2) AS SalaireMoyenDept
FROM Employe E1
ORDER BY NumDept;

71-72Combinés
SELECT NumEmploye, Nom, Salaire, NumDept,Round((SELECT AVG(Salaire)
FROM Employe E2
WHERE E1.NumDept = E2.NumDept),2)SalaireMoyenDept,
ROUND((SELECT AVG(Salaire)
FROM Employe),2) SalaireMoyenGlobal
FROM Employe E1;

13
Oracle SQL – PL/SQL
==Sous-requêtes dans les instructions UPDATE, DELETE ==

73- Modifier les prix d’achat des produits fournis par des fournisseur Marocain en les réduisant de 20%.
UPDATE Produit
SET PrixAchat = PrixAchat -PrixAchat*20/100
WHERE Reference IN (SELECT Reference
FROM Fournisseur
WHERE UPPER(Pays) = 'MAROC');

--Annuler les modifications


ROLLBACK;

74- Supprimer les produits fournis par les fournisseurs Libyens.

DELETE FROM Produit


WHERE Reference IN (SELECT Reference
FROM Fournisseur
WHERE UPPER(Pays) = 'LYBIE');

--Annuler les modifications


--Remarque : Il faut faire une suppression en cascade car un produit est référencé à parti de la table stock
-- et peut l'être également à partir de la table DetailCommande

ROLLBACK;

==Sous-requêtes et opérateurs de comparaison===

75- Afficher les informations NumClient, Nom et ville des clients qui se trouvent dans la même ville que le fournisseur ‘SOS INFO’.

SELECT CodeClient, Nom, Ville


FROM Client
WHERE Ville = (SELECT Ville
FROM Fournisseur
WHERE UPPER(RaisonSociale) = 'SOS INFO');

76- Afficher les informations NumEmploye, Nom, Prenom, Salaire, et NumDept des employés dont le salaire est inférieur au salaire de tous les
employés du département N°20.

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept


FROM Employe
WHERE Salaire < (SELECT Min(Salaire)
FROM Employe
WHERE NumDept = 20);

Ou

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept


FROM Employe
WHERE Salaire < ALL(SELECT Salaire
FROM Employe
WHERE NumDept = 20);

===Opérateurs de comparaison modifiés par ANY, SOME ou ALL===

14
Oracle SQL – PL/SQL
77- Afficher les informations NumEmploye, Nom, Prenom, Salaire, et NumDept des employés dont le salaire est supérieur au salaire d’au moins
un employé du département N°20.

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept


FROM Employe
WHERE Salaire > ANY (SELECT SALAIRE
FROM Employe
WHERE NumDept=20);
--Ou

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept


FROM Employe
WHERE Salaire > SOME (SELECT SALAIRE
FROM Employe
WHERE NumDept=20);
-Ou

SELECT NumEmploye, Nom, Prenom, Salaire, NumDept


FROM Employe
WHERE Salaire > (SELECT Min(SALAIRE)
FROM Employe
WHERE NumDept=20);

78- Afficher les informations CodeDepot et Ville des dépôts qui se trouvent dans une ville où il ya au moins un fournisseur.

SELECT CodeDepot, VilleDepot


FROM Depot
WHERE VilleDepot = ANY(SELECT Ville
FROM Fournisseur);

79- Afficher les informations CodeDepot et Ville des dépôts qui se trouvent dans une ville où il n'y a aucun fournisseur.

SELECT CodeDepot, VilleDepot


FROM Depot
WHERE VilleDepot <> ALL(SELECT Ville
FROM Fournisseur);
--Ou

SELECT CodeDepot, VilleDepot


FROM Depot
WHERE VilleDepot NOT IN (SELECT Ville
FROM Fournisseur);
80- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le salaire est supérieur au salaire de tous les employés
du Departement Numéro 20.
SELECT NumEmploye, Nom, Prenom, Salaire
FROM Employe
WHERE Salaire > ALL(SELECT Salaire
FROM Employe
WHERE NumDept=20);

--ou

SELECT NumEmploye, Nom, Prenom, Salaire

15
Oracle SQL – PL/SQL
FROM Employe
WHERE Salaire > (SELECT MAX(Salaire)
FROM Employe
WHERE NumDept=20);

81- Extraire les informations NumEmploye, Nom, Prenom et Salaire des employes dont le salaire est supérieur au salaire d’au moins
un employé du Departement Numéro 10 .
SELECT NumEmploye, Nom, Prenom, Salaire
FROM Employe
WHERE Salaire > ANY(SELECT Salaire
FROM Employe
WHERE NumDept=10);
--ou
SELECT NumEmploye, Nom, Prenom, Salaire
FROM Employe
WHERE Salaire > (SELECT MIN(Salaire)
FROM Employe
WHERE NumDept=10);

===Qualification de noms de colonnes dans des sous-requêtes===

82- Afficher les noms des clients qui ont passé des commandes auprès de l’employé dont le numéro est 16034.
SELECT Nom
FROM Client
WHERE CodeClient IN(SELECT CodeClient
FROM Commande
WHERE NumEmploye = 16034);

===Sous-requêtes introduites par EXISTS====

83- Refaire la question N°78 en utilisant l’opérateur EXISTS.


Afficher les informations CodeDepot et Ville des dépôts qui se trouvent dans une ville où il ya au moins un fournisseur.
SELECT CodeDepot, VilleDepot
FROM Depot D
WHERE EXISTS(SELECT Ville
FROM Fournisseur F
WHERE F.Ville = D.VilleDepot);

84- Afficher la désignation des produits fourni par des fournisseurs qui se trouvent dans une ville qui commence par la lettre F.

===Sous-requêtes introduites par NOT EXISTS===

85- Afficher les noms des fournisseurs qui n’ont fourni aucun produit de la catégorie ORD001.
SELECT RaisonSociale
FROM Fournisseur F
WHERE NOT EXISTS(SELECT Reference
FROM Produit P
WHERE F.CodeFournisseur = P.CodeFournisseur AND P.CodeCategorie='ORD001');

86- Afficher la désignation des produits qui n’ont pas été vendus. (La reference du produit n'existe pas dans la table DetailCommande)

SELECT Designation
FROM Produit P

16
Oracle SQL – PL/SQL
WHERE NOT EXISTS (SELECT *
FROM DetailCommande DC
WHERE P.Reference = DC.Reference);

===Utilisation de EXISTS et NOT EXISTS pour la recherche des intersections et des différences===

87- Afficher les villes où sont implantés des clients et des fournisseurs
SELECT Ville
FROM Client C
WHERE EXISTS (SELECT *
FROM Fournisseur F
WHERE C.Ville = F.Ville);

88- Afficher les villes où il y a des clients mais aucun fournisseur.

SELECT Ville
FROM Client C
WHERE NOT EXISTS (SELECT *
FROM Fournisseur F
WHERE C.Ville = F.Ville);

==Utilisation d'une sous-requête à la place d'une expression===

89- Afficher pour chaque produit les informations Désignation, PrixAchat, Prix achat moyen, et l’écart entre le prix achat et le prix achat moyen .
SELECT Designation, PrixAchat,
(SELECT ROUND(AVG(PrixAchat),2)FROM Produit) PrixAchatMoyen,
PrixAchat-(SELECT ROUND(AVG(PrixAchat),2)FROM Produit) Ecart
FROM Produit;

===Niveaux d'imbrication multiples===

90- Afficher les noms des clients qui ont acheté des produits stocké dans le dépôt ‘DEP002’.
SELECT Nom
FROM Client
WHERE CodeCLIENT NOT IN (SELECT CodeClient
FROM Commande
WHERE NumCommande IN (SELECT NumCommande
FROM DetailCommande DC
WHERE REFERENCE IN(
SELECT REFERENCE
FROM Stock
WHERE CodeDepot = 'DEP002')));

======== Limitation des jeux de résultats à l'aide de TOP et de PERCENT ====

Remarque : Oracle ne contient ni les clauses TOP et TOP PERCENT de Microsoft ACCESS ni la clause
LIMIT de MySQL. IL faut utiliser la pseudo-colonne ROWNUM

91- Extraire les 5 premiers grands salaires des employés

SELECT DISTINCT Salaire


17
Oracle SQL – PL/SQL
FROM (SELECT Salaire FROM EMPLOYE ORDER BY Salaire DESC)
WHERE ROWNUM <=5;

--===Oracle 12C et Plus : ne marche pas avec Oracle 11g====

SELECT SALAIRE
FROM Employe
ORDER BY SALAIRE DESC
FETCH FIRST 5 ROWS ONLY;

92-Extraire les 5% premiers grands salaires des employés

SELECT DISTINCT Salaire


FROM (SELECT Salaire FROM EMPLOYE ORDER BY Salaire DESC)
WHERE ROWNUM <= 5/100*(SELECT COUNT(*) FROM Employe);

================== Requêtes paramètrées===============

93- Extraire les informations NumEmploye, nom, prénom, salaire et fonction des employés dont on saisit la fonction
au clavier.

--Variable de substitution (&fonction)


SELECT NumEmploye, Nom, Prenom, Fonction
FROM Employe
WHERE Fonction = '&fonction';

94-Extraire les informations NumEmploye, nom, prénom, salaire et DateEmbauche embauchés entre une date de
début et date de fin.

SELECT NumEmploye, Nom, Prenom, Salaire, DateEmbauche


FROM Employe
WHERE DateEmbauche BETWEEN TO_DATE('&DateDebut') AND TO_DATE('&DateFin');

18
Oracle SQL – PL/SQL
Annexe1 :
Oracle : Expressions régulières

Correspondance avec certains types de caractères


Pattern Correspond à
. N'importe quel caractère à l'exception du caractère nouvelle ligne(\n)
N'importe quel caractère se trouvant entre les crochets
[ ]
(\[ et \] pour chercher les crochets)
[^ ] N'importe quel caractère ne se trouvant pas entre les crochets
[a-z] N'importe quel caractère se trouvant dans l'intervalle spécifié
\w N'importe quelle lettre, chiffre ou trait de soulignement
N'importe quel caractère autre que lettre, chiffre, ou trait de
\W
soulignement
\d N'importe quel chiffre
\D N'importe quel caractère autre que chiffre
\s N'importe quel caractère espace (espace, \t, \n, \r, …)
\S N'importe quel caractère autre que espace (espace, \t, \n, \r, …)

Pattern qui correspondent aux positions dans une string


Pattern Correspond à
^ Début de la chaine (utiliser \^ pour faire correspondre au caractère ^
$ Fin de la chaine (utiliser \$ pour faire correspondre à la fin de la chaine)
Caractère de mot qui n'est pas suivi ou précédé par un caractère de mot.
\b
Un caractère de mot est n'importe quelle lettre minuscule(a-z), majuscule(A-Z),
chiffre(0-9) et underscore(_).
\B Caractère de mot qui est suivi ou précédé par un caractère de mot.

Les quantificateurs

Les quantifiateurs permettent de dire combien de fois un caractère doit être recherché

Quantifier Description

c+ N'importe quelle string qui contient au moins une fois c

19
Oracle SQL – PL/SQL
c* N'importe quelle string qui contient zero ou plusieurs occurrences de c

c? N'importe quelle string qui contient 0 ou 1 occurrence de c

c{n} N'importe quelle string qui contient une sequence de n c

c{n,m} N'importe quelle string qui contient une séquence de n à m c

c{n,} N'importe quelle string qui contient une séquence d'au moins n c.

?=s N'importe quelle string suivie par une string spécifique s

?!s N'importe quelle string qui n'est pas suivie par une string spécifique s

20
Oracle SQL – PL/SQL

Oracle SQL

Oracle PL/SQL

21
Oracle SQL – PL/SQL

22

Vous aimerez peut-être aussi