Informatique Chapitre 5 : INITIATION AUX BASES DE DONNEES Objectifs du chapitre - Savoir prototyper et créer une base de données simple, à l'aide d'un outil interactif - Savoir traduire les questions posées dans un langage de requête, consulter une base de données à travers des requêtes de type SQL I – INTERET DES BASES DE DONNEES 1/ Les limites de l'approche fichiers Le responsable d'une bibliothèque peut être tenté de gérer les emprunts par un simple fichier sur un tableur. Les premières lignes de ce fichier peuvent ressembler à ce qui suit : On peut tout de suite relever différentes difficultés avec cette organisation : - l'orthographe des différents noms de famille peut manquer de cohérence (Le Dray ou Ledray ?) ; - même chose pour les titres des ouvrages : Mme ou Madame Bovary ? - la recopie des numéros de téléphone est fastidieuse et comporte des risques d'erreur ; - même l'entrée de la date peut poser problème (deuxième emprunt de Mme Bovary : 6 janvier 2011 ou 2010 ??). Si le fichier comporte des milliers de lignes, il devient alors délicat de retrouver les prêts de M. Castel, ou encore de chercher quels sont les ouvrages qui ont été prêtés depuis plus de 2 semaines. On dit que la structure du fichier de gestion de la bibliothèque est "plate", car elle impose une lecture séquentielle complète du tableau pour chaque interrogation. Les algorithmes de recherche simples sont alors très coûteux (en temps de calcul), ce qui les rend inopérants. En résumé : Gestion impossible ! CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -1- Informatique 2/ Solution avec une base de données (BD) et un système de gestion de base de données (SGBD) Le modèle relationnel des bases de données permet de résoudre ces problèmes d'intégrité et de cohérence des données tout en assurant l'efficacité des recherches et interrogations. Les systèmes de gestion de bases de données (SGBD) actuels permettent l'utilisation de quantités considérables de données dans des bases partagées par de multiples utilisateurs et souvent disponibles en ligne. La stratégie est la suivante : Définition d'une Base de Données (BD) : - ensemble d’informations exhaustif, non redondant, structuré, persistant ; - les informations sont disponibles pour plusieurs applications en parallèle. Définition d'un Système de gestion de Bases de Données (SGBD) : - C'est un logiciel qui permet de décrire, modifier, interroger la base de données ; - il fait l'interface entre les utilisateurs et les fichiers physiques de la base de données ; l'utilisateur dispose ainsi facilement et immédiatement de données à jour. Les SGBD sont des logiciels complexes, résultats de dizaines d’années de recherche et de développement. Ils permettent à des individus ou des programmes d’exprimer des "requêtes" pour interroger des bases de données ou pour les modifier. En TP, on se servira par exemple du logiciel libre très utilisé SQLite. Sur l'exemple de la bibliothèque, le modèle relationnel conduit par exemple à créer 5 tables au lieu d'un fichier : La table des Livres comporte une colonne identifiant le livre, puis une autre identifiant l'auteur par son numéro, et de même pour le genre. Les titres ne sont pas répétés, ce qui garantit la cohérence des données. Même principe pour la table des Auteurs. La table des Emprunts permet de trouver le numéro de l'emprunteur et celui de l'ouvrage emprunté. La date de rendu est éventuellement NULL si l'ouvrage est encore dehors. Table des emprunteurs : là encore, la non répétition des abonnés de la bibliothèque permet de garantir la cohérence des données. La table des genres complète la base de données. CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -2- Informatique 3/ Les architectures physiques des systèmes de gestion des données • Une première architecture est celle des systèmes client/serveur. La base de données est gérée sur un serveur (SGBD + fichiers physiques de la BD). L’application tourne sur une autre machine, le client. De plus en plus, cette architecture se complique avec l’introduction d’un troisième "tiers", une machine qui gère l’interface, typiquement un navigateur Web sur une tablette ou un PC portable. On a alors l'architecture trois-tiers. • Ex. d'architecture 3 tiers : BD des notes du lycée - application et serveur de BD : PRONOTE - clients avec accès à l'interface : profs, élèves, administration. • Nous pouvons noter différentes évolutions générées par des améliorations dans les matériels disponibles : – l’accroissement des performances, notamment fondées sur les mémoires vives de plus en plus vastes ; – l’utilisation de plus en plus de parallélisme massif dans des grappes de machines pour traiter d’énormes volumes de données. On parle parfois de "big data" ; – pour simplifier la gestion de données, on tend à la déporter dans les nuages (le "cloud computing"), c’est-à-dire à mettre ses données dans des grappes de machines gérées par des spécialistes. II – LE MODELE RELATIONNEL ET SON VOCABULAIRE • Un système de gestion de bases de données doit proposer un langage facilement utilisable par des êtres humains, destiné à exprimer des "requêtes". Ces exigences forment le point de départ du modèle relationnel proposé par Ted Codd, un chercheur d’IBM, dans les années 1970. 1/ Relation, attribut, n-uplet, schéma de relation • Dans le modèle relationnel, les données sont organisées en tables à deux dimensions appelées des "relations", notées R. • Ex : Un extrait de base de données relationnelles : Relations Attribut Schéma de relation N-uplet d'arité 3 = triplet dans la relation SEANCE. • Les noms des colonnes sont appelés "attributs", notés A. Par exemple : Titre. On note les attributs A1, A2, A3, A4… À chaque attribut est associé son domaine, qui est l'ensemble des valeurs qu'il peut prendre : un entier, une chaîne de caractères, etc. On note Dom(Ai) le domaine de l'attribut Ai. On note R.Ai l'ensemble des valeurs de l'attribut Ai de la relation R. Par exemple : SEANCE.Titre. • Une base de données est constituée d'un nombre fini de relations : 1 par table. On dit que la relation R suit le "schéma de relation" S = (A1, A2, A3,…). L'ensemble des schémas de relation de la base de données s'appelle le "schéma relationnel". Par exemple : (Titre, Réalisateur, Acteur) est le schéma de la relation FILM. Pour marquer cette association, on désigne cette relation par FILM(Titre, Réalisateur, Acteur). • Une ligne d'une relation est appelée "n-uplet" (tuple en anglais), noté t. Un n-uplet est noté de la façon suivante : (Casablanca, M. Curtiz, Humphrey Bogart). CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -3- Informatique C'est donc un élément de Dom(A1) × Dom(A2) × Dom(A3) ×… L'ensemble des n-uplets de la table constitue la relation. Deux n-uplets de la même relation diffèrent au moins sur un attribut. Si t est le n-uplet (Les 400 coups, F. Truffaut, J.-P. Léaud), on note t[Réalisateur, Acteur] = (F. Truffaut, J.-P. Léaud), t[Titre] = (Les 400 coups) et ainsi de suite. On peut aussi noter t.Titre = Les 400 coups. • Une base de données est constituée d’un ensemble de relations R(S), chacune associée à son schéma de relation S. 2/ Clé primaire • Pour une relation R(S), une clé est le plus petit ensemble d'attributs de R(S) qui permet de distinguer 2 n-uplets. Par exemple, Titre, Réalisateur ou (Titre, Réalisateur) ne sont pas des clés de la relation FILM(Titre, Réalisateur, Acteur). Par contre, Acteur est une clé, tant qu'on ne rajoute pas un autre film d'un des 4 acteurs ! Ex : Donner une clé pour la relation suivante : • Une clé primaire est simplement un choix d'une clé. Pour l'indiquer, on souligne les attributs correspondants dans la table. On la nomme souvent id, ce qui a été fait dans quatre des cinq tables de la base de données de la bibliothèque p.2. Pour la table Emprunts, c'est le triplet (qui, quoi, date) qui peut servir de clé primaire. • Indiquer au SGBD une clé primaire pour chaque table permet une indexation des données à l'aide de cette clé, ce qui renforce l'efficacité des procédures d'interrogation de la table. En effet, une clé primaire A permet d'identifier un nuplet t uniquement par la donnée de t.A. Grâce à cela, on pourra créer des liens entre plusieurs relations. 3/ Comment interroger une base de données ? • Les bases de données sont interrogées en utilisant comme langage le "calcul relationnel". Le calcul relationnel s’appuie sur des noms qui représentent les relations comme FILM ou SEANCE, des entrées de ces relations comme Star Wars, des variables comme ti, h, et des symboles logiques, (et), (ou), (non), (implique), (existe), (pour tout). À partir de ces ingrédients, des formules logiques, ou "requêtes", peuvent être construites telles que : {res(s, h)| ti, r ; (FILM(ti, r, "Humphrey Bogart") SEANCE(ti, s, h))} qui se lit : "Donnez-moi les résultats couples (salle s, heure h) pour lesquels il existe un titre ti et un réalisateur r tels que le n-uplet (ti, r, "Humphrey Bogart") se trouve dans la relation FILM, et le n-uplet (ti, s, h) dans SEANCE". Les variables s et h sont dites libres, car on n'impose pas leur valeur : ce sont elles que l'auteur de la requête cherche à connaître. On peut donc lire plus clairement : "Où et à quelle heure puis-je voir un film avec Humphrey Bogart ?". • En pratique, les machines utilisent le langage SQL (pour Structured Query Language) qui exprime différemment les mêmes questions. Par exemple la question précédente s’exprime en requête SQL comme : SELECT Salle, Heure FROM FILM ⋈ SEANCE WHERE FILM.Titre = SEANCE.Titre AND Acteur = "Humphrey Bogart" Que l'utilisateur de la base de données s’exprime en français ou qu’il utilise une interface graphique, le SGBD transforme sa question en requête SQL. CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -4- Informatique III – LES OPERATEURS DE L'ALGEBRE RELATIONNELLE • Alors que le calcul relationnel ou le SQL permettent de formuler une requête, l'algèbre relationnelle permet de "calculer la réponse". Afin de manipuler un ensemble de relations, on doit en effet définir des opérateurs algébriques opérant sur les relations. • Dans tous les cas, les opérandes seront des relations, ou au moins une relation ; le résultat est une relation. 1/ Les opérateurs ensembliste, adaptés au contexte relationnel : union, intersection, différence • Si deux relations ont le même schéma, alors il est possible d’appliquer un opérateur ensembliste sur ces relations. • Union : Soit le schéma de relation CE(Couleur, Etat) utilisé par un concessionnaire de voitures d'occasion. On a par exemple les 2 relations suivantes : CE1 et CE2 . Alors CE3 = CE1 CE2 donne : L'union R1 R2 de 2 relations R1(S) et R2(S) produit une relation avec les n-uplets compris dans R1 OU dans R2 (les doubles sont éliminés). • Intersection L'intersection R1 dans R2. : CE4 = CE1 CE2 donne : CE4 R2 de 2 relations R1(S) et R2(S) produit une relation avec les n-uplets présents à la fois dans R1 ET • Différence – : CE5 = CE1 – CE2 donne : CE5 La différence R1 – R2 de 2 relations R1(S) et R2(S) produit une relation avec les n-uplets de R1 qui ne sont pas présents dans R2. 2/ Les opérateurs spécifiques de l'algèbre relationnelle • Projection : Opérandes : 1 relation et un ou des attributs. Soit le schéma de relation CME(Couleur, Marque, Etat) utilisé par le concessionnaire de voitures d'occasion. CME La projection de CME selon les attributs (Couleur, Marque) donne : Couleur, Marque(CME) La projection de CME selon l'attribut (Couleur) donne : Couleur(CME) La projection Ai(R) d'une relations R(S) selon les attributs Ai donne la relation restant après conservation des colonnes des attributs Ai et suppression des n-uplets devenus identiques. CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -5- Informatique • Sélection ou Restriction : Opérandes : 1 relation et une condition. La sélection de CME selon la condition Couleur = Jaune donne : σCouleur = Jaune(CME) La sélection (ou restriction) A=a(R) d'une relations R(S) selon la condition A = a (avec a restant après suppression des n-uplets ne satisfaisant pas la condition. Dom(A)) donne la relation Rq : La condition peut aussi se présenter sous la forme d'une inégalité. Rq2 : La condition peut faire intervenir plusieurs attributs. On obtient alors une opération plus puissante : Fruits Pommes + Bananes(stock) donne : On peut ainsi vérifier l’intégrité de la relation (c’est-à-dire que le nombre de fruits correspond bien à la somme des pommes et des bananes) et voir qu'il y a une erreur dans la caisse 2. • On peut commencer à écrire des sélections composées : Dans la relation élève d'une base de données d'élèves de CPGE, on cherche la sélection complexe correspondant à la condition : "Soit le nom de l’élève est Michel mais son prénom n’est pas Jean, soit il est en PCSI 1". Cette sélection se traduit par : [ Nom = Michel(élève) - Prénom Jean(élève) ] Classe = PCSI 1(élève) • Renommage : Opérandes : 1 schéma de relation et un attribut. Il est possible, souvent pour des raisons pratiques afin de lever une ambiguïté, de renommer un attribut Ai d’une relation à l’aide d’un opérateur , dit de renommage. Les domaines du nouvel attribut Bi et de l'ancien Ai doivent être les mêmes. Le renommage Ai Bi(S) d'un schéma S donne une relation identique à la relation de départ, mis à part le schéma de relation qui a été changé pour intégrer le nouveau nom d'attribut Bi. On peut renommer plusieurs attributs en une seule opération avec A1, …, An Avec l'exemple de la relation élève(Nom, Prénom) précédente : Nom, Prénom • Produit cartésien x : Opérandes : 2 relations. Le produit cartésien de C et E B1, …, Bn(S). LastName, FirstName(élève) donne : est CE6 = C x E Le produit cartésien R1 x R2 de 2 relations R1(S) et R2(S) donne une relation avec toutes les combinaisons possibles des n-uplets de R1 et de R2. • Division cartésienne : Opérandes : 2 relations. On peut dire qu'il s'agit de l'opération inverse du produit cartésien ; elle peut être formulée de la façon suivante : CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -6- Informatique La division cartésienne R1 R2 de la relation R1(A11, A12, …, A1n) par la (sous-)relation R2(A1p+1, …, A1n) est la relation R3(A11, A12, …, A1p) formée des n-uplets qui, concaténés à chaque n-uplet de R2, donnent toujours un n-uplet de R1. Le résultat de la division est une nouvelle relation qui a les attributs non communs à R1 et R2. Par exemple : lors d'un meeting d'athlétisme, on veut savoir quel athlète a participé à toutes les épreuves. On a les relations et . Alors, QUOTIENT = PARTICIPER EPREUVES donne : Il ne peut pas y avoir Durand dans le quotient, car le couple (Durand, 200 m) n'est pas présent dans PARTICIPER. Idem pour Martin car (Martin, 400 m) ne fait pas partie de PARTICIPER. • Jointure (symétrique) ⋈ : Opérandes : 2 relations et une condition portant sur un attribut de la 1ère relation et sur un attribut de la 2nde. Prenons les schémas de relation : E(Nom, Dept, Fonction) des employés d'une entreprise : et L(Int, Lieu, NBEmp) des différentes localisations de cette entreprise en France : Alors la jointure EL = E ⋈ L(Dept = Int) donne : La jointure R1 ⋈ R2(A1i = A2j) des schémas (A11, A12, …) et (A21, A22, …) selon (A1i, A2j) donne le produit cartésien R1 x R2 suivi de l’élimination des n-uplets ne satisfaisant pas la condition (sélection) sur A1i et A2j. L'opérateur de jointure permet de "recoller" 2 relations : le résultat contient l’ensemble des n-uplets obtenus en recollant un n-uplet de R1 et un n-uplet de R2 dans le cas où les attributs sélectionnés A1i, A2j y sont identiques. Il est à noter que la présence des deux attributs A1i, A2j est redondante après jointure. On peut éliminer cette redondance avec une projection : Nom, Dept, Fonction, Lieu, NBEmp (EL) : On peut ne pas mettre de condition si 2 attributs de R1 et R2 portent déjà le même nom : Soit les relations : Alors R ⋈ S donne : (il est implicite que la jointure se fait selon (B, B)). On parle alors de jointure naturelle. • Agrégation : Opérandes : une relation et un ou plusieurs attributs. Le dernier concept (complexe !) à connaître est celui de l'agrégation. Prenons la relation suivante : CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -7- Informatique L’agrégation va permettre de regrouper les Elève d’une même Classe (ce groupe de nuplets est appelé un agrégat) et d’effectuer une opération sur chacun des agrégats. Par exemple, on peut calculer la moyenne sur chaque Classe ce qui produit la relation : Classe moyenne(Note)(relevé) : Rq : on peut grouper selon plusieurs attributs à la fois. On a utilisé ici une fonction moyenne pouvant être appliquée sur un nombre quelconque de valeurs d'un attribut, indépendamment de leur ordre. On l'appelle fonction d'agrégation f ; cinq fonctions d'agrégation sont utilisées : - comptage(A) associe à tout agrégat de n-uplets le nombre de valeurs de A ; - max(A) (resp. min(A)) associe à tout agrégat de n-uplets la plus grande (resp. la plus petite) valeur de A ; - moyenne(A) (resp. somme(A)) calcule la moyenne (resp. la somme) des valeurs de A pour chaque agrégat de n-uplets. On considère un jeu d'attributs A i, Aj d'une relation R. On regroupe les n-uplets t de R qui ont les mêmes valeurs sur les attributs Ai ; on obtient, pour chaque valeur commune t.Ai, un sous-ensemble de n-uplets. Pour chacun de ces sous-ensembles, on applique la fonction d'agrégation choisie f sur les valeurs de l'attribut Aj. Le résultat est la relation Ai f(Aj)(R). 3/ Savoir traduire dans le langage de l’algèbre relationnelle des requêtes écrites en langage courant Pour traduire une requête, on commence par les opérations les plus simples (sous-requêtes) que l’on combine ensuite pour former des opérations plus complexes. 1- Traduire les critères présents dans la requête sous forme de sélections. 2- Si nécessaire, utiliser des opérations ensemblistes pour combiner les sélections entre elles. 3- Lorsqu’une requête concerne des informations réparties dans plusieurs relations, effectuer une jointure pour les rassembler en une seule relation. 4- Lorsqu’une requête demande d’effectuer un calcul sur un ensemble de valeurs, identifier la fonction correspondante et effectuer une agrégation. 5- Utiliser des projections pour ne conserver que les informations utiles. Cet ordre convient bien pour les requêtes courantes, mais il n’est pas forcément approprié pour des requêtes complexes. IV – LE LANGAGE SQL (Structured Query Language) 1/ Implémentation d'une BD avec un SGBD : choix de SQLite • Les bases de données, par leur complexité et leur grande optimisation, nécessitent des logiciels dédiés, les SGBD. Il en existe un grand nombre : – des professionnels (puissants et payants) : Oracle, … – des systèmes développés par des organisations à buts non lucratifs (universités), mais aussi largement utilisés par le monde professionnel : PostgreSQL, MySQL, SQLite, … • Contrairement aux autres SGBD, SQLite a l'intérêt de ne pas utiliser un schéma habituel clientserveur mais d'être directement intégré aux programmes applicatifs. L'intégralité des tables de la BD est stockée dans un fichier indépendant de la plateforme ; il n'y a donc plus besoin de serveur. SQLite est actuellement le moteur de base de données le plus distribué au monde, grâce à son utilisation dans de nombreux logiciels grand public (Firefox, Skype) et dans les bibliothèques standards de nombreux langages comme PHP ou Python. De par son extrême légèreté, il est aussi employé sur les systèmes embarqués, notamment sur la plupart des smartphones modernes : l'iPhone et les systèmes d'exploitation mobiles Symbian et Android l'utilisent. CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -8- Informatique 2/ Utilisation du SGBD SQLite avec une interface graphique • Un SGBD est une boite noire : il n’y a pas besoin de savoir comment il gère effectivement les données pour l’utiliser. Au contraire, on lui délègue le travail difficile. Il n’est pas conçu pour être regardé directement par l’utilisateur : il ne contient pas d’interface graphique, tout est caché (et c’est très bien). • Respectant le modèle d'architecture 3-tiers, on l’utilise au travers d’une application, par exemple un script Python qui va demander à la base des renseignements (ou écrire de nouvelles informations, les mettre à jour, les traiter, …). Avant cela, pour administrer cette base, on utilisera comme application une interface graphique de la base, par exemple SQLite Manager, qui est un module complémentaire de Firefox. 3/ Un langage commun aux SGBD : le SQL • Le langage SQL est le langage de programmation que parlent les BD. Il permet de tout faire en ligne de commande, sans passer par l’interface graphique : définition, interrogation et modification des données. En SQL, on rencontre la dénomination suivante pour les objets manipulés : tables (= relations), colonnes (= attributs) et lignes (= n-uplets). • On peut écrire une requête SQL sur plusieurs lignes pour plus de lisibilité. Schéma relationnel en exemple : Notes(nom, prenom, cours, note) Eleves(nom, prenom, email, classe) Cours(intitule, …) 4/ Création et alimentation d'une BD Création d'une table • CREATE TABLE permet de fabriquer une table, avec la description précise de tous ses champs (type, valeur par défaut, …). Voici la requête SQL de création d'une table Notes(nom, prenom, cours, note) : CREATE TABLE Notes (nom VARCHAR (80), prenom VARCHAR (80), cours VARCHAR (80), note INT, PRIMARY KEY(nom, prenom, cours), FOREIGN KEY(nom, prenom) REFERENCES Eleves(nom, prenom), FOREIGN KEY(cours) REFERENCES Cours(intitule)); • Les types de données (pour les attributs) sont : CHAR(n), VARCHAR(n) : chaîne de caractères fixe ou variable, de longueur maximale n ; INT ou INTEGER : entiers FLOAT : réels (flottants) DATE, TIME, TIMESTAMP : "estampilles" temporelles. Rq : On évite les accents comme d'habitude. • Les clés sont définies de la manière suivante : PRIMARY KEY définit la clé primaire (1 seule par table !), FOREIGN KEY définit une clé étrangère, qui sert à relier 2 tables entre elles (ici, (nom, prénom) est une clé étrangère qui relie la table Notes et la table Eleves, cours est une clé étrangère qui relie la table Notes et la table Cours). Destruction d'une table DROP TABLE R; supprime la table R. Ajout d'une colonne ALTER TABLE R(Ai type_de_Ai); ajoute l'attribut Ai. On ne peut pas supprimer directement une colonne, il faut définir une nouvelle table. CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville -9- Informatique Renommage d'une table RENAME ancien_nom TO nouveau_nom; Alimentation d'une table • On insère un n-uplet de valeurs des attributs A1, A2, … de la manière suivante : INSERT INTO Nom_de_la_table VALUES (valeur_de_A1, valeur_de_A2, …); Rq : Le "--" permet de saisir des commentaires. Par exemple : INSERT INTO Notes VALUES ("Vador ", "Dark ", "Pilotage", 20); -- L'élève Dark Vador a eu 20/20 en pilotage • On supprime un n-uplet avec : DELETE FROM Nom_de_la_table WHERE A1 = valeur_de_A1 AND A2 = valeur_de_A2; Par exemple : DELETE FROM Notes WHERE nom = "Vador" AND prenom = "Dark"; -- supprime toutes les notes de Dark Vador Sans WHERE, toutes les lignes sont mises à jour. • On met à jour les valeurs d'une ou plusieurs colonnes avec : UPDATE Nom_de_la_table SET A1 = nouvelle_valeur_de_A1 WHERE A2 = valeur_de_A2; Par exemple : UPDATE Notes SET note = note * 1.1 WHERE cours = "SII" -- Modifie les notes de SII et met à jour la table Notes. 5/ Les requêtes d'interrogation en SQL • Le langage SQL est conçu pour pouvoir exprimer la plupart des opérateurs de l’algèbre relationnelle. Nous indiquerons ici la syntaxe de ce langage pour faire des requêtes de recherche en présentant la traduction des opérations vues précédemment. • On peut toujours désigner l'attribut Ai d'une relation R en utilisant la notation préfixée : R.Ai . Cela permet, en cas de nécessité, de distinguer des attributs qui portent le même nom dans différentes tables. Requête pour la projection • Pour effectuer la projection SELECT Ai FROM R; Ai(R), on évalue la requête : Il est possible d’obtenir l’intégralité de la relation grâce à l’utilisation du joker * à la place des attributs : SELECT * FROM R; -- Renvoie toutes les colonnes de R Par exemple, pour la relation Notes(prenom, nom, cours, note) : SELECT nom, note FROM Notes ; -- Sélectionne les noms des élèves, ainsi que leurs notes • La projection peut renvoyer des doublons. On peut éviter cela avec SELECT DISTINCT Ai FROM R;. Requête pour la sélection • En fait, la commande SELECT admet un paramètre supplémentaire WHERE permettant d’imposer une condition. La sélection A=a(R) s’écrit donc : SELECT * FROM R WHERE A = a; Par exemple en combinant avec une projection : SELECT nom, note FROM Notes WHERE note >= 10; -- Sélectionne les noms et notes des élèves qui ont eu >10 • Pour les sélections composées il est possible d’utiliser directement les opérateurs booléens dans la condition. Par exemple, la condition : "Soit le nom de l’élève est Skywalker mais son prénom n’est pas Luke, soit il est en TSI1" se traduit en : SELECT * FROM Eleves WHERE (nom = "Skywalker" AND prenom != "Luke") OR filiere = "TSI1"; CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville - 10 - Informatique • Le mot-clé LIKE permet aussi d'écrire des conditions incomplètes : … WHERE nom LIKE "S%"; sélectionnera tous les noms commençant par la lettre S. Si la valeur d'un attribut n'est pas renseignée, on dit qu'il a la valeur NULL. Cette "valeur" peut être sélectionnée avec … WHERE A IS NULL; ou à l'inverse : … WHERE A IS NOT NULL; Requêtes pour les opérations ensemblistes • Pour combiner dans un résultat unique des lignes venant d’interrogations différentes, on réalise des opérations ensemblistes. On utilise les mots-clés UNION, INTERSECT ou EXCEPT pour réaliser les opérations d’union, d’intersection et de différence. Pour rappel, les lignes doivent avoir rigoureusement le même nombre de colonnes avec des types identiques. Les noms des colonnes du résultat sont ceux du premier SELECT. Par exemple, pour effectuer R1 R2, on écrit : SELECT * FROM R1 INTERSECT SELECT * FROM R2; Renommage • Pour effectuer le renommage d’un attribut, on "décore" une projection par le mot clé AS. Si R est une relation de schéma (A1, … , An, C1, …, Cm) où l’on souhaite obtenir A1, …, An B1, …, Bn(S), on doit effectuer la requête : SELECT A1 AS B1, ..., An AS Bn, C1, ..., Cm FROM R; On voit qu'il est nécessaire d’indiquer tous les attributs. Requête de jointure • La jointure R1 ⋈ R2(A1i = A2j) s’écrit : SELECT * FROM R1 JOIN R2 ON A1i = A2j ; Là encore, il s’agit d’une extension de la commande SELECT, et on peut donc directement la combiner avec une projection (A1j à la place de *) voire une sélection (WHERE…). Requêtes avec fonctions d'agrégation • Les fonctions utilisées après agrégation se traduisent en SQL de la façon suivante : Pour calculer le résultat de la fonction f sur les valeurs de l'attribut A i de la relation R, on utilise là encore une projection spéciale : SELECT f(Ai) FROM R; • Il est possible de coupler ce calcul à une projection / sélection / renommage comme on l’a vu précédemment, par exemple : SELECT MAX(note) AS notemax FROM Eleves WHERE filiere = TSI1; -- Renommage de la note max. des élèves de la classe TSI1 ou encore avec une "sous-requête" : SELECT * FROM Eleves WHERE note >= (SELECT AVG(note) FROM Eleves); -- Elèves avec note > moy. des notes • Enfin, le regroupement avant application de la fonction d'agrégation, c'est-à-dire Ai SELECT f(Aj) FROM R GROUP BY Ai; f(Aj)(R), s'écrit avec GROUP BY : Par exemple : SELECT nom, prenom, AVG(note) FROM Notes GROUP BY nom, prenom; -- calcule la moyenne des notes de tous les cours pour chaque élève CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville - 11 - Informatique ou encore en spécifiant une condition avec HAVING (remplace WHERE, mais ne porte que sur des caractéristiques de groupe) : SELECT nom, prenom, AVG(note) FROM Notes GROUP BY nom, prenom, HAVING AVG(note) > 10; -- ne garde que les élèves qui ont une moyenne supérieure à 10 • Une requête cumulant WHERE, HAVING, GROUP BY est évaluée dans l'ordre suivant : 1 – Application de WHERE : sélectionne des lignes 2 – Application de GROUP BY : constitution des groupes 3 – Application de HAVING : sélection des groupes 4 – évaluation des fonctions d'agrégation sur les groupes constitués. Sous-requêtes • On peut bien entendu combiner les requêtes grâce aux sous-requêtes : Toujours avec le schéma Notes(nom, prenom, cours, note) et Eleves (nom, prenom, email, classe) : SELECT nom FROM Eleves WHERE nom IN (SELECT nom FROM Notes); -- Combine 2 requêtes pour avoir le nom des élèves qui ont une note Permet de chercher dans l'ensemble de lignes renvoyé par la sous-requête. 6/ Savoir traduire une question dans le langage de requête SQL en respectant sa syntaxe • Le principe reste le même que pour la traduction d’une question dans le langage de l’algèbre relationnelle : construire la requête en commençant par les opérations les plus simples que l’on combine en opérations complexes. La construction de requêtes élaborées est facilitée par le fait que les commandes SQL réalisent simultanément plusieurs opérations. • Les requêtes SQL ne sont pas sensibles à la casse, mais il est d’usage de mettre les mots-clés en majuscules et les attributs en minuscules. Les valeurs des attributs non numériques sont écrites entre guillemets simples ou doubles. • On note que : - toutes les requêtes commencent par le mot-clé SELECT qui effectuera une projection en fin de requête ; - la relation sur laquelle on opère est précisée par FROM ; - les requêtes SQL se terminent systématiquement par un point-virgule. - Attention au faux ami, SELECT n’effectue pas une sélection ! Sources : - Serge Abiteboul, Benjamin Nguyen, Yannick Le Bras, "Introduction aux bases de données relationnelles", 2014 - Benjamin Wack et al., "Informatique pour tous en classes préparatoires aux grandes écoles", Eyrolles, 2013 - Laurent Chéno, IG Mathématiques, Introduction aux bases de données et au langage SQL, 2013 - Sylvain Bouveret & Noha Ibrahim, "Introduction aux Systèmes de Gestion de Bases de Données", ENSIMAG 2013 - Stéphane Devismes, "Base de données", POLYTECH GRENOBLE 2013 - Python et bases de données, Formation continue SUPELEC 2013 CPGE TSI – Lycée P.-P. Riquet – St-Orens de Gameville - 12 -