Poly TP PostgreSQL
Poly TP PostgreSQL
Poly TP PostgreSQL
3ème année
La reproduction de ce document par tout moyen que ce soit est interdite conformément
aux articles L111-1 et L122-4 du code de la propriété intellectuelle
1
TP SQL sous DBFiddle et PostgreSQL
Ce document contient une description des outils utilisés (voir Section I), la description du
script de la base de données exemple le sujet du TP (voir Section II), des exemples de
fonctions SQL, PL/pgSQL et de déclencheur le scripts d’insertion des nuplets (voir Section III
et Section IV). En annexe, vous trouverez également un exemple de programme ODBC et
quelques informations sur JDBC et des informations sur l’installation de PostgreSQL.
Attention : la connexion est temporaire, votre base est effacée une fois que vous quittez
le site.
Le SGBD utilisé est PostgreSQL, qui est un Système de Gestion de Bases de Données
Relationnel Objet, open source, successeur de Ingres, développé par l’Université de
Californie de Berkeley. Pour plus d’informations sur PostgreSQL, vous pouvez regarder les
sites suivants : http://www.postgresql.org ou https://sql.sh/sgbd/postgresql, ainsi
que la documentation en français https://docs.postgresql.fr/ et le site de la
communauté française http://www.postgresql.fr/.
Dans la partie gauche de la fenêtre de dbfiddle (voir Figure 1), vous devez y
saisir/copier le script SQL de création du schéma, ainsi que les commandes d’insertion
et de mises à jour des nuplets (i.e. toutes les commandes CREATE, INSERT, UPDATE et
DELETE).
Pour créer la base de données (temporaire – valide uniquement le temps de votre connexion
sur le site), il faut bien sélectionner PostgreSQL dans la liste déroulante de droite des
SGBD disponibles, puis il faut cliquer sur Run.
Vos requêtes d’interrogation (SELECT) peuvent être saisies dans la partie droite de la
fenêtre. L’exécution se fait en cliquant sur Run. Le résultat de la requête apparait en bas de la
fenêtre (voir Figure 2).
-- Un exemple de vue
CREATE OR REPLACE VIEW Email_Etudiant
AS SELECT Nom, Prenom, Email FROM Etudiant;
Remarque : vous pouvez choisir d’utiliser une incrémentation automatique des clés
primaires, lorsqu’elles sont mono-attribut et de type entier. Il faut pour cela utiliser le type
SERIAL. Par exemple, l’instruction SQL suivante crée une relation TableEssai dont
l’attribut idAuto est un entier qui s’incrémente à chaque insertion de nuplet.
CREATE TABLE TableEssai (idAuto SERIAL, nom VARCHAR(100));
Sous PostgreSQL, cette instruction implique la création implicite d’une séquence, comme
l’indique le message affiché par le SGBD suite à la commande de création de la relation.
=>NOTICE:CREATE TABLE will create implicit sequence
"tableessai_idauto_seq" for serial column "tableessai.idauto"
Le type de l’attribut idAuto sera le type entier et cet attribut aura une valeur égale par défaut
à nextval(‘tableessai_idauto_seq’).
Une insertion dans cette relation devra par conséquent se faire de la manière suivante :
INSERT INTO TableEssai
VALUES (nextval('tableessai_idauto_seq'),'Toto');
INSERT INTO
Etudiant(Nom,Prenom,Date_Naissance,Adresse,Ville,Code_Postal,Telephone,Fax,
Email) VALUES ('GAMOTTE', 'Albert','1979/02/18','50, Rue des
alouettes','PARIS','75021','0143567890',NULL,'gamotal4[at]etud.dauphine.fr'
);
INSERT INTO
Etudiant(Nom,Prenom,Date_Naissance,Adresse,Ville,Code_Postal,Telephone,Fax,
Email) VALUES ('HIBULAIRE', 'Pat','1980/08/23','10, Avenue des
marguerites','POUILLON','40000','0678567801',NULL,'pat[at]yahoo.fr');
INSERT INTO
Etudiant(Nom,Prenom,Date_Naissance,Adresse,Ville,Code_Postal,Telephone,Fax,
Email) VALUES ('ODENT', 'Jamal','1978/05/12','25, Boulevard des
fleurs','PARIS','75022','0145678956','0145678956','odent[at]free.fr');
INSERT INTO
Etudiant(Nom,Prenom,Date_Naissance,Adresse,Ville,Code_Postal,Telephone,Fax,
Email) VALUES ('DEBECE', 'Gill','1979/07/15','56, Boulevard des
fleurs','PARIS','75022','0678905645',NULL,'deby[at]hotmail.com');
INSERT INTO
Etudiant(Nom,Prenom,Date_Naissance,Adresse,Ville,Code_Postal,Telephone,Fax,
Email) VALUES ('DEBECE', 'Aude','1979/08/15','45, Avenue des
abeilles','PARIS','75022',NULL,NULL,NULL);
INSERT INTO
Reservation(Batiment,Numero_Salle,Cours_ID,Departement_ID,Enseignant_ID,Dat
e_Resa,Heure_Debut,Heure_Fin,Nombre_Heures) VALUES
('B','022','1','1',(SELECT Enseignant_id FROM Enseignant WHERE
Nom='MANOUVRIER'),'2016/10/15','08:30:00','11:45:00','3');
INSERT INTO
Reservation(Batiment,Numero_Salle,Cours_ID,Departement_ID,Enseignant_ID,Dat
e_Resa,Heure_Debut,Heure_Fin,Nombre_Heures) VALUES
('B','022','1','1','2','2016/11/04','08:30:00','11:45:00','3');
INSERT INTO
Reservation(Batiment,Numero_Salle,Cours_ID,Departement_ID,Enseignant_ID,Dat
e_Resa,Heure_Debut,Heure_Fin,Nombre_Heures) VALUES
('B','022','1','1','2',DEFAULT,'08:30:00','11:45:00','3');
INSERT INTO
Reservation(Batiment,Numero_Salle,Cours_ID,Departement_ID,Enseignant_ID,Dat
e_Resa,Heure_Debut,Heure_Fin,Nombre_Heures) VALUES
('B','020','1','1','1',DEFAULT,'08:30:00','11:45:00','3');
Sous PostgreSQL, vous pouvez créer des fonctions SQL, correspondant à des requêtes
paramétrées et des déclencheurs. Les sous-sections suivantes vous présentent des exemples.
A. Fonctions SQL
CREATE OR REPLACE FUNCTION GetSalleCapaciteSuperieurA(int)
RETURNS SETOF Salle
AS '
SELECT * FROM Salle WHERE Capacite > $1;
'
LANGUAGE SQL;
La requête ci-dessous permet par exemple d’appeler cette fonction pour rechercher les salles
de capacité supérieure à 300.
SELECT * FROM GetSalleCapaciteSuperieurA(300) ;
La requête ci-dessous permet par exemple d’appeler cette fonction pour voir s’il est possible
de réserver la salle B022 le 4 novembre 2006 entre 9h et 18h.
SELECT PossibiliteResa('B','022','2006/11/04','09:00:00','18:00:00');
IF FOUND THEN
RAISE EXCEPTION ''Réservation impossible, salle occupée à la date
et aux horaires demandés'';
ELSE RETURN NEW; Si on peut faire l’insertion, la fonction retourne le nuplet
END IF; en cours d’insertion, représenté par NEW
END;'
LANGUAGE 'plpgsql';
III. ENONCE DU TP
A. Création de la base exemple
1. Créer le schéma de données de la base exemple en exécutant le script dans l’interpréteur
de requêtes SQL.
Il vous suffit pour cela de recopier le contenu du fichier dans dans la partie gauche de la
fenêtre de dbfiddle (voir Figure 5).
2. Afin de vous approprier le schéma de la base et réaliser plus facilement les requêtes
demandées dans la section suivante, insérer (par la commande SQL INSERT) les nuplets
suivants :
a. Un département,
b. Un enseignant dans le département MIDO,
c. Un étudiant,
d. Une salle,
e. Une réservation pour un cours existant,
f. Une réservation qui chevauche une réservation existante (pour tester
l’affichage du déclencheur).
Rappel : sous PostgreSQL, pour mettre des lignes en commentaires, vous devez précéder
chaque ligne par – (deux tirets) ou placer les lignes à mettre en commentaire entre /* et */.
Ecrire et exécuter les requêtes1 d’interrogation SQL suivantes sur la base de données
exemple (dans la partie droite de la fenêtre de DBFiddle et en cliquant sur Run) :
1. Liste des noms et des prénoms des étudiants stockés dans la base.
2. Liste des noms et des prénoms des étudiants qui habitent une ville choisie (par vous) dans
la liste des villes de la base.
3. Liste des noms et des prénoms des étudiants dont le nom commence par 'G'.
4. Liste des noms et des prénoms des enseignants dont l'avant dernière lettre du nom est 'E'.
5. Liste des noms et des prénoms des enseignants classés par nom de département, par nom
et par prénom.
6. Combien y a-t-il d'enseignants dont le grade est 'Moniteur' ?
7. Quels sont les noms et les prénoms des enseignants n'ayant pas de Fax (valeur NULL) ?
8. Quels sont les intitulés des cours dont la description contient le mot 'SQL' ou 'Licence' ?
9. Si on suppose qu'une heure de cours coûte 50 euros, quel est le coût en euros de chaque
cours (les heures de cours concernent les heures réservées – voir relation Réservation)?
10. A partir de la requête précédente, indiquer quels sont les intitulés des cours dont le coût
est compris entre 500 et 750 euros.
11. Quelles sont la capacité moyenne et la capacité maximum des salles ?
1
Attention : toutes les requêtes ne retournent pas forcement de résultat. Certaines peuvent retourner une relation
vide (i.e. sans nuplet). Vous pouvez insérer des nuplets en conséquence pour qu’il y ait des nuplets résultat.
12. Quelles sont les salles dont la capacité est inférieure à la capacité moyenne ?
13. Quels sont les noms et les prénoms des enseignants appartenant aux départements
nommés 'MIDO' ou 'LSO' ? (Utiliser IN puis une autre solution)
14. Quels sont les noms et les prénoms des enseignants n’appartenant ni au département
'MIDO' ni au département 'LSO' ?
15. Classer les étudiants par ville.
16. Combien y a-t-il d’enseignements associés à chaque département ?
17. Quels sont les noms des départements où le nombre de cours associé est supérieur ou égal
à3?
18. Créer une vue permettant de visualiser le nombre de réservation par enseignant.
19. Quels sont les noms et les prénoms des enseignants pour lesquels il existe au moins deux
réservations ? (Utiliser EXISTS puis une autre solution en utilisant la vue créée
précédemment).
20. Quels sont les enseignants ayant le plus de réservations (Utiliser la Vue définie à la
question 18 et le mot-clé ALL) ?
21. Quels sont les noms et les prénoms des enseignants n’ayant aucune réservation ?
22. Quelles salles ont été réservées à toutes les dates (stockées dans la base de données) ?
23. A quelles dates toutes les salles sont-elles réservées ?
PostgreSQL est un Système de Gestion de Bases de Données Relationnel Objet, open source,
successeur de Ingres, développé par l’Université de Californie de Berkeley. Pour plus
d’informations sur PostgreSQL, vous pouvez regarder les sites suivants :
• https://www.postgresql.org/
• https://sql.sh/sgbd/postgresql
• Documentation en français : https://docs.postgresql.fr/
• Site de la communauté française : https://www.postgresql.fr/
Pour installer PostgreSQL sur votre machine, vous pouvez regarder les liens suivants :
• https://www.postgresqltutorial.com/install-postgresql/
• https://www.postgresql.fr/_media/doc_postgresql_9_1.pdf
• https://docs.postgresql.fr/12/INSTALL.html
Une interface graphique pour utiliser PostgreSQL est PgAdmin, téléchargeable à l’adresse :
https://www.pgadmin.org/
2
Il existe des implantation d'ODBC sous d'autres plates-formes.
Le fichier Departement.java est un exemple de classe Java dont les objets sont
persistants (i.e. sont récupérés à partir de données de la base de données ou dont les valeurs
des attributs sont stockées dans la base). Le fichier CreerDepartement.java permet de
tester cette classe.
Ces programmes ont été adaptés à la base de données exemple à partir des exemples de
http://www.fankhausers.com/postgresql/jdbc/#driver_download et de
http://deptinfo.unice.fr/~grin/mescours/minfo/bdavancees/tp/tpjdbc1/index.html
Si vous utilisez le SGBD PostgreSQL, le pilote JDBC se nomme
org.postgresql.Driver et l’adresse de la base de données est la suivante :
jdbc:postgresql://url_du_SGBD/nom_base
Si dans le volet DNS Utilisateur ou Sources de données utilisateur, (pour une connexion de
l'utilisateur connecté sur la machine) ou dans le volet DNS Système (pour une connexion
relative à la machine, quel que soit l'utilisateur connecté), le nom du pilote PostgreSQL
apparaît, cliquez sur OK pour quitter la fenêtre.
Une fenêtre apparaît où vous devez saisir le nom de votre base de données, le serveur (adresse
IP associée) et votre login sous PostgreSQL :
Pour pouvoir utiliser les fonctions ODBC, vous devez inclure la bibliothèque de la PI ODBC
(ex. afxdb.h sous Visual C++) dans votre programme.
3. Un curseur, de type HSTMT, qui permet de se déplacer dans la table résultat de la requête.
4. D’un code retour de fonction, de type RETCODE, qui permet de savoir lorsqu’il y a une
erreur à un moment donné de l’exécution du programme.
Le code source du programme exemple (adapté du tutoriel Visual C++ à la base de données
exemple) est disponible à l’adresse :
http://www.lamsade.dauphine.fr/~manouvri/BD/prog_ex_ODBC.cpp