Algèbre : suite et fin suivi du Chapitre 6 http://www.lri.fr/~cohen/bd/bd.html Requêtes avancées en algèbre relationnelle (1/3) Q1 : Quelles sont les tailles de disques durs qui sont utilisées par au moins 2 PCs? Q2 : Quels sont les constructeurs vendant l'ordinateur le plus rapide? Ces requêtes sont difficiles à exprimer en algèbre car il faut compter (Q1) ou calculer un maximum (Q2) On a besoin de comparer des lignes, on ne sait que comparer des colonnes! 1 2 Requêtes avancées (2/3) Comparer des colonnes Produit cartésien Q1 : Quelles sont les tailles de disques durs qui sont utilisées par au moins 2 PCs? PC PC 1 x PC 2 Modèle HD (renomage) 1001 1.6 1002 1.6 1003 2.5 On peut maintenant comparer les colonnes! PC1.Modèle PC1.HD PC2.Modèle PC2.HD 1001 1.6 1001 1.6 1001 1.6 1002 1.6 1001 1.6 1003 2.5 1002 1.6 1001 1.6 1002 1.6 1002 1.6 1002 1.6 1003 2.5 1003 2.5 1001 1.6 1003 2.5 1002 1.6 1003 2.5 1003 2.5 3 Requêtes avancées (3/3) Solution : Comparer des colonnes Produit cartésien Q1 : Quelles sont les tailles de disques durs qui sont utilisées par au moins 2 PCs? PC Modèle HD πpc1.hdσ PC1.modele PC2.modele (PC 1 x PC 2) 1001 1.6 1002 1.6 1003 2.5 On peut maintenant comparer les colonnes! PC1.HD = PC2.HD PC1.Modèle PC1.HD PC2.Modèle PC2.HD 1001 1.6 1001 1.6 1001 1.6 1002 1.6 1001 1.6 1003 2.5 1002 1.6 1001 1.6 1002 1.6 1002 1.6 1002 1.6 1003 2.5 1003 2.5 1001 1.6 1003 2.5 1002 1.6 1003 2.5 1003 2.5 4
Pouvoir expressif de l algèbre relationnelle (1/2) Ce que l algèbre sait exprimer Au moins 1, au moins 2, au moins 125 (classique, projection-selection-jointure) Tous, aucun (division, différence) Exactement 1, exactement 2,.., : difficile! Mais possible le plus rapide : difficile (différence + produit cartésien) NB : Pensez à exprimer la négation de la requête et utilisez la différence Spectateurs n aimant aucun des films qu ils ont vus l ens. des spectateurs ceux qui ont aimé au moins un film 5 Pouvoir expressif de l algèbre relationnelle (2/2) Ce que l algèbre ne sait pas exprimer (SQL!) Combien? au moins n (avec n dépendant d un calcul) Groupes de valeurs NB : Certaines requêtes ne peuvent pas être exprimées en SQL non plus (données graphes) La BD est alors interfacée avec un autre langage (C, JAVA) ou bien on fait du PL/SQL 6 Chapitre 6 SQL avancé Requêtes simples SELECT * * : liste de tous les attributs σ Acteur= Adjani FILM WHERE Acteur= Adjani SELECT Titre π Titre [σ Acteur= Adjani FILM] WHERE Acteur= Adjani Sémantique formelle cas mono-relation : SELECT distinct B1... Bk FROM R π WHERE C B1 Bk [σ C R] 7 8
Requêtes classiques Renomage des attributs du schéma cible SELECT Titre AS Adjani s movies WHERE Acteur= Adjani Valeur des attributs = expression arithmétique SELECT Titre, Durée*60 AS durée-en-minutes -durée 9 Conditions de la clause WHERE Comparateurs habituels, arithmétique, concaténation ( ),... Connecteurs : OR, AND et NOT SELECT Titre WHERE Acteur= Adjani OR réalisateur= Poirier Motifs pour la recherche de chaînes de caractères % : une chaîne quelconque SELECT Titre WHERE Titre LIKE %retour% Le retour du roi, Aliens le retour, 10 Chaînes de caractères (suite) Exercice 1 Majuscules / Minuscules Pas de distinction pour les mots clés Distinction pour les valeurs des conditions Divers les motifs comme les valeurs sont écrits entre négation possible : NOT LIKE condition d intervalle : att. BETWEEN val1 AND val2 Soit le schéma suivant CLIENT (N C, NomC, AdrC, CP, Ville, Tél, CondPart) PRODUIT (N P, Description, Prix, QtéP, Ville) COMMANDE (N Comm, N C, N P, QtéC, DateC) Répondez aux requêtes suivantes (Q1) Lister la description et le prix des produits dont le prix est compris entre 500 et 1000 euros (Q2) Lister les noms et adresses des clients dont le nom commence par un D 11 12
Exercice 1 (Correction) (Q1) SELECT Description, Prix FROM Produit WHERE Prix BETWEEN 500 AND 1000 Ou bien Prix >=500 AND Prix<=1000 (Q2) SELECT NomC, AdrC FROM Client WHERE NomC LIKE 'D%' Manipulation de dates format : aaaa-mm-jj DATE 2003-11-06 BETWEEN DATE 2003-09-25 AND DATE 2004-02-15 13 14 Sémantique formelle cas multi-relation SELECT B1,..., Bk FROM R1... Bp π B1 Bk [σ C R1 x x Bp] WHERE C Les cinémas qui projettent un film dans lequel M.F. Pisier est actrice (pour chaque cinéma donner le titre du film et l horaire) SELECT Nom-Cine, FILM.Titre, Horaire, PROG WHERE FILM.titre=PROG.titre AND Acteur= M-F. Pisier π[ Nom-Cine,Titre,Horaire [σ Acteur= M-F.Pisier [FILM X PROG]] =π[ Nom-Cine,Titre,Horaire [σ Acteur= M-F.Pisier [FILM X PROG]] ^ FILM.titre=PROG.titre 15 Introduction de variables Les films et tous les acteurs dans lesquels joue M-F Pisier [π F2.Titre, F2.Acteur [σ Acteur= M-F.Pisier F1.Titre = F2.Titre [FILM 1] X [FILM 2]]] SELECT F2.Titre, F2.Acteur AS F1, FILM AS F2 -- équiv. à FILM F1, FILM F2 WHERE F1.Titre = F2.Titre AND F1.Acteur= M-F. Pisier F1 et F2 sont des copies virtuelles de FILM F1 et F2 sont des variables utilisées pour désigner n importe quel couple de n-uplets de FILM Si la table FILM n est pas dédoublée, la seule actrice retournée est MF Pisier (les autres acteurs sont «perdus» car non sélectionnés dans F1, F2 les retrouve) 16
SQL : Union, Intersection, Différence Les titres des films dans lesquels joue M-F. Pisier et qui sont à l affiche SELECT Titre WHERE Acteur= M-F. Pisier INTERSECT SELECT Titre FROM PROG Les titres des films qui ne sont pas à l affiche SELECT Titre EXCEPT SELECT Titre FROM PROG SQL : ensembles et multi-ensembles {1, 2, 1, 3} est un multi-ensemble select-from-where (par défaut ALL, multi-ens) Union, Except,Intersect (DISTINCT par défaut, ensemble simple) Toutes les personnes ayant participées au tournage du film Marion SELECT Acteur AS Personne WHERE Titre = Marion UNION SELECT réalisateur AS Personne WHERE Titre = Marion 17 Élimination des dupliqués SELECT DISTINCT Titre 18 SQL : Agrégats SUM() : somme, AVG() : moyenne, MIN() : minimum, MAX() : maximum, COUNT() : cardinalité d un multiensemble Le nombre de films dirigés par Bergman SELECT COUNT(Titre) FROM PROG WHERE réalisateur = Bergman PB : si un même film de Bergman est plusieurs fois à l affiche, il est compté plusieurs fois! Éliminer les dupliqués SELECT COUNT (DISTINCT Titre) FROM PROG WHERE réalisateur = Bergman 19 Groupement Nombre d acteurs par film SELECT Titre, COUNT (distinct Acteur) GROUP BY Titre (1) Projection, (2) regroupement, (3) calcul de l agrégat (multi-ensemble) Film, réalisateur, acteur T R A r1 a1 r1 r1 a3 t2 r4 r2 a1 r2 r2 a3 T t2 A a1 a3 a1 a3 T 3 t2 1 20
Groupement - Importance du Distinct SELECT Titre, COUNT (Acteur) -- pas de distinct GROUP BY Titre Projection, regroupement, calcul de l agrégat (multi-ensemble) Film, réalisateur, acteur T R A r1 a1 r1 r1 a3 r2 a1 r2 r2 a3 t2 r4 T t2 A a1 a3 a1 a3 T 6 t2 1 21 SQL : Groupement et agrégat Ajout d un schéma Cinephile(NomPers, Nom-Cine) SELECT NomPers, COUNT (DISTINCT Titre) FROM Cinephile, PROG WHERE Cinephile.Nom-Cine = PROG.Nom-Cine GROUP BY NomPers Distinct : Cas où plusieurs salles projettent le même film! (1) jointure naturelle de Cinephile et PROG, (2) projection, (3) regroupement, et (4) calcul de l agrégat Les personnes et le nombre de films qu ils peuvent voir Clause SELECT en présence d agrégat SELECT liste1, agg(liste2) FROM liste-relations WHERE condition GROUP BY liste1 22 SQL : la clause HAVING Les titre de films et le nombre d acteurs des films de plus de 3 acteurs SELECT Titre, COUNT (DISTINCT Acteur) GROUP BY Titre HAVING COUNT(distinct acteur) >= 3 Élimination des groupes ne satisfaisant pas la condition Les films dirigés par plus de deux metteurs en scène SELECT Titre GROUP BY Titre HAVING COUNT(distinct realisateur) > 2 Exercice 2 Soit le schéma suivant CLIENT (N C, NomC, AdrC, CP, Ville, Tél, CondPart) PRODUIT (N P, Description, Prix, QtéP, Ville) COMMANDE (N Comm, N C, N P, QtéC, DateC) Répondez aux requêtes suivantes Combien de clients habitent Paris? Quel est le prix moyen des produits? Lister toutes les paires de numéros de Clients, tels que ces 2 Clients habitent dans la même ville 23 24
Correction (Exercice 2) (Q1) Combien de clients habitent Paris? SELECT COUNT (N C) FROM Client WHERE Ville = 'Paris Ou bien SELECT COUNT (*) La table Client a une clé simple : N C Les lignes de la table Client ont toutes des N C différents Compter les N C est équivalent à compter les lignes (*) Correction (Exercice 2) (Q2) Quel est le prix moyen des produits? SELECT AVG (Prix) FROM Produit (Q3) Lister toutes les paires de numéros de Clients, tels que ces 2 Clients habitent dans la même ville SELECT c1.n C, c2.n C FROM Client c1, Client c2 WHERE c1.ville = c2.ville AND c1.n C c2.n C NB : si on veut éviter les doublons (c1, c2) et (c2, c1), on peut choisir de dire c1.n C > c2.n C ou c1.n C < c2.n C 25 26 SQL : Sous-Requêtes et Imbrication Utilisation du résultat d un Select-From-Where FILM-DEB(Titre, Acteur) stocke le titre du premier film de chaque acteur. Les acteurs du premier film joué par M-F. Pisier? SELECT Acteur WHERE Titre = (SELECT Titre -DEB WHERE Acteur= M-F. Pisier ) SELECT FILM.Acteur, FILM-DEB WHERE FILM.Titre=FILM-DEB.Titre AND FILM-DEB.Acteur= M-F. Pisier 27 SQL : Sous-requête avec l opérateur IN Les titres des films dont les réalisateurs sont acteurs (pas forcément dans le même film) SELECT Titre WHERE réalisateur IN (SELECT Acteur ) Le résultat de la sous-requête est un ensemble de n- uplets SELECT F1.Titre AS F1, FILM AS F2 WHERE F1.réalisateur = F2.acteur 28
Sous-requêtes coûteuses! Soient 2 schémas de relation R(ABC) et S(BCD) Deux façons d exprimer une jointure entre R et S (et proj. s/a) (1) SELECT A FROM R WHERE (R.B, R.C) IN (SELECT B, C FROM S) (2) SELECT A FROM R AS R1 WHERE EXISTS (SELECT S2.B, S2.C FROM S WHERE R1.B = S.B AND R1.C = S2.C ) Attention : Les sous requêtes sont coûteuses, à éviter lorsque cela est possible 29 Exercice 5 Soit le schéma suivant CLIENT (N C, NomC, AdrC, CP, Ville, Tél, CondPart) PRODUIT (N P, Description, Prix, QtéP, Ville) COMMANDE (N Comm, N C, N P, QtéC, DateC) Répondez aux requêtes suivantes Quels sont les produits plus chers que le prix moyen? Quels sont les clients (numéro de client) ayant commandé au moins 1 produit dont le prix vaut 1000 euros Quel est le produit le moins cher? 30 Exercice 5 (correction 1/3) Produits plus chers que le prix moyen? SELECT N P FROM Produit WHERE Prix > (SELECT AVG (Prix) FROM Produit) Attention : impossible de faire sans requête imbriquée! Q2 : SELECT N P FROM Produit WHERE Prix > AVG(Prix)?????? NON : Q2 est fausse : AVG(Prix) ne peut pas être dans la clause WHERE Exercice 5 (correction 2/3) Les clients (num) ayant commandé 1 produit dont le prix = 1000 SELECT N C FROM Commande, Produit WHERE Prix = 1000 AND Commande.N P = Produit. N P Ou bien (inutilement complexe) SELECT N C FROM Commande WHERE N P IN (SELECT N P FROM Produit WHERE Prix = 1000) 31 32
Exercice 5 (correction 3/3) Produit le moins cher SELECT P1.N P FROM Produit P1 WHERE Prix = (SELECT min(p2.prix) FROM Produit P2) Trouver des objets atteignant des valeurs min et max sont des cas où ils faut utiliser des requêtes imbriquées Autre version correcte : SELECT P1.N P FROM Produit P1 WHERE NOT EXISTS (SELECT * FROM Produit P2 WHERE P2.Prix < P1.Prix) On cherche les numéros de produits de P1 tel qu il n existe pas de produit p2 moins cher que p1. 33 En plus ORDER BY, LIMIT On utilise la clause ORDER BY pour trier les résultats d une requête Ordre croissant par défaut (ASC) On utilise DESC pour trier par ordre décroissant On peut alors utiliser LIMIT n (n un entier fixé) pour extraire les n premiers résultats Attention : coût important du tri! SELECT * WHERE acteur= Adjani ORDER BY titre DESC LIMIT 20; // 20 films seront renvoyés au plus 34 En plus SQL : Valeurs nulles Une valeur nulle remplace une valeur d un attribut valeur inconnue, attribut inapproprié, valeur incertaine, valeur cachée... Comparaison avec une valeur nulle vrai=1, faux=0, inconnu=1/2 : logique tri booléene! x AND y =min(x,y), x OR y =max(x,y), Not x =1-x Attention : loi du tiers exclu n est plus valide p OR (NOT p) pour p=1/2 35 En plus Jointure externe Elle est obtenue en calculant la jointure de R et S puis en y ajoutant # les n-uplets de R non joingnables avec un n-uplet de S et complétés avec des valeurs nulles $ les n-uplets de S non joingnables avec un n-uplet de R et complétés avec des valeurs nulles R S Jointure externe de R et S A B 1 2 3 4 B C 2 5 2 7 6 8 A B C 1 2 5 1 2 6 3 4 Null Null 7 8 36
Quelques syntaxes raccourcis pour les jointures SQL2 propose une variété de formes de jointures : externe, naturelle R NATURAL JOIN S correspond exactement à la jointure algébrique (deux colonnes de même nom) R CROSS JOIN S équivaut à SELECT * FROM R, S R JOIN S ON R.B = S.B équivaut à SELECT * FROM R, S WHERE R.B = S.B R OUTER JOIN S (jointure + $ et #) R RIGHT OUTER JOIN S (seul $ est effectué) R LEFT OUTER JOIN S (seul # est effectué) 37