Requêtes complexes
-
Upload
judith-williamson -
Category
Documents
-
view
54 -
download
5
description
Transcript of Requêtes complexes
![Page 1: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/1.jpg)
Requêtes complexes
![Page 2: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/2.jpg)
2
Opérateurs d’ensembles• Ils associent les rangées de 2 requêtes
UNION [ALL]
INTERSECT
MINUS
![Page 3: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/3.jpg)
3
• les 2 ensembles doivent :– avoir le même nombre de
colonnes– les colonnes doivent être de
même type– la longueur des colonnes peut-
être différente
Opérateurs d’ensembles
![Page 4: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/4.jpg)
4
UNION
Exemple :◦ Afficher la liste des numéros de
département situés à Montréal, ou qui contiennent au moins un employés qui touche une commission plus grande que $1000.
SELECT
id_departement
FROM
departement
WHERE
ville = ‘Montréal’
UNION
SELECT
id_departement
FROM
employe
WHERE
commission >1000;
Id_departement
10
20
Id_departement
30
Id_departement
10
20
30
![Page 5: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/5.jpg)
5
L’union inclus donc dans un nouvel ensemble tous les éléments des deux SELECT.
ALL = toutes les valeurs, même les doublons. Sans le All = valeurs distinctes
UNION suite
10 20
UNION 3010
20 30
![Page 6: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/6.jpg)
6
INTERSECT
Exemple◦ Trouver la liste des numéro de
département situés à Montréal et qui contiennent au moins un employé qui gagne un salaire de plus de $2,900.
SELECT
id_departement
FROM
employe
WHERE
salaire > 2900
INTERSECT
SELECT
id_departement
FROM
departement
WHERE
Ville = ‘Montréal’;
Id_departement
10
20
Id_departement
10
Id_departement
10
![Page 7: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/7.jpg)
7
L’intersection met dans un nouvel ensemble tous les éléments communs aux deux SELECT.
INTERSECT suite
10 20
INTERSECT 10 10
![Page 8: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/8.jpg)
8
MINUS
Afficher le numéro des départements qui ont au moins un employé qui gagne plus de $2900 et qui ne sont pas situés à Ottawa
SELECT
id_departement
FROM
employe
WHERE
salaire > 2900
MINUS
SELECT
id_departement
FROM
departement
WHERE
ville = ‘Ottawa’;
Id_departement
10
20
Id_departement
20
Id_departement
10
![Page 9: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/9.jpg)
9
Le MINUS met dans un nouvel ensemble la soustraction des éléments du premier SELECT qui sont communs au deuxième SELECT.
MINUS suite
10 20
MINUS 10 20
10 MINUS10 20
Ensemble vide
![Page 10: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/10.jpg)
10
Sous-requêtes
Synonyme : requête imbriquée Il s’agir d’une requête comprise
dans la clause WHERE d’une autre requête
Exemple :◦ Afficher la liste des employés qui
sont du même département que Rivest
SELECT
nom
FROM
employe
WHERE
id_departement = (SELECT
id_departement
FROM
employe
WHERE
nom= ‘rivest’);
![Page 11: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/11.jpg)
11
Notes sur les sous-requêtes
L’imbrication peut continuer indéfiniment.
Une sous-requête peut accéder à des tables différentes
![Page 12: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/12.jpg)
Produire la liste des employés qui occupent le même type de poste que « Cabana » ou qui ont un salaire plus élevé que le sien:
SELECT
nom, poste, salaire
FROM
employe
WHERE
poste = ( SELECT
poste
FROM
employe
WHERE
nom = 'cabana' )
OR salaire > ( SELECT
salaire
FROM
employe
WHERE
nom= 'cabana' );
12
Exemple
![Page 13: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/13.jpg)
Trouver la liste des employés de Calgary qui ont un salaire plus élevé que celui de Bergeron.
Solution #1: SELECT imbriqués avec jonction de table
SELECT nom, poste, salaire
FROM employe, departement
WHERE employe.id_departement = departement.id AND
ville = 'Calgary‘ AND salaire > ( SELECT
salaire FROM
employe WHERE
nom = 'Bergeron' );
Solution #2: triple SELECT imbriqués
SELECT nom, poste, salaire
FROM employe
WHERE id_departement IN ( SELECT id FROM departement
WHERE ville = 'Calgary' ) AND salaire > ( SELECT salaire FROM employe WHERE nom = 'Bergeron' );
13
Les sous-requêtesexemple #2
![Page 14: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/14.jpg)
Exemple :◦ Produire la liste des plus anciens
employés.
SELECT
nom
FROM
employe
WHERE
date_embauche = ( SELECT
MIN(date_embauche)
FROM
employe );
14
Sous-requêtes et fonctions de groupe
![Page 15: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/15.jpg)
Les requêtes peuvent être classées selon le nombre de rangées qu'elles retournent.◦ 1 - les requêtes qui retournent 0 ou 1 rangée.◦ 2 - les requêtes qui retournent plus qu'une rangée.
Certains opérateurs ( =,>,<,... ) exigent qu'une sous-requête soit du premier type.
Exemple:◦ Trouver la liste des employés qui ont le même
salaire que Cabana.
SELECT
nom
FROM
employe
WHERE salaire = ( SELECT // Comparaison de 1ier type
salaire
FROM
employe
WHERE
nom= 'Cabana' );
15
Types de requêtes
![Page 16: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/16.jpg)
On peut comparer des listes d’expressions.
Exemple :◦ Trouver la liste des employés qui
ont le même salaire et qui sont du même département que Cabana:
SELECT nom
FROMemploye
WHERE ( salaire, id_departement) = ( SELECT
salaire, id_departement FROM
employe WHERE
nom = 'Cabana' );
16
Liste d’expressions
![Page 17: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/17.jpg)
Les 2 listes doivent avoir :◦le même nombre
d’expressions◦les expressions doivent être
de même type
17
Liste d’expressions
![Page 18: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/18.jpg)
Certains opérateurs acceptent des sous-requêtes qui retournent plusieurs rangées.
Ces opérateurs sont:◦ IN◦ ANY◦ ALL◦ EXISTS
18
Sous-requêtes de plusieurs rangées
![Page 19: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/19.jpg)
Compare une valeur à chaque valeur d'un ensemble.
Signifie "est égal à n'importe quel membre d'un ensemble
Exemple:◦ Trouver la liste des employés qui
travaillent dans un des départements situés à Québec.
SELECT nom
FROM employe
WHERE id_departement IN (SELECT
id FROM
departement WHERE
ville = 'Québec' );
19
L'opérateur IN
![Page 20: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/20.jpg)
Compare une valeur à chaque valeur d'un ensemble.
Doit être précédé de =,>,<,>= ou <=.
Exemple:◦ X > ANY (Ensemble)
retourne vrai si X est > que n'importe quelle valeur de l'ensemble.
20
L'opérateur ANY
![Page 21: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/21.jpg)
Trouvez le nom des gestionnaires qui gagnent un salaire plus petit que l’un des commis.
SELECT nom
FROM employe
WHERE poste = ‘gestion’ AND
salaire < ANY ( SELECTsalaire
FROM employe
WHERE poste =‘commis’
);
21
Exemple
![Page 22: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/22.jpg)
=ANY est équivalent à IN
X =ANY ( A , B , C )
est la même chose que
X IN ( A , B , C )
22
ANY et IN
![Page 23: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/23.jpg)
Compare une valeur à chaque valeur d'un ensemble
Doit être précédé de =,>,<,>=, ou <= Exemple:
◦ X > ALL ( ensemble) retourne vrai si X est > que
toutes les valeurs de l'ensemble.
23
L’opérateur ALL
![Page 24: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/24.jpg)
Trouvez la liste des employés qui ont été embauchés après les employés du département 20.
SELECT
nom
FROM
employe
WHERE
date_embuche > ALL ( SELECT
date_embauche
FROM
employe
WHERE
id_departement= 20 );
24
Exemple
![Page 25: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/25.jpg)
EXISTS ( Ensemble )est vrai si l'ensemble contient au moins une valeur.
NOT EXISTS ( Ensemble ) est vrai si l'ensemble est vide.
25
Opérateur EXISTS et NOT EXISTS
![Page 26: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/26.jpg)
Trouver le nom des employés du département 30, si aucun employé du département 30 ne reçoit de commission.
SELECT
nom
FROM
employe
WHERE
id_departement= 30 AND
NOT EXISTS ( SELECT
*
FROM
employe
WHERE
id_departement= 30 AND
commission IS NOT NULL );
26
Exemple
![Page 27: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/27.jpg)
Il s’agit d’une sous-requête qui fait référence à des données de la requête principale.
Exemple d’une sous-requête non corrélative:◦ Trouver les employés qui gagnent le
salaire le plus petit du département 20.
SELECT nom FROM employe WHERE salaire =
(SELECT MIN(salaire) FROM employe WHERE id_departement =
20;
27
Requête corrélative
La sous requête est exécutée une fois seulement.
![Page 28: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/28.jpg)
Exemple d’une sous-requête corrélative:
Exemple:◦ Trouver les employés qui gagnent le
plus petit salaire de leur département.
SELECT nom
FROM employe e1
WHERE salaire = (
SELECT MIN(e2.salaire)
FROM employe e2
WHERE e2.id_departement = e1.id_departement
);
28
Requête corrélative suite
La sous requête est exécutée pour chaque rangée de la requête principale.
![Page 29: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/29.jpg)
Trouvez le nom des employés qui font partie d'un département dans lequel aucun employé ne reçoit de commission.
SELECT
e1.nom
FROM
employe e1
WHERE
NOT EXISTS ( SELECT *
FROM employe e2
WHERE e2.id_departement = e1.id_departement
AND e2.commission IS NOT NULL );
NOT EXISTS doit rien retourné pour être vraie.
29
Corrélative et NOT EXISTS
![Page 30: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/30.jpg)
Certain énoncés simples peuvent être complexes à résoudre.
Exemple : ◦ quels sont les départements qui
embauchent tous les employés de l’usine?
Étape 1: Tous les employés de l’usine
SELECT Usine.id
FROM employe Usine;
30
Corrélative et opérateur
![Page 31: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/31.jpg)
Étape 2 : ◦ Est-ce que le département X embauche tous
les employés:
SELECT
‘Oui’
FROM
DUAL
WHERE
NOT EXISTS(
(SELECT Usine.id
FROM employe Usine)
MINUS
(SELECT EmpDept.id
FROM employe EmpDept
WHERE EmpDept.id = X)
);
31
Corrélative et opérateur (suite)
X n’est pas une valeur valide.
![Page 32: Requêtes complexes](https://reader035.fdocuments.net/reader035/viewer/2022062308/56813231550346895d9897cb/html5/thumbnails/32.jpg)
Dernière étape : ◦ Il faut généraliser pour tous les
départements (remplacer le X par un générateur) :
SELECT e1.id_departement
FROM employe e1
WHERE NOT EXISTS(
(SELECT Usine.id
FROM employe Usine)
MINUS
(SELECT EmpDept.id
FROM employe EmpDept
WHERE EmpDept.id = e1.id)
);
32
Corrélative et opérateur (suite)