Les 06

Vous aimerez peut-être aussi

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 28

Sous-interrogations

Objectifs

A la fin de ce chapitre, vous pourrez :


• décrire les types de problème que les
sous-interrogations permettent de résoudre
• définir des sous-interrogations
• énumérer les types de sous-interrogation
• écrire des interrogations monolignes et
multilignes
Résoudre un problème
à l'aide d'une sous-interrogation

Qui touche un salaire supérieur à celui d'Abel ?

Interrogation principale :

Quels employés touchent un salaire


? supérieur à celui d'Abel ?

Sous-interrogation :

?
Quel est le salaire d'Abel ?
Syntaxe des sous-interrogations

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

• Vous pouvez, par exemple, placer une sous-


interrogation dans les clauses suivantes :
-Clause WHERE
-Clause HAVING
-Clause FROM
-Clause SELECT
• La sous-interrogation (interrogation interne)
s'exécute une fois avant l'interrogation principale.
• L'interrogation principale (interrogation externe)
utilise le résultat de la sous-interrogation.
Utiliser une sous-interrogation

SELECT last_name
FROM employees 11000
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
Règles d'utilisation des
sous-interrogations

• Placez les sous-interrogations entre parenthèses.


• Placez les sous-interrogations dans la partie droite
de la condition de comparaison.
• Utilisez des opérateurs monolignes dans les
sous-interrogations monolignes et des opérateurs
multilignes dans les sous-interrogations
multilignes.
Types de sous-interrogation

• Sous-interrogation monoligne
Interrogation
principale
Sous- renvoie
interrogation ST_CLERK

• Sous-interrogation multiligne
Interrogation
principale
Sous- renvoie ST_CLERK
interrogation SA_MAN
Sous-interrogations monolignes

• Renvoient une seule ligne


• Utilisent des opérateurs de comparaison monolignes
Opérateur Signification

= Egal à

> Supérieur à

>= Supérieur ou égal à

< Inférieur à

<= Inférieur ou égal à

<> Différent de
Exécuter des sous-interrogations
monolignes
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = ST_CLERK
(SELECT job_id
FROM employees
WHERE employee_id = 141)
AND salary > 2600
(SELECT salary
FROM employees
WHERE employee_id = 143);
Utiliser des fonctions de groupe dans une
sous-interrogation
SELECT last_name, job_id, salary
FROM employees 2500
WHERE salary =
(SELECT MIN(salary)
FROM employees);
Clause HAVING et sous-interrogations

SELECT department_id, MIN(salary)


FROM employees
GROUP BY department_id
2500
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
Erreurs dans les sous-interrogations

SELECT employee_id, last_name


FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);

ERROR at line 4:
ORA-01427: single-row subquery returns more than
one row
Problèmes liés aux sous-interrogations

SELECT last_name, job_id


FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');

no rows selected
Sous-interrogations multilignes

• Renvoient plusieurs lignes


• Utilisent des opérateurs de comparaison multilignes

Opérateur Signification

IN Egal à n'importe quel membre de la liste

ANY Compare la valeur à chaque valeur


renvoyée par la sous-interrogation

Compare la valeur à toutes les valeurs


ALL
renvoyées par la sous-interrogation
Utiliser l'opérateur ANY dans
les sous-interrogations multilignes

SELECT employee_id, last_name, job_id, salary


FROM employees 9000, 6000, 4200
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';


Utiliser l'opérateur ALL dans
les sous-interrogations multilignes

SELECT employee_id, last_name, job_id, salary


FROM employees
9000, 6000, 4200
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Valeurs NULL dans une
sous-interrogation

SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);

no rows selected
Requêtes imbriquées multiples

• Une sous requête peut contenir d'autres sous


requêtes imbriquées
• Ex : Ensemble des clients ayant commandé le
produit "50"

SELECT code_client, societe, contact, ville


FROM clients
WHERE code_Client IN
(SELECT code_client FROM commandes WHERE n_Commande IN
(SELECT n_Commande FROM details_commandes
WHERE ref_produit=’50’)) ;
Sous-requêtes vide, non vide

• Le prédicat EXISTS permet de tester l'existence ou


l'absence de données dans la sous-requête.
Si la sous-requête renvoie au moins une ligne le
prédicat est vrai. Dans le cas contraire le prédicat
à valeur fausse. Le prédicat EXISTS peut être
combiné avec l'opérateur de négation NOT.
• Ex : le total des stagiaires du complexe, à
condition qu'il y ait au moins une classe contenant
au moins 20 personnes :

Select count(*) from stagiaire


where exists (select id_class from stagiaire
group by id_class having count(*) 20)
Requêtes corrélées

• Une sous-requête corrélée est une sous-requête


qui s'exécute pour chaque ligne de la requête
principale et non une fois pour toute. Pour arriver
à un tel résultat, il suffit de faire varier une
condition en rappelant dans la sous-requête la
valeur d'une colonne de la requête principale.

Select sub.employee_id from employees sub


where sub.hire_date < (select sup.hire_date
from employees sup
Where sub.manager_id=sup.employee_id);
Méthode 2 auto jointure (méthode prédicative):
Select sub.employee_id from employees sub, employees sup
Where sub.manager_id=sup.employee_id
And sub.hire_date<sup.hire_date;
Méthode prédicative/ensembliste

• La méthode prédicative(jointures) :la requête


comporte une seule instruction SELECT qui traite
plusieurs tables dont la liste apparaît dans la clause
FROM.
• La méthode ensembliste réalise l’intersection de
deux ensembles et s’exprime sous forme de
requêtes imbriquées.
1er methode ensembliste:
Select last_name from employees
where department_id in (select department_id
from departments where department_name like ‘%MA%’)
2eme methode predicative:
Select last_name from employees, departments
Where employees.department_id=departments.department_id
And department_name like ‘%MA%‘
Méthode prédicative/ensembliste
• Exemple de Jointure entre trois table:
1er methode predicative:
Select last_name from employees, departments, location
Where employees.department_id=departments.department_id
And departments.location_d=locations.location_id
And city =‘torento’

2eme methode ensembliste:


Select last_name from employees
where department_id in (select department_id
from departments where location_id in (select location_id
From locations where city =‘torento’));
Remarque :
• Pour la méthode ensembliste on ne peu afficher
que les colonnes qui appartiennent à la table de la
requête extérieur alors que pour la prédicative on
peut afficher toutes les colonnes appartemant aux tables
de jointure
UNION,EXCEPT,INTERSECT

• EXCEPT et INTERSECT sont de nouveaux


opérateurs permettant de trouver des
enregistrements communs à deux jeux de
données ou de retrouver des enregistrements
figurant dans un jeu de données et pas dans
l’autre. Ces opérateurs obéissent aux mêmes
règles que UNION, les jeux d’enregistrement
doivent être de structure identique (même nombre
de colonnes, mêmes types voire même longueur).
Synthèse

Ce chapitre vous à permis d'apprendre à :


• déterminer quand une sous-interrogation peut
aider à résoudre un problème
• écrire des sous-interrogations lorsqu'une
interrogation est basée sur des valeurs inconnues
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
Présentation de l'exercice 6

Dans cet exercice, vous allez :


• créer des sous-interrogations pour interroger des
valeurs basées sur un critère inconnu,
• utiliser des sous-interrogations pour déterminer
quelles valeurs existent dans un ensemble de
données et pas dans un autre.

Vous aimerez peut-être aussi