TP base de données SQLite 1 Différents choix possibles et choix de SQLite : La plupart des logiciels de gestion de base de données fonctionnent à l aide d un serveur. Ils demandent donc une installation plus importante. Nous nous contenterons ici de SQLite, qui ne demande qu une installation très rapide et de son interface SQLite Manager qui s installe comme outil (plugin) de Firefox. Pour installer SQLite chez vous : http ://www.sqlite.org, puis pour SQLite Manager : installer Firefox si vous ne l avez pas puis installer le module SQLite Manager à partir du menu Outils. 2 Définir une base de donnée avec SQLite Manager Pour lancer SQLite Manager : Lancer Firefox puis dans le menu Outil, sélectionner SQLite Manager. 2.1 Définition d un schéma relationnel simple avec une clé primaire Dans le Menu Base de donnée sélectionner : nouvelle base de donnée Une fenêtre s ouvre : donner un nom à votre base de donnée. Disons que vous voulez créer une base eleve analogue à celles vues en cours. Une fois que vous lui avez donné un nom et sélectionné un endroit pour l enregistrer : Dans le Menu Table sélectionner : créer une table. Une fenêtre s ouvre dans laquelle vous allez pouvoir créer vos différents attributs. Ici : prénom avec le domaine (Datatype) VARCHAR (chaîne de caractères) : on peut indiquer une longueur maximum pour la chaîne par exemple VARCHAR(20), datenaissance avec pour domaine INT (noter qu il existe aussi un type DATETIME), sexe avec pour domaine VARCHAR(1) : un seul caractère. En cochant vous pouvez définir la clé primaire (primary key) : vous notez qu alors les attributs correspondant à la clé primaire ne peuvent pas être vide (Non Null) Lorsque vous validez vous obtenez le code sql correspondant à votre définition de schéma relationnel. 2.2 Remplissage de la table A gauche de votre fenêtre de Sqlite Manager, apparaissent les tables présentes en mémoire. A ce stade comme vous n avez créé qu une table eleve, elle est seule à apparaître. En la sélectionnant, vous pouvez la remplir avec le bouton Ajouter une nouvelle entrée. 1
3 Lecture et premières requêtes sur une base plus riche 3.1 Lecture d une base de données Récupérer le fichier : hotel.sqlite dans /profs/bondil/public/ Pour charger le fichier hotel.sqlite dans SQLite Manager, dans le menu Base de données sélectionner Connecter la base de données. Vous voyez apparaître les 8 tables contenues dans cette base. Trois d entre elles (eleves, notes, cours) ne nous concerneront pas pour ce TP. Nous allons utiliser les 5 tables qui concernent une agence de Tourisme. Par commodité, voici les schémas de ces 5 tables de Tourisme, sur papier : resorts (station en anglais) : (ns,noms,types,capch) : la station de numéro ns a pour nom noms, est de type types (mer ou montagne), et a une capacité de capch chambres au total. hotels (hôtels en anglais) : (ns,nh,nomh,adrh,telh,cath,deb,fin,nbch) : l hôtel de numéro nh se trouve dans la station de numéro ns, a pour nom nomh, a nbch chambres, se trouve à l adresse adrh, a pour téléphone telh, est de catégorie cath (nombre d étoiles) et est ouvert de deb à fin. rooms : (ns,nh,nch,typch,prix) : la chambre numéro nch de l hôtel numéro nh est de type typch (S=Simple,D=douche,DWC= douche et WC,SDB=salle de bain) et coûte prix euros. guests : (ncl,nomcl,adrcl,telcl) : le client numéro ncl a pour nom nomcl, pour adresse adrcl, avec pour téléphone telcl. bookings : (ns,nh,nch,jour,ncl) la chambre numéro nch de l hôtel numéro nh de la station numéro ns est occupé le jour Jour par le client de numéro ncl. 3.2 Requêtes en algèbre relationnelle (TD) et en SQL (TP) Ecrire en utilisant l algèbre relationnelle (TD) et en langage SQL (TP) les requêtes suivantes. Pour entrer ces requêtes et les exécuter avec SQLite Manager cliquer sur Executer le SQL (R1) Liste des numéros et noms des stations de montagne avec leur capacité en chambres. Vérif. : On doit obtenir six réponses Rappel du cours : en SQL : SELECT... FROM... WHERE (R2) Liste des noms des hôtels trois étoiles et quatre étoiles. Vérif. : On doit obtenir 31 réponses. Attention : a priori nomh n est pas une clé primaire... il se pourrait que plusieurs hotels aient le même nom. Dans ce cas, il seront répétés dans la liste, ce qui ne la rend pas très précise. Une vraie liste précise rajouterait les clefs primaires ns,nh de Hotels. Pour voir combien il y a de noms d hôtels distincts dans la réponse à votre requête (R2) remplacer SELECT par SELECT DISTINCT. Mais ce faisant, vous perdrez ici de l information... (R3) Liste des noms et des numéros des hôtels avec leur adresse, tél., catégorie, se trouvant dans une station balnéaire. Indication : Attention, il y a deux tables à croiser... car le caractère balnéaire d une station ne se voit pas dans la table hôtel. Vérif. : On doit obtenir 37 réponses. (R4) Liste des noms des stations au bord de la mer ayant des hôtels 4 étoiles. N.B. Vous obtiendrez quatre résultats avec une entrée qui apparaît deux fois. Ceci vient du fait que, contrairement à la déf. théorique de l algèbre relationnelle, en SQL les tables acceptent les doublons. Pour éviter les doublons, utiliser la requête SELECT DISTINCT (R5) Liste des noms et adresses des clients dont l adresse est un hôtel. Vérif. : 2 réponses. (R6) Liste des noms et adresses des clients ayant réservé à la montagne. 2
Remarque : Ici deux jointures. En fait la jointure naturelle est associative. Vérif. : 889 réponses. A partir de maintenant, on ne demande pas l écriture en algèbre relationnelle, seulement le SQL pour l instant. (R7) Liste (sans répétitions) des hôtels avec leur nom, adresse, numéro de station ayant au moins une chambre de réservée et liste des hotels n ayant aucune chambre de réservée. Vérif. : 77 réponses et 1 réponse. Indication : On pourra, pour coder la différence d ensembles, utiliser la commande EXCEPT entre deux tables. On peut aussi utiliser la commande NOT IN. (R8) Liste des hôtels avec leur numéro, numéro de station, nom, adresse, dont toutes les chambres ont un prix inférieur à 40 euros. Vérif. 31 réponses. (R9) Prix de la chambre la moins chère située dans un hôtel trois étoile d une station balnéaire? Vérif. 65 euros. 3
TP base de données SQLite : solutions des requêtes (R1) Liste des numéros et noms des stations de montagne avec leur capacité en chambres. En SQL : SELECT ns, noms, capch FROM resorts WHERE types= montagne (R2) Liste des noms des hôtels trois étoiles et quatre étoiles avec leur numéro de station. On n utilise que la base hotels. En SQL : SELECT nomh,ns, FROM hotels WHERE cath=3 OR cath=4 (R3) Liste des noms des hôtels avec leur adresse, tél., catégorie, se trouvant dans une station balnéaire. Code SQL correspondant : SELECT h.nomh,h.adrh,h.telh,h.cath FROM resorts r, hotels h WHERE r.ns=h.ns AND r.types= mer Variante avec la commande JOIN : SELECT h.nomh,h.adrh,h.telh,h.cath FROM resorts r JOIN hotels h ON r.ns=h.ns WHERE r.types= mer (R4) Liste des noms des stations au bord de la mer ayant des hôtels 4 étoiles. Code SQL correspondant : SELECT r.noms FROM resorts r, hotels h WHERE r.ns=h.ns AND r.types= mer AND cath=4 Mais pour éviter les doublons, on a besoin de : SELECT DISTINCT r.noms FROM resorts r, hotels h WHERE r.ns=h.ns AND r.types= mer AND cath=4 (R5) Liste des noms et adresses des clients dont l adresse est un hôtel. En SQL : SELECT DISTINCT g.nomcl, g.adrcl FROM Guests g, Hotels h WHERE g.adrcl=h.adrh (R6) Liste des noms et adresses des clients ayant réservé à la montagne. Code SQL : SELECT DISTINCT g.nomcl,g.adrcl FROM resorts r, bookings b, guests g WHERE r.ns=b.ns AND g.ncl=b.ncl AND r.types= montagne 1
TD base de données : requêtes en algèbre relationnelle (R1) Liste des numéros et noms des stations de montagne avec leur capacité en chambres. En algèbre relationnelle : π ns,noms,capch (σ types= montagne (resorts)). (R2) Liste des noms des hôtels trois étoiles et quatre étoiles avec leur numéro de station. On n utilise que la base hotels. Seulement il faut faire la REUNION de deux sélections. En algèbre relationnelle : π nomh,ns (σ cath=3 (hotels) σ cath=4 (hotels)). (R3) Liste des noms des hôtels avec leur adresse, tél., catégorie, se trouvant dans une station balnéaire. Première étape : On doit d abord à partir de la table resorts sélectionner les stations balnéaires c est à dire considérer σ types=mer (resorts). Deuxième étape : On doit créer une table à partir des tables hotels et resorts car le type de la station n apparaît pas dans hotels : ce qui relie les deux tables est l attribut ns (nom station). On considère donc la jointure hotels hotels.ns=resorts.ns (σ types=mer (resorts)) Troisième étape : on la projette sur les attributs demandés. Au total, le résultat en terme d algèbre relationnelle s écrit : π nomh,adrh,telh,cath (hotels hotels.ns=resorts.ns (σ types=mer (resorts))) (R4) Liste des noms des stations au bord de la mer ayant des hôtels 4 étoiles. On doit d un côté fabriquer la table des hôtels 4 étoiles : par sélection à partir de hotels De l autre côte fabriquer la table des stations au bord de la mer par sélection à partir de resorts On doit enfin faire la jointure de ces deux tables à partir de l égalité des numéros des stations. (R5) Liste des noms et adresses des clients dont l adresse est un hôtel. Encore une jointure :GUESTS guests.adrcl=hotels.adrh HOTELS Et l on projette avec π NomCl, AdrCl. (R6) Liste des noms et adresses des clients ayant réservé à la montagne. L énoncé mêle les mots clients, réservé, montagne ce qui fait naturellement intervenir les trois tables Guests, Bookings, Resorts. D abord : - Jointure entre la table bookings et la sélection de la table resorts pour avoir les réservation à la montagne via le ns. Autrement dit : σ types=montagne (resorts) resorts.ns=bookings.ns bookings -Puis, jointure entre cette table et la table client : via ncl. La formule finale est : π nomcl,adrcl (σ types=montagne (resorts) resorts.ns=bookings.ns bookings bookings.ncl=guests.ncl guests). 2
Suite TP base de données SQLite : encore des requêtes Solutions des dernières requêtes (R8) et (R9) (R8) Liste des hôtels avec leur numéro, numéro de station, nom, adresse, dont toutes les chambres ont un prix inférieur à 40 euros. Vérif. 31 réponses. Une solution avec un HAVING : SELECT h.ns, h.nh, h.nomh, h.adrh FROM Hotels h, Rooms r WHERE h.ns=r.ns AND h.nh=r.nh GROUP BY h.ns, h.nh, h.nomh, h.adrh HAVING MAX(r.prix)<40 Sans utiliser d opérateur d agrégation comme le MAX, on peut écrire une requête, qui, en algèbre relationnelle s écrirait ainsi : π ns,nh,adrh,cath (Hotels) hotels1.ns=hotels2.ns hotels1.ns=hotels2.nh (π ns,nh (hotels) π ns,nh (σ prix>40 (Rooms))). Commentaires : la raison d être de la différence ensembliste : en sélection dans Rooms les chambres dont le prix est supérieur à 40 euros et on projetant, on a la liste des numéros des hôtels ayant au moins une chambre dont le prix est supérieur à 40 euros. En prenant le complémentaire, on a la liste des numéros des hôtels dont toutes les chambres ont un prix inférieur à 40 euros. on peut ne pas marquer les conditions de jointure : la jointure sur fait sur la clé primaire des deux tables, c est plus lisible! (R9) Prix de la chambre la moins chère située dans un hôtel trois étoile d une station balnéaire? SELECT MIN(ro.prix) AS prix FROM Resorts re, Hotels h, Rooms ro WHERE re.ns=h.ns AND h.ns=ro.ns AND h.nh=ro.nh AND h.cath=3 AND re.types= mer Algèbre relationnelle : En trichant un peu, et en écrivant la comparaison dans la condition de jointure... cela a l air d être admis, on obtient : En posant -CH1=π ns,nh,nch,prix (σ cath=3 types= mer (resorts hotels rooms) -CH2=π ns,nh,nch,prix (σ cath=3 types= mer (resorts hotels rooms) OUI c est la même table! On peut alors écrire la requête : π prix (CH1) (π CH1.prix (CH1 CH1.prix>CH2.prix (CH2). Travail à faire : Ecrire les réponses en SQL et Algèbre relationnelle Nouvelles requêtes : (R10) Obtenir la liste des hôtels 4 étoiles n ayant que des chambres avec salles de bain. Vérif. 11 réponses. (R11) Listes des hôtels avec leur nom, adresse, et catégorie et leur nombre de réservations dans l année Vérif. 78 réponses, c est facile à savoir mais : Attention : un hôtel n a pas de réservation, il faut le faire néanmoins apparaître dans la liste : ce qui demande un traitement de cas d exceptions. 3
N.B. En SQL, on utilisera un COUNT. En algèbre relationnelle la fonction f= somme. Pour ce qui suit : SQL seulement (R12) Nom et adresse de l hôtel de la station Chamonix ayant eu le plus de réservations dans l année. Indication On pourra utiliser les opérateurs MAX et COUNT. Vérification On trouvera l Hôtel de la Gentiane. (R13) Jour de l année où l hôtel Bon séjour de la station Chamonix a eu le plus de réservations. Vérification On trouvera deux jours : le jour 99 et le jour 100. (R14) Noms des clients ayant réservé dans tous les hôtels 2 étoiles de la station Chamonix. Vérifications 5 réponses. 4