Initiation aux bases de données et à la programmation événementielle Cours N°2 : langage d’interrogation de données. (Les requêtes statistiques et autres). Support de cours de Souheib BAARIR. Page web : pagesperso-systeme.lip6.fr/Souheib.Baarir/bdvba/support.htm E-mail : souheib.baarir@u-paris10.fr Université Paris Ouest Nanterre la Défense. 2009-2010.
SQL : requêtes statistiques Plusieurs types de requêtes : d’interrogation. de manipulation : insert, update, delete… de définition : create, alter, drop… Les requêtes statistiques SELECT [DISTINCT] liste de champs FROM liste de tables [WHERE prédicats] , fonctions d’agrégats Liste des champs servant à l’agrégation de plusieurs enregistrements [GROUP BY définition des groupes] [HAVING condition] Autre clause de restriction qui portent sur les fonctions et champs d’agrégat.
Requêtes statistiques Le calcul se fait sur les données d’un groupe de plusieurs enregistrements d’une table R0. Ces enregistrements doivent avoir un point commun : des champs qui ont la même valeur. Ils sont agrégés pour n’en faire plus qu’un qui comprend : Une partie des champs communs (éventuellement tous). Les résultats des calculs. Les enregistrements ainsi décrits forment une nouvelle table R1 (le résultat de la requête).
Les fonctions d’agrégats Syntaxe : nom_de_la_fonction (expression). Sémantique : calcule une valeur à partir des valeurs de tous les enregistrements agrégés. Les fonctions disponibles sont : Sum : somme Count : compte Avg : moyenne Min : le plus petit Max : le plus grand StDev : écart type Var : variance First : premier Last : dernier
Fonctions d’agrégats : Sum Sum : fournit la somme d’un champ Stock La quantité de tout le matériel en stock ? N° Produit désignation quantité 1 Marteau 40 2 Pelle 10 3 Truelle 5 4 Tournevis 100 SELECT Sum(quantité) FROM Stock Exp1000 155 SELECT Sum(quantité) as QG FROM Stock QG 155
Fonctions d’agrégats : Count (1/2) Count : permet de compter le nombre d’enregistrements étudiants N° étudiant Nom Prénom formation 105230 MARTIN Marie MMIA 105234 BERNARD Louis Gestion 105237 THOMAS Alice Anglais 105239 Bernard 105250 MARIE Philippe 105211 Mounier Quel est le nombre d’étudiants par formation ? SELECT formation, count ([N° étudiant]) as Nombre FROM étudiant Group by formation formation Nombre MMIA 1 Gestion 3 Anglais 2
Fonctions d’agrégats : Count (2/2) Quelles sont les formations de étudiants N° étudiant Nom Prénom formation 105230 MARTIN Marie MMIA 105234 BERNARD Louis Gestion 105237 THOMAS Alice Anglais 105239 Bernard 105250 MARIE Philippe 105211 Mounier Quelles sont les formations de Plus de 2 étudiants? SELECT formation, count([N° étudiant]) as Nombre FROM étudiant Group by formation Having count([N° étudiant]) > 2 formation Nombre Gestion 3
Important ! Tous les champs sur lesquels on fait la projection (clause Select) doivent servir dans la clause d’agrégat (clause Group By). Mais, un champ peut figurer dans la clause d’agrégat sans servir à la projection. De même, les champs utilisés dans la restriction Where peuvent ne pas servir à la projection.
Exemples SELECT formation, count([N° étudiant]) FROM étudiant Group by formation Having count([N° étudiant]) >2 formation formation SELECT formation, prénom, count([N° étudiant]) FROM étudiant Group by formation Having count([N° étudiant]) >2 formation prénom formation SELECT formation, prénom, count([N° étudiant]) FROM étudiant Group by formation, prénom Having count([N° étudiant]) >2 formation, prénom formation, prénom SELECT formation, count([N° étudiant]) FROM étudiant Group by formation, prénom Having count([N° étudiant]) >2 formation formation prénom
SQL : les tris Plusieurs types de requêtes : d’interrogation. de manipulation : insert, update, delete… de définition : create, alter, drop… SELECT [DISTINCT] liste de champs FROM liste de tables [WHERE prédicats] , fonctions d’agrégats [GROUP BY définition des groupes] [HAVING condition] [ORDER BY liste de champs]
Quelles sont les formations triées par ordre alphabétique? Les tris : exemple 1 étudiants N° étudiant Nom Prénom formation 105230 MARTIN Marie MMIA 105234 BERNARD Louis Gestion 105237 THOMAS Alice Anglais 105239 Bernard 105250 MARIE Philippe 105211 MOUNIER Quelles sont les formations triées par ordre alphabétique? SELECT formation FROM étudiant Order By formation Formation Anglais Gestion MMIA Formation Anglais Gestion MMIA SELECT Distinct formation FROM étudiant Order By formation
Quelles sont les formations triées par ordre alphabétique Les tris : exemple 2 étudiants N° étudiant Nom Prénom formation 105230 MARTIN Marie MMIA 105234 BERNARD Louis Gestion 105237 THOMAS Alice Anglais 105239 Bernard 105250 MARIE Philippe 105211 MOUNIER Quelles sont les formations triées par ordre alphabétique inversé? Formation MMIA Gestion Anglais SELECT formation FROM étudiant Order By formation DESC
Exercice : base de données Cinéma Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée, refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) codeC codeR codeF refR refC codeA refF refA
Qui joue dans « mission impossible » ? BD Cinéma : Qui joue dans « mission impossible » ? Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée,refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) SELECT Acteurs.nom,Acteurs.prénom FROM Films INNER JOIN (Acteurs INNER JOIN Joue ON Acteur.codeA =Joue.refA) ON Films.codeF=Joue.refF WHERE films.titre= "Mission impossible"
Combien de films a réalisé « Spielberg » ? BD Cinéma : Combien de films a réalisé « Spielberg » ? Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée,refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) SELECT count(codeF) as Nombre FROM Réalisateurs INNER JOIN Films ON Films.refR=Réalisateurs.codeR WHERE Réalisateurs.nom= "Spielberg"
Combien de films de chaque catégorie a réalisé « Spielberg » ? BD Cinéma : Combien de films de chaque catégorie a réalisé « Spielberg » ? Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée,refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) SELECT Catégorie.intitulé,count(codeF) as Nombre FROM Réalisateurs INNER JOIN (Films INNER JOIN Catégories ON Films.refC= Catégories.codeC) ON Films.refR=Réalisateurs.codeR WHERE Réalisateurs.nom= "Spielberg" Groupe By Catégorie.codeC, Catégorie.intitulé
Quels sont les réalisateurs dont le nom commence par « Spiel »? BD Cinéma : Quels sont les réalisateurs dont le nom commence par « Spiel »? Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée,refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) SELECT Réalisateurs.nom FROM Réalisateurs WHERE Réalisateurs.nom LIKE "Spiel*" LIKE : compare deux expression avec des joker. * : Joker qui signifie une chaine de n’importe quelle taille. ? : Joker qui signifie un seul caractère.
Quels sont les films de durée entre 90 et 120 minutes? BD Cinéma : Quels sont les films de durée entre 90 et 120 minutes? Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée,refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) SELECT Films.titre FROM Films WHERE Filmes.durée >= 90 AND Filmes.durée <=120 SELECT Films.titre FROM Films WHERE Filmes.durée BETWEEN 90 AND 120
Quels sont les films dont la catégorie n’est pas renseignée? BD Cinéma : Quels sont les films dont la catégorie n’est pas renseignée? Catégories(codeC,intitulé) Réalisateurs(codeR,nom,prénom,nationalité) Films(codeF,titre,durée,refR,refC) Acteurs(codeA,nom,prénom) Joue(refF,refA) SELECT Films.titre FROM Films WHERE ISNULL(Filmes.refC) ISNULL : est une fonction qui teste le renseignement d’une valeur dans un champ.
SQL : sous-requêtes Plusieurs types de requêtes : d’interrogation. de manipulation : insert, update, delete… de définition : create, alter, drop… Les sous-requêtes SELECT [DISTINCT] liste de champs FROM liste de tables [WHERE prédicats] , (SELECT…. ) exp op ANY (SELECT...) exp op ALL (SELECT...) exp IN (SELECT...) exp NOT IN (SELECT...) …
Quelle est la formation ayant la le plus grand nombre d’étudiants ? Exemple étudiants N° étudiant Nom Prénom formation 105230 MARTIN Marie MMIA 105234 BERNARD Louis Gestion 105237 THOMAS Alice Anglais 105239 Bernard 105250 MARIE Philippe 105211 Mounier Quelle est la formation ayant la le plus grand nombre d’étudiants ? nb 1 3 2 maximum 3 SELECT formation FROM étudiant GROUP BY formation HAVING count(N° étudiant) = ( ) SELECT max(nb) as maximum FROM ( ) SELECT count(N° étudiant) as nb FROM étudiant GROUP BY formation formation Gestion