Chapitre 6 Les sous-requêtes



Documents pareils
Le Langage SQL version Oracle

Optimisation SQL. Quelques règles de bases

Le langage SQL Rappels

INTRODUCTION AU DATA MINING

Langage SQL : créer et interroger une base

Bases de données cours 4 Construction de requêtes en SQL. Catalin Dima

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Support de cours «SGBD»

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

Cours 4 : Agrégats et GROUP BY

Introduction au Système de Gestion de Base de Données et aux Base de Données

Le Langage De Description De Données(LDD)

16H Cours / 18H TD / 20H TP

TP Bases de données réparties

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

1 Introduction et installation

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Cours 4. Gestion de la performance. DBA - Maîtrise ASR - Université Evry

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

Les bases de données

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

1 Modélisation d une base de données pour une société de bourse

Évaluation et optimisation de requêtes

Bases de données avancées Introduction

données en connaissance et en actions?

1 Introduction. 2 Le modèle relationnel. 3 Algèbre relationnelle 4 SQL. 5 Organisation physique des données 1/228

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Bases de données relationnelles

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Bases de Données. Plan

Systèmes de Gestion de Bases de Données

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

Créer le schéma relationnel d une base de données ACCESS

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

TP 8: LES OPERATEURS ENSEMBLISTES

SQL Server et Active Directory

Plan de formation : Certification OCA Oracle 11g. Les administrateurs de base de données (DBA) Oracle gèrent les systèmes informatiques

TD n 10 : Ma première Base de Données

FileMaker 13. Guide de référence SQL

Bases de données réparties: Fragmentation et allocation

A QUOI SERVENT LES BASES DE DONNÉES?

Vincent Augusto

Les bases fondamentales du langage Transact SQL

2 Serveurs OLAP et introduction au Data Mining

Auto-évaluation SQL. Document: f0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

Cours SQL. Base du langage SQL et des bases de données

Business Intelligence

Cours: Les Jointures 1

Base de données relationnelle et requêtes SQL

CORRIGE LES NOMBRES DECIMAUX RELATIFS. «Réfléchir avant d agir!»

Information utiles. webpage : Google+ : digiusto/

COURS SQL. SQL*Plus PL/SQL

1. Base de données SQLite

Oracle Décisionnel : Modèle OLAP et Vue matérialisée D BILEK

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Université de Nice Sophia-Antipolis. Langage SQL. version 5.7 du polycopié. Richard Grin

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Introduction : présentation de la Business Intelligence

Systèmes d informations nouvelles générations. Répartition, Parallèlisation, hétérogénéité dans les SGBD. Exemple d application d un futur proche

INTRODUCTION : Données structurées et accès simplifié

Oracle : SQL. Denis Roegel roegel@loria.fr IUT Nancy / Introduction 2

TP Contraintes - Triggers

Bases de Données relationnelles et leurs systèmes de Gestion

Partie 1. Fonctions plus complexes dans Excel. Fonctions Si(), Et(), Ou() et fonctions imbriquées. Opérateurs logiques. I.1.

Mysql avec EasyPhp. 1 er mars 2006

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Bases de données et sites WEB

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

Résolution de systèmes linéaires par des méthodes directes

TP2_1 DE BUSINESS INTELLIGENCE ISIMA ZZ3 F3

Partie II Cours 3 (suite) : Sécurité de bases de données

Business Intelligence avec Excel, Power BI et Office 365

Bases de données. Mihaela Mathieu

Chapitre Introduction : Notion de Bases de données. 2. Définition : BD Répartie. 3. Architecture des SGBD. 4. Conception des bases réparties

Du 10 Fév. au 14 Mars 2014

Construction d un EDD avec SQL 2008 R2. D. Ploix - M2 Miage - EDD - Création

Faculté des sciences de gestion et sciences économiques BASE DE DONNEES

Introduction aux Bases de Données 2004/2005

SQL Historique

Utiliser Access ou Excel pour gérer vos données

Excel avancé. Frédéric Gava (MCF)

Mise à jour du STAN S31 au logiciel R6F

Cours Bases de données 2ème année IUT

SQL Server 2012 Implémentation d'une solution de Business Intelligence (Sql Server, Analysis Services...)

Gestion des utilisateurs et de leurs droits

... /5. Bases de Données I (J. Wijsen) 23 janvier 2009 NOM + PRENOM : Orientation + Année : Cet examen contient 11 questions.

Dossier I Découverte de Base d Open Office

La présente publication est protégée par les droits d auteur. Tous droits réservés.

Transcription:

Chapitre 6 Les sous-requêtes Une caractéristique très puissante SQL est la possibilité d imbriquer une requête SQL (SELECT) dans une autre. En effet, nous pouvons utiliser le résultat d une requête pour formuler une condition que l on utilise dans une autre requête dite requête principale. Supposons qu on veuille afficher les noms s employés qui sont mieux payés que ALLEN. Pour résoudre ce problème nous avons besoin ux requêtes ; la première est dite sous-requête et servira à extraire le salaire ALLEN. La uxième est dite requête principale et servira à extraire les noms s employés en question en utilisant le résultat la sous-requête. Il existe ux grans familles sous-requêtes ; les sous-requêtes corrélées (synchronisées, ou encore dites dépendantes). L exécution ce type requêtes dépend la requête principale d où la corrélation. Ce type requêtes est complexe, il sera traité dans une section ultérieure (don t worry). La uxième famille est celle s sous-requêtes non corrélées, et dont ne dépend pas celle la requête principale. La sous-requête est alors exécutée la première, son résultat est utilisé séparément pour la requête principale. 6.1 Les sous-requêtes simples (non corrélées) Une sous-requête simple peut être incluse dans les clauses : - WHERE - HAVING - FROM. Dans le cas où elle est incluse dans les ux premières clauses, le résultat la sous-requête est utilisé comme étant un critère recherche. Utilisée dans la 3 ème clause, la sous-requête retourne une relation (table virtuelle) à partir laquelle on pourrait extraire nos données. Lorsque la sousrequête est utilisée dans les ux premières clauses, la requête principale a la forme suivante : SELECT colonne(s) FROM table WHERE exp OPERATEUR (SELECT colonne FROM table) ; Il est évint qu il doit y avoir une certaine cohérence entre l expression exp qu on a besoin comparer (expression recherche, généralement une colonne), l opérateur comparaison OPERATEUR et le résultat la sous-requête. En d autres termes, la condition la clause WHERE doit être construite logiquement (on ne peut pas comparer une colonne à une liste valeurs si l opérateur est =). Une sous-requête simple retourne une relation à une seule ligne ou à plusieurs lignes. La famille s sous-requêtes simples peut être alors divisée en ux sous-familles, les sous-requêtes produisant une seule ligne et les sous-requêtes produisant plusieurs lignes.

28 6.1.1 Les sous-requêtes produisant une seule ligne Ce type sous-requête produit une relation à une seule ligne. L opérateur comparaison OPERATEUR est alors un opérateur comparaison classique (=,>,,<,,!=). REQ 45 Afficher les noms et les salaires s employés mieux payés que ALLEN? SELECT ENAME, SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME= ALLEN ) ; Ici, nous avons besoin d une seule valeur, le salaire Mr ALLEN. Imaginez que la sousrequête retourne plusieurs lignes (plusieurs salaires). Dans ce cas la comparaison n aura aucun sens et la requête principale retourne une erreur. REQ 46 Afficher l employé le moins payé dans l entreprise? SELECT * FROM EMP WHERE SAL=(SELECT MIN(SAL) FROM EMP) ; Il faut savoir qu on peut comparer par couples valeurs (plus généralement un uplet valeurs). Dans ce cas, la sous-requête est autorisée à produire une relation à une seule ligne et à plusieurs colonnes, on ne peut utiliser que les opérateurs = ou!=. REQ 47 Afficher les employés ayant le même job et département que MARTIN? SELECT ENAME, JOB, DEPTNO FROM EMP WHERE (DEPTNO,JOB)=(SELECT DEPTNO, JOB FROM EMP WHERE ENAME= MARTIN ) ; 6.1.2 Les sous-requêtes produisant plusieurs lignes Ce type sous-requête doit être utilisé avec les opérateurs convenables. Ces opérateurs sont : - IN suivie d une liste valeurs, la condition est vraie si notre exp est égale à l une s valeurs la liste. - op ANY suivie d une liste valeurs, la condition est vraie si la comparaison (en utilisant l opérateur op) est vraie pour n importe quelle valeur la liste. - op ALL suivie d une liste valeurs, la condition est vraie si la comparaison (en utilisant l opérateur op) est vraie pour chaque valeur la liste. (Ici, op est un opérateur comparaison classique).

29 REQ 48 Afficher les employés les moins payés pour chaque département? SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO) ; ENAME SAL DEPTNO SMITH 800 20 JAMES 950 30 MILLER 1300 10 Maintenant, supposons que l employé ADAMS qui travaille dans le département 20 a le salaire 1300 au lieu 1100. ADAMS sera affiché, car son salaire figure parmi les valeurs que retourne la sous-requête. Cette solution présente donc une faille, elle affichera tous les employés dont le salaire est 1300, et non seulement les employés du département 10 et dont le salaire est 1300 ( même pour les valeurs 950 et 800). La bonne solution doit prendre en compte le DEPTNO dans la comparaison. REQ 49 Afficher les employés les moins payés pour chaque département? SELECT ENAME, SAL, DEPTNO FROM EMP WHERE (SAL,DEPTNO) IN (SELECT MIN(SAL),DEPTNO FROM EMP GROUP BY DEPTNO) ; Les opérateurs ANY et ALL peuvent être utilisés avec tous les opérateurs comparaison classiques si on veut comparer une colonne à plusieurs valeurs. La requête aura la forme suivante : SELECT colonne(s) FROM table WHERE exp OPERATEUR_CLASSIC ANY/ALL (SELECT colonne REQ 50 FROM table) ; Afficher les employés qui sont mieux payés que tous les employés du département 30? SELECT ENAME, SAL FROM EMP WHERE SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO=30) ; On peut aussi comparer une liste colonnes (uplet colonnes) au résultat d une sousrequête ramenant plusieurs colonnes et plusieurs lignes. La requête aura la forme suivante : SELECT colonne(s) FROM table

30 WHERE (exp 1,exp 2,,exp n ) OPERATEUR_CLASSIC ANY/ALL (SELECT exp 1,exp 2,,exp n FROM table) ; Dans ce cas, l opérateur classique ne peut être que = et!=. Il faut noter que : - = ANY IN -!= ALL NOT IN - = ALL et!= ANY n on aucun sens. Une ligne et une colonne Une ligne et plusieurs colonnes Plusieurs lignes et une colonne =,!=,>,,<, =,!= Plusieurs lignes et plusieurs colonnes [NOT] IN [NOT] IN (=,!=,>,,<, ) ANY/ALL = ANY ;!=ALL Récapitulatif s sous-requêtes simples : Opérateurs utilisés selon le nombre colonnes et lignes retournées REQ 51 Afficher les départements ayant une moyenne salaires supérieure à celle du département 30? SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>(SELECT AVG(SAL) FROM EMP REQ 52 WHERE DEPTNO=30) ; Afficher le job ayant la plus gran moyenne salaires? SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL)=(SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB) ; Il est à noter qu on ne peut pas trier une sous-requête. On ne peut utiliser la clause ORDER BY qu à la fin la requête principale pour trier le résultat final. 6.2 Les sous-requêtes corrélées (synchronisées) Une sous-requête corrélée est une sous-requête dont l évaluation se fait pour chaque ligne la requête principale. Supposons qu on veut afficher les employés dont le salaire est supérieur à la moyenne s salaires leurs départements. La condition la clause WHERE doit être

31 spécifique à chaque employé, dans la mesure ou chaque employé a un département, et chaque département a une moyenne salaires différente. REQ 53 Afficher les employés dont le salaire est supérieur à la moyenne salaires dans leurs départements? SELECT * FROM EMP E WHERE SAL>(SELECT AVG(SAL) FROM EMP WHERE E.DEPTNO=DEPTNO) ; L exécution cette requête se produit ainsi : 1- La requête principale fixe une ligne la table EMP. 2- Ayant E.DEPTNO, la sous-requête est évaluée. 3- La condition la clause WHERE la requête principale est évaluée, la ligne est retournée ou non suivant la valeur la condition. 4- Itération s étapes 1, 2 et 3 pour les lignes restantes la table EMP. 6.3 L opérateur EXISTS L opérateur EXISTS est généralement suivi d une sous-requête corrélée. Cet opérateur prend la valeur VRAI si la sous-requête ramène au moins une ligne, et la valeur FAUX si la sous-requête ne ramène aucune ligne. Dans le cas où cet opérateur est suivi d une sous-requête simple, il y aura exécution celle-ci et dès qu elle ramène une ligne EXISTS prend la valeur VRAI et la requête principale affiche toutes les lignes. Si la sous-requête ne ramène aucune ligne, alors la requête principale ne retourne aucune ligne. Il en découle l inutilité d une sous-requête simple venant après l opérateur EXISTS, car dans ce cas il y aura affichage toute les lignes (si EXISTS est VRAI) ou d aucune (si EXISTS est FAUX). REQ 54 Afficher les employés qui dirigent au moins un autre employé? SELECT * FROM EMP M WHERE EXISTS (SELECT * FROM EMP E WHERE M.EMPNO=E.MGR); Ici, pour chaque employé la table EMP, la sous-requête est exécutée. Pour SMITH, la sous-requête (SELECT * FROM EMP WHERE MGR=7369 ) ne retourne aucune ligne, EXISTS prend la valeur FAUX et notre employé ne sera pas affiché. Il faut noter qu en général dans la sous-requête, la clause SELECT peut contenir n importe quelle colonne, expression, fonction ou même littéral (constante) car ce qui importe pour notre opérateur, c est le nombre lignes retournées (0 ou au moins 1).

32 La requête précénte peut être réalisée par la jointure ou par l opérateur IN : REQ 55 SELECT DISTINCT M.EMPNO, M.ENAME, M.JOB, M.DEPTNO FROM EMP E, EMP M WHERE E.MGR=M.EMPNO ; REQ 56 SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE EMPNO IN (SELECT DISTINCT MGR FROM EMP) ; REQ 57 EMPNO ENAME JOB DEPTNO 756 JON MANAGE 20 6 769 ES BLA R MANAGE 30 8 778 KE CLA R MANAGE 10 2 778 RK SCO R ANALYS 20 8 783 TT KIN T PRESID 10 9 790 2 G FOR D ENT ANALYS T 20 Afficher les employés qui n existent dans aucun département DEPT? SELECT * FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO); Aucune ligne sélectionnée. REQ 58 Afficher les départements dans lesquelles n existe aucun employé? SELECT * FROM DEPT WHERE NOT EXISTS (SELECT * FROM EMP WHERE EMP.DEPTNO=DEPT.DEPTNO); REQ 59 Afficher les départements qui ont au moins un employé ayant un salaire supérieur à 10.000? SELECT DNAME FROM DEPT WHERE EXISTS(SELECT * FROM EMP

33 WHERE DEPTNO=DEPT.DEPTNO AND SAL>1000); 6.4 NOT EXISTS vs NOT IN Les ux opérateurs peuvent être utilisés pour résoudre la même interrogation, mais il existe une différence entre les ux. REQ 60 Afficher les employés qui ne dirigent aucun autre employé? SELECT M.EMPNO, M.ENAME FROM EMP M WHERE NOT EXISTS (SELECT * FROM EMP E WHERE E.MGR=M.EMPNO); Cette solution nous affiche huit employés dont l EMPNO ne figure pas dans la colonne MGR (ne sont donc pas s managers). REQ 61 SELECT EMPNO, ENAME FROM EMP WHERE EMPNO NOT IN (SELECT MGR FROM EMP) ; Cette solution, apparemment correcte, n affiche aucune ligne, car la sous-requête simple retourne la valeur NULL. Ecrivons la même requête en développant l opérateur NOT IN : SELECT EMPNO, ENAME FROM EMP WHERE EMPNO!=7566 AND EMPNO!=7566 AND AND EMPNO!=NULL ; Or toute expression logique comparant la valeur NULL à une colonne est mise à FAUX, et puisque les expressions logiques la clause WHERE sont connectées par s AND, alors c est toute la condition qui portera la valeur FAUX. Le problème peut être corrigé en utilisant la fonction NVL, ou en restreignant les valeurs NULL via la clause WHERE, ou tout simplement en utilisant l opérateur NOT EXISTS. 6.5 La division et le NOT EXISTS C est une opération algébrique dont on n a pas spécifié d opérateur. Il s agit diviser une relation R par une autre relation S sur les colonnes qui sont communes. Le résultat est une relation D composé par les colonnes non communes entre R et S. La division R par S sur l attribut B est la relation D définie par : D = { a R[ A]/ b S,( a, b) R } = { a R[ A]/ b S,( a, b) R } R

34 A B a1 b1 a1 b2 a2 b1 S /B B = b1 b2 D A a1 Remarquez que le produit cartésien S et D est inclus dans la relation R. Ici, D contient les a i qui sont en relation avec tous les b i S. D est alors le résultat la question suivante : Donnez les a i R qui sont en relation avec tous les b i S? Mais on peut reformuler cette question d une autre manière : Donnez chaque a i R tel qu il n existe aucun b i S qui ne soit pas en relation avec a i? Ainsi la traduction la division dans le langage SQL se fait ainsi : REQ 62 SELECT A FROM R R1 WHERE NOT EXISTS(SELECT B FROM S L exécution cette requête est la suivante : WHERE NOT EXISTS(SELECT A, B FROM R R2 WHERE R2.A=R1.A AND R2.B=S.B); Requête principale 1 ère sous-requête 2 ème sous-requête Fixer la 1 ère valeur A qui est a1. Pour retourner a1, nous sommes obligés passer à la 1 ère sous-requête pour évaluer la 1 ère clause WHERE. a1 sera retourné s il n existe aucune ligne dans cette sous-requête.

35 Requête principale 1 ère sous-requête 2 ème sous-requête Fixer la 1 ère valeur B qui est b1. Pour retourner b1, il faut que la 2 ème sous requête ne retourne aucune ligne, cette rnière est (SELECT * FROM R WHERE A=a1 AND B=b1). Celle-ci retourne une ligne. (a1,b1) b1 ne sera pas retournée. aucune ligne Fixer la 2 ème valeur B qui est b2. Pour retourner b2, il faut que la 2 ème sous requête ne retourne aucune ligne, cette rnière est (SELECT * FROM R WHERE A=a1 AND B=b2). Celle-ci retourne une ligne. (a1,b2) b1 ne sera pas retournée. aucune ligne Tous les b i sont vérifiés. Retour à la requête principale. aucune ligne

36 Requête principale 1 ère sous-requête 2 ème sous-requête NOT EXISTS est vrai pour a1 a1 Fixer le 2 ème A qui est a2 Fixer la 1 ère valeur B qui est b1.pour retourner b1, il faut que la 2 ème sous requête ne retourne aucune ligne, cette rnière est (SELECT * FROM R WHERE A=a2 AND B=b1). Celle-ci retourne une ligne. (a2,b1) b1 ne sera pas retournée. aucune ligne Fixer la 2 ème valeur B qui est b2.pour retourner b2, il faut que la 2 ème sous requête ne retourne aucune ligne, cette rnière est (SELECT * FROM R WHERE A=a2 AND B=b2). Celle-ci ne retourne aucune ligne. aucune ligne.

37 Requête principale 1 ère sous-requête 2 ème sous-requête b2 sera alors retournée b2 il existe une ligne dans la 1ère sousrequête. Donc a2 sera rejetée. final D={a1} Le même résultat peut être obtenu en utilisant le langage algébrique : R[A] MINUS ((R[A] TIMES S[B]) MINUS R[A,B])[A] La traduction en langage SQL est la suivante : REQ 63 SELECT A FROM R MINUS SELECT A FROM (SELECT R.A, S.B FROM R, S MINUS SELECT A, B FROM R) On peut aussi calculer pour chaque a i, la différence entre (tous les b i S) et (les b i avec qui il est en relation). Si cette différence donne l ensemble vi, c est que notre a i est en relation avec tous les b i S :

38 REQ 64 SELECT A FROM R R1 WHERE NOT EXISTS ( SELECT B FROM S MINUS SELECT B FROM R R2 WHERE R2.A=R1.A); Finalement, la division peut aussi se produire cette manière ; calculer le nombre bi distincts pour chaque ai et le comparer avec le nombre total bi dans S. Cette métho n est pas aussi robuste que les trois qui ont précédé car non efficace dans certaines situations. REQ 65 SELECT A FROM R GROUP BY A HEVING COUNT(DISTINCT B) = (SELECT COUNT(B) FROM S); Ou encore : REQ 66 SELECT A FROM R R1 WHERE (SELECT COUNT(DISTINCT B) FROM R R2 WHERE R2.A=R1.A)=(SELECT COUNT(B) FROM S); Soient les tables suivantes : F (NF, NOMF, VILLE) P (NP, NOMP, COULEUR, POIDS, VILLE) J (NJ, NOMJ, VILLE) FPJ (NF, NJ, NP, QTE) REQ 67 Donner les fournisseurs qui livrent toutes les pièces P? SELECT NF FROM FPJ X WHERE NOT EXISTS(SELECT NP FROM P WHERE NOT EXISTS(SELECT NF, NP FROM FPJ Y WHERE Y.NF=X.NF AND Y.NP=P.NP));