Objectifs Au cours de ce chapitre, vous allez apprendre à écrire des sous-interrogations multi-colonne et des sous-interrogations dans la clause FROM d'un ordre SELECT.
Sous-Interrogations Multi-colonne Jusqu'à maintenant, vous avez écrit des sous-interrogations mono-ligne et multi-ligne dans lesquelles une seule colonne était comparée via la clause WHERE ou HAVING de l'ordre SELECT principal. Si vous voulez comparer plusieurs colonnes, vous devez écrire une clause WHERE composée utilisant des opérateurs logiques. Les sous-interrogations multi-colonne vous permettent de combiner plusieurs conditions WHERE dans une même clause WHERE. Syntaxe SELECT column, column , ... FROM table WHERE ( column, column , ...) IN (SELECT column, column , ... FROM table WHERE condition );
Utilisation des Sous-Interrogations Multi-colonne La sous-interrogation ci-dessus, qui ramène plusieurs colonnes, est un exemple de sous-interrogation multi-colonne. Elle compare la colonne SAL et la colonne COMM. Elle affiche le nom, le numéro de département, le salaire et la commission de tout employé dont le salaire et la commission correspondent à la fois aux salaire et commission d'un des employés du département 30. L'ordre SQL ci-dessus donnera les résultats suivants : ENAME DEPTNO SAL COMM ---------- --------- --------- --------- JAMES 30 950 WARD 30 1250 500 MARTIN 30 1250 1400 TURNER 30 1500 0 ALLEN 30 1600 300 BLAKE 30 2850 6 rows selected.
Utilisation des Sous-Interrogations Multi-colonne La sous-interrogation ci-dessus, qui ramène plusieurs colonnes, est un exemple de sous-interrogation multi-colonne. Elle compare la colonne SAL et la colonne COMM. Elle affiche le nom, le numéro de département, le salaire et la commission de tout employé dont le salaire et la commission correspondent à la fois aux salaire et commission d'un des employés du département 30. L'ordre SQL ci-dessus donnera les résultats suivants : ENAME DEPTNO SAL COMM ---------- --------- --------- --------- JAMES 30 950 WARD 30 1250 500 MARTIN 30 1250 1400 TURNER 30 1500 0 ALLEN 30 1600 300 BLAKE 30 2850 6 rows selected.
Comparaisons " par Groupe de Colonnes" versus "Colonne par Colone" Dans une sous-interrogation multi-colonne, les comparaisons peuvent être effectuées "par groupe de colonnes" ou "colonne par colonne". Dans l'exemple de la diapositive précédente, la comparaison exécutée dans la clause WHERE est faite par groupe de colonnes: chaque ligne rapportée par l'ordre SELECT doit comporter à la fois le même salaire et la même commission qu'un employé du département 30. Pour effectuer une comparaison par groupe de colonnes, utilisez une clause WHERE avec seule condition faisant intervenir les différentes colonnes. Pour effectuer une comparaison colonne par colonne (produit cartésien), utilisez une clause WHERE avec de multiples conditions, chaque condition faisant intervenir une colonne.
Sous-Interrogation Effectuant une Comparaison Colonne par Colonne L'exemple ci-dessus effectue une comparaison colonne par colonne. Il affiche le nom, le numéro de département, le salaire et la commission de tout employé dont le salaire et la commission correspondent au salaire et à la commission d'un employé du département 30. L'ordre SQL ci-dessus donnera le résultat suivant : Le résultat des deux dernières requêtes est identique bien que les conditions de comparaison diffèrent. Cela s'explique par la nature des données présentes dans la table EMP. ENAME DEPTNO SAL COMM ---------- --------- --------- --------- JAMES 30 950 BLAKE 30 2850 TURNER 30 1500 0 ALLEN 30 1600 300 WARD 30 1250 500 MARTIN 30 1250 1400 6 rows selected.
Exemple Supposons que le salaire et la commission de l'employé Clark soient modifiés de telle sorte qu'il ait le même salaire qu'un employé du département 30 et la même commission qu'un autre employé du département 30. Le salaire de Clark est désormais égal à celui de Turner ($1500) et sa commission est la même que celle d'Allen ($300). Nous allons maintenant exécuter une comparaison par groupe de colonnes puis colonne par colonne pour voir combien de lignes sont ramenées dans chaque cas. Remarque : la syntaxe à utiliser pour mettre à jour les données d'une table sera traitée au cours du chapitre 9.
Sous-Interrogation avec Comparaison par Groupe de Colonnes Les résultats de la sous-interrogation avec comparaison par groupe de colonnes ne changent pas et ramènent toujours six lignes.
Sous-Interrogation avec Comparaison Colonne par Colonne Le résultat de la sous-interrogation avec comparaison colonne par colonne inclut l'employé Clark puisque maintenant, son salaire est le même que celui de Turner et sa commission identique à celle d'Allen.
Présence d'une Valeur NULL dans les Résultats d'une Sous-Interrogation L'ordre SQL ci-dessus tente d'afficher tous les employés n'ayant pas de subordonné. L'ordre SQL ne ramène aucune ligne alors que logiquement, il aurait dû en renvoyer huit. En fait, l'une des valeurs ramenées par la sous-interrogation étant une valeur NULL, la requête principale ne renvoie aucune ligne. En effet, quand dans une interrogation, on utilise un opérateur de comparaison (=,>, <,...) pour comparer une valeur à NULL, cette interrogation retourne zéro ligne. NULL ne peut être testé qu'avec les opérateurs IS NULL et IS NOT NULL. C'est pourquoi, chaque fois que les résultats d'une sous-interrogation risquent de contenir des valeurs NULL, vous ne devez pas utiliser l'opérateur NOT IN. L'opérateur NOT IN est l'équivalent de !=ALL. En revanche, la présence d'une valeur NULL dans le résultat d'une sous-interrogation ne posera pas de problème si vous utilisez l'opérateur IN. Celui-ci est l'équivalent de =ANY. Par exemple, pour afficher les employés qui ont des subordonnés, utilisez l'ordre SQL suivant : SQL> SELECT employee.ename 2 FROM emp employee 3 WHERE employee.empno IN (SELECT manager.mgr 4 FROM emp manager); ENAME ---------- KING … 6 rows selected.
Utilisation d'une Sous-Interrogation dans la Clause FROM Vous pouvez utiliser une sous-interrogation dans la clause FROM d'un ordre SELECT. Cette méthode présente de nombreuses similitudes avec le mode d'utilisation des vues. L'exemple ci-dessus affiche le nom, le salaire, le numéro de département et le salaire moyen du département pour tous les employés gagnant plus que le salaire moyen de leur département.