Requêtes complexes

32
Requêtes complexes

description

Requêtes complexes. Opérateurs d’ensembles. Ils associent les rangées de 2 requêtes. UNION [ALL]. INTERSECT. MINUS. Opérateurs d’ensembles. 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. - PowerPoint PPT Presentation

Transcript of Requêtes complexes

Page 1: Requêtes  complexes

Requêtes complexes

Page 2: Requêtes  complexes

2

Opérateurs d’ensembles• Ils associent les rangées de 2 requêtes

UNION [ALL]

INTERSECT

MINUS

Page 3: Requêtes  complexes

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

=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

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

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

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

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

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

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

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

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

É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

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)