Informatique générale pour l ingénieur Introduction aux bases de données Partie I : Généralités - Organisation du stockage des données Introduction Un annuaire, le système Visiocolle qui gère les notes en CPGE dans notre lycée, ou le répertoire-client d une pizzeria, tous ces systèmes stockent une information riche, multiforme (nom, adresse, note, date...), et non hiérarchisée ( il est aussi important que de savoir que monsieur Gaston habite au 34 rue des boulets que de savoir madame Lucienne a commandé une Quatre fromage) Pour ce genre de situation, le stockage dans un tableur (c'est-à-dire avec une feuille de calcul comme dans Excel) n est pas la bonne façon d organiser les informations. En fait, on va répartir les informations entre différents tableaux (que l on appellera tables) que l on reliera entre eux. Pour gérer le stock d informations de façon transparente pour l utilisateur, on fera appel à un SGBD (Système de gestion de Base de Données). Cet outil est un ensemble de routines informatiques qui permettent d une part de structurer le stockage de l information et d autre part de créer des procédures d interrogation de la base de données. Il existe de nombreux SGBD (SQLite, MySQL, PostgreSQL ) qui, avec quelques nuances, fonctionnent tous sur un langage spécifique adapté aux bases de données le SQL (Structured Query Language). Ces systèmes ne fournissent pour la plupart que des outils rudimentaires pour interagir avec eux (on entre les commandes de manière textuelle en ligne de commande) aussi, pour en faciliter l utilisation, des interfaces graphiques ont été créées. Dans ce cours d introduction, le SGBD choisi sera SQLite et l interface graphique sera au choix soit l outil SQLite manager de Firefox.(version 0.8.0 ou supérieure) soit le petit logiciel Sqliteman. Dans un premier temps, on va s intéresser à l organisation du stockage de données (la structure de données) puis on s intéressera à la façon d interroger, d exploiter la base de données. I. Organisation des données : un peu de théorie a. Premières définitions Une base de données est un ensemble structuré de données informatiques dans lequel : - les données sont enregistrées sur un support permanent - chaque objet ou entité possède un identifiant unique Une base de données relationnelle est une base de données formée d un ensemble de tables. Une table est un ensemble de p-ulplets Les éléments p-ulplets sont appelés des attributs (on dit aussi champs). Chaque attribut est d un type particulier (entier, texte ). Le domaine de l attribut est le domaine de définition de l attribut (exemple pour un entier non nul c est N*) Remarque : Reprise de ces définitions avec un vocabulaire plus mathématiques 1 : 1 Pour ceux qui voudraient lire des mathématiques associées aux bases de données. 1
On appelle schéma S d une relation, l expression qui spécifie la forme du p-uplet : S = (A1,..,Ap) où les attributs Ai sont distincts deux à deux. On pourra noter S = ((A1,dom(A1),..,(Ap,dom(Ap))) pour rappeler les domaines de définition des différents attributs. On appelle relation (= table ) un ensemble fini de p-uplets de dom(a1) x x dom(ap). Les éléments de la relation sont appelées des valeurs de la relation ce qui s appelle aussi des enregistrements dans le vocabulaire des utilisateurs de bases de données. Leur nombre est appelé le cardinal de la relation. b. Exemple Voyons un exemple pour fixer les idées. Fuxendi a ouvert une filiale de vente de pizza à distance Pizzafuxa. On se propose de réaliser sa base de données. La table clients est l annuaire des clients de Pizzafuxa. Table clients numcli nom tel adresse ville codepostal On a, dans cette table, 6 attributs. nom est une chaine de caractère tel, adresse, ville aussi. (remarque : éviter les accents et les caractères spéciaux) codepostal est un entier numcli est par exemple un entier qui donne le numéro du client c. Définitions complémentaires Dans une table on doit pouvoir retrouver facilement un enregistrement à l aide de la valeur d un ou plusieurs de ses attributs. On appelle clé d une relation un sous ensemble minimal d attributs qui donne accès à un et un seul enregistrement de la table. Exemple : le nom du client ne suffit pas pour retrouver un client donné, plusieurs familles de la même ville pouvant avoir le même nom de famille. Le couple nom,prénom, lui, fournit une quasi-clé qui fonctionne dans la plupart des cas. (mais c est pas parfait il reste le cas des homonymes ) S il est nécessaire de combiner plusieurs attributs de la table pour faire une clé on dit que cette clé est composite. C est une situation qu on essaie d éviter. clé primaire : c est une clé choisie parmi tous les clés possibles. (Les clés non primaires sont secondaires) identifiant : une clé primaire formée avec un attribut unique. Il est recommandé de le choisir comme non sémantique c'est-à-dire introduit dans la table au seul fin d être une clé. C est ce qui a été fait avec l attribut numcli. Un autre exemple est votre numéro INSEE. clé étrangère : c est une clé qui fait référence à la clé primaire d une autre table de la base. Par exemple dans notre base Pizzafuxa il y aura une table commandes dont l un des attribut sera le numcli de la table clients ; cet attribut sera pour la table commande une clé étrangère. Une étape importante de la mise en place d une base de données est sa conceptualisation c'est-à-dire la détermination de la façon la plus pertinente de répartir les informations entre plusieurs tables. Il existe des méthodes pour rationnaliser cette conceptualisation mais elles relèvent d un cours avancé et ne seront pas abordées ici. 2
II. Création pratique d une base de données Dans un premier temps, on pourrait travailler en ligne de commande mais ce n est pas convivial et en pratique on travaille avec une interface graphique. Pour nous, nous utiliserons au choix Sqilteman ou SQLite Manager. Les instructions SQL à écrire sont les mêmes quelque soit l interface ce qui change c est juste la présentation des menus et l affichage. A. Travail à travers Sqliteman 1. Création de tables Tout d abord, on crée une base de données pizzafux1.sqlite. par Fichier > Nouveau > puis on crée la base à l endroit voulu. Ici le Bureau. Vocab : les instructions SQL s appelle des requêtes. On va faire ici une requête de création de table. On crée ensuite la table clients en entrant la commande suivante dans la fenêtre SQL CREATE TABLE clients (numcli INTEGER PRIMARY KEY NOT NULL, nom VARCHAR(20), tel VARCHAR(10), adresse TEXT, ville VARCHAR(30), codepostal INTEGER) ; Rem : Si une instruction est trop longue on passe à la ligne par un retour chariot. Autre exemple plus étoffé 2 : CREATE TABLE clients ( id INTEGER PRIMARY KEY NOT NULL, nom VARCHAR (100), prenom VARCHAR(100), email VARCHAR(255), date_naissance DATE, pays VARCHAR(255), ville VARCHAR(255), code_postal VARCHAR(5), ) ; Voici des explications sur les colonnes créées : id : identifiant unique qui est utilisé comme clé primaire et qui n est pas nulle nom : nom de l utilisateur dans une colonne de type VARCHAR avec un maximum de 100 caractères au maximum prenom : idem mais pour le prénom email : adresse email enregistré sous 255 caractères au maximum date_naissance : date de naissance enregistré au format AAAA-MM-JJ (exemple : 1973-11-17) pays : nom du pays de l utilisateur sous 255 caractères au maximum ville : idem pour la ville code_postal : 5 caractères du code postal 2 Récupéré sur le site : http://sql.sh jetez un œil, il ya de bons exemples.. 3
2. Remplissage d une table Apres avoir créé une table, il faut la remplir. L insertion de données dans une table s effectue à l aide de la commande INSERT INTO.. VALUES. Cette commande permet au choix d inclure une seule ligne à la base existante ou plusieurs lignes d un coup. Insertion d une ligne à la fois Pour insérer des données dans une base, il y a 2 syntaxes principales : 1) Insérer une ligne en spécifiant toutes les colonnes La syntaxe pour remplir une ligne avec cette méthode est la suivante : INSERT INTO table VALUES ('valeur 1', 'valeur 2',...) ; Cette syntaxe possède les avantages et inconvénients suivants : Obliger de remplir toutes les données, tout en respectant l ordre des colonnes Il n y a pas le nom de colonne, donc les fautes de frappe sont limitées. Par ailleurs, les colonnes peuvent être renommées sans avoir à changer la requête L ordre des colonnes doit rester identique sinon certaines valeurs prennent le risque d être complétée dans la mauvaise colonne Rentrons par cette méthode le premier client INSERT INTO clients VALUES (1, Guillo', 0612349875, 34 rue des boulets, Paris,75015) ; 2) Insérer une ligne en spécifiant seulement les colonnes souhaitées Cette deuxième solution est très similaire, excepté qu il faut indiquer le nom des colonnes avant «VALUES». La syntaxe est la suivante : INSERT INTO table (nom_colonne_1, nom_colonne_2,... VALUES ('valeur 1', 'valeur 2',...); A noter : il est possible de ne pas renseigner toutes les colonnes. De plus, l ordre des colonnes n est pas important. B. Travail à travers SQLite Manager On peut aussi travailler avec comme interface graphique l outil SQLite Manager que l on lance à partir de Firefox. 4
Insertion de plusieurs lignes à la fois 3 Il est possible d ajouter plusieurs lignes à un tableau avec une seule requête. Pour ce faire, il convient d utiliser la syntaxe illustrée par l exemple suivant qui continue le remplissage de notre table clients. INSERT INTO clients (numcli, nom, tel, adresse, ville, codepostal) VALUES (2, 'Roudier', '0123456789', '22 rue Cauchy', 'Paris',75019), (3, 'Curie', '0123498765', '33 Avenue du Parc', 'Sceaux',92123), (4, 'Zidane', '0199807120', '30 Place du Bresil', 'Paris', 75016), (5, 'Pridieu', '', '1 place Notre Dame', 'Paris', 75001) ; A noter : lorsque le champ à remplir est de type VARCHAR ou TEXT il faut indiquer le texte entre guillemet simple. En revanche, lorsque la colonne est un numérique tel que INTEGER on écrit directement. Ouvrons notre base de données et prenons quelques minutes pour faire le tour des menus. Voila à quoi cela doit ressembler la table clients. En utilisant l interface, on va créer une table menu regroupant les caractéristiques des pizzas vendues. On utilise le menu Table > Créer une table. On adapte les réglages. 3 Cette fonctionnalité ne semble pas encore implémentée avec Sqliteman mais marche avec SQLitemanager et en ligne de commande. 5
La requête SQL est alors automatiquement générée et exécutée après confirmation CREATE TABLE "menu" ("plaid" INTEGER PRIMARY KEY NOT NULL, "nompizza" VARCHAR(30), "desc" TEXT, "prix" REAL); Il n a plus qu à remplir toujours à l aide de l interface. (Une entrée = un enregistrement de la table) Voyons tout d abord l ajout d une entrée unique Là aussi, la requête SQL est alors automatiquement générée et exécutée après confirmation L importation automatique de nombreuses données peut se faire à partir d un fichier texte. En effet, l interface permet de remplir facilement une table en important un fichier csv qui a la bonne structure. C est que nous allons faire. On a un fichier menu.csv qui contient les infos sur les pizzas proposées à la vente. On va successivement : 1. Détruire la table menu que nous venons de créer pour partir de zéro. Avec la commande SQL Ou avec l interface graphique DROP TABLE menu 6
2. Utilisons l Import Wizard (S il n apparait pas faire Base de données> Importer). On utilise le fichier menu.csv qui contient le menu. Les champs y sont séparés par des virgules et les entêtes = nom des attributs ne sont pas données (ce sont dans l ordre : plaid, nompizza, prix, desc). On entre les caractéristiques des attributs. (Attention on a changé l ordre de desc et de prix par rapport à la table menu précédente) Et hop!... c est fait. C. Problème des clés étrangères Voyons cela sur un exemple. On se propose de créer une dernière table : la table commande qui va contenir les commandes de pizzas faite par les clients. Cette table aura pour schéma Table commandes numcom cli piz date Domaine des attributs (= type) numcom : INTEGER clé primaire non null : cli est une clé etrangère qui renvoie à numcli de clients date: DATE le format retenu est le format anglosaxon AAAAMMJJ piz est une clé etrangère qui renvoie à plaid de menu 7
La syntaxe est la suivante : CREATE TABLE commandes ("numcom" INTEGER PRIMARY KEY NOT NULL UNIQUE, "cli" INTEGER, "piz" INTEGER, "date" DATE, FOREIGN KEY(cli) REFERENCES clients(numcli), FOREIGN KEY(piz) REFERENCES menu(platid)) On obtient ainsi le schéma relationnel de la base plaid nompizza desc prix numcom cli piz date numcli nom tel adresse ville codepostal D. Modification des tables 1. Modification de structure La commande ALTER TABLE en SQL permet de modifier une table existante. Il est ainsi possible d ajouter une colonne, d en supprimer une ou de modifier une colonne existante, par exemple pour changer le type. D une manière générale, la commande s utilise de la manière suivante: ALTER TABLE nom_table instruction Le mot-clé «insctruction» ici sert à désigner une commande supplémentaire, qui sera détaillée ci-dessous selon l action que l ont souhaite effectuer : ajouter, supprimer ou modifier une colonne. Exemples : a) L ajout d une peut s effectuer à l aide d une requête ressemblant à ceci: b) La suppression d une colonne dans une table 2. Modification de contenu ALTER TABLE nom_table ADD nom_colonne type_donnees ALTER TABLE nom_table DROP nom_colonne La commande UPDATE permet d effectuer des modifications sur des lignes existantes. Très souvent cette commande est utilisée avec WHERE pour spécifier sur quelles lignes doivent porter la ou les modifications. La syntaxe basique d une requête utilisant UPDATE est la suivante : 8
UPDATE nom_table SET nom_colonne_1 = nouvelle valeur WHERE condition Cette instruction permet d attribuer une nouvelle valeur à la colonne nom_colonne_1 pour les lignes qui respectent la condition stipulé avec WHERE. Il est aussi possible d attribuer la même valeur à la colonne nom_colonne_1 pour toutes les lignes d une table si la condition WHERE n était pas utilisée. A noter, pour spécifier en une seule fois plusieurs modifications, il faut séparer les attributions de valeur par des virgules. Ainsi la syntaxe deviendrait la suivante : UPDATE nom_table SET colonne_1 = valeur 1, colonne_2 = valeur 2, colonne_3 = valeur 3 WHERE condition Exemple : Pour changer les coordonnées de monsieur Roudier qui est parti en vacances. UPDATE clients SET adresse = '49 Rue des Gendarmes',ville='Saint-tropez', codepostal=83990 WHERE nom='roudier' Bilan à la fin de ce poly on doit avoir 3 tables Les tables clients et menu ressemblent à : 9