Faculté I&C, Claude Petitpierre, André Maurer Bases de données SQL (Structured Query Language)
Faculté I&C, Claude Petitpierre, André Maurer Une base de données contient des tables idvregioncepageannee 1Lavauxchasselas2005 3Chiantisangiovese2002 2Bourgognepinot noir2000 Le nom et le type de chaque colonne est défini par lutilisateur.
Faculté I&C, Claude Petitpierre, André Maurer Chaque colonne a un nom Chaque ligne correspond à un objet Lid est une colonne définie par lutilisateur idvregioncepageannee 1Lavauxchasselas2005 3Chiantisangiovese2002 2Bourgognepinot noir2000
Faculté I&C, Claude Petitpierre, André Maurer On crée, remplit et affiche les lignes de la table au moyen du langage SQL create table vins (idv int auto_increment primary key, region varchar (20), cepage varchar (20), annee int) insert into vins values (0, 'Chianti', 'sangiovese', null) insert into vins set idv=0, region='Bourgogne' select * from vins
Faculté I&C, Claude Petitpierre, André Maurer Primary key idv int auto_increment primary key int - le champ contient un entier auto_increment - chaque fois quon crée une ligne contenant un id 0, une nouvelle valeur unique est insérée primary key - peut être utilisée pour identifier un objet de façon sûre (unique et structurée pour un accès rapide)
Faculté I&C, Claude Petitpierre, André Maurer Création dune table varchar(20) - String de 20 caractères au maximum create table vins (idv int auto_increment primary key, region varchar (20), cepage varchar (20), annee int)
Faculté I&C, Claude Petitpierre, André Maurer Insertion insert into vins values (0, 'Lavaux', null, 2005) Introduit une nouvelle ligne dans la table vins. Entre les parenthèses de values doivent apparaître une valeur par colonne et dans lordre. Si lon ne veut pas introduire une colonne particulière à linsertion, on peut introduire null.
Faculté I&C, Claude Petitpierre, André Maurer Insertion, deuxième forme insert into vins set idv=0, region='Bourgogne' le set est formé dune séquence de couples nom_de_colonne – valeur Il peut manquer des colonnes
Faculté I&C, Claude Petitpierre, André Maurer Lecture des données select * from vins select vins.idv, cepage from vins Après le select, on peut introduire une * (toutes les colonnes) ou une liste de champs de la table. Sil ny a quune table impliquée dans la commande, il ny a pas besoin de faire précéder le nom du champ par le nom de la table (comme cepage).
Faculté I&C, Claude Petitpierre, André Maurer Lecture de données déterminées select * from vins where annee>2003 select vins.idv, cepage from vins where cepage=chasselas and annee<2000 Après where, on peut introduire une expression contenant des constantes et des champs des tables
Faculté I&C, Claude Petitpierre, André Maurer Mise à jour de lignes update vins set annee=1999, cepage=viogner where idv = 2 update vins set annee=annee+1 where idv = 2
Faculté I&C, Claude Petitpierre, André Maurer Libraries pour appels depuis Javascript
Faculté I&C, Claude Petitpierre, André Maurer Appels depuis Javascript var result = database.query("select * from vins") // au retour de la query, result contient un tableau dobjets [ {idv:1,cepage:chasselas,region:Lavaux,annee:2005}, {id:2,cepage:sangiovese,annee:2002}, {id:3, region:Bourgogne} ] // Les champs nulls napparaissent pas dans lobjet.
Faculté I&C, Claude Petitpierre, André Maurer Accès aux champs [ {idv:1,cepage:chasselas...},{id:2,ccepage:...},{id:3} ] result[0].idv result[0].cepage result[0].region result[1].idv result[1].cepage result[1].region result[2].idv result[2].cepage result[2].region result.length lignes
Faculté I&C, Claude Petitpierre, André Maurer Accès aux champs [ {idv:1,cepage:chasselas...},{id:2,ccepage:...},{id:3} ] Si un champ, par exemple result[0].cepage, nest pas défini, on a typeof result[0].cepage == undefined Sil ny a quune ligne, elle est quand même placée dans [ ]
Faculté I&C, Claude Petitpierre, André Maurer Lecture dun objet var result = [ {'a':2, 'b':3} ] for ( key in result [0] ) { document.write( result [0] [key] ) } document.close()
Faculté I&C, Claude Petitpierre, André Maurer Traitement des erreurs var result try { result = database.query("select * from vins") } catch(e) { alert(Erreur: +e) return } // continue ici, en cas de succès if (result.length==0) { // pas de ligne retournée }
Faculté I&C, Claude Petitpierre, André Maurer Passage de paramètres var an=2003, cep=chasselas var result = database.query( "select * from vins where annee=? and cepage=?", an, cep ) // Le premier paramètre de query est la string contenant la // commande SQL // Un nombre arbitraire de paramètres suivent. Chaque // paramètre (nombre ou string) remplace un ?
Faculté I&C, Claude Petitpierre, André Maurer Tableau de valeurs var data = [0, Barolo, nebbiolo, null] var result = database. query( 'insert into vins values (?), data ) // data étant un array, le ? est remplacé par les // valeurs de data séparées par des virgules // comme cette query est une action, result reçoit le // nombre de lignes modifiées: 1
Faculté I&C, Claude Petitpierre, André Maurer Objet en paramètre var vin = {'region':'Bordeaux', 'cepage':'merlot'} var result = database. query( 'insert into vins set ?, vin ) // vin étant un objet, le ? est remplacé par les couples // nom-valeur de vin séparés par des virgules // result contient le nombre de lignes introduites: 1 // la clé primaire est générée automatiquement; on peut obtenir // sa valeur en appelant (après la query): idNb = database.last_insert_id()
Faculté I&C, Claude Petitpierre, André Maurer Points dinterrogation Il peut y avoir plusieurs ? A chaque ? doit correspondre un argument (il peut y en avoir plusieurs après la query) Un ? peut être remplacé par –un entier ou un réel –une string –un tableau –un objet Evidemment, lordre des paramètres doit correspondre aux ?, le système ne teste pas sil est pertinent
Faculté I&C, Claude Petitpierre, André Maurer Trois façons de construire un objet Javascript unVin = {idv:0, Valais, cepage:chasselas, annee:2004} function Vin(a, b, c) { this.idv = 0 this.region = a this.cepage = b this.annee = c } v = new Vin(Meursault, chard) v.annee = 1999 var vin = { } vin.idv = 0 vin.region = Valais vin.cepage = chasselas vin.annee = 2004
Faculté I&C, Claude Petitpierre, André Maurer Relations: vins reliés à un marchand idvregioncepageanneemarchand 1Lavauxchasselas Chiantisangiovese Bourgognepinot noir20001 idmnom 1Jean 3Luc Vins Marchands
Faculté I&C, Claude Petitpierre, André Maurer Liste des vins offerts par Luc select vins.* from vins, marchands where vins.marchand=marchands.idm and marchands.nom='Luc' idvregioncepageanneemarchandidmnom 1Lavauxchasselas200531Jean 2Chiantisangiovese200231Jean 3Bourgognepinot noir200011Jean 1Lavauxchasselas200533Luc 2Chiantisangiovese200233Luc 3Bourgognepinot noir200013Luc vins, marchands (join)
Faculté I&C, Claude Petitpierre, André Maurer Si un marchand peut fournir plusieurs vins et chaque vin peut être fourni par plusieurs marchands idmnom 1Jean 2Marc 3Luc idvregioncepageannee 1Lavauxchasselas2005 2Chiantisangiovese2002 3Bourgognepinot noir2000 idmidv vins vinsXmarchands marchands
Faculté I&C, Claude Petitpierre, André Maurer Le numéro du fournisseur du Lavaux puis son nom se lect vinsXmarchands.idm from vins, vinsXmarchands where vins.region=Lavaux and vins.idv=vinsXmarchands.idv noMarchand select marchands.nom from marchands where marchands.idm=noMarchand Jean
Faculté I&C, Claude Petitpierre, André Maurer Les vins fournis par Luc select idm from marchands where marchands.nom=Luc noLuc select vins.* from vins, vinsXmarchands where vins.idv=vinsXmarchands.idv and vinsXmarchands.idm=noLuc
Faculté I&C, Claude Petitpierre, André Maurer Les vins fournis par Luc (un seul select) select vins.* from vins, marchands, vinsXmarchands where vins.idv=vinsXmarchands.idv and marchands.idm=vinsXmarchands.idm == sur la même ligne and marchands.nom=Luc // en Javascript function findMarchandByNom(nom) { return database.query(select vins* from vins, marchands, +vinsXmarchands where vins.idv=vinsXmarchands.idv +and marchands.idm=vinsXmarchands.idm +and marchands.nom=?, nom) }
Faculté I&C, Claude Petitpierre, André Maurer Schéma E/R (entité-relation) MarchandsVins fournit 0..n Stock n 1
Faculté I&C, Claude Petitpierre, André Maurer Exercices 1.Charger la page puis cliquez chaque ligne (éventuellement en cliquant le select * entre chaque ligne) Essayez de modifier quelques ligneshttp://lti.epfl.ch/LemanOS/database/SQL.html 2.Créez les tableaux de vins et de marchands des derniers transparents précédents et affichez les vins dun marchand et les marchands qui fournissent un vin particulier. 3.Mettez vos requêtes dans une fonction dans le fichier préparé à cet effet.