4 SQL Query - Equipe BD@LIP6
Transcription
4 SQL Query - Equipe BD@LIP6
SQL – Partie 2 Interrogation sur plusieurs tables UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 1 SQL : interrogation de BD Jointures Requêtes imbriquées Discussion UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 2 Rappel : Requêtes impliquant une table SELECT liste-colonnes FROM Table WHERE Condition; Sélectionne les colonnes précisées dans le SELECT provenant de la table précisée dans le FROM dont les lignes vérifient les conditions précisées dans le WHERE. UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 3 Produit cartésien : Requêtes impliquant plusieurs tables SELECT Atts FROM T1, T2 …, Tn WHERE Condition ; Atts liste d'attributs ∈Att(T1)*Att(T2)*…*Att(Tn) Condition contient des sous-conditions de la forme - Ti.a θTi.b ou - Ti.a θ cste où a et b sont des attributs de Ti, cste une constante et i=1..n Schéma = concaténation des attributs des Ti restreints à Atts Résultat = TOUTES les combinaisons des n-uplets de T1, …,Tn vérifiant Condition UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 4 Exemple EMP ENO E1 E2 E3 E4 E5 E6 E7 E8 ENAME TITLE J. Doe M. Smith A. Lee J. Miller B. Casey L. Chu R. Davis J. Jones Elect. Eng Analyst Mech. Eng. Programmer Analyst Elect. Eng. Mech. Eng. Analyst PAY TITLE Elect. Eng. Analyst Mech. Eng. Programmer SALARY 55000 70000 45000 60000 SELECT ENO, ENAME, EMP.TITLE, SALARY FROM EMP, PAY WHERE EMP.TITLE='Analyst' SALARY ENO ENAME EMP.TITLE E2 E2 M. Smith M. Smith Analyst Analyst 55000 70000 E2 M. Smith Analyst 45000 E2 M. Smith Analyst 60000 E5 B. Casey Analyst 55000 E5 B. Casey Analyst 70000 E5 E5 B. Casey B. Casey Analyst Analyst 45000 60000 E8 E8 E8 E8 J. Jones J. Jones J. Jones J. Jones Analyst Analyst Analyst Analyst 55000 70000 45000 60000 UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 5 Jointure SELECT liste-colonnes FROM T1, …, Tn WHERE Condition; Condition contient des sous-conditions de la forme Ti.a θ Tj.b ou Ti.a θ cste Schéma avant la projection = concaténation des attributs des différentes tables Ti Résultat avant la projection = TOUTES les combinaisons des lignes de T1, …,Ti dont on ne garde que les lignes vérifiant Condition UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 6 Jointure : remarques Un tuple de la table nomtable1 apparait dans le résultat de le jointure s'il joint avec au moins 1 tuple de nomtable2 Souvent un tuple joint avec plusieurs, d'où l'utilisation fréquente d'un DISTINCT dans le SELECT Si un attribut de même nom dans les 2 tables alors nécessité de préfixer l'attribut par le nom de la table (ou par son renommage si la table est renommée) Si oubli de la condition de jointure... produit cartésien ! Donc si k tables dans le from, en général au minimum k-1 conditions de jointure dans le WHERE UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 7 Exemples de jointure (1) Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City) Pay(Title, Salary) Works(Eno, Pno, Resp, Dur) Noms et salaire des employés ? SELECT Ename, Salary FROM Emp, Pay WHERE Emp.Title = Pay.Title Noms et titres des employés qui travaillent dans un projet pendant plus de 17 mois? SELECT Ename, Title FROM Emp, Works WHERE Dur > 17 AND Emp.Eno = Works.Eno UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 8 Exemples de jointure (2) Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City) Pay(Title, Salary) Works(Eno, Pno, Resp, Dur) Numéros et noms des projets dans lesquels a travaillé l'employé 10? SELECT Project.Pno, Pname FROM Project, Works WHERE Eno=10 AND Project.Pno = Works.Pno Noms et titres des employés qui travaillent dans un projet à Paris ? SELECT Ename, Title FROM Emp E, Works W, Project P WHERE P.City = ‘Paris’ AND E.Eno = W.Eno AND W.Pno = P.Pno UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 9 Exemple EMP ENO E1 E2 E3 E4 E5 E6 E7 E8 ENAME TITLE J. Doe M. Smith A. Lee J. Miller B. Casey L. Chu R. Davis J. Jones Elect. Eng Analyst Mech. Eng. Programmer Analyst Elect. Eng. Mech. Eng. Analyst PAY TITLE Elect. Eng. Analyst Mech. Eng. Programmer SALARY 55000 70000 45000 60000 SELECT ENO, ENAME, EMP.TITE, SALARY FROM EMP, PAY WHERE EMP.TITLE=PAY.TITLE ENO ENAME EMP.TITLE SALARY E1 E2 J. Doe M. Smith Elect. Eng. Analyst 55000 70000 E3 A. Lee Mech. Eng. 45000 E4 J. Miller Programmer 60000 E5 B. Casey E6 E7 E8 Analyst 70000 L. Chu Elect. Eng. 55000 R. Davis J. Jones Mech. Eng. Analyst 45000 70000 UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 10 Auto-jointure : un exemple Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City) Pay(Title, Salary) Works(Eno, Pno, Resp, Dur) Nom des employés originaires de la même ville? SELECT E1.Ename, E2.Ename FROM Emp E1, Emp E2 WHERE E1.City = E2.City EMP : Résultat : Eno Ename Title City 10 Pierre Analyst London 20 Lucy Engineer Paris 30 Yifan RH Munich 40 Anne RH London 50 Ryadh Analyst Paris UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) E1.Ename E2.Ename Pierre Pierre Pierre Anne Lucy Lucy Lucy Ryadh Yifan Yifan Anne Anne Anne Pierre Ryadh Ryadh Ryadh Lucy 11 Cas particulier : l'auto-jointure Auto-jointure : jointure impliquant 2 fois la même table SELECT liste-colonnes FROM T1 var1, T1 var2 WHERE conditions; Renommage des tables dans le FROM obligatoire Tous les attributs préfixés par var1 et var2 car présents dans les 2 tables T1 et T2 respectivement Attention car un enregistrement dans T1 apparait aussi dans T2 (et donc peut joindre avec lui-même suivant le prédicat de jointure) UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 12 Auto-jointure : un exemple(2) Comment améliorer ? 1ère idée Nom des employés originaires de la même ville? SELECT FROM WHERE AND E1.Ename, E2.Ename Emp E1, Emp E2 E1.City = E2.City E1.Ename <> E2.Name EMP : Eno Ename Title Résultat : City 10 Pierre Analyst London 20 Lucy Engineer Paris 30 Yifan RH Munich 40 Anne RH London 50 Ryadh Analyst Paris UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) E1.Ename E2.Ename Pierre Anne Lucy Ryadh Anne Pierre Ryadh Lucy 13 Auto-jointure : un exemple(3) Comment améliorer ? 2ème idée Nom des employés originaires de la même ville? SELECT FROM WHERE AND E1.Ename, E2.Ename Emp E1, Emp E2 E1.City = E2.City E1.Ename < E2.Name EMP : Résultat : Eno Ename Title City 10 Pierre Analyst London 20 Lucy Engineer Paris 30 Yifan RH Munich 40 Anne RH London 50 Ryadh Analyst Paris UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) E1.Ename E2.Ename Lucy Ryadh Anne Pierre 14 SQL : interrogation de BD Jointures Requêtes imbriquées Discussion UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 15 SQL : Requêtes imbriquées Requête imbriquée dans la clause WHERE d'une requête externe: SELECT … FROM … WHERE [Opérande] Opérateur (SELECT … FROM … WHERE …) 3 imbrications possibles : • (A1,…An) IN <sous-req> exprime inclusion ensembliste • EXISTS <sous-req> exprime condition d’existence • (A1,…An) <comp> [ALL|ANY] <sous-req> exprime comparaison avec quantificateur (ANY par défaut) UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 16 Expression « IN » SELECT … FROM … WHERE (A1,…,An)[NOT] IN (SELECT B1,…,Bn FROM … WHERE …) Sémantique : la condition est vraie si le n-uplet désigné par (A1,…, An)de la requête externe appartient (n’appartient pas) au résultat de la requête interne. UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 17 Exemple avec “IN” Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des employés qui habitent dans des villes où il y a des [n’y a pas de] projets de budget inférieur à 50? SELECT Ename FROM Emp WHERE City [NOT] IN (SELECT City FROM Project WHERE Budget < 50) UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 18 Imbrications avec IN : remarques La requête interne est effectuée dans un premier temps et son résultat est stocké (temporairement) en RAM (ou sur disque si trop gros!) La requête interne n'utilise pas la (les) table(s) de la requête externe Le IN étant ensembliste, les nuplets retournés par la requête interne doivent être du même format que le nuplet avant le IN (même nombre d'attributs et de même domaine, par forcément de même nom) Le SELECT de la requête externe ne peut retourner que des attributs appartenant aux tables placées dans son FROM UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 19 ALL/ANY SELECT … FROM … WHERE (A1,…,An) θ ALL/ANY (SELECT B1,…,Bn FROM … WHERE …) On peut utiliser une comparaison θ∈{=, <, <=, >, >=, <>} et ALL (∀) ou ANY (∃): La condition est alors vraie si la comparaison est vraie pour tous les n-uplets /au moins un n-uplet de la requête interne. Comment peut-on exprimer « IN » avec ALL/ANY? UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 20 Imbrications avec ANY/ALL : remarques Comme le IN : La requête interne est effectuée dans un premier temps La requête interne n'utilise pas la (les) table(s) de la requête externe les nuplets retournés par la requête interne doivent être du même format que le nuplet avant le ANY/ALL Le SELECT de la requête externe ne peut retourner que des attributs appartenant aux tables placées dans son FROM Le ANY/ALL obligatoire devant le comparateur car le SELECT interne retourne plusieurs nuplets auxquels on veut comparer 1 nuplet Alors que le IN ne couvre que l'égalité (appartenance ensembliste) le ANY/ALL permet de faire des inégalités UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 21 Exemple avec “ANY” Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des projets lyonnais de budget supérieur à (au moins) un budget de projet parisien? SELECT Pname FROM Projet WHERE City = 'Lyon' AND Budget > ANY (SELECT Budget FROM Project WHERE City='Paris') Pas possible avec un IN... mais comment faire avec une jointure ? UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 22 Exemple avec “ALL” Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des professions ayant le plus petit salaire? SELECT Title FROM Pay WHERE Salary <= ALL (SELECT Salary FROM Pay) Ici IN ou jointure impossible ! UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 23 Expression “EXISTS” Q SELECT … FROM … WHERE Q’ [NOT] EXISTS (SELECT * FROM … WHERE P) Sémantique procédurale : pour chaque n-uplet x de la requête externe Q, exécuter la requête interne Q’; s'il existe au moins un [s'il n'existe aucun] nuplet y dans le résultat de la requête interne, alors sélectionner x. Sémantique logique : { x… | Q(x) ∧ [¬]∃ y (Q’(y) } UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 24 Imbrications avec EXISTS : remarques Contrairement au IN/ANY/ALL : Les deux requêtes sont corrélées : la condition P dans la requête interne Q’ exprime une jointure entre les tables de Q’ et les tables de la requête externe Q. => la requête interne exécutée pour chaque enregistrement de la requête externe Seule l'existence d'un résultat importe d'où le * dans le SELECT de la requête interne en général... si autre attribut attention aux valeurs nulles Par contre comme le ANY/ALL : Le SELECT de la requête externe ne peut retourner que des attributs appartenant aux tables placées dans son FROM Permet des comparaisons autres que l'égalité dans l'expression de la jointure UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 25 Exemple avec “EXISTS” Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des employés qui habitent dans une ville où il y a un projet? SELECT Ename FROM Emp WHERE EXISTS (SELECT FROM WHERE * Project Emp.City=Project.City) Pour chaque employé on va vérifer si un projet est localisé dans sa ville. Si oui, EXISTS vaut vrai et on retourne le nom de l'employé Peut se faire avec une jointure, un IN ou un ANY ! UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 26 Exemple avec “EXISTS” (2) Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des employés qui habitent dans une ville sans projet? SELECT Ename FROM Emp WHERE NOT EXISTS (SELECT FROM WHERE * Project Emp.City=Project.City) Impossible avec jointure seule, possible avec un NOT IN, un ALL (ou un MINUS avec jointure dans deuxième requête)! UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 27 Exemple avec “EXISTS” (3) Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des projets ayant le plus grand budget? SELECT Pname FROM Project P1 WHERE NOT EXISTS (SELECT * FROM Project P2 WHERE P1.Budget < P2.Budget) Ne peut se faire avec jointure ou un NOT IN, mais avec un ALL ! UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 28 SQL : interrogation de BD Jointures Requêtes imbriquées Discussion UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 29 Equivalence IN/ANY, NOT IN/ALL Toute requête avec un IN peut-être écrite avec un ANY : Donner le nom des employés habitant la ville d'un ingénieur ? SELECT Ename FROM Emp WHERE City IN (SELECT City FROM Emp WHERE Title='ingénieur') SELECT Ename FROM Emp WHERE City = ANY(SELECT City FROM Emp WHERE Title='ingénieur') Toute requête avec un NOT IN peut-être écrite avec un ALL : Donner le nom des employés habitant une ville sans ingénieur ? SELECT Ename FROM Emp WHERE City NOT IN (SELECT City FROM Emp WHERE Title='ingénieur') SELECT Ename FROM Emp WHERE City <> ALL(SELECT City FROM Emp WHERE Title='ingénieur') UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 30 Equivalence ANY/EXISTS, ALL/NOT EXISTS Toute requête avec un ANY peut-être écrite avec un EXISTS : Donner les travaux durant plus qu'un travail dirigé par 'Prof' ? SELECT * FROM Work WHERE Dur > ANY (SELECT Dur FROM Work WHERE Resp='Prof') SELECT * FROM Work W1 WHERE EXISTS (SELECT * FROM Work W2 WHERE Resp='Prof' AND W1.Dur > W2.Dur) Toute requête avec un ALL peut-être écrite avec un NOT EXISTS : Donner les travaux durant plus que tous les travaux dirigés par 'Prof' ? SELECT * FROM Work WHERE Dur > ALL (SELECT Dur FROM Work WHERE Resp='Prof') SELECT * FROM Work W1 WHERE NOT EXISTS (SELECT * FROM Work W2 WHERE Resp='Prof' AND W1.Dur < W2.Dur) UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 31 Jointures vs imbrications (1) Une jointure peut-être en général ré-écrite à l'aide d'une imbrication : Avec IN, ANY ou EXISTS si la (les) condition(s) de jointure sont des égalités Avec ANY ou EXISTS si au moins une est une inégalité Une jointure ne peut pas être ré-écrite avec une imbrication si des attributs du SELECT appartiennent à la (aux) table(s) qu'on souhaite placer dans l'imbrication UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 32 Jointures vs imbrications (2) A propos de la différence : La notion de totalité (tous, aucun, personne, jamais, plus que tous, moins que tous, etc) se traduit par une différence en algèbre La différence ne peut jamais être réalisée avec seulement la jointure, éventuellement avec un MINUS et des jointures dans les 2 requêtes (donc nécessite peut-être plus de tables qu'imbrication) Tous (sauf cas division, voir prochain cours, aucun, personne, jamais... peuvent être traduit à l'aide d'un NOT IN, ALL ou NOT EXISTS Plus que tous, moins que tous (ex : plus grand, plus vieux, plus cher, etc) peuvent être traduit à l'aide d'un ALL ou d'un NOT EXISTS UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 33 Exemple de différence Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Noms des employés n'ayant jamais travaillé sur un projet? SELECT Ename FROM Emp WHERE Eno NOT IN (SELECT Eno FROM work W) SELECT Ename FROM emp E WHERE NOT EXISTS (SELECT FROM WHERE * work W E.Eno = W.Eno) SELECT Ename FROM Emp MINUS SELECT Ename FROM Emp,Work WHERE Emp.Eno=Work.Eno UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation nelles (BD-2I009) 34