INFO 2014 Fichiers et base de données Philippe Fournier-Viger Département d’informatique, U.de Moncton Bureau D216, [email protected] 1 Calendrier TP1 énoncé TP2 énoncé 2 TP2 - information Pour faire un programme qui accepte des paramètres en ligne de commande: #include <iostream> int main(int argc, char* argv[]) { cout << argv[0] << endl; return 0; } 3 La suite du cours sera basée sur: Silberschatz, Korth et Sudarshan, Database System concepts, Sixth edition, New York, McGraw-Hill, 2010. Chap. 1,2,3,4,5, 7,8,9 et 14 (principalement) 4 Les bases de données (BD) 5 Introduction Base de données (BD): un ensemble de données inter-reliées Système de gestion de base de données (SGBD): logiciel pour accéder et gérer une BD. Les SGBD sont conçus pour gérer de très grands volumes d’information. ◦ permet de définir des structures pour stocker l’information, ◦ offre des mécanismes d’accès à l’information. Un SGBD peut aussi protéger les données: ◦ accès autorisés seulement, ◦ assurer l’intégrité des données si plusieurs utilisateurs simultanés (exclusion mutuelle), ◦ autre contraintes… 6 Applications des BD Exemple: Gérer l’information d’une entreprise, de façon générale: ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ les employés, les clients, les fournisseurs, les produits, l’inventaire, la comptabilité (reçus, paiement, …), les biens de l’entreprise, et autres (ex.: le feed-back de consommateurs). 7 Applications des BD (suite) Pour des domaines plus spécifiques: Le domaine de la finance: ◦ transactions bancaires, ◦ clients, ◦ information du marché boursier mise à jour en temps réel. Les universités: ◦ information sur les étudiants, employés, cours, notes, livres, etc. Les compagnies aériennes: ◦ réservations, horaire, points boni, … Les entreprises en télécommunication: ◦ historique des appels téléphoniques, cartes prépayés, information sur le réseau téléphonique… 8 Interaction avec les BD Il y a une trentaine d’années, la plupart des gens n’interagissaient pas avec les BD. De nos jours, cela est très courant: ◦ ◦ ◦ ◦ ◦ ◦ ◦ guichets automatiques, système téléphonique intelligent, site web de réservation, site web de choix de cours, site web d’achat de produits (ex.: Amazon), site web de votre compte bancaire. publicités personnalisées sur le Web. 9 Interaction avec les BD (suite) Dans la vie quotidienne, les BD et les détails des accès aux BD ne sont généralement pas visibles à l’utilisateur. On peut remarquer l’importance des BD: ◦ les compagnies spécialisées telles qu’Oracle sont parmi les plus grandes compagnies informatique, ◦ plusieurs grandes compagnies informatiques (IBM, Microsoft…) ont des produits dans ce domaine. 10 Pourquoi des BD? Il y a quelques décennies, Les données étaient stockées dans des fichiers. Des programmes étaient développés pour gérer l’accès aux fichiers et effectuer des opération (recherche, modification…) (ex.: inscrire un nouvel étudiant dans un cours, annuler un cours…) Si de nouveaux besoins, alors de nouveaux programmes étaient développés, modifiés ou de nouveaux fichiers étaient ajoutés. produire bilan mensuel clients inventaire Imprimer les factures employés factures ajouter un client enregistrer une vente11 Utilisation de fichiers Désavantages: Le stockage des fichiers est géré par le système d’exploitation. Incohérence et redondance: avec le temps: ◦ des fichiers avec des structures différentes, ◦ plusieurs langages de programmation, ◦ dédoublement de l’information dans plusieurs fichiers (ex.: étudiant en informatique et philosophie), ◦ risques d’incohérences (ex.: adresse n’est pas mise à jour partout). 12 Utilisation de fichiers (suite) Accès difficile aux données: ◦ Les applications et structures de fichier développées ne sont pas flexibles pour de nouveaux besoins. ◦ Ex.: un logiciel pour générer la liste de tous les étudiants, mais la secrétaire n’a besoin que de la liste des étudiants du département qui ont plus de 60 crédits. ◦ Solution: faire appel à un programmeur ou faire le tri manuellement… ◦ En somme, organiser de l’information en fichiers n’est pas flexible et pratique pour l’utilisateur. 13 Utilisation de fichiers (suite) Isolation par les formats de données: ◦ Si les données sont stockées dans plusieurs fichiers ayant différents formats, il peut être très difficile de définir un programme pour extraire et manipuler l’information appropriée. ◦ Exemples: Plusieurs formats de fichier pour stocker les dossiers des étudiants dans chaque département. Plusieurs formats pour stocker l’inventaire dans différentes succursales. 14 Utilisation de fichiers (suite) Intégrité des données: ◦ Pour assurer l’intégrité des données, il est possible d’ajouter des contraintes aux programmes (ex.: dates de naissances > 1900, montant > 0 $). ◦ Toutefois, si de nouvelles contraintes, difficile de les ajouter à tous les programmes sans introduire d’erreurs. ◦ Exemples: changement de la taxe de vente, changement des conditions d’amissibilité à un programme ◦ Ceci est encore plus problématique quand les données sont réparties dans plusieurs fichiers. 15 Utilisation de fichiers (suite) Problèmes d’atomicité: ◦ Considérons un programme de transfert d’argent: Programme « transfert » Paramètres : montant, compte source, compte destination 1. Lire le montant dans le compte de banque source 2. Soustraire la somme 3. Écrire le nouveau montant dans le compte de banque destination ◦ Si une panne survient entre le retrait et le dépôt, l’argent est perdu. ◦ Les données sont alors dans un état incohérent. ◦ En utilisant des fichiers, il peut être difficile d’assurer la cohérence des données.. 16 Utilisation de fichiers (suite) Problèmes d’atomicité (suite) ◦ L’atomicité est une propriété désirable. C’est la propriété de pouvoir traiter plusieurs opérations comme un tout. En cas d’échec d’une opération, toutes les opérations sont annulées. 17 Utilisation de fichiers (suite) Anomalies causées par des accès concurrents: ◦ Plusieurs systèmes permettent aux utilisateurs de mettre à jour les données simultanément. ◦ Ex: une banque avec des milliers de clients. ◦ Ceci peut provoquer des incohérences. ◦ Exemple 18 Utilisation de fichiers (suite) Exemple: ◦ un compte avec 1000 $. Programme « retrait » Paramètres : montant, # de compte 1. Lire le montant dans le compte de banque 2. Soustraire la somme 3. Écrire le nouveau montant dans le compte de banque ◦ Deux achats quasi simultané: un de 100 $ et un de 200$. ◦ Il est possible que le montant d’argent dans le compte après les transactions soit 900 $, 800 $ ou bien 700 $..... ◦ Il faut donc un système de supervision des accès concurrents. ◦ Difficile à mettre en place quand plusieurs programmes sont utilisés. 19 Cas 1 (résultat attendu): Guichet 1 Lecture de 1000$ Compte 1000 $ Guichet 2 1000$ - 200$ = 800 $ Écriture de 800 $ 800 $ 700$ Lecture de 800$ 800$ - 100$ = 700 $ Écriture de 700 $ Cas 2 (erreur): Guichet 1 Lecture de 1000$ 1000$ - 200$ = 800 $ Écriture de 800 $ Compte 1000 $ Guichet 2 900$ 800 $ Lecture de 1000$ 1000$ - 100$ = 900 $ Écriture de 900 $ Cas 3 (erreur): Guichet 1 1000$ - 200$ = 800 $ Compte 1000 $ Guichet 2 900 $ Lecture de 1000$ 1000$ - 100$ = 900 $ Lecture de 1000$ Écriture de 900 $ Écriture de 800 $ 800$ 22 Utilisation de fichiers (suite) Problèmes de sécurité: ◦ Tous les utilisateurs ne doivent pas avoir accès à toutes les données. ◦ Exemple: dans une université, tous ne doivent pas avoir accès aux informations académiques ou au système de paie. ◦ Difficile de vérifier les contraintes de sécurité quand les accès aux données sont faits par plusieurs programmes sur des fichiers. 23 Vues sur les données Les SGBD offrent des vues abstraites aux utilisateurs pour simplifier les interactions avec le système. Raison: ◦ certains utilisateurs ne sont pas des programmeurs, ◦ pour être efficient, un SGBD peut utiliser des structures de données (ex.: B+ arbres) et mécanismes complexes, pas pertinents pour l’utilisateur final. 24 Vues sur les données (suite) Trois niveaux d’abstraction pour les données: 1. niveau physique: comment les données sont réellement stockées sur le disque. ◦ Structure de données de bas niveau, indexation… B+ arbre… 2. niveau logique: décrit quelles sont les information contenues dans la base de données et leur relations. ◦ cela est décrit avec des structures simples indépendantes de la représentation physique. ◦ les administrateurs de BD travaillent principalement à ce niveau pour décider de ce qui est stocké dans une BD. 25 Vues sur les données (suite) 3. niveau des vues: ◦ le niveau de l’utilisateur final. ◦ une vue présente seulement une partie de la BD à un utilisateur. ◦ le système peut offrir plusieurs vues de la même BD à différents utilisateurs. ◦ Les vues: permettent de faire abstraction de la variété d’information stockées dans la BD. permettent de simplifier l’interaction avec le système. servent de mécanisme de sécurité pour empêcher les accès interdits. 26 Vues sur les données (suite) Une analogie avec la programmation: ◦ niveau physique: l’information est stockée dans des cases mémoires. ◦ niveau logique: des structure de données sont définies. Ex.: Département possède nom, édifice, budget Cours possède titre, dept, crédits, session… Étudiant possède matricule, nom, adresse … ◦ niveau des vues: les utilisateurs d’un logiciel n’ont qu’une vue sur les données du logiciel. 27 Instances et schémas Instances et schémas d’une BD Instance d’une BD: les informations stockées dans la BD à un temps donné. Schéma d’une BD: la conception générale de la BD. Analogie avec la programmation: instance = valeur d’une variable, ou instance d’un objet schéma = déclaration de variable ou classe 28 Schémas Les schémas peuvent être décrits selon les trois niveaux d’abstraction (physique, logique et vues). Les administrateurs utilisent les schémas logiques pour faire la conception d’une BD. Des sous-schémas peuvent être utilisés pour décrire différentes vues sur une BD. La séparation des niveaux d’abstraction permet une indépendance des logiciels ou des utilisateurs envers la représentation physique des données. 29 Modèles de données Un autre concept important est celui de modèle de données. Le modèle de données décrit ◦ les outils conceptuels pour décrire les données, ◦ les relations, ◦ la sémantique des données, ◦ les contraintes d’intégrité. Il y a plusieurs modèles de données: 30 Modèles de données 1. Modèle relationnel: ◦ Le plus utilisé! ◦ Des tables stockent les données et les relations entre elles. ◦ Une table a plusieurs colonnes avec des noms uniques. ◦ Le modèle relationnel est basé sur le concept d’enregistrement. Une ligne dans une table = un enregistrement Une colonne = un attribut d’un enregistrement 31 Exemple: une table « étudiants » Matricule 1234567666 Nom Roy Prénom Linda Programme Administration 1234567777 1234569999 1234568888 Sauvé Pierre Sauvé Paul Marc Paul Éducation Biologie Informatique … … …. … 1234568668 Fournier Jean Informatique enregistrements champ 32 Modèles de données (suite) 2. Modèle entité-relation: ◦ Les données sont représentées en termes d’entités et de relations entre entités. ◦ Entités: un élément ou une chose du monde réel. ◦ Relations: relations entre éléments ◦ Ce modèle est souvent utilisé pour modéliser de façon informelle les liens entre les entités décrites dans une base de données, pour passer ensuite à un autre modèle de données comme le modèle relationnel. 33 durée_contrat date_embauche employé id_employé nom salaire succursale travaille travaille prix_vente id_succ adresse téléphone vend produit nom couleur description 34 Modèles de données (suite) 3. Modèle orienté-objet: ◦ Une BD orientée objet stocke des objets et leurs relations directement et permet de les récupérer. ◦ Encapsulation, méthodes, objets… 4. Modèle semi-structuré: ◦ Permet de spécifier des éléments de données pour lesquels les instances n’ont pas toujours la même structure. ◦ Ex.: les bases de données XML, RDF,... 5. Autres: graphes, spatial, temporel, etc. 35 SGBD Système de Gestion de Bases de données. Ex.: Access, MySQL, MariaDB… Le but d’un système de gestion de BD est de fournir un environnement pratique et efficient pour stocker et récupérer de l’information. De nos jours, les BD sont partout. 36 Langages de bases de données Deux types de langage: ◦ langage de manipulation de données. ◦ langage de définition de données. En pratique ces deux types de langages sont souvent combinés en un seul langage. Ex.: SQL 37 Langage de manipulation de données Langage de manipulation de données (LMD): permet aux utilisateurs de manipuler les données. Accéder, insérer, supprimer ou modifier de l’information stockée dans la BD. Un LMD permet de spécifier les données à accéder et optionnellement comment y accéder. Ex.: SQL INSERT: ajouter des enregistrement(s) DELETE: effacer des enregistrement(s) SELECT: sélectionner des enregistrement(s) 38 Langage de manipulation de données (suite) Une requête est un énoncé demandant de l’information. Un langage de requêtes permet d’exprimer des requêtes. Un processeur de requêtes est incorporé aux SGBD pour traduire les requêtes LMD en actions au niveau physique. 39 Exemples de requête SELECT nom_employés FROM table_employés WHERE salaire > 30000 AND age < 35. SELECT nom_clients FROM table_clients WHERE somme_achats > 500$ AND dernière_visite < 2011. 40 Langage de définition de données (LDD) permet de spécifier la structure de stockage des données (les schémas). permet de spécifier des contraintes sur la cohérence des données. Elles sont vérifiées par le SGBD à chaque modification de la BD. Ex.: type employé = record matricule : char(5); nom: char(20); nom_departement: char(20); salaire: numeric(8,2); end; Quatre types de contraintes note: numeric (nombre de chiffres avant et après la virgule) 41 Contraintes Contraintes de domaine: associent un domaine de valeur à chaque attribut. ◦ Ex.: l’attribut « salaire » est un entier positif. ◦ Ces contraintes sont vérifiées à chaque modification de la BD. 42 Contraintes Contraintes d’intégrité référentielle: ◦ pour s’assurer qu’une valeur qui apparaît dans une relation pour un ensemble d’attributs apparaît aussi dans un ensemble d’attribut d’une autre relation. ◦ Ex.: le code de programme présent dans un enregistrement sur un étudiant est un code de programme qui existe dans les enregistrements décrivant les programmes. 43 Contraintes (suite) Assertions: des conditions qui doivent être toujours satisfaites dans la BD. Les deux types de contraintes précédents sont des assertions, mais il en existe d’autres types. Ex.: tous les départements doivent avoir au moins 5 étudiants. Quand une assertion est créée, elle est vérifiée initialement sur la BD. Puis l’assertion est vérifiée à chaque modification. Une modification est annulée si elle contredit une assertion. 44 Contraintes (suite) Autorisations: permettent de spécifier les permissions d’accès pour chaque utilisateur ou groupe d’utilisateurs: ◦ ◦ ◦ ◦ autorisation de lecture, autorisation d’insertion, autorisation de modification (mise à jour), autorisation de suppression. 45 Langage de définition de données (suite) Les LDD sont interprétés. Ils génèrent des métadonnées qui sont stockées dans la BD (dans le dictionnaire de la BD). Ces métadonnées sont strictement utilisées par le SGBD et sont invisibles aux utilisateurs. 46 Dictionnaire de données décrit la structure employée pour stocker les données dans la base de données. les noms des champs (ex.: adresse, téléphone), le type de données que les champs contiennent (numérique, alphanumérique, date, …), la taille des champs (ex.: nombre de caractère d’un code postal). 47 Exploitation d’une bases de données Accès direct par l’utilisateur (ex.: Access) Logiciels exploitant la BD (ex.: C++, Java, C#…) Sites Web dynamiques (ex.: PHP, Servlets, JSP, ASP…) … Code PHP 48 INTRODUCTION AUX BD RELATIONNELLES 49 Introduction Des bases de données basées sur différents « modèles de données »: ◦ ◦ ◦ ◦ orienté objet, relationnelles, semi-structurées (ex.: XML), multimédia… Le type le plus répandu est le modèle relationnel. 50 Les bases de données relationnelles Structure d’une BD relationnelle: des tables représentant des données et les relations entre les données. Le modèle relationnel est populaire, car il est simple et expressif. Système de gestion de base de données relationnelles: un SGBD spécialisé pour les BD relationnelles. ◦ Ex.: MySQL (open-source, par Oracle), MariaDB, SQLServer, SQLite, IBM DB2, Oracle, Microsoft Access… 51 Les bases de données relationnelles Pour interagir avec une BD relationnelle, il faut un langage de définition de données (LDD) et un langage de manipulation de données (LMD). En général, SQL est utilisé et il rempli ces deux fonctions. Des outils d’administration visuels sont aussi souvent fournis et utilisés pour un accès simples aux BD. (ex.: MySQLAdmin, PhpMyAdmin, Access…) 52 Les tables Chaque ligne représente un enregistrement. Chaque colonne a un nom unique et représente un attribut pour décrire un enregistrement. Une ou plusieurs tables. Ex.: Table « Restos » Restaurant Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4568 Sous-marins Vitos 125-4569 Italien … … … 53 Les tables (suite) Il est important de bien concevoir le schéma d’une BD. Un schéma mal conçu peut introduire de la redondance inutile et causer d’autres problèmes. Ex.: Table « Restos » Nom_restaurant Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4568 Fast-food Vitos 125-4569 Italien … … … Table « Addresses_restos » Nom_restaurant Téléphone Addresse Pizza+ 123-4567 1 main st. … … … 54 Un autre exemple: Nom Prenom Equipe Universite Lecompte Paul Aigles U. de Moncton Boisvert Luc Aigles U. de Moncton Charles Marie Verts et or U. de Sherbrooke Lafortune Jean Tigers U. Dalhousie Boisvert Marc Verts et or U. de Sherbrooke … … … … 55 Langage de manipulation de données SQL est un langage non procédural (une requête demande une information, mais ne dit pas comment l’obtenir). Une requête SQL retourne toujours une table en résultat. Exemple de requête SQL: select Restos.nom from Restos where Téléphone =‘123-4567’ Cette requête retourne une table contenant le nom de tous les restaurants ayant le numéro de téléphone 123-4567. Table « Restos » nom Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4568 Fast-food … … … Résultat Nom Pizza+ 56 Langage de manipulation de données (suite) ◦ Les requêtes peuvent porter sur plusieurs tables. ◦ Ex.: select Restos.nom, Addresses_restos.adresse from Restos, Addresses_restos where Restos.Type=‘Pizzeria’ and Restos.nom = Addresses_restos.nom Nom Table « Restos » Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4567 Fast-food Vitos 125-4567 Italien … … … Table « Addresses_restos » Nom Téléphone Addresse Pizza+ 123-4567 1 main st. 57 Langage de définition de données SQL fournit un langage pour définir: ◦ tables, ◦ contraintes d’intégrités, ◦ assertions, etc. Exemple 1 (créer une table: create table Etudiants (prenom char(20), programme char(15), credits tinyint); Exemple 2 (contrainte): ALTER TABLE Comptes_banques ADD CONSTRAINT solde CHECK (balance >= 0) 58 Accès à partir d’un logiciel d’application ◦ Logiciel d’application: logiciel utilisateur. Ex.: logiciel de gestion des employés. ◦ SQL ne remplace pas un langage de programmation. ◦ Certaines opérations sont impossibles en SQL. ◦ Entre autres, SQL ne gère pas l’affichage à l’utilisateur, la communication réseau, etc. ◦ C’est pourquoi SQL est toujours utilisé avec un langage hôte: Java, C++, C#... ◦ En général, pour envoyer des requêtes SQL au SGBD, une interface de programmation est utilisée (ex.: JDBC en Java, qui se conforme à la norme ODBC). Ex.: connecteurs pour MYSQL: http://www.mysql.com/products/connector/ 59 CONCEPTION DE BD 60 Conception de bases de données La conception d’une BD consiste principalement en la définition de ses schémas. Étapes: 1. Analyse des besoins: comprendre les besoins des utilisateurs. 2. Design conceptuel: choisir un modèle de données pour établir un schéma conceptuel de la BD décrivant les données et leur relations. Objectif: faire une modélisation de haut niveau des données qui seront stockées. ◦ ◦ Quels attributs? Quoi inclure dans la BD? Modèle entité-relation, ◦ Normalisation ( ) 61 Exemple de modèle entité-relation Il existe plusieurs représentations graphiques pour le modèle entité-relation. instructeur matricule nom salaire département membre nom département bâtiment budget Représentation inspirée de UML Les entités sont représentée par des rectangles • nom (en gris) • attributs (en blanc) Les relations sont représentées par des losanges. Il est possible d’ajouter des contraintes de cardinalité aux relations (ex.: 1 instructeur ne peut être associé qu’à 1 seul département) 62 Conception de bases de données (suite) Spécification des besoins fonctionnels: spécifier quels sont les besoins en terme d’opérations sur la BD (chercher, modifier, supprimer, insérer…). 3. ◦ 4. 5. à cette étape, on peut revenir à l’étape 2 pour réviser le modèle conceptuel. Conception logique: traduction du modèle conceptuel de haut niveau en modèle utilisé par la BD. (ex.: création de tables pour le modèle relationnel à partir d’un modèle entité-relation) Conception physique: un schéma logique est défini pour prendre des décisions pour la BD au niveau physique ◦ Ex.: choix de structures de stockage interne, du mécanisme d’indexation…. 63 Normalisation Une méthode pour créer une base de données relationnelle (sous forme de tables) est la normalisation. Cela consiste a analyser les dépendances entre attributs pour créer des schémas logiques (des tables) qui sont dans une forme normale appropriée. ◦ 1ière forme normale, 2ième forme normale, …5ième forme normale, 6ième forme normale. Chaque forme normale énonce des critères à respecter. Plus une BD est dans une forme normale élevée, moins il y a de risque de redondance et d’erreurs. 64 Exemple Considérez la table suivante qui se nomme “Professeurs”: Plusieurs problèmes potentiels. 65 Exemple Considérez la table suivante qui se nomme “Professeurs”: Problème 1: Les information sur le département d’histoire sont dupliquées. • Plus coûteux à mettre à jour. • Risque d’incohérence si un seul enregistrement est mis à jour. 66 Exemple Considérez la table suivante qui se nomme “Professeurs”: Problème 2: Un autre problème: Il est impossible d’ajouter un département sans créer un enregistrement pour le département. • Solution? Créer un département avec des valeurs « null » ? Mais quoi faire lorsque le dernier membre est supprimé? 67 Architecture d’une BD Principalement deux modules: 1) Gestionnaire de stockage: gère les données stockées sur disque, Insertion, recherche et mise à jour de l’information stockée, emploi des stratégies pour minimiser le nombre d’accès disque, telles que: ◦ Indexation, bassins de tampons, B+ arbre. vérifie les contraintes d’intégrité et les autorisations… 68 Architecture d’une BD 2) Processeur de requêtes: transforme des requête écrites en langage de requêtes en opérations au niveau physique, l’utilisation d’un langage de requêtes simplifie et facilite l’accès aux données, cela permet aux utilisateurs de travailler au niveau des vues plutôt qu’au niveau physique. 69 Utilisateurs des BD Utilisateurs « naïfs »: ceux qui utilisent les logiciels d’application (ex.: formulaires, page Web). Programmeurs de logiciels d’applications. Utilisateurs « sophistiqués »: interrogent la BD en utilisant des requêtes ou des outils d’analyse spécialisés. Utilisateurs « spécialisés »: utilisateurs qui écrivent des logiciels qui exploitent les connaissances dans la BD de façon particulière (ex.: systèmes experts…) 70 L’administrateur de BD Il est responsable de : ◦ ◦ ◦ ◦ ◦ définir les schémas de BD, choisir une structure de stockage, choisir une méthode d’accès, gérer les autorisations d’accès, Effectuer la maintenance: sauvegarde périodique de la BD, s'assurer qu’il y a assez d’espace disque et mettre à jour le matériel, faire un suivi de la performance. Ex.: pour éviter que des tâches de certains utilisateurs accaparent toutes les ressources. 71 LES BD RELATIONNELLES (SUITE) 72 Introduction Le modèle relationnel est au niveau logique et au niveau des vues. Les données sont représentées comme un ensemble de tables. Chaque table a un nom unique. 73 Exemple Table “Instructeur” 74 Table “Cours” Table “prérequis” 75 Fondements mathématiques du modèle relationnel Une table est une relation. Une ligne dans une table est un uplet (tuple, en anglais), c’est-à-dire une liste de valeurs (des éléments). Une relation est un ensemble d’uplets (non ordonnés). ◦ Donc, l’ordre des uplets dans une table n’est pas pertinent. Nom_restaurant Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4568 Fast-food … … … 76 Fondements mathématiques du modèle relationnel Exemple: Une table nommée « Restaurants »: Nom_restaurant Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4568 Fast-food McDO 123-8765 Fast-food Représentation mathématique de cette relation: R = {(Pizza+, 123-4567, Pizzeria), (Subway, 124-4568, Fast-food), (McDo, 123-8765, Fast-food)} (cette relation est un ensemble d’uplets de 3 éléments). R ⊆ Chaines_caractères × Téléphones × Types_restaurants (la relation est sous-ensemble du produit cartésien du domaine de chaque attribut). 77 Fondements mathématiques du modèle relationnel (suite) Pour chaque attribut un domaine est défini ◦ ex.: le domaine de l’attribut « salaire » sont les entiers positifs de 0 à 100,000. Toutes les valeurs d’attributs sont atomiques (une valeur d’attribut ne peut pas être un ensemble de valeurs). ◦ Ex.: On ne peut pas stocker plusieurs numéros de téléphones dans un attribut « téléphone » (en fait, si on le faisait, le SGBD le traiterait comme un seul) Nom_restaurant Téléphone Type Pizza+ 123-4567 Pizzeria Subway 124-4568 Fast-food … … … 78 Caractéristiques (suite) La valeur « null » pour un attribut signifie que la valeur est inconnue. ◦ Ex.: un professeur qui n’a pas de numéro de téléphone. Table « Professeur » Nom_professeur Telephone Jean P. 514-123-4567 Paul F. 506-123-7654 Fernand G. Null En pratique, il est préférable de ne pas avoir de valeurs « null » car cela peut engendrer des problèmes. 79 Schémas et instances Le schéma d’une relation (table) est le nom de la relation suivi du nom de ses arguments (attributs): ◦ Ex. 1: instructeur( ID, name, dept_name, salary) ◦ Ex. 2: Cours(course_id, title, dept_name, credits) Une instance d’une relation est l’ensemble des uplets que contient cette relation dans une instance de la BD (lignes dans une table). Certains attributs (ex.: dept_name) peuvent être communs à plusieurs relations afin de relier les uplets de plusieurs relations. Exemple 80 Exemple 1 Table « Professeur » matricule_prof nom_professeur telephone nom_departement 1234789 Jean P. 514-123-4567 Informatique 9898000 Paul F. 506-123-7654 Biologie 5656987 Fernand G. 506-124-7653 Administration Table « Departement » nom_departement annee_fondation bâtiment Informatique 1980 ABC Biologie 1970 ABC Administration 1960 XHY Table « Bâtiment » bâtiment adresse ABC 1234 rue des pins XYZ 1235 connaught XHY 1236 mountain road 81 Exemple 2 Voici quelques relations qu’on pourrait définir dans le schéma d’une BD pour une université: Étudiant(ID_e, nom, dépt., crédits) Professeur(ID_s, nom, telephone) Suit_cours(ID_e, sigle, semestre, année, ID_s) Salle_cours(batiment, num_local, capacité Case_horaire(id_case, jour, temps_debut, temps_fin) 82 Les clés Une clé est un attribut permettant de distinguer les uplets au sein d’une relation. Aucun uplet ne doit être entièrement identique à un autre uplet pour un attribut qui est une clé. Exemple: Table « Livres » ISBN Titre Auteur Date Éditeur 145343454 Java Jean P. 2000 AAA 345755675 Les bases de données Marc X. 2005 BBB 809076786 SQL Tom Y. 2003 AAA 453452333 Java Luc W. 2003 DDD 686786786 Scala pour les nuls Tom Y. 2003 EEE Quelles sont le(s) clé(s)? • ISBN 83 Les super-clés Une super-clé est un ensemble d’un ou plusieurs d’attributs qui collectivement identifient uniquement chaque uplet dans une relation. Exemple: Table « Livres » ISBN Titre Auteur Date Éditeur 145343454 Java Jean P. 2000 AAA 345755675 Les bases de données Marc X. 2005 BBB 809076786 SQL Tom Y. 2003 AAA 453452333 Java Luc W. 2003 DDD 686786786 Scala pour les nuls Tom Y. 2003 EEE Quelles sont le(s) super-clé(s)? 84 Table « Livres » ISBN Titre Auteur Date Éditeur 145343454 Java Jean P. 2000 AAA 345755675 Les bases de données Marc X. 2005 BBB 809076786 SQL Tom Y. 2003 AAA 453452333 Java Luc W. 2003 DDD 686786786 Scala pour les nuls Tom Y. 2003 EEE Quelles sont les super-clés? • ISBN • ISBN + Titre • ISBN + Auteur • ISBN + Auteur + Titre • … • Auteur + Titre • Auteur + Date + Titre • Auteur + Titre + Éditeur • … 85 Les clés candidates Une clé candidate est une super-clé minimale. Il est possible qu’il y aille plusieurs clés candidates pour une relation. Exemple 86 Exemple 1 Table « Livres » ISBN Titre Auteur Date Éditeur 145343454 Java Jean P. 2000 AAA 345755675 Les bases de données Marc X. 2005 BBB 809076786 SQL Tom Y. 2003 AAA 453452333 Java Luc W. 2003 DDD 686786786 Scala pour les nuls Tom Y. 2003 EEE Parmi les clés suivantes, quelles sont les clé(s) candidate(s)? • ISBN • ISBN + Titre • ISBN + Auteur • ISBN + Auteur + Titre • … • Auteur + Titre • Auteur + Date + Titre • Auteur + Titre + Éditeur • … 87 Exemple 2 Table « Employé » Nom Prénom Date_naiss Code postal Telephone Adresse Parent Jean 1985 H1J2K2 555-5533 1234 rue Main Arsenault Marc 1987 H2P3K3 … Charest Tom 1990 E1C3K4 … Torvald Linus 1992 E2C3K5 … Sawyer Tom 1990 E2F9P2 … … … … … … Quelles sont les clé(s) candidate(s)? • Nom + prénom + Date_naissance • Nom + prénom + Telephone • Nom + prénom + Adresse • …? 88 Les clés primaires Une clé primaire est une clé candidate choisie par le concepteur d’une BD comme moyen principal pour identifier les uplets d’une relation. Contrainte: aucun uplet ne doit avoir la même valeur qu’un autre uplet pour la clé primaire. Quand on conçoit une BD, il faut bien choisir les clés primaires pour respecter la contrainte! Exemple: Table « Employé » Nom Prénom Date_naiss Code postal Telephone Adresse Parent Jean 1985 H1J2K2 555-5533 1234 rue Main Arsenault Marc 1987 H2P3K3 … … … … … … Que choisiriez-vous comme clé primaire? 89 Clés étrangères Quand une relation r1 inclus dans ses attributs, une clé primaire d’une autre relation r2 , il s’agit d’une clé étrangère pour r1. Exemple.: Soit les deux schémas suivants: departement(nom_departement, bâtiment) instructeur( matricule, nom, nom_departement, salaire) nom_departement est une clé primaire de departement. nom est une clé primaire de instructeur nom_departement est une clé étrangère de instructeur. Ainsi pour chaque valeur pour nom_departement dans la relation instructeur, il doit y avoir une valeur pour nom_departement dans la relation departement(ceci est un exemple de contrainte d’intégrité référentielle) 90 Exemple 2 Table « Departement » nom_departement annee_fondation bâtiment Informatique 1980 ABC Biologie 1970 ABC Administration 1960 XHY Table « Bâtiment » bâtiment adresse ABC 1234 rue des pins XYZ 1235 connaught XHY 1236 mountain road L’attribut « bâtiment » est une clé étrangère pour la relation « Département » 91 Diagrammes de schéma Le schéma d’une BD avec les clés primaires et étrangères peut être représenté par un diagramme de schéma. Notation: ◦ ◦ ◦ ◦ une relation: une boîte nom d’une relation: rectangle bleu clé primaire: souligné clé étrangère: au début d’une flèche 92 Exemple – BD universitaire diagramme de schéma une relation: une boîte nom d’une relation: rectangle bleu clé primaire: souligné clé étrangère: au début d’une flèche 93 Exemple – BD universitaire (suite) schémas 94 Diagramme de schéma (suite) Avec certains logiciels (ex.: Microsoft Access), il est possible de créer des diagrammes de schéma visuellement. 95 Opérations relationnelles Une requête ◦ est une demande d’information à une base de données, ◦ est exprimée dans un langage de requêtes, ◦ exprime un ensemble de contraintes sur le résultat demandé, ◦ retourne une relation comme résultat. 96 Opérations relationnelles (suite) Les requêtes sont traduites en opérations relationnelles par le module de traitement des requêtes d’un SGBD. Une opération relationnelle ◦ prend en paramètre une ou plusieurs relations, ◦ retourne une relation comme résultat. Il est possible de combiner plusieurs opérations relationnelles pour effectuer des requêtes complexes. 97 Algèbre relationnel Les opérations relationnelles varient en fonction du langage de requêtes, mais sont généralement semblables d’un langage à l’autre. Elles définissent un algèbre relationnel. 98 Exemples d’opérations relationnelles 1. Sélection: sélectionner tous les uplets dans une relation qui satisfont une certaine condition. Exemple 1: sélectionner tous les employés avec une date de naissance > 1990 Table « Employé » Nom Prénom Date_naiss Parent Jean 1985 Nom Prénom Date_naiss Arsenault Marc 1987 Charest Tom 1990 Charest Tom 1990 Torvald Linus 1992 Torvald Linus 1992 Sawyer Tom 1990 Sawyer Tom 1990 Résultat Exemple 2 99 Exemples d’opérations relationnelles 1. Sélection: sélectionner tous les uplets dans une relation qui satisfont une certaine condition.. Exemple 2: sélectionner tous les employés avec prénom = « Jean ». Table « Employé » Nom Prénom Date_naiss Parent Jean 1985 Nom Prénom Date_naiss Arsenault Marc 1987 Parent Jean 1985 Charest Tom 1990 Torvald Linus 1992 Sawyer Tom 1990 Résultat Exemple 3 100 Exemples d’opérations relationnelles 1. Sélection: sélectionner tous les uplets dans une relation qui satisfont une certaine condition. Exemple 3: sélectionner tous les employés nés entre 1980 et 1988, inclusivement. Table « Employé » Nom Prénom Date_naiss Parent Jean 1985 Nom Prénom Date_naiss Arsenault Marc 1987 Parent Jean 1985 Charest Tom 1990 Arsenault Marc 1987 Torvald Linus 1992 Sawyer Tom 1990 Résultat 101 Exemples d’opérations relationnelles (suite) 2. Projection: sélectionner un sous-ensemble d’attributs d’une relation. Exemple: sélectionner les attributs « Nom » et « Prénom » de la relation « Employé » Table « Employé » Résultat Nom Prénom Date_naiss Nom Prénom Parent Jean 1985 Parent Jean Arsenault Marc 1987 Arsenault Marc Charest Tom 1990 Charest Tom Torvald Linus 1992 Torvald Linus Sawyer Tom 1990 Sawyer Tom 102 Exemples d’opérations relationnelles (suite) 3. Jointure naturelle de deux relations: combiner les uplets de deux relations avec les mêmes valeurs pour les mêmes attributs. (note: il existe d’autres types de jointures…) Exemple: Table « Bâtiment » bâtiment adresse ABC 1234 rue des pins XYZ 1235 connaught XHY 1236 mountain road Table « Departement » Résultat nom fondation bâtiment adresse Informatique 1980 ABC 1234 … nom fondation bâtiment Biologie 1970 ABC 1234… Informatique 1980 ABC 1960 XHY 1236… Biologie 1970 ABC Administratio n Administration 1960 XHY 103 Exemples d’opérations relationnelles (suite) 4. Produit cartésien: combine les uplets de deux relations en formant toutes les combinaisons possibles. Exemple: Coûteux! Le produit cartésien de deux relations de 2000 uplets contiendra 2000 x 2000 = 4 millions d’uplets Table « Cours » sigle sujet INFO2012 Prog. INFO2014 BD INFO3020 Réseaux Résultat sigle sujet nom fondation Table « Departement » INFO2012 Prog. Info 1980 nom fondation INFO2012 Prog. Bio 1970 Info 1980 INFO2012 Prog. Adm 1960 Bio 1970 INFO2014 BD Info 1980 Adm 1960 …. … … … 104 Exemples d’opérations relationnelles (suite) 5. Union: applique l’opération ensembliste d’union Exemple: union des cours d’automne et d’hiver Table « Cours Automne » sigle sujet INFO2012 Prog. INFO2014 BD INFO3020 Réseaux Résultat sigle sujet Table « Cours Hiver » INFO2012 Prog. sigle sujet INFO2014 BD INFO2014 BD INFO3020 Réseaux INFO3020 Réseaux INFO4021 Arch. de réseau INFO4021 Arch. de réseau 105 Exemples d’opérations relationnelles (suite) 6. Différence: applique l’opération ensembliste de soustraction d’ensemble Exemple: cours d’hiver non offert à l’automne Table « Cours Automne » sigle sujet INFO2012 Prog. INFO2014 BD INFO3020 Réseaux Résultat Table « Cours Hiver » sigle sujet INFO2014 BD INFO3020 Réseaux INFO4021 Arch. de réseau sigle sujet INFO4021 Arch. de réseau 106 Exemples d’opérations relationnelles (suite) 7. Renomer: renomme un attribut d’une relation ou une relation elle même Exemple: cours d’hiver non offert à l’automne Résultat (relation anonyme) Table « Cours Hiver seulement » sigle sujet sigle_cours sujet INFO4021 Arch. de réseau INFO4021 Arch. de réseau 107 Exemples d’opérations relationnelles (suite) Autres opérations ensemblistes: intersection… 9. Opérations d’agrégation: 8. ◦ ◦ ajout de fonction telles que somme, minimum, maximum, moyenne et compte pour cumuler l’information sur un attribut donné. Exemple: obtenir la date de naissance maximale Table « Employé » Nom Prénom Date_naiss Parent Jean 1985 Arsenault Marc 1987 Charest Tom 1990 Torvald Linus 1992 Sawyer Tom 1990 Résultat 1992 108 Opérations relationnelles (suite) De plus, il est possible de combiner plusieurs opérations. Par exemple 109 Exemple 1 de combinaison d’opérations Table « Bâtiment » bâtiment adresse ABC 1234 … XYZ 1235 … XHY 1236 … jointure naturelle nom Table « Departement » Informatique fondation adresse 1980 ABC 1234 … 1970 ABC 1234… 1960 XHY 1236… ? nom fondation bâtiment Biologie nformatique 1980 ABC Biologie 1970 ABC Administratio n Administration 1960 XHY Quelles opérations ont été effectuées? (deux) bâtiment projection nom adresse Informatique 1234 … Biologie 1234… Administration 1236… 110 Exemple 2 de combinaison d’opérations Table « departement » Numéro département 1 A 2 B Table « items_prix » nom prix_unitaire Scie 20.00 nom Code Dep Marteau 15.00 Scie 1 A Éclume 5.00 Marteau 1 A Éclume 1 A Scie 2 B Marteau 2 B Éclume 2 B Quelles opérations ont été effectuées? 111 Opérations relationnelles (suite) Certaines opérations relationnelles peuvent retourner des uplets en double. En fonction des implémentations, ces doublons peuvent être conservés ou supprimés, dépendant si une implémentation respecte la définition d’ensemble mathématique ou non. SQL est basé sur l’idée d’algèbre relationnel, mais propose également d’autres éléments pour compléter. 112 Opérations relationnelles (suite) Pour obtenir le résultat à une requête, il existe souvent plusieurs séquences d’opérations relationnelles équivalentes. Un bon module de traitement de requête, optimisera le choix des opérations pour une meilleure performance. Exemple 113 Quelques exemples de principes d’optimisation effectuer l’opération de sélection en premier réduit le nombre d’information à traiter pour les opérations suivantes. certaines opérations sont sans effet (ex.: plusieurs sélections identiques sur une même relation). certaines opérations sont commutatives (ex.: sélection) une sélection avec plusieurs conditions sous forme de conjonction, peut être faite en deux opérations successives. 114 Quelques exemples de principes d’optimisation une sélection avec plusieurs conditions sous forme de disjonction, peut être faite en l’union du résultat de deux opérations successives. les différents types de jointures sont de façon générale les opérations les plus coûteuses dans certains cas, il est préférable de faire une projection avant une sélection pour réduire le nombre d’uplets. … 115 INTRODUCTION À SQL 116 Introduction à SQL Le langage de requêtes le plus utilisé est SQL. Langage multiplateforme. Il en existe d’autres, expérimentaux ou commerciaux. SQL est inspiré de Sequel un langage développé par IBM dans les années 1970 Plusieurs versions de SQL. La dernière spécification est SQL-2011. La spécification peut être achetée auprès de l’ISO. Le langage SQL peut être traité légèrement différemment par certaines implémentations (ex.: Access). 117 Introduction à SQL (suite) Le langage SQL est composé de: ◦ Un LDD pour spécifier: le schéma logique de la BD, des contraintes d’intégrité, des vues, contrôler le début et la fin des transactions, les autorisations ◦ Un LMD pour interroger la BD et la modifier. 118 Langage de définition de SQL Il permet de définir: ◦ ◦ ◦ ◦ ◦ ◦ le schéma pour chaque relation, le domaine de chaque attribut, les contraintes d’intégrité, les indices à maintenir pour chaque relation, les autorisations pour chaque relation, la structure de stockage de chaque relation sur le disque 119 Types de base Plusieurs types prédéfinis: char(n): chaîne de caractères de taille n, varchar(n): chaîne de caractères à taille variable avec maximum n caractères. int : entier de 4 octets tinyint: entier de 1 octet numeric(p, d): des nombres avec maximum p chiffres avant la virgule et d après la virgule, smallint, real, double, float, date…. etc. 120 Création d’une table Commande pour la création d’une table: create table departement (nom_dept varchar(20), bâtiment varchar(15), budget numeric(12,2) ); titre de la relation définition des attributs Il est également possible d’utiliser des contraintes supplémentaires. Exemple 121 Exemple create table departements (nom_dept varchar(20), bâtiment varchar(15), budget numeric(12,2) primary key(nom_dept)); indication qu’un attribut est une clé primaire. indication que la valeur « Null » n’est pas acceptée pour un attribut create table professeurs (matricule char(5) not null, nom_dept varchar(20) , salaire numeric(6,2) primary key(matricule) foreign key(nom_dept) references(departements); Indication qu’un attribut est une clé étrangère Note: Il est possible de déclarer plusieurs clés étrangères pour une même table. 122 Insertion/supression Insertion d’un uplet: insert into professeurs values(12345, ‘informatique’, 30000); Suppression de tous les uplets d’une relation (sans supprimer la relation): delete from professeurs; Suppression d’une relation: drop table professeurs; 123 Ajout/suppression d’attributs Ajout d’un attribut à une relation: alter table professeurs add annees_experience int; Suppression d’un attribut: alter table professeurs drop annees_experience; 124 Structure d’une requête SQL les attributs à sélectionner Select A1,A2, A3… from r1,r2, r3… where C; les relations à laquelle s’applique la requête la condition pour déterminer les enregistrements à sélectionner. 125 Requête sur une relation Exemple 1: select nom from employe; Résultat Table « employe » nom prenom date_naiss Nom Parent Jean 1985 Parent Arsenault Marc 1987 Arsenault Charest Tom 1990 Charest Torvald Linus 1992 Torvald Sawyer Tom 1990 Sawyer 126 Requête sur une relation Exemple 2: select nom, prenom from employe; Résultat Table « employe » nom prenom date_naiss nom prenom Parent Jean 1985 Parent Jean Arsenault Marc 1987 Arsenault Marc Charest Tom 1990 Charest Tom Torvald Linus 1992 Torvald Linus Sawyer Tom 1990 Sawyer Tom 127 Requête sur une relation Exemple 3: select prenom from employe; Résultat Table « employe » nom prenom date_naiss prenom Parent Jean 1985 Jean Arsenault Marc 1987 Marc Charest Tom 1990 Tom Torvald Linus 1992 Linus Sawyer Tom 1990 Tom Observation: certaines valeurs apparaissent plusieurs fois dans la relation qui est le résultat de la requête! Comment éliminer? 128 Requête sur une relation Exemple 4: select distinct prenom from employe; Résultat Table « employe » nom prenom date_naiss prenom Parent Jean 1985 Jean Arsenault Marc 1987 Marc Charest Tom 1990 Tom Torvald Linus 1992 Linus Sawyer Tom 1990 Note: Éliminer les doublons peut être coûteux en terme de traitement! 129 Requête sur une relation Il est possible d’utiliser les opérateurs arithmétiques * / + - dans la clause select. Exemple 5: select nom, salaire * 1.1 from employe; Résultat Table « employe » nom prenom salaire nom Parent Jean 20000 Parent 22000 Arsenault Marc 30000 Arsenault 33000 Charest Tom 50000 Charest 55000 Torvald Linus 60000 Torvald 66000 Sawyer Tom 90000 Sawyer 99000 130 Requête sur une relation La clause « where » permet de sélectionner seulement les uplets qui satisfont une condition. Exemple 6: select nom, salaire from employe where salaire >= 50000; Table « employe » nom prenom salaire Parent Jean 20000 nom salaire Arsenault Marc 30000 Charest 50000 Charest Tom 50000 Torvald 60000 Torvald Linus 60000 Sawyer 90000 Sawyer Tom 90000 Résultat Note: Il est possible d’utiliser > >= < <= <> and or not dans la clause where. 131 Requête sur une relation La clause « where » permet de sélectionner seulement les uplets qui satisfont une condition. Exemple 7: select nom, salaire from employe where prenom = ‘Tom’ and salaire >= 50000; Table « employe » nom prenom salaire Parent Jean 20000 Arsenault Marc 30000 Charest Tom 50000 Torvald Linus 60000 Sawyer Tom 90000 Résultat nom salaire Charest 50000 Sawyer 90000 Note: Il est possible d’utiliser > >= < <= <> and or not dans la clause where. 132 Requête sur une relation La clause « where » permet de sélectionner seulement les uplets qui satisfont une condition. Exemple 8: select nom, salaire from employe where prenom <> ‘Tom’ Table « employe » nom prenom salaire Parent Jean 20000 Arsenault Marc 30000 Charest Tom 50000 Torvald Linus 60000 Sawyer Tom 90000 Résultat nom salaire Parent 20000 Arsenault 30000 Torvald 60000 Note: Il est possible d’utiliser > >= < <= <> and or not dans la clause where. 133 Requêtes sur plusieurs relations Il est parfois nécessaire d’accéder simultanément à de l’information provenant de plusieurs tables. Exemple: select nom, adresse Table « Bâtiments » batiment adresse ABC 1234 rue des pins XYZ 1235 connaught XHY 1236 mountain road Table « departements » nom fondation bâtiment Informatique 1980 ABC Biologie 1970 ABC Administration 1960 XHY from batiments, departements where batiments.batiment = departements.batiment. Résultat nom adresse Informatique 1234 rue des pins Biologie 1234 rue des pins Administration 1236 mountain road • La clause from spécifie les relations. • La clause where spécifie la condition d’appariement. • Le « . » est utilisé pour éliminer l’ambiguïté 134 Interprétation select nom, adresse from batiments, departements where batiments.batiment = departements.batiment. La requête SQL peut être interprétée comme suit: Créer une nouvelle relation résultat vide. Pour chaque uplet x dans batiments Pour chaque uplet y dans departements Concatener x et y en un nouveau uplet si x.batiment = y.batiment. Ajouter le uplet résultant dans la relation résultat. Retourner la relation résutat. Note: En pratique, un processeur de requête SQL utilise une approche optimisée pour éviter de tester toutes les possibilités. 135 Requêtes sur plusieurs relations (suite) select nom, adresse from batiments, departements where batiments.batiment = departements.batiment. Qu’arrive t-il si on omet la clause where? Le résultat de la requête est alors le produit cartésien des deux relations. Toutes les combinaisons possibles entre les uplets des deux relations sont effectuées. Cela peut générer un très grand nombre d’uplets comme résultat! 136 Illustration – produit cartésien Résultat Table « Cours » sigle sujet nom fondation sigle sujet INFO2012 Prog. Info 1980 INFO2012 Prog. INFO2012 Prog. Bio 1970 INFO2014 BD INFO2012 Prog. Adm 1960 INFO3020 Réseaux INFO2014 BD Info 1980 INFO2014 BD Bio 1970 Table « Departement » nom fondation INFO2014 BD Adm 1960 Info 1980 INFO3020 Réseaux Info 1980 Bio 1970 INFO3020 Réseaux Bio 1970 Adm 1960 INFO3020 Réseaux Adm 1960 select sigle, sujet, nom, fondation from cours, departement La jointure naturelle Table « Bâtiments » bâtiment adresse ABC 1234 … XYZ 1235 … XHY 1236 … Jointure naturelle: concaténer les uplets de deux relations qui ont les mêmes valeurs pour les attributs ayant le même nom. nom Table « Departement » Informatique adresse ? nom fondation bâtiment Biologie nformatique 1980 ABC Administration Biologie 1970 ABC Administration 1960 XHY 1234 … 1234… 1236… select nom, adresse from batiments natural join departements Note: Ceci est équivalent à: select nom, adresse from batiments, departements where batiments.batiment = departements.batiment. 138 La jointure naturelle (suite) De façon plus générale, une jointure naturelle peut porter sur plus de deux relations. Syntaxe générale: 139 Un autre exemple de jointure naturelle Considérez les trois tables suivantes: Table « professeurs » Table « donne » Table « cours » IDProf bâtiment Nom IDProf sigle sigle bâtiment Titre 123 ABC Paul 123 INFO1000 INFO1000 ABC Java 456 XYZ Léo 123 INFO1002 INFO1002 XYZ C++ 678 XHY Luc 678 INFO1003 INFO1003 XHY SQL Quel est la signification de la requête suivante ? select nom, titre from professeurs natural join donne, cours where donne.sigle = cours.sigle; Obtenir les uplets « nom de professeur » et « titre de cours » pour tous les cours. 140 Table « professeurs » Table « donne » Table « cours » IDProf bâtiment Nom IDProf sigle sigle bâtiment Titre 123 ABC Paul 123 INFO1000 INFO1000 ABC Java 456 XYZ Léo 123 INFO1002 INFO1002 XYZ C++ 678 XHY Luc 678 INFO1003 INFO1003 XHY SQL Est-ce que la requête précédente : select nom, titre from professeurs natural join donne, cours where donne.sigle = cours.sigle; est équivalente à cette requête: select nom, titre from professeurs natural join donne natural join cours ? Non, cette requête ne retourne que les uplets où un cours est donné dans le bâtiment associé au professeur qui donne le cours (parce que « bâtiment » est présent dans deux tables). 141 Une façon de résoudre ce problème: select nom, titre from professeurs natural join donne natural joins cours select nom, titre from (professeurs natural join donne) join cours using (cours.sigle); Le mot-clé join indique de faire une jointure. La différence avec natural join est que join permet de spécifier le(s) attribut(s) à utiliser pour faire la jointure. 142 AUTRES OPÉRATIONS 143 Renommer un attribut Dans certaines situations, il est nécessaire de (re)nommer un attribut: La clause select d’une requête crée une relation avec deux attributs ayant le même nom provenant de deux tables différentes. Un attribut est créé par une opération arithmétique ce qui résulte en un attribut sans nom. On veut renommer un attribut dans le résultat d’une requête. 144 Renommer un attribut (suite) Comment renommer? ancien nom Exemple: nouveau nom select titre as titre_cours, sigle from cours where batiment = ‘ABC’; Table « cours » Résultat sigle batiment titre titre_cours sigle INFO1000 ABC Java Java INFO1000 INFO1002 ABC Cobol INFO1003 XHY SQL Cobol INFO1002 145 Renommer un attribut (suite) Un autre exemple: select nom, salaire * 1.1 as nouveau_salaire from employe; Résultat Table « employe » nom prenom salaire nom nouveau_salaire Parent Jean 20000 Parent 22000 Arsenault Marc 30000 Arsenault 33000 Charest Tom 50000 Charest 55000 Torvald Linus 60000 Torvald 66000 Sawyer Tom 90000 Sawyer 99000 146 Renommer (suite) On peut aussi renommer une relation à l’intérieur d’une requête pour simplifier la requête: select professeurs.nom, donne.sigle from professeurs, donne where professeurs.ID = donne.ID; select T.nom, S.sigle from professeurs as T, donne as S where T.ID = S.ID; 147 Renommer (suite) On peut aussi renommer une relation afin d’utiliser deux fois la même relation dans la même requête. Exemple: Cette requête retourne tous les instructeurs ayant un salaire supérieur à celui de l’instructeur le moins bien payé du département de biologie. 148 Opération sur les chaînes de caractères Les chaîne de caractères sont représentées avec des guillemets simples. Ex.: ‘ordinateur’ Opérateur de comparaison = Ex.: ‘ordinateur’ = ‘maison’ est faux Ex.: ‘ordinateur’ = ‘ordinateur’ est vrai Ex.: ‘ordinateur’ = ‘Ordinateur’ est vrai ou faux dépendant de l’implémentation. 149 Opération sur les chaînes de caractères (suite) Opérateur de concaténation || Ex.: prenom || ‘ ‘ || nom Conversion en majuscule: upper(s) Conversion en minuscule: lower(s) Enlever les espaces à la fin d’une châine: trim(s) 150 Exemple Concaténation avec Oracle: SELECT 'Le nom est: ' || nom_famille FROM employe; Concaténation avec Access: SELECT 'Le nom est: ' & nom_famille FROM employe; 151 Opération sur les chaînes de caractères (suite) Appariement de motif: ◦ un motif est une chaîne de caractère sensible à la casse. ◦ SQL permet d’énoncer qu’un motif doit apparaître dans une chaîne de caractères. ◦ Un motif est défini en utilisant les symboles: % le caractère s’apparie avec n’importe quelle chaîne. _ le caractère s’apparie avec n’importe quel caractère. ◦ Exemples: ‘%Test’ signifie toutes les chaînes de caractères se terminant par ‘Test’. ‘Test%’ signifie toutes les chaînes de caractères débutant par ‘Test’. ‘_ _ _’ signifie les chaînes contenant 3 caractères. ‘_ _ _%’ signifie les chaînes avec au moins 3 caractères. 152 Opération sur les chaînes de caractères (suite) Appariement de motif (suite): Les motifs sont utilisés dans les requêtes en utilisant l’opérateur like. Exemple 1: select nom from produits where produits.nom like ‘%C++%’; Table « produits » nom auteur ISBN Le C++ Paul 12345678 Le Java Marc 98767575 C++ en 24h Peter 26456456 Java en 24h Linus 45645645 SQL Jean 83454689 Résultat nom Le C++ C++ en 24h 153 Opération sur les chaînes de caractères (suite) Exemple 2: select auteur from produits where produits.auteur like ‘P_ _ _’; Table « produits » nom auteur ISBN Le C++ Paul 12345678 Le Java Marc 98767575 C++ en 24h Peter 26456456 Java en 24h Linus 45645645 SQL Jean 83454689 Résultat auteur Paul 154 Opération sur les chaînes de caractères (suite) Appariement de motif (suite): ◦ Si on veut utiliser les caractères % et _ dans un motif, il faut utiliser \% et \_ ◦ De la même façon, il faut utiliser \\ pour le caractère \ select nom from produits where produits.nom like ‘\%cereales%’; 155 Opération sur les chaînes de caractères (suite) Appariement de motif (suite): ◦ SQL offre aussi un opérateur not like: select nom from produits where produits.nom not like ‘%cereales%’; ◦ SQL:1999 introduit aussi l’utilisation d’expressions régulières similaires à celles d’Unix avec l’expression similar to. 156 Sélection de tous les attributs Il est possible de sélectionner tous les attributs d’une relation en utilisant « * ». Exemple 1: select * from produits where produits.nom not like ‘%Java%’; Table « produits » nom auteur ISBN Le C++ Paul 12345678 Le Java Marc 98767575 C++ en 24h Peter 26456456 Java en 24h Linus 45645645 SQL Jean 83454689 Résultat nom auteur ISBN Le C++ Paul 12345678 C++ en 24h Peter 26456456 SQL Jean 83454689 157 Sélection de tous les attributs Exemple 2: select departements.*, batiments.nom from batiments, departements where batiments.batiment = departements.batiment. Table « Bâtiments » batiment nom ABC Taillon XYZ Jeanne XHY Rémi Table « Departement » nom fondation batiment nom nom fondation batiment Informatique 1980 ABC Taillon Informatique 1980 ABC Biologie 1970 ABC Taillon Biologie 1970 ABC Administration 1960 XHY Rémi Administration 1960 XHY Note: En général, il est préférable de ne pas utiliser « * » dans du code de production. 158 Ordonner les uplets La clause order by permet de trier les uplets résultant d’une requête. Par défaut, le tri est par ordre croissant. select nom, prenom from employe order by prenom; Table « employe » nom prenom date_naiss Parent Jean 1985 Arsenault Marc 1987 Charest Tom 1990 Torvald Linus 1992 Sawyer Tom 1990 Résultat nom prenom Parent Jean Torvald Linus Arsenault Marc Charest Tom Sawyer Tom 159 Ordonner les uplets (suite) Il est possible d’utiliser asc ou desc pour choisir de trier en ordre croissant ou décroissant. De plus, il est possible de trier avec plusieurs attributs. select prenom, salaire from employe order by prenom asc, salaire desc; Table « employe » nom prenom salaire Parent Jean 5000 Arsenault Marc 6000 Charest Tom 5000 Torvald Linus 5500 Sawyer Tom 7000 Résultat prenom salaire Jean 5000 Linus 5500 Marc 6000 Tom 7000 Tom 5000 160 Intervalles dans la clause where L’opérateur between permet de spécifier des intervalles. Exemple: select nom, prix from produits where prix between 20 and 100; Ceci est équivalent à: select nom, prix from produits where prix <= 100and prix >= 20; 161 Comparaison d’uplets La notation (v1, v2, … vn) peut être utilisée pour représenter un uplet de taille n ayant les valeurs v1, v2, … vn. Cela peut être utilisé pour des fins de comparaisons dans une requête. Par exemple: select cours.sigle from cours, professeur where (cours.prof, professeur.dept) = (professeur.id, ‘info’); est équivalent à : select cours.sigle from cours, professeur where cours.prof = professeur.id and professeur.dept = ‘info’; = est vrai si tous les attributs sont identiques. >= , <= … 162 Opérations ensemblistes Il est possible de réaliser l’union, intersection et la différence de relations. Considérez l’exemple suivant: 163 On désire obtenir les sigles des cours offerts à l’hiver 2011. Table « cours » select sigle from cours where annee = 2011 and session =‘hiver'; sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 sigle INFO1003 ete 2012 INFO1002 INFO1000 ete 2012 INFO1003 INFO1003 hiver 2011 INFO1004 automne 2009 On désire obtenir les sigles des cours offert à l’été 2012. select sigle from cours where annee = 2012 and session =‘ete'; sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 sigle INFO1003 ete 2012 INFO1000 INFO1000 ete 2012 INFO1003 INFO1003 hiver 2011 INFO1000 INFO1004 automne 2009 Notez la présence de doublons 164 Maintenant, si on désire obtenir les sigles des cours offerts à l’hiver 2011 ou à l’été 2012: (select sigle from cours where annee = 2011 and session =‘hiver) union (select sigle from cours where annee = 2012 and session =‘ete'); Note: l’union élimine les doublons. sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 ete 2012 INFO1000 ete 2012 INFO1003 hiver 2011 INFO1004 automne 2009 sigle INFO1000 INFO1002 INFO1003 165 Si on désire conserver les doublons: (select sigle from cours where annee = 2011 and session =‘hiver) union all (select sigle from cours where annee = 2012 and session =‘ete'); sigle session annee INFO1000 ete 2012 sigle INFO1002 hiver 2011 INFO1000 INFO1003 ete 2012 INFO1000 INFO1000 ete 2012 INFO1002 INFO1003 hiver 2011 INFO1003 INFO1004 automne 2009 INFO1003 166 Si on désire obtenir les sigles des cours offerts à l’hiver 2011 ainsi qu’à l’été 2012: (select sigle from cours where annee = 2011 and session =‘hiver) intersect (select sigle from cours where annee = 2012 and session =‘ete'); sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 ete 2012 sigle INFO1000 ete 2012 INFO1003 INFO1003 hiver 2011 INFO1004 automne 2009 Note: Il est possible d’utiliser intersect all pour conserver les doublons, s’il y en a. Ex.: Si INFO4000 apparaît 4 fois dans le résultat du premier select et 2 fois dans le résultat du deuxième select, le résultat contiendra 2 fois INFO4000. 167 Si on désire obtenir les sigles des cours offerts à l’hiver 2011 mais pas à l’été 2012: (select sigle from cours where annee = 2011 and session =‘hiver) except (select sigle from cours where annee = 2012 and session =‘ete'); sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 ete 2012 sigle INFO1000 ete 2012 INFO1002 INFO1003 hiver 2011 INFO1004 automne 2009 Note: Il est possible d’utiliser except all pour conserver les doublons, s’il y en a. Ex.: Si INFO4000 apparaît 5 fois dans le résultat du premier select et 3 fois dans le résultat du deuxième select, le résultat contiendra 2 fois INFO4000. 168 Les valeurs nulles Une valeur null dans une BD indique l’absence de valeur. Le résultat d’une opération arithmétique ( / * + - ) appliquée à null est null . Le résultat d’une comparaison avec null retourne la valeur unknown au lieu de true ou false ◦ Ex.: 1 < null ◦ Ex.: r.a >= 5 où r.a prend la valeur null Le résultat des opérateurs booléens (and, or not) à unknown est unknown . 169 Les valeurs nulles (suite) Exemple: Quel est le résultat de not (r.a >= 5) quand r.a prend la valeur null ? Note: Si une clause where est évaluée à unknown ou false pour un uplet, le uplet n’est pas inclus dans le résultat. 170 Les valeurs nulles (suite) Il est possible de tester si une valeur est nulle avec is null et is not null. Exemple: select cours.sigle from cours where cours.titre is null; Certaines implémentations de SQL offrent aussi is unknown et is not unknown. Note: Si on utilise select distinct, deux uplets sont égaux, s’ils ont les même valeurs pour les mêmes attributs, incluant les valeurs nulles. Cette interprétation est différente de null = null qui retourne unknown. 171 Les fonctions d’agrégation SQL offrent cinq fonctions d’agrégation: ◦ avg : la moyenne ◦ min : le minimum ◦ max : le maximum ◦ sum : la somme ◦ count : le nombre d’uplets. Ces fonctions prennent en entrée un ensemble de valeurs (entiers, chaînes de caractères, dates…). Exemples 172 On désire obtenir le salaire moyen des employés. select avg (salaire) from employe; Table « employe » nom prenom salaire Parent Jean 5000 Arsenault Marc 6000 Charest Tom 5000 Torvald Linus 5500 Sawyer Tom 7000 5700 Le résultat est une valeur pour un attribut non nommé. Si on veut le nommer 173 select avg (salaire) as moyenne from employe; Table « employe » nom prenom salaire Parent Jean 5000 Arsenault Marc 6000 Charest Tom 5000 Torvald Linus 5500 Sawyer Tom 7000 moyenne 5700 174 On désire obtenir le nombre de cours offerts. select count(sigle) as compte from cours; Table « cours » sigle batiment titre INFO1000 ABC Java INFO1002 ABC Cobol INFO1003 XHY SQL compte 3 « count » compte le nombre de valeurs dans la colonne « sigle » 175 On désire obtenir le nombre de bâtiments qui offrent des cours: select count(batiment) as compte from cours; Table « cours » sigle batiment titre INFO1000 ABC Java INFO1002 ABC Cobol INFO1003 XHY SQL compte 3 Cette requête ne donne pas le résultat escompté! 176 Une solution: select count(distinct batiment) as compte from cours; Table « cours » sigle batiment titre INFO1000 ABC Java INFO1002 ABC Cobol INFO1003 XHY SQL compte 2 177 Et s’il y a des valeurs nulles? select count(batiment) as compte from cours; Table « cours » sigle batiment titre INFO1000 ABC Java INFO1002 ABC Cobol INFO1003 null SQL compte 2 Les valeurs nulles ne sont pas comptées. 178 Si on veut compter le nombre de uplets dans une relation: select count(*) as compte from cours; Table « cours » sigle batiment titre INFO1000 ABC Java INFO1002 ABC Cobol INFO1003 null SQL compte 3 Note: distinct ne peut pas être utilisé avec count(*). 179 Pour obtenir la valeur minimum d’un attribut: select prenom, min(salaire) as salairemin from employe; Table « employe » nom prenom salaire Parent Jean 3000 Arsenault Marc 6000 Charest Tom 5000 Torvald Linus 5500 Sawyer Tom 7000 prenom salairemin Jean 3000 De façon similaire, on pourrait utiliser « max » pour obtenir la valeur maximale pour un attribut. 180 Pour obtenir la somme des valeurs d’un attribut: select sum(salaire) as total from employe; Table « employe » nom prenom salaire Parent Jean 3000 Arsenault Marc 6000 Charest Tom 5000 Torvald Linus 5500 Sawyer Tom 7000 total 26500 181 Agrégation par groupes Le mot-clé group by permet d’agréger par groupes. select departement, avg(salaire) as salaire_moyen from professeurs group by departement; Table « professeurs » nom departement salaire departement salaire_moyen Jean Chimie 5000 Chimie 4500 Paul Chimie 4000 Biologie 2500 Luc Biologie 3000 Math 10000 Martin Biologie 2000 Sylvain Math 10000 182 Agrégation par groupes (suite) On peut appliquer une condition aux groupes en utilisant « having ». select departement, avg(salaire) as salaire_moyen from professeurs group by departement having avg(salaire) > 3000; Table « professeurs » nom departement salaire departement salaire_moyen Jean Chimie 5000 Chimie 4500 Paul Chimie 4000 Math 10000 Luc Biologie 3000 Martin Biologie 2000 Sylvain Math 10000 183 Agrégation par groupes (suite) On peut utiliser plusieurs attributs dans un « group by » SELECT pays, count(*) as compte FROM livres GROUP BY pays, année; Table « livres » pays année titre Canada 2014 Pascal Canada 2014 France pays compte Canada C# 2 France 2014 Java 2 Pérou France 2014 C++ 1 Pérou 1980 Cobol 184 Agrégation par groupe (suite) L’ordre d’évaluation des requêtes SQL est le suivant: 51234- 185 Note sur l’agrégation Lorsque « group_by » est utilisé, les attributs dans « select » doivent être soit présents dans « group by » ou être le résultat d’une fonction d’agrégation select departement, nom, avg(salaire) from professeurs group by departement having avg(salaire) > 3000; Table « professeurs » nom departement salaire Jean Chimie 5000 Paul Chimie 4000 Luc Biologie 3000 Martin Biologie 2000 Ceci est interdit! 186 Agrégation (suite) Traitement des valeurs nulles: Toutes les fonctions d’agrégation ignorent les valeurs nulles sauf count(*). 187 SELECT TOP / LIMIT Quand on manipule de très grandes tables, on peut vouloir limiter le nombre d’uplets en résultat. N’est pas supporté par toutes les SGBD. SELECT TOP 2 pays, titre FROM livres; Table « livres » pays année titre pays titre Canada 2014 Pascal Canada Pascal Canada 2014 C# Canada C# France 2014 Java France 2014 C++ Pérou 1980 Cobol En général, retourne les premiers uplets de la table. 188 REQUÊTE IMBRIQUÉES 189 Exemple: SELECT nom, prenom FROM employe WHERE salaire > (SELECT AVG(salaire) FROM employe); Table « employe » nom prenom salaire Parent Jean 5000 nom prenom Arsenault Marc 6000 Arsenault Marc Charest Tom 5000 Sawyer Tom Torvald Linus 5500 Sawyer Tom 7000 La moyenne est 5875 190 L’appartenance à un ensemble Les mots-clés in et not in permettent de vérifier si un uplet appartient à une relation. Exemple 191 Si on désire obtenir les sigles des cours offerts à l’hiver 2011 ainsi qu’à l’été 2012: select sigle from cours where annee = 2011 and session =‘hiver and sigle in (select sigle from cours where annee = 2012 and session =‘ete'); sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 ete 2012 INFO1000 ete 2012 INFO1003 hiver 2011 INFO1004 automne 2009 sigle INFO1000 INFO1003 INFO1000 sigle INFO1003 192 select sigle from cours where annee = 2011 and session =‘hiver and sigle in (select sigle from cours where annee = 2012 and session =‘ete'); est équivalent à: (select sigle from cours where annee = 2011 and session =‘hiver) intersect (select sigle from cours where annee = 2012 and session =‘ete'); 193 Si on désire obtenir les sigles des cours offerts à l’hiver 2011 mais pas à l’été 2012: select sigle from cours where annee = 2011 and session =‘hiver and sigle not in (select sigle from cours where annee = 2012 and session =‘ete'); sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 ete 2012 sigle INFO1000 ete 2012 INFO1002 INFO1003 hiver 2011 INFO1004 automne 2009 194 L’appartenance à un ensemble énuméré Les mots-clés in et not in peuvent être aussi utilisés avec des ensembles énumérés. select distinct nom from musiciens where nom not in (‘Marco’, ‘Sylvain’); Table « musicien » nom style salaire nom Marco rock 2000 Julie Julie pop 10000 Luc Luc rock 7000 Sarah Sarah jazz 2000 Sylvain blues 10000 195 L’appartenance à un ensemble (suite) De plus, il est possible de tester l’inclusion de uplets à plusieurs attributs. select count(matricule) from inscrit_a where (sigle, semestre, année) in (select sigle, semestre, année from enseigne where prof.id = 222444); Cette requête signifie trouver le nombre d’étudiant qui ont pris un cours enseigné par le prof. 222444’. Table « inscrit_a » Table « enseigne » sigle semestre année matricule 222444 INFO 1 A2013 2000 A0012 10000 222444 INFO2 A2013 10000 A0014 7000 113333 INFO3 A2014 7000 A0017 sigle semestre année prof_id INFO1 A2013 2000 INFO2 A2012 INFO3 A2014 Résultat : 1 196 Comparaison d’ensembles Le mot-clé some signifie au moins un uplet parmi une relation. select nom from professeurs where salaire > some (select salaire from professeurs where departement = ‘Biologie’); Cette requête retourne tous les professeurs ayant un salaire supérieur à celui du professeur le moins bien payé du département de biologie. Table « professeurs » nom departement salaire nom Jean Chimie 5000 Jean Paul Chimie 4000 Luc Luc Biologie 7000 Sylvain Martin Biologie 4500 Sylvain Math 10000 197 est équivalent à: select nom from professeurs where salaire > (select min(salaire) from professeurs where departement = ‘Biologie’); Note: il est aussi possible d’utiliser >= < <= = et <> avec some 198 Exemple select nom from professeurs where salaire <= some (select salaire from professeurs where departement = ‘Biologie’); Cette requête retourne tous les professeurs ayant un salaire inférieur ou égal à celui du professeur le mieux payé du département de biologie. Table « professeurs » nom departement salaire nom Jean Chimie 5000 Jean Paul Chimie 4000 Paul Luc Biologie 7000 Luc Martin Biologie 4500 Martin Sylvain Math 10000 199 Comparaison d’ensembles (suite) Le mot-clé all signifie tous les uplets parmi une relation. select nom from professeurs where salaire > all(select salaire from professeurs where departement = ‘Biologie’); Cette requête retourne tous les instructeurs ayant un salaire supérieur à tous les instructeurs du département de biologie. Note: il est aussi possible d’utiliser >= < <= = et <> avec all 200 est équivalent à: select nom from professeurs where salaire > (select max(salaire) from professeurs where departement = ‘Biologie’); 201 Exercice Que signifie la requête suivante? 202 Comparaison d’ensembles (suite) Les mots clés exists ou not exists permettent de vérifier si le résultat d’une sous-requête retourne un résultat vide ou non. (retourne vrai ou faux). (select sigle from cours as S where annee = 2011 and session =‘hiver’ and exists (select * from cours as T where annee = 2012 and session =‘ete‘ and S.sigle = T.Sigle); Cette requête retourne les sigles des cours offerts à l’hiver 2011 ainsi qu’ à l’été 2012. sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 ete 2012 sigle INFO1000 ete 2012 INFO1003 INFO1003 hiver 2011 INFO1004 automne 2009 203 Tester la présence de doublons Les mots clés unique et not unique permettent de vérifier si le résultat d’une sous-requête contient des doublons ou non. (retourne vrai ou faux) Exemple: Trouver tous les cours offerts au plus une fois en 2012 (peut être offert zéro fois ou 1 fois). (select sigle from cours as T where unique (select R.sigle from cours as R where R.annee = 2012 and T.sigle = R.Sigle); sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 automne 2012 INFO1003 INFO1000 ete 2012 INFO1002 sigle 204 Tester la présence de doublons Exemple: Trouver tous les cours offerts au moins deux fois en 2012 (select sigle from cours as T where not unique (select R.sigle from cours as R where R.annee = 2012 and T.sigle = R.Sigle); sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1003 automne 2012 INFO1000 ete 2012 sigle INFO1000 205 Requête imbriquée dans la clause From Il est aussi possible de placer des requêtes imbriquées dans la clause from des requêtes. Exemple: Trouver le salaire moyen par département des départements où le salaire moyen est supérieur à 42,000 $. Cela est accepté par la plupart des implémentations SQL. 206 Requêtes scalaires Les requêtes retournant une seule valeur peuvent être imbriquées dans select, where et having. Exemple: (select nom_dept, (select count(*) from professeur where departement.nom_dept = professeur.nom_dept) from departement; Cette requête liste les départements avec leur nombre de professeurs. 207 REQUÊTES DE MODIFICATION DE LA BASE DE DONNÉES delete, insert, update… 208 Suppression Une requête de suppression ne peut supprimer que des uplets au complet à partir d’une seule table (on ne peut pas supprimer une partie d’un uplet). Les requêtes de suppression ont la forme: delete from r where C; où r est une seule table et C est une condition. Si la clause where est omise tous les uplets de la table sont supprimés. Exemple 209 delete from cours where session = ‘été’; Table « cours » sigle session annee sigle session annee INFO1000 ete 2012 INFO1002 hiver 2011 INFO1002 hiver 2011 INFO1003 automne 2012 INFO1003 automne 2012 INFO1000 ete 2012 delete from professeurs where salaire between 3500 and 6000; Table « professeurs » nom departement salaire nom departement salaire Jean Chimie 5000 Luc Biologie 3000 Paul Chimie 4000 Martin Biologie 2000 Luc Biologie 3000 Sylvain Math 10000 Martin Biologie 2000 Sylvain Math 10000 211 delete from professeurs where bâtiment in (select batiment from batiments where adresse = ‘1235 connaught’); Table « professeurs » Table « batiments » IDProf bâtiment Nom batiment adresse 123 ABC Paul ABC 1234 rue des pins 456 XYZ Léo XYZ 1235 connaught 678 XHY Luc XHY 1236 mountain road Table « professeurs » Table « batiments » IDProf bâtiment Nom batiment adresse 123 ABC Paul ABC 1234 rue des pins 678 XHY Luc XYZ 1235 connaught XHY 1236 mountain road 212 delete from professeurs where salaire < (select avg(salaire) from professeurs); Table « professeurs » nom departement salaire Jean Chimie 5000 Paul Chimie 4000 Luc Biologie 3000 Martin Biologie 2000 Sylvain Math 10000 Table « professeurs » nom departemen t salaire Jean Chimie 5000 Sylvain Math 10000 Dans cet exemple, le salaire moyen est 4800. 213 Insertion Deux cas: ◦ requête pour insérer un uplet. ◦ requête qui résulte en un ensemble d’uplets à insérer. 214 Exemple 1 – insertion d’un uplet insert into cours values (‘INFO2014’, ‘hiver’, 2012); insert into cours values (‘INFO4018’, ‘hiver’, 2012); Table « cours » Table « cours » sigle session annee sigle session annee INFO1000 ete 2012 INFO1000 ete 2012 INFO1002 hiver 2011 INFO1002 hiver 2011 INFO1003 automne 2012 INFO1003 automne 2012 INFO1000 ete 2012 INFO1000 ete 2012 INFO2014 hiver 2012 INFO4018 hiver 2012 215 Exemple 2 – insertion du résultat d’une requête insert into superviseurs (select nom_employe, 29999 from employes_reguliers where annee_experience >= 5); Table « superviseurs » Table « superviseurs » nom salaire nom salaire Jean 5000 Jean 5000 Paul 4000 Paul 4000 Luc 3000 Luc 3000 Sylvain 10000 Sylvain 10000 Bill 29999 Paul 29999 Table « employes_reguliers » nom_employe annee_experience Mario 1 Simon 4 Bill 5 Paul 7 Cette requête fait la promotion de tous les employé réguliers avec 5 ans ou plus d’expérience et leur donne un salaire de 29999. 216 Exemple 3 Il est possible d’insérer un uplet contenant des valeurs à « null » insert into cours values (‘INFO2014’, ‘hiver’, null); Table « cours » Table « cours » sigle session annee sigle session annee INFO1000 ete 2012 INFO1000 ete 2012 INFO1002 hiver 2011 INFO1002 hiver 2011 INFO1003 automne 2012 INFO1003 automne 2012 INFO1000 ete 2012 INFO1000 ete 2012 INFO2014 hiver null 217 Autres méthodes d’insertion De nombreux SGBD offrent également la possibilité d’insérer de grands volumes de uplets par lot à partir de fichiers textes formatés. Certains SGBD offrent une interface graphique (ex.: Access). 218 Mise à jour des uplets Les mises à jour sont faites avec le motclé update. Exemple: augmenter le coût des items en vente de 10%. update items set prix_unitaire = prix_unitaire * 1.1; Table « items » Table « items » nom prix_unitaire nom prix_unitaire Scie 20.00 Scie 22.00 Marteau 15.00 Marteau 16.50 Tournevis 5.00 Tournevis 5.50 Éclume 200.00 Éclume 220.00 219 Exemple 2: update items set prix_unitaire = prix_unitaire * 1.1; where prix_unitaire < 18; Table « items » Table « items » nom prix_unitaire nom prix_unitaire Scie 20.00 Scie 20.00 Marteau 15.00 Marteau 16.5 Tournevis 5.00 Tournevis 5.50 Éclume 200.00 Éclume 200.00 La clause where d’une requête update peut pratiquement contenir tout ce que la clause where d’une requête select peut contenir. Autre exemple 220 Exemple 3: update items set prix_unitaire = prix_unitaire * 1.1; where prix_unitaire < (select avg(prix_unitaire) from items); Table « items » Table « items » nom prix_unitaire nom prix_unitaire Scie 20.00 Scie 22.00 Marteau 15.00 Marteau 16.5 Tournevis 5.00 Tournevis 5.50 Éclume 200.00 Éclume 200.00 La moyenne des prix unitaire est 60 $ 221 Exemple 4: Supposons qu’on veut augmenter de 10% les prix inférieur ou égal à 15 $ et diminuer de 10% les prix supérieurs à 15 $. update items set prix_unitaire = prix_unitaire * 1.1; where prix_unitaire <= 15; update items set prix_unitaire = prix_unitaire * 0.9; where prix_unitaire > 15; Table « items » Table « items » nom prix_unitaire nom prix_unitaire Scie 20.00 Scie 18 Marteau 15.00 Marteau 14.85 Tournevis 5.00 Tournevis 5.5 Éclume 200.00 Éclume 180.00 Problème! La première requête affecte la seconde! solution 222 Solution: utiliser case update items set prix_unitaire = case when prix_unitaire <=15 then prix_unitaire = prix_unitaire * 1.1 else prix_unitaire = prix_unitaire * 0.9 end; Note: Il est possible d’utiliser plusieurs when …. then…. à l’intérieur de case. 223 Exemple 5: mise à jour en utilisant le résultat d’une requête scalaire update items as I set prix_unitaire = (select avg(R.prix_unitaire) ) from items as R where R.prix_unitaire > I.prix_unitaire); Pour chaque item, mettre à jour son prix comme étant le prix moyen de tous les items ayant un prix supérieur à celui de l’item. 224 LES JOINTURES 225 Les jointures Il existe plusieurs types de jointures. Nous avions vu la jointure naturelle. ◦ Rappel Nous verrons d’autres types de jointures… 226 Rappel - La jointure naturelle Table « Bâtiment » bâtiment adresse ABC 1234 … XYZ 1235 … XHY 1236 … Jointure naturelle: concaténer les uplets de deux relations qui ont les mêmes valeurs pour les attributs ayant le même nom. nom Table « Departement » Informatique adresse ? nom fondation bâtiment Biologie nformatique 1980 ABC Administration Biologie 1970 ABC Administration 1960 XHY 1234 … 1234… 1236… select nom, adresse from batiments natural join departements Note: Ceci est équivalent à: select nom, adresse from batiments, departements where batiments.batiment = departements.batiment. 227 Rappel – La jointure naturelle en spécifiant les attributs à utiliser pour la jointure select nom, titre from (professeurs natural join donne) join cours using (cours.sigle); Le mot-clé join indique de faire une jointure naturelle. Le mot clé using indique avec quel(s) attributs faire la jointure naturelle. 228 La jointure naturelle en spécifiant une condition arbitraire select * from etudiant join inscrit_a on (etudiant.nom = inscrit_a.nom); Le mot-clé join indique de faire une jointure naturelle. Le mot-clé on indique une condition à respecter pour effectuer la jointure naturelle. 229 Les jointures externes (outer joins) Comment écrire une requête pour obtenir la liste de tous les étudiants avec les cours qu’ils ont suivis? Select * from etudiants natural join inscrit_a Non! Cette requête n’affichera pas les étudiants qui ne sont inscrit à aucun cours dans le résultat. Etudiants Matricule nom A00123 Jean A00555 Julie A00777 Paul Inscrit_a Matricule sigle A00123 INFO2014 A00123 INFO4022 A00555 INFO3020 Matricule nom sigle A00123 Jean INFO2014 A00123 Jean INFO4022 A00555 Julie INFO3020 L’étudiant A0777 n’apparaît pas dans les résultats! 230 Les jointures externes (outer joins) La solution: utiliser une jointure externe. Une jointure externe fonctionne comme une jointure naturelle, mais préserve les uplets qui seraient perdus, en ajoutant des valeurs « null » Trois types de jointures externes: ◦ jointure externe à gauche (left outer join): conserve les uplets de la relation nommée en premier. ◦ jointure externe à droite (right outer join): conserve les uplets de la relation nommée en deuxième ◦ jointure externe complète (full outer join): conserve les uplets des deux relations. 231 La jointure externe à gauche Exemple: Select * from etudiants natural left outer join inscrit_a Etudiants Matricule nom A00123 Jean Matricule nom sigle A00555 Julie A00123 Jean INFO2014 A00777 Paul A00123 Jean INFO4022 A00555 Julie INFO3020 A00777 Paul null Inscrit_a nom sigle A00123 INFO2014 A00123 INFO4022 A00555 INFO3020 232 La jointure externe à droite Exemple: Select * from employes natural right outer join projets Employes Matricule nom X123 Luc Matricule nom Titre X555 Antoine X123 Luc Super-projet X888 Sophie X888 Sophie Mon projet null null Projet secret Projets Matricule Titre X123 Super-projet X888 Mon projet null Projet secret 233 La jointure complète Exemple: Select * from employes natural full outer join projets Employes Matricule nom X123 Luc Matricule nom Titre X555 Antoine X123 Luc Super-projet X888 Sophie X888 Sophie Mon projet null null Projet secret X555 Antoine null Projets Matricule Titre X123 Super-projet X888 Mon projet null Projet secret 234 Les jointures externes (suite) Pour aller un peu plus loin… Il est possible d’utiliser la clause « on » pour exprimer une condition sur une jointure externe. Exemple: Select * from etudiants natural left outer join inscrit_a on etudiant.nom = inscrit_a.nom; Ceci équivaut au premier exemple de jointure naturelle. 235 Quelques détails supplémentaires… Note: Si les clause on et where sont utilisées dans une même requête où il y a jointure externe alors seul le on est utilisé pour l’établissement de la jointure. La condition where s’applique après la jointure. Jointures internes Le terme jointure interne (« inner join ») dénote la jointure régulière. Le terme « join » est équivalent à « inner join » Le terme « natural join » est équivalent à « natural inner join » 236 Illustration des jointures jointure naturelle jointure externe à gauche source: w3schools jointure externe à droite jointure complète 237 LES VUES 238 Les vues Comment restreindre l’accès à certaines relations pour certains utilisateurs? Ex.: Un commis doit avoir accès aux noms des employés dans la relation « Employés », mais pas aux salaires. Une solution: créer une vue (une relation « virtuelle ») 239 Les vues (suite) Pour créer une vue, il faut utiliser la syntaxe « create view <nom> as <requête> » Exemple: create view noms_employes as select nom, prenom, departement from employes; 240 Les vues (suite) Une vue est dynamique. Elle n’est pas calculée à l’avance. Elle est calculée seulement quand il y a accès à la vue. Les vues peuvent être utilisées dans des requêtes de la même façon qu’on utiliserait une relation. Exemple: SELECT nom, prenom FROM noms_employes WHERE departement = ‘Informatique’; 241 Les vues (suite) Certaines bases de données vont permettre de créer des « vues matérialisées » où la vue est stockée et mise à jour s’il y a changements aux relations utilisées dans la définition de la vue. Le mécanisme de mise à jour dépend du SGBD. 242 CONCLUSION - SQL 243 En résumé SQL permet de définir le schéma des relations. ◦ noms de relations, attributs, types d’attributs… ◦ renommer les attributs et relations SQL permet d’interroger une BD. ◦ ◦ ◦ ◦ select, from where, jointures, … opérations ensemblistes (union, …) requêtes imbriquées, valeurs « null », tri des résultats, fonctions d’agrégation, SQL permet de mettre à jour une BD. ◦ insertion, suppression, mise à jour. 244 Microsoft Access Microsoft Access ne supporte pas le mot clé « natural join ». Pourquoi? La jointure naturelle est implicite, ce qui peut générer des erreurs si la structure des tables est changée. Plutôt que d’utiliser « natural join », on peut utiliser inner join avec Access, ce qui permet de spécifier les attributs à utiliser pour la jointure. Exemple: SELECT Fournisseurs.Nom_fournisseur, Regions.Nom_region FROM Regions INNER JOIN Fournisseurs ON Regions.code_region = Fournisseurs.code_région; 250 Microsoft Access (suite) Access n’offre pas Except, Intersect… Pour augmenter la taille de la police pour les requêtes SQL dans Access: ◦ Fichier > Options > Concepteurs d’objets > Création de requêtes > Taille de police Il n’y a pas de bouton « Annuler » dans Access. Il est préférable de ne pas utiliser d’espace dans les noms des attributs et des relations (le souligné _ peut être utilisé). Pour le devoir, attention aux accents et aux lettres minuscules et majuscules dans les noms des attributs. 251 Bibliographie Chap. 1, 2, 3 et 4. Silberschatz, Korth et Sudarshan, Database System concepts, Sixth edition, New York, McGraw-Hill, 2010. 252