postgresql
Transcription
postgresql
POSTGRESQL Version 1.00 POSTGRESQL Philippe PHENGSAVATH 05/07/2011 POSTGRESQL Version 1.00 SOMMAIRE I.INTRODUCTION..............................................................................................................................1 II.POSTGRESQL.................................................................................................................................2 II.1.Présentation...............................................................................................................................2 II.2.Installation PostgreSQL sous Debian 5.....................................................................................2 II.3.Modification du fichier postgresql.conf....................................................................................2 II.4.Modification du fichier pg_hba.conf.........................................................................................2 II.5.Lancement de PostgreSQL........................................................................................................2 II.6.Création de mot de passe pour l'utilisateur postgres.................................................................3 II.7.Se connecter en tant qu'administrateur PostgreSQL.................................................................3 II.8.Création d'un utilisateur............................................................................................................3 II.9.Ajout de mot de passe 'SQL' pour postgres...............................................................................3 II.10.Création de base de données sur serveur virtuel.....................................................................3 II.10.a.Se connecter à PostgreSQL :...........................................................................................3 II.10.b.Création des tables :........................................................................................................4 II.10.c.Ajout de données à la base :............................................................................................4 II.11.Vérification de la base de données..........................................................................................4 II.11.a.Description des tables de la base de données avec \d :....................................................5 II.11.b.Définition de la table avec \d nom_de_la_table :............................................................5 II.12.Ajout de données à la base de données à partir d'un fichier texte...........................................6 II.12.a.Création d'un fichier texte (.sql) :....................................................................................6 II.12.b.Ajout des lignes suivantes :.............................................................................................6 II.13.Installation de Phppgadmin.....................................................................................................6 II.13.a.Modification du fichier config.inc.php et apache.conf....................................................6 II.13.b.Connexion Phppgadmin via interface web......................................................................7 III.PREREQUIS...................................................................................................................................8 IV.LA BASE CENTRALIVRES........................................................................................................12 IV.1.Installation de postgresql plperl.............................................................................................12 IV.2.Modification du fichier CentraLivresBaseInstall.sql.............................................................12 IV.3.Execution du fichier InstallationBD.sql.................................................................................12 IV.4.Connexion à la base en tant que TSGERI..............................................................................13 IV.5.Création de schémas...............................................................................................................14 IV.6.Création d'un type de données personnalisés.........................................................................16 IV.7.Création des tables relationnelles...........................................................................................18 IV.8.Modification des contraintes d'intégrité avec ALTER TABLE..............................................22 IV.9.Modification de la structure des tables avec ALTER TABLE...............................................23 IV.10.Création d'index avec CREATE INDEX.............................................................................24 IV.11.Insertion des données dans la base avec INSERT................................................................24 IV.12.Mise à jour et suppression des données...............................................................................25 IV.13.Requêtes SQL de base avec SELECT..................................................................................25 IV.14.Requêtes SQL avancées.......................................................................................................38 IV.15.Vu, Règles, Droits et Tables système...................................................................................38 IV.16.Transactions.........................................................................................................................40 POSTGRESQL Version 1.00 IV.17.Fonction SQL et langage procédural PL/pgSQL.................................................................41 IV.18.Déclencheurs........................................................................................................................41 V.CONCLUSION...............................................................................................................................42 PostgreSQL sous Debian 5 Version 1.00 I. INTRODUCTION La documentation se porte sur un TP de PostgreSQL en manipulant différentes fonctions de commande. Page 1 /42 PostgreSQL sous Debian 5 Version 1.00 II. POSTGRESQL II.1. Présentation PostgreSQL est un système de gestion de base de données relationnelle et objet. II.2. Installation PostgreSQL sous Debian 5 $ sudo apt-get install postgresql postgresql-contrib postgresql-client II.3. Modification du fichier postgresql.conf /etc/postgresql/8.4/main/postgresql.conf • Editez postgresql.conf : $ vi postgresql.conf • Modifiez la ligne : # listen_addresses = 'localhost' par listen_addresses = '*' (ne pas oublier d'enlever le # devant listen_addresses) II.4. Modification du fichier pg_hba.conf /etc/postgresql/8.4/main/pg_hba.conf • Editez pg_hba.conf : $ vi pg_hba.conf • Ajoutez en fin de page : host all all 172.25.105.0/24 md5 II.5. Lancement de PostgreSQL • Lancez PostgreSQL : # /etc/init.d/postgresql start (start / status / stop / restart) Page 2 /42 PostgreSQL sous Debian 5 Version 1.00 II.6. Création de mot de passe pour l'utilisateur postgres $ sudo passwd postgres Entrez le nouveau mot de passe UNIX : 'votre mot de passe' Retapez le nouveau mot de passe UNIX : 'confirmation de votre mot de passe' passwd: le mot de passe a été mis à jour avec succès II.7. Se connecter en tant qu'administrateur PostgreSQL $ su postgres Mot de passe : 'postgres (pour notre exemple)' $ psql psql (8.4.7) Saisissez « help » pour l'aide. postgres=# \q (\q pour quitter le mode administrateur) II.8. Création d'un utilisateur postgres@DT13-1:/home/tsgeri$ createuser tsgeri (tsgeri comme nom d'utilisateur pour exemple) Le nouvel rôle est-il superutilisateur ? (o/n) o postgres@DT13-1:/home/tsgeri$ psql -d template1 -c "alter user tsgeri with password 'votre_mot_de_passe'" ALTER ROLE Vérifier avec la commande: psql select * from pg_shadow; II.9. Ajout de mot de passe 'SQL' pour postgres postgres@DT13-1:/home/tsgeri$ psql -d postgres -c "ALTER USER postgres WITH PASSWORD 'postgres'" (postgres comme mot de passe dans notre exemple) ALTER ROLE II.10. Création de base de données sur serveur virtuel II.10.a. Se connecter à PostgreSQL : tsgeri@DT13-1:~# su postgres postgres@DT13-1:~$ psql psql (8.4.7) Saisissez « help » pour l'aide. postgres=# Page 3 /42 PostgreSQL sous Debian 5 Version 1.00 II.10.b. Création des tables : CREATE DATABASE movies; \c movies ; drop table client; drop table dvd; drop table location; CREATE TABLE "client" ( "client_id" integer unique not null, "client_nom" character varying(50) not null, "telephone" character(14) null, "date_naissance" date null, "balance" decimal(7,2) ); CREATE TABLE "dvd" ( "dvd_id" character(8) not null, "titre" character varying(80) not null, "duree" interval ); CREATE TABLE "location" ( "dvd_id" character(8) not null, "date_location" date not null, "client_id" integer not null ); II.10.c. Ajout de données à la base : INSERT INTO client VALUES (3, 'Panky, Henry', '04.91.05.57.29', '1968-01-21', 0.00); INSERT INTO client VALUES (1, 'Jones, Henry', '04.42.35.46.91', '1970-10-10', 0.00); INSERT INTO client VALUES (4, 'Wonderland, Alice N.', '04.91.30.87.77', '1969-03-05', 3.00); INSERT INTO client VALUES (2, 'Chirac, Jacques', '04.91.63.82.19', '1972-07-10', 15.00); INSERT INTO dvd VALUES ('AB-12345', 'The Godfather'); INSERT INTO dvd VALUES ('AB-67472', 'The Godfather'); INSERT INTO dvd VALUES ('MC-68873', 'Casablanca'); INSERT INTO dvd VALUES ('OW-41221', 'Citizen Kane'); INSERT INTO dvd VALUES ('AH-54706', 'Rear Window'); INSERT INTO location VALUES ('AB-12345', '2007-10-25', 1); INSERT INTO location VALUES ('AB-67472', '2007-10-25', 3); INSERT INTO location VALUES ('OW-41221', '2007-10-25', 1); INSERT INTO location VALUES ('MC-68873', '2007-10-20', 3); II.11. Vérification de la base de données movies=# select * from client; client_id | client_nom | telephone | date_naissance | balance -----------+----------------------+----------------+----------------+--------3 | Panky, Henry | 04.91.05.57.29 | 1968-01-21 | 0.00 Page 4 /42 PostgreSQL sous Debian 5 Version 1.00 1 | Jones, Henry | 04.42.35.46.91 | 1970-10-10 | 0.00 4 | Wonderland, Alice N. | 04.91.30.87.77 | 1969-03-05 | 3.00 2 | Chirac, Jacques | 04.91.63.82.19 | 1972-07-10 | 15.00 (4 lignes) movies=# select * from dvd; dvd_id | titre | duree ----------+---------------+------AB-12345 | The Godfather | AB-67472 | The Godfather | MC-68873 | Casablanca | OW-41221 | Citizen Kane | AH-54706 | Rear Window | (5 lignes) movies=# select * from location; dvd_id | date_location | client_id ----------+---------------+----------AB-12345 | 2007-09-25 | 1 AB-67472 | 2007-10-25 | 3 OW-41221 | 2007-10-25 | 1 MC-68873 | 2007-10-20 | 3 (4 lignes) II.11.a. Description des tables de la base de données avec \d : movies=# \d Liste des relations Schéma | Nom | Type | Propriétaire --------+----------+-------+-------------public | client | table | postgres public | dvd | table | postgres public | location | table | postgres (3 lignes) II.11.b. Définition de la table avec \d nom_de_la_table : movies=# \d client (client / dvd / location pour les tables qu'on a créé) Table « public.client » Colonne | Type | Modificateurs ---------+-----------------------+--------------client_id | integer | non NULL client_nom | character varying(50) | non NULL telephone | character(14) | date_naissance | date | balance | numeric(7.2) | Index : « client_client_id_key » UNIQUE, btree (client_id) Page 5 /42 PostgreSQL sous Debian 5 Version 1.00 II.12. Ajout de données à la base de données à partir d'un fichier texte • Quittez postgres : postgres=# \q II.12.a. Création d'un fichier texte (.sql) : # vi donnees.sql II.12.b. Ajout des lignes suivantes : INSERT INTO client VALUES (5, 'Jackson, Michael', '00555.354.2243', '1967-09-15', 1.00); INSERT INTO client VALUES (6, 'Henry, Kissinger', '04.42.35.47.91', '1957-11-30', 5.75); INSERT INTO dvd VALUES ('BD-73221', 'It is me, Mom !'); INSERT INTO dvd VALUES ('JS-54876', 'Back Home'); • Lancez la commande suivante : postgres@DT13-1:/home/tsgeri$ psql -d movies <donnees.sql II.13. Installation de Phppgadmin # apt-get install apache2 phppgadmin II.13.a. Modification du fichier config.inc.php et apache.conf /etc/phppgadmin# vi config.inc.php • Modifiez les lignes : $conf['servers'][0]['sslmode'] = 'disable'; ... $conf['min_password_length'] = 6; /etc/phppgadmin# vi apache.conf • Modifiez les lignes : #order deny,allow #deny from all #allow from 127.0.0.0/255.0.0.0 ::1/128 allow from all Page 6 /42 PostgreSQL sous Debian 5 Version 1.00 II.13.b. Connexion Phppgadmin via interface web • Entrez l'adresse web suivant : http://172.25.105.47/phppgadmin/ (l'adresse IP est celui du serveur où héberge phppgadmin) • Cliquez sur PostgreSQL et entrez le nom d'utilisateur et le mot de passe, comme dans la figure 1 (le nom d'utilisateur et le mot de passe est le compte créé du II.8) Figure 1 • Vérifiez dans le dossier movies que vous avez bien toutes les informations créées précédemment, comme dans la figure 2. Figure 2 Page 7 /42 PostgreSQL sous Debian 5 Version 1.00 III. PREREQUIS • Le SGBDR ne peut pas héberger plus de 5000 bases de données. Vrai ou Faux ? Faux, le SGBDR n'est pas limité en base de données mais par l'espace disque. • Dans PostgreSQL, une base de données peut avoir une taille illimitée. Vrai ou Faux ? Vrai, une base de données peut avoir une taille illimitée mais limitée au niveau du système de fichier d'exploitation et sous Linux, EXT3 à 2 To. • Une base de données peut contenir des schémas. A quoi servent-ils ? Les schémas servent à isoler et à protéger les accès aux données. • Par défaut, seul le créateur d'un schéma a le droit d'y acceder. Vrai ou Faux ? Vrai, par défaut, les utilisateurs ne peuvent pas accéder aux objets présents dans les schémas qui ne leur appartiennent pas. Pour le permettre, le propriétaire du schéma doit donner le droit USAGE sur le schéma. Pour autoriser les utilisateurs à manipuler les objets d'un schéma, des privilèges supplémentaires doivent éventuellement être accordés, en fonction de l'objet. Les commandes GRANT et REVOKE donnent ces droits. • Quel est le numéro de port sur lequel le serveur PostgreSQL écoute les connexions ? Le numéro de port utilisé par le serveur PostgreSQL est le 5432. • Quel est le fichier de configuration des accès à PostgreSQL ? Le fichier de configuration des accès se nomme pg_hba.conf • Chaque utilisteur doit posséder un compte avec le même nom que sur le système. Vrai ou Faux ? Faux, les noms d'utilisateurs de PostgreSQL sont différents des comptes utilisateurs du système d'exploitation. Il y a la possibilité de faire correspondre les 2 comptes par l'intermédiaire du fichier pg_ident.conf. • Pourquoi l'utilisateur postgres (qui est le seul à pouvoir démarrer, administrer et arrêter le SGBDR) n'a aucun droit sur le système d'exploitation ? L'utilisateur postgres n'a aucun droit sur le système d'exploitation, c'est un administrateur de base de données mais pas du système, pour raison de sécurité. • Quelle est la commande pour la création d'une table ? CREATE TABLE temps ( ville varchar(80), t_basse int, -- température basse t_haute int, -- température haute prcp real, -- précipitation date date ); Page 8 /42 PostgreSQL sous Debian 5 Version 1.00 • La clé primaire d'une table relationnelle ne peut porter que sur une seule colonne. Vrai ou Faux ? Faux, les clés primaires peuvent également contraindre plusieurs colonnes ; la syntaxe est semblable aux contraintes d'unicité : CREATE TABLE exemple ( a integer, b integer, c integer, PRIMARY KEY (a, c) ); Une clé primaire simple est sur une colonne et une clé primaire composite est sur plusieurs colonnes. • Quelle est la différence entre des contraintes UNIQUE et PRIMARY KEY ? La contrainte UNIQUE spécifie qu'un groupe de colonnes d'une table ne peut contenir que des valeurs uniques. Le comportement de la contrainte de table est le même que celui des contraintes de colonnes avec la possibilité supplémentaire de grouper des colonnes. Les valeurs NULL ne sont pas considérées égales dans le cas d'une contrainte d'unicité. Toute contrainte d'unicité sur la table doit nommer un ensemble de colonnes différent de celui utilisé par quelque autre contrainte d'unicité ou de clé primaire sur la table. Dans le cas contraire, cela revient à définir deux fois la même contrainte. Une contrainte de clé primaire est utilisée pour spécifier des colonnes qui ne peuvent contenir que des valeurs uniques, non NULL. Techniquement, PRIMARY KEY n'est qu'une combinaison de UNIQUE et NOT NULL. Toutefois, identifier un ensemble de colonnes comme clé primaire fournit des informations sur les schémas. En effet, une clé primaire implique que d'autres tables puissent utiliser cet ensemble de colonnes comme identifiant unique de ligne. Seule une clé primaire peut être spécifiée par table, qu'il s'agisse d'une contrainte de colonne ou de table. La contrainte de clé primaire doit nommer un ensemble de colonnes différent de tout autre ensemble de colonnes utilisé par une contrainte d'unicité sur la table. • La contrainte ON DELETE CASCADE fait partie de la définition d'une clé primaire ou d'une clé étrangère ? Une contrainte de clé étrangère. Une clé étrangère, dans une base de données relationnelle, est une contrainte qui garantit l'intégrité référentielle entre deux tables. • L'utilisation du type varchar pour stocker des chaînes de caractères permet d'optimiser l'espace de stockage. Vrai ou Faux ? Vrai, seule la chaîne de caractères la plus courte est enregistrée et la chaîne « ami » avec un varchar(6) n'occupe que 3 caractères sur 6 disponibles. • Quel type de données doit etre utilisé pour qu'une valeur entière s'auto-incrémente ? Il faut ajouter une clé primaire ou une contrainte UNIQUE avec le type de données SERIAL. • A quoi sert l'option TABLESPACE de la commande CREATE TABLE ? Page 9 /42 PostgreSQL sous Debian 5 Version 1.00 Les tablespaces dans PostgreSQL permettent aux administrateurs de bases de données de définir l'emplacement dans le système de fichiers où seront stockés les fichiers représentant les objets de la base de données. Une fois créé, un tablespace peut être référencé par son nom lors de la création d'objets. En utilisant les tablespaces, un administrateur peut contrôler les emplacements sur le disque d'une installation PostgreSQL. Ceci est utile dans au moins deux cas. Tout d'abord, si la partition ou le volume sur lequel le groupe a été initialisé arrive à court d'espace disque mais ne peut pas être étendu, un tablespace peut être créé sur une partition différente et utilisé jusqu'à ce que le système soit reconfiguré. Deuxièmement, les tablespaces permettent à un administrateur d'utiliser sa connaissance des objets de la base pour optimiser les performances. Par exemple, un index qui est très utilisé peut être placé sur un disque très rapide et disponible, comme un périphérique mémoire. En même temps, une table stockant des données archivées et peu utilisée ou dont les performances ne portent pas à conséquence pourra être stockée sur un disque système plus lent, moins cher. • Créer une table avec l'option WITH (OIDS=TRUE) permet d'optimiser l'indexation des données (OIDS = Optimized Index) ou d'attribuer un identifiant supplémentaire à chaque ligne de la table. Il permets d'optimiser l'indexation des données et Postgres les utilise en interne comme clés primaires de différentes tables système. • Pourquoi est il conseillé de nommer les contraintes de colonne ou de table avec des noms explicites ? Nommer les contrainttes permet de localiser rapidement les erreurs. • Quelle est la commande utilisée pour supprimer une colonne dans une table ? ALTER TABLE produits DROP COLUMN description; ALTER TABLE produits DROP COLUMN description CASCADE; (pour une contrainte de clé étrangère d'une autre table) • Après avoir exécuté la commande suivante CREATE TABLE personne (nom varchar (10) , prenom varchar (10) , age intéger); Quelles sont les instructions qui provoquent une erreur ? INSERT INTO personne ('Dupont', 'Jean', 50); ERREUR (manque VALUES après personne) INSERT INTO personne VALUES ('Dupont', 'Jean', 50); INSERT INTO personne VALUES ('Jean', 'Dupont', 50); ERREUR (nom et prénom inversés) INSERT INTO personne (age, prenom, nom) VALUES (50, 'Jean', 'Dupont'); INSERT INTO personne VALUES ('Dupont', 'Jean', '50'); ERREUR (pas de ' à 50) • Sur la table créée à la question précédente, quel va etre l'effet de la commande suivante ? ALTER TABLE personne ADD CONSTRAINT verifie_age CHECK (age BETWEEN 0 and 120); Celà permet une vérification pour limiter l'âge de 0 à 120. Page 10 /42 PostgreSQL sous Debian 5 Version 1.00 • Il n'est plus possible de changer le nom d'une table une fois qu'elle est créée. Vrai ou Faux ? Faux, il est possible de changer le nom d'une table une fois qu'elle est créée. ALTER TABLE produits RENAME TO elements; Page 11 /42 PostgreSQL sous Debian 5 Version 1.00 IV. LA BASE CENTRALIVRES IV.1. Installation de postgresql plperl # apt-get install postgresql-plperl-8.4 IV.2. Modification du fichier CentraLivresBaseInstall.sql • Téléchargez le fichier CentraLivresBaseInstall.sql du serveur ftp://172.25.0.5/SQL et copiez le sur le serveur Debian 5 : $ wget ftp://172.25.0.5/SQL/CentraLivresBaseInstall.sql • Renommez le fichier CentraLivresBaseInstall.sql par InstallationBD.sql : # cp CentraLivresBaseInstall.sql InstallationBD.sql • Modifiez le fichier InstallationBD.sql aux lignes suivantes par 8.4 : # vi InstallationBD.sql '/usr/share/postgresql/8.4/contrib/uninstall_isn.sql' ... \set fichier_isbn '/usr/share/postgresql/8.4/contrib/isn.sql' IV.3. Execution du fichier InstallationBD.sql • Connectez-vous en utilisateur postgres : tsgeri@DT13-1 :~$ su postgres Mot de passe : 'mot_de_passe_postgres' postgres@DT13-1:/home/tsgeri$ • Exécutez le fichier InstallationBD.sql : postgres@DT13-1:/home/tsgeri$ psql -U postgres -d postgres psql (8.4.7) Saisissez « help » pour l'aide. Page 12 /42 PostgreSQL sous Debian 5 Version 1.00 postgres=# \i InstallationBD.sql … centralivres=# \q postgres@DT13-1:/home/tsgeri$ exit tsgeri@DT13-1:~$ IV.4. Connexion à la base en tant que TSGERI tsgeri@DT13-1:~$ psql -U tsgeri -d centralivres psql (8.4.7) Saisissez « help » pour l'aide. centralivres=> (\h et \? sont des commandes d'aide mémoire) • Liste des bases de données : centralivres=> \l Liste des bases de données Nom | Propriétaire | Encodage | Tri | Type caract. | Droits d'accès --------------+--------------+----------+-------------+--------------+----------------------centralivres | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =CTc/postgres : postgres=CTc/postgres movies | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | postgres | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | template0 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres : postgres=CTc/postgres template1 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres : postgres=CTc/postgres (5 lignes) Il y a 5 bases de données sur le serveur. • Exécution de la commande SELECT : centralivres=> select 10*5-10; Page 13 /42 PostgreSQL sous Debian 5 Version 1.00 ?column? ------------40 (1 ligne) Avec AS on obtient : centralivres=> select 10*5-10 AS "10 fois 5 moins 10 font:"; 10 fois 5 moins 10 font: -----------------------------40 (1 ligne) Commande \w, \g et \i : • centralivres=> \w requete.sql (\w écrit le contenu tampon de requête dans le fichier requete.sql) centralivres=> \g resultat.txt (\g envoie le tampon de requête au serveur et les résultats au fichier resultat.txt) centralivres=> \i requete.sql (\i exécute les commandes du fichier requete.sql) IV.5. Création de schémas Listez des schémas avec la commande \dn : • centralivres=> \dn Liste des schémas Nom | Propriétaire -------------------------+-------------------------adherents | postgres information_schema | postgres pg_catalog | postgres pg_toast | postgres pg_toast_temp_1 | postgres public | postgres (6 lignes) • Listez des schémas détaillés sur les droits avec la commande \dn+ : centralivres=> \dn+ Page 14 /42 PostgreSQL sous Debian 5 Version 1.00 Liste des schémas Nom | Propriétaire | Droits d'accès | Description -------------------------+--------------+---------------------------+---------------------------------adherents | postgres | postgres=UC/postgres | : =U/postgres information_schema | postgres | postgres=UC/postgres | : =U/postgres pg_catalog | postgres | postgres=UC/postgres | system catalog schema : =U/postgres pg_toast | postgres | | reserved schema for TOAST tables pg_toast_temp_1 | postgres | | public | postgres | postgres=UC/postgres | standard public schema : =UC/postgres (6 lignes) Création d'un schéma : • centralivres=> CREATE SCHEMA gestion; CREATE SCHEMA Vérification du schéma créé : • centralivres=> \dn Liste des schémas Nom | Propriétaire -------------------------+-----------------------adherents | postgres gestion | tsgeri information_schema | postgres pg_catalog | postgres pg_toast | postgres pg_toast_temp_1 | postgres public | postgres (7 lignes) • Ajout d'un commentaire au schéma : Page 15 /42 PostgreSQL sous Debian 5 Version 1.00 centralivres=> COMMENT ON SCHEMA gestion IS 'Schema contenant les donnees'; Liste des schémas Nom | Propriétaire | Droits d'accès | Description -------------------------+------------------+---------------------------+---------------------------------adherents | postgres | postgres=UC/postgres | : =U/postgres gestion | tsgeri information_schema | postgres | | Schema contenant les donnees | postgres=UC/postgres | : =U/postgres pg_catalog | postgres | postgres=UC/postgres | system catalog schema : =U/postgres pg_toast | postgres | | reserved schema for TOAST tables pg_toast_temp_1 | postgres | | public | postgres | postgres=UC/postgres | standard public schema : =UC/postgres (7 lignes) • Commande SHOW pour afficher l'appartenance des schémas : centralivres=> SHOW search_path; search_path -----------------------------"$user", public • Modification de search_path : centralivres=> ALTER USER tsgeri SET search_path TO gestion, adherents, public; ALTER ROLE centralivres=> SHOW search_path; search_path ------------------------------gestion, adherents, public IV.6. Création d'un type de données personnalisés • Création et édition du fichier types.sql : Page 16 /42 PostgreSQL sous Debian 5 Version 1.00 tsgeri@DT13-1:~$ vi types.sql -- Type de composite adresse qui contient numero, type de voie, nom de voie, code postal et ville CREATE TYPE adresse AS( numero smallint, type_de_voie varchar(10), nom_de_voie varchar(30), code_postal integer, ville varchar(25) ); -- Type de composite personne qui contient nom, prenom et naissance CREATE TYPE personne AS( nom varchar(20), prenom varchar(20), naissance date ); • Création et édition de domaines du fichier domaines.sql : tsgeri@DT13-1:~$ vi domaines.sql -- Domaine email de type varchar(50) qui verifiera qu'une adresse email a une syntaxe correcte CREATE DOMAINE email AS varchar(50); CHECK(VALUE~*E'^[a-z][a-z0-9_-]+\.?[a-z0-9_-]+@[a-z0-9_-]+\.[a-z]{2,4}$'); -- Domaine numtel de type varchar(14) qui verifiera qu'un numero de telephone est bien forme CREATE DOMAIN numtel AS varchar(14); CHECK(VALUE~*E'0\\d{1}\.\\d{2}\.\\d{2}\.\\d{2}\.\\d{2}'); -- Domaine url qui verifiera la bonne syntaxe d'une adresse web CREATE DOMAIN url AS varchar(200); CHECK(VALUE~*E'^http[s]?://[a-z0-9]+\.[a-z0-9]+\.[a-z]{2,4}$'); CREATE TYPE isbn13; CREATE FUNCTION ean13_out(isbn13) RETURNS cstring AS '$libdir/isn', 'ean13_out' Page 17 /42 PostgreSQL sous Debian 5 Version 1.00 LANGUAGE c IMMUTABLE STRICT; ALTER FUNCTION public.ean13_out(isbn13) OWNER TO tsgeri; IV.7. Création des tables relationnelles • Création et édition du fichier Tables.sql : tsgeri@DT13-1:~$ vi Tables.sql -- TABLE editions BASE centralivres CREATE TABLE editions( code_edition integer CONSTRAINT editions_CP PRIMARY KEY CONSTRAINT editions_code_edition_CHECK CHECK(code_edition>=1 AND code_edition<10000000), nom varchar(50) UNIQUE NOT NULL, adresse varchar(50), code_postal integer, ville varchar(25), nombre_employes smallint CONSTRAINT editions_nombre_employes_CHECK CHECK(nombre_employes>0), date_creation date CONSTRAINT editions_date_CHECK CHECK(date_part('year', date_creation)>1500) ); -- TABLE imprimeurs BASE centralivres CREATE TABLE imprimeurs( code_imprimeur serial CONSTRAINT imprimeurs_CP PRIMARY KEY, nom_imprimeur varchar(40) NOT NULL, coordonnees adresse CONSTRAINT imprimeurs_coordonnes_type_de_voie_CHECK CHECK((coordonnees).type_de_voie IN ('Lieu-dit','Faubourg','Quai', 'Chemin','Impasse','Rue','Boulevard','Avenue','Allee','Cours')) CONSTRAINT imprimeurs_coordonnees_numero_CHECK CHECK((coordonnees).numero>0), nb_employes integer CONSTRAINT imprimeurs_nb_employes_CHECK CHECK(nb_employes>0), web url, telephone numtel, fax numtel ); Page 18 /42 PostgreSQL sous Debian 5 Version 1.00 -- TABLE auteurs BASE centralivres CREATE TABLE auteurs( identifiant_auteur smallint CONSTRAINT auteurs_CP PRIMARY KEY CONSTRAINT auteur_cp_positive_CHECK CHECK(identifiant_auteur>0), nom varchar(30) NOT NULL, prenom varchar(30), nationalite varchar(20), date_naissance date CONSTRAINT auteur_age_sup7_CHECK CHECK(EXTRACT(year FROM age(current_date,date_naissance))>7), date_deces date CONSTRAINT naiss_inf_deces_CHECK CHECK((date_naissance<date_deces) AND (date_deces<=current_date)), lieu_naissance varchar(50) ); -- TABLE collections BASE centralivres CREATE TABLE collections( code_collection smallint CONSTRAINT collections_CP PRIMARY KEY CONSTRAINT collections_code_collection_CHECK CHECK(code_collection>0), intitule varchar(30), code_edition integer CONSTRAINT collections_code_editeur_CE REFERENCES editions(code_edition) ON DELETE RESTRICT ON UPDATE CASCADE, theme varchar(30) ); -- TABLE entrepots BASE centralivres CREATE TABLE entrepots( code_entrepot smallint CONSTRAINT entrepots_CP PRIMARY KEY CONSTRAINT entrepots_code_entrepot_CHECK CHECK(code_entrepot>0), adresse varchar(50), code_postal integer CONSTRAINT entrepots_code_postal_CHECK CHECK(code_postal BETWEEN 1000 AND 99000), ville varchar(25), responsable personne CONSTRAINT entrepots_responsable_CHECK CHECK(EXTRACT(year FROM age((responsable).naissance)) BETWEEN 18 AND 150), employes smallint CONSTRAINT entrepots_employes_CHECK CHECK(employes>0), Page 19 /42 PostgreSQL sous Debian 5 Version 1.00 code_edition integer CONSTRAINT entrepots_code_edition_CE REFERENCES editions ON DELETE RESTRICT ON UPDATE CASCADE ); -- TABLE imprime BASE centralivres CREATE TABLE imprime( code_collection smallint, code_imprimeur integer, CONSTRAINT imprime_CP PRIMARY KEY (code_collection, code_imprimeur), CONSTRAINT imprime_code_collection_CE FOREIGN KEY (code_collection) REFERENCES collections (code_collection) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT imprime_code_imprimeur_CE FOREIGN KEY (code_imprimeur) REFERENCES imprimeurs (code_imprimeur) ON DELETE CASCADE ON UPDATE CASCADE ); -- TABLE livres BASE centralivres CREATE TABLE livres( isbn isbn13 CONSTRAINT livres_CP PRIMARY KEY, titre varchar(150) NOT NULL, prix numeric(4,2), depot_legal date DEFAULT NULL, date_impression date DEFAULT NULL, langue varchar(25) NOT NULL, annee date, traductions varchar[], code_collection smallint, CONSTRAINT livre_code_collection_CE FOREIGN KEY (code_collection) REFERENCES collections (code_collection) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT livre_date_CHECK CHECK((date_impression>=depot_legal) AND (date_impression<=current_date)) ); -- TABLE ecrit_par BASE centralivres CREATE TABLE ecrit_par( isbn isbn13, Page 20 /42 PostgreSQL sous Debian 5 Version 1.00 id_auteur integer, CONSTRAINT ecrit_par_CP PRIMARY KEY (isbn, id_auteur), CONSTRAINT ecrit_par_isbn_CE FOREIGN KEY (isbn) REFERENCES livres (isbn) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT ecrit_par_id_auteur_CE FOREIGN KEY (id_auteur) REFERENCES auteurs (identifiant_auteur) ON DELETE RESTRICT ON UPDATE CASCADE ); -- TABLE entrepose BASE centralivres CREATE TABLE entrepose( isbn isbn13, code_entrepose smallint, quantite integer, date_modification date, CONSTRAINT entrepose_CP PRIMARY KEY (isbn, code_entrepose), CONSTRAINT entrepose_isbn_CE FOREIGN KEY (isbn) REFERENCES livres (isbn) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT entrepose_code_entrepot_CE FOREIGN KEY (code_entrepose) REFERENCES entrepots (code_entrepot) ON DELETE RESTRICT ON UPDATE CASCADE ); -- TABLE distinctions BASE centralivres CREATE TABLE distinctions( prix varchar(50) CONSTRAINT distinctions_CP PRIMARY KEY, annee_creation date, lieu_creation varchar(25) ); -- TABLE recompence BASE centralivres CREATE TABLE recompence( prix varchar(50), isbn isbn13, annee date NOT NULL, CONSTRAINT recompence_CP PRIMARY KEY (prix, isbn), CONSTRAINT recompence_par_isbn_CE FOREIGN KEY (isbn) REFERENCES livres (isbn) Page 21 /42 PostgreSQL sous Debian 5 Version 1.00 ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT recompence_par_prix_CE FOREIGN KEY (prix) REFERENCES distinctions (prix) ON DELETE CASCADE ON UPDATE CASCADE ); • Insertion des scripts types.sql, domaines.sql et Tables.sql dans la base de données : tsgeri@DT13-1:~$ psql -U tsgeri -d centralivres psql (8.4.7) Saisissez « help » pour l'aide. centralivres=> \i types.sql centralivres=> \i domaines.sql centralivres=> \i Tables.sql IV.8. Modification des contraintes d'intégrité avec ALTER TABLE • TABLE livres : - Valeur de prix positive : ALTER TABLE livres ADD CONSTRAINT livres_prix_positif_CHECK CHECK(prix>0); - Année supérieure à 1500 et inférieure à date de dépôt légal : ALTER TABLE livres ADD CONSTRAINT livres_annee_CHECK CHECK(date_part ('year', annee) >1500 AND annee<=depot_legal); • TABLE collections : - Champ intitule NON NULL : ALTER TABLE collections ADD CONSTRAINT collections_intitule_CHECK CHECK(intitule IS NOT NULL); - Thème du titre choisi dans une liste : ALTER TABLE collections ADD CONSTRAINT collections_theme_CHECK CHECK(theme IN ('Romans','Sciences Humaines','Informatique','Enseignement','Litterature','Anticipation','Essais','Beaux Livres')); • TABLE auteurs : - Nationalité NON NULL et valeur « inconnue » : ALTER TABLE auteurs ADD CONSTRAINT auteurs_nationalite_CHECK Page 22 /42 PostgreSQL sous Debian 5 Version 1.00 CHECK(nationalite IS NOT NULL); ALTER TABLE auteurs ALTER COLUMN nationalite SET DEFAULT 'Inconnue'; • TABLE editions : - Code_postal comprise entre 1000 et 99000 : ALTER TABLE editions ADD CONSTRAINT editions_code_postal_CHECK CHECK(code_postal BETWEEN 1000 AND 99000); • TABLE entrepose : - Quantité de stock NON NULL et >= 0 : ALTER TABLE entrepose ADD CONSTRAINT entrepose_quantite_non_null_positive_CHECK CHECK(quantite IS NOT NULL AND quantite>=0); • TABLE imprimeurs : - Coordonnées de type adresse compris entre 10000 et 99000 : ALTER TABLE imprimeurs ADD CONSTRAINT imprimeurs_code_postal_CHECK CHECK((coordonnees).code_postal BETWEEN 1000 AND 99000); • Suppression d'une contrainte : ALTER TABLE table DROP CONSTRAINT nom; IV.9. Modification de la structure des tables avec ALTER TABLE • TABLE editions : - Ajout de la colonne email_contact de type email : ALTER TABLE editions ADD COLUMN email_contact TYPE email; • TABLE auteurs : - Suppression de la colonne lieu_naissance : ALTER TABLE auteurs DROP COLUMN lieu_naissance; • TABLE imprimeurs : - Changement du type integer par le type smallint de la colonne nb_employes : ALTER TABLE imprimeurs ALTER COLUMN nb_employes TYPE smallint; Page 23 /42 PostgreSQL sous Debian 5 • Version 1.00 TABLE distinctions : - Suppression de la colonne lieu_creation : ALTER TABLE distinctions DROP COLUMN lieu_creation; • TABLE editions : - Taille de 50 à 40 caractères de la colonne nom : ALTER TABLE editions ALTER COLUMN nom TYPE varchar(40); IV.10.Création d'index avec CREATE INDEX • TABLE auteurs : - Ajout d'un index à la colonne nom : CREATE INDEX auteurs_idx ON auteurs (nom); • TABLE livres : - Création d'un index composite des colonnes prix et titre : CREATE INDEX livres_prix_titre_idx ON livres (prix, titre); - Suppression de l'index précédente puis création d'un index uniquement pour les livres dont le prix est comprise entre 5 et 20€ : DROP INDEX livres_prix_titre_idx; CREATE INDEX livres_prix_idx ON livres (prix, titre) WHERE prix BETWEEN 5 AND 20; IV.11. Insertion des données dans la base avec INSERT • TABLE editions : - Insertion dans le schéma gestion, les maisons d'éditions numéro 7460, 8210, 905151, 8359, 7989, 84002, 7685, 84369 et 7745 extraites de la table editions du schéma adherents : INSERT INTO editions SELECT code_editions, nom, adresse, code_postal, ville, nombre_employes, date_creation, email_contact FROM adherents.editions WHERE code_editions IN (7460,8210,905151,8369,7989,85625,84002,7685,7745); • TABLE imprimeurs : - Insertion des données : INSERT INTO imprimeurs VALUES (10, 'Imprimerie Nouvelle', ROW(22, 'Rue', 'du Champ Page 24 /42 PostgreSQL sous Debian 5 Version 1.00 de Blé', '75004', 'Paris'), 500, 'http://www.impnouv.fr', '01.56.25.98.41', NULL); • TABLE distinctions : - Insertion des données : INSERT INTO distinctions ('Prix des Lycees Techniques', '15/01/2003'); • TABLE livres : - Insertion des données avec l'option ARRAY : INSERT INTO livres VALUES ('978-2-84002-790-4', 'La valeur de l'art', 52, '21-02-2000', '1502-2000', 'francais', '01/01/1999', ARRAY ['anglais', 'japonais', 'allemand'], 13); IV.12.Mise à jour et suppression des données • Mise à jour adresse ENI Editions : UPDATE editions SET adresse = 'Rue Benjamin Franklin' WHERE nom = 'ENI Editions'; • Effet par les 2 suppressions suivantes : - Suppression de la maison d'éditions Maillard DELETE FROM editions WHERE nom = 'Maillard'; - Suppression du prix littéraire Prix du Festival du Polar DELETE FROM distinctions WHERE prix = 'Prix du Festival du Polar'; • Augmentation des prix des livres de 5% : UPDATE livres SET prix = prix*1.05; • Suppression de l'auteur Alexandre Dausmenil : DELETE FROM auteurs WHERE nom = 'Dausmenil' AND prenom = 'Alexandre'; • Changement de Rue par Avenue : UPDATE imprimeurs SET (coordonnees).type_de_voie = 'Avenue' WHERE code_imprimeur = 10; IV.13.Requêtes SQL de base avec SELECT • Sélection de colonnes : Page 25 /42 PostgreSQL sous Debian 5 Version 1.00 SELECT colonne1, colonne2, …, colonne10 FROM table; • Sélection de toutes les colonnes : SELECT * FROM table; • Ecriture 'non-égale' : SELECT ville FROM editions WHERE ville != 'Paris'; SELECT ville FROM editions WHERE ville <> 'Paris'; • Commande SELECT max(code_postal) FROM editions; max = donne la valeur numérique maximale et aussi utilisée pour le type varchar en donnant la dernière valeur de la colonne. TABLE personnes Nom Prénom Dupond Jean Robert Anaïs Dupond Pierre Burrel André Dupond Jean Dupond • SELECT + DISTINCT : SELECT DISTINCT * FROM personnes; (n'affiche que 5 noms + prénoms différents) SELECT nom DISTINCT FROM personnes; (n'affiche que 3 noms différents) SELECT count(DISTINCT prenom) FROM personnes; (n'affiche que 4 prénoms différents) • Requêtes suivantes sont identiques : SELECT titre FROM livres WHERE prix BETWEEN 5.50 AND 9.50; SELECT titre FROM livres WHERE prix >=5.50 AND <=9.50; Page 26 /42 PostgreSQL sous Debian 5 Version 1.00 TABLE personnes Nom Prénom Age Dupond Jean 26 Robert Anaïs 30 Dupond Pierre 45 Burrel André Dupond Jean • 60 SELECT + LIKE : SELECT round(avg(age),2) FROM personnes WHERE nom LIKE 'd%'; (pas de noms commençant par un d miniscule) • Requête donnant le nom et l'âge dont l'âge est renseigné : SELECT nom, age FROM personnes WHERE age >= ANY (SELECT age FROM personnes); • Requête donnant le nom des auteurs dont la date de décès et le prénom sont connus : SELECT nom FROM auteurs WHERE date_deces IS NOT NULL AND prenom IS NOT NULL; • Requête calculant le nombre d'auteurs vivants avec + de 50 ans : SELECT count(*) FROM auteurs WHERE EXTRACT(year FROM age(date_naissance)) >50 AND date_deces IS NULL; • Requête donnant les prénoms en majuscules : SELECT upper(prenom) FROM personnes; • Requête donnant le prix moyen des livres pour chaque collection, par code de collection croissant : SELECT code_collection, round(avg(prix),2) FROM livres GROUP BY code_collection ORDER BY code_collection; Page 27 /42 PostgreSQL sous Debian 5 • Version 1.00 Requête donnant le nombre de personnes de chaque âge, compris entre 30 et 40, par ordre croissant : SELECT count(*) AS "Nombre de personnes", age FROM personnes GROUP BY age HAVING age BETWEEN 30 AND 40 ORDER BY age; TABLE T1 Nom Age Note Martin 15 5 Durand 16 12 Dupont 15 TABLE T2 Nom Age Note Michel 8 Reynaud 16 12 Dalic 14 14 • Requête affichant les noms d'étudiants de la table T1 ayant les mêmes notes que la table T2 et le même âge : SELECT nom FROM T1 WHERE note = (SELECT note FROM T2 age = T1.age); • EXERCISES : - A Sélection : - Affichage de la table collections SELECT * FROM collections; code_collection | intitule | code_edition | theme -----------------+--------------------------+--------------+------------------1 | Les TPS Informatiques | 7460 | informatique 2 | Technote | 7460 | informatique 3 | Certifications | 7460 | enseignement 4 | Ressources Informatiques | 7460 | informatique 5 | Microfluo | 7460 | informatique 6 | SF | 8210 | anticipation 7 | Grands Classiques | 8210 | littérature Page 28 /42 PostgreSQL sous Debian 5 Version 1.00 8 | Lecture Passion | 8210 | romans 9 | Architectures | 8359 | beaux livres 10 | Réflexions urbanistes | 8359 | beaux livres 11 | Amour toujours | 7989 | romans 12 | Homme et société | 84002 | sciences humaines 13 | Réflexions | 84002 | essais 14 | La philo facile | 84002 | enseignement - Affichage de l'intitulé et du code des collections SELECT code_collection, intitule FROM collections; code_collection | intitule -----------------+-------------------------1 | Les TPS Informatiques 2 | Technote 3 | Certifications 4 | Ressources Informatiques 5 | Microfluo 6 | SF 7 | Grands Classiques 8 | Lecture Passion 9 | Architectures 10 | Réflexions urbanistes 11 | Amour toujours 12 | Homme et société 13 | Réflexions 14 | La philo facile - Affichage du titre et du prix des livres SELECT titre, prix FROM livres; titre | prix --------------------------------------------+------SQL Server 2005 | 26.93 Oracle 10g | 26.93 Windows Server 2003 | 26.93 Page 29 /42 PostgreSQL sous Debian 5 AutoCAD 2006 Version 1.00 | 26.93 ….... - Affichage de l'intitulé des collections dont les éditions ont pour code 7460 SELECT intitule FROM collections WHERE code_edition = 7460; intitule -------------------------Les TPS Informatiques Technote Certifications Ressources Informatiques Microfluo - Affichage du code des entrepôts situés à Lyon SELECT code_entrepot FROM entrepots WHERE ville = 'Lyon'; code_entrepot --------------8 - Affichage du code des entrepôts qui ne sont pas situés à Lyon SELECT code_entrepot FROM entrepots WHERE ville != 'Lyon'; code_entrepot --------------1 3 4 5 …...... - Affichage du nom des imprimeurs qui ont moins de 200 employés SELECT nom_imprimeur FROM imprimeurs WHERE nb_employes < 200; nom_imprimeur --------------------Imprimerie Hébrard Page 30 /42 PostgreSQL sous Debian 5 Version 1.00 Camteck et fils Impressions ENI Offset Jeux d'encre Mizenpage Charlier et Herbont - Affichage de l'intitulé, du code et du thème des collections dont le thème est romans ou essais SELECT intitule, code_collection, theme FROM collections WHERE theme = 'romans' OR theme = 'essais'; intitule | code_collection | theme -----------------+-----------------+-------Lecture Passion | 8 | romans Amour toujours | 11 | romans Réflexions | 13 | essais - Affichage du titre des livres déposés légalement entre le 20 Janvier 1975 et le 18 Mars 1985. Nommez le résultat : « Livres déposés entre le 20/01/1975 et 18/03/1985 ». SELECT titre AS "Livres deposes entre le 20/01/1975 et 18/03/1985" FROM livres WHERE depot_legal BETWEEN '1975-01-20' AND '1985-03-18'; Livres deposes entre le 20/01/1975 et 18/03/1985 -------------------------------------------------L'homme et son environnement - Listage des imprimeurs dont l'adresse est située dans une rue SELECT nom_imprimeur FROM imprimeurs WHERE (coordonnees).type_de_voie = 'Rue'; nom_imprimeur --------------------Imprimerie Nouvelle Charlier et Herbont - Affichage de l'ISBN et du titre des livres écrits en anglais dont le prix est inférieur à 8,50€ SELECT isbn, titre FROM livres WHERE langue = 'anglais' AND prix < 8.50; isbn | titre -------------------+---------------------Page 31 /42 PostgreSQL sous Debian 5 Version 1.00 978-2-7989-2674-8 | Romance de printemps - Affichage du titre des livres dont le prix est compris entre 10 et 20€. Nommez le résultat : « Livres coûtant entre 10 Euros et 20 Euros ». SELECT titre AS "Livres coutant entre 10 Euros et 20 Euros" FROM livres WHERE prix BETWEEN 10 AND 20; Livres coutant entre 10 Euros et 20 Euros ------------------------------------------Les méta-hommes Promenades en France La violence urbaine en Europe Quelle place pour la culture? L'homme et son environnement Manuscrits antiques d'auteurs inconnus Vie et mort du système scolaire - B Absence de valeur : - Affichage du titre des livres dont le prix n'est pas renseigné SELECT titre FROM livres WHERE prix IS NULL; titre --------------------------------Applications serveur sous .NET SQL Server 2000 - Examen 70-228 Eugénie Grandet Le secret de Miranda - Affichage du nom des imprimeurs dont le nombre d'employés est connu SELECT nom_imprimeur FROM imprimeurs WHERE nb_empoyes >= ANY (SELECT nb_employes FROM imprimeurs); nom_imprimeur --------------------Imprimerie Nouvelle Imprimerie Hébrard Camteck et fils Print Express Page 32 /42 PostgreSQL sous Debian 5 Version 1.00 Impressions ENI Offset Jeux d'encre Mizenpage Charlier et Herbont - C Tri : - Affichage des noms d'auteurs triés par ordre alphabétique SELECT nom FROM auteurs ORDER BY nom; nom ----------------Arniaud Arrouas Atelin Bernard …..... - Affichage des titres des livres par ordre de prix SELECT titre FROM livres ORDER BY prix; titre -------------------------------------------Romance de printemps Un amour impossible Le coureur à pied Les amis du bout du monde …..... - D LIKE : - Noms d'auteurs commençant par la lettre F SELECT nom FROM auteurs WHERE nom LIKE 'F%'; nom ---------Fournier Franchi Page 33 /42 PostgreSQL sous Debian 5 Version 1.00 Falque - E DATE : - Affichage du nom, de la date et du jour de naissance des auteurs SELECT nom, date_naissance AS "Date de naissance", EXTRACT(day FROM date_naissance) AS "Jour de naissance" FROM auteurs; nom | Date de naissance | Jour de naissance -----------------+-------------------+------------------Arrouas | 05/06/1971 | 5 Fournier | 15/10/1947 | 15 | 9 Dausmenil Bernard | | | 09/04/1964 …..... - Affichage du numéro du jour dans l'année qui correspond à la date de dépôt légal avec FLOOR SELECT - F Les chaînes de caractères : - Affichage du nom des auteurs en majuscules SELECT upper (nom) FROM auteurs; upper ----------------ARROUAS FOURNIER DAUSMENIL ….... - G Minimum, maximum, moyenne et arrondi : - Affichage du prix minimum, maximum et moyenne des livres SELECT min (prix), max (prix), avg (prix) FROM livres; min | max | avg ------+-------+--------------------4.97 | 79.50 | 20.2635294117647059 Page 34 /42 PostgreSQL sous Debian 5 Version 1.00 - Affichage du prix des livres en francs arrondi à 2 décimales SELECT round (prix,2) FROM livres; round ------17.64 23.15 21.50 ….... 5.02 20.07 17.31 - Affichage du prix des livres sans TVA SELECT prix, round (prix*0.196,2) FROM livres; prix | round -------+------17.64 | 3.46 23.15 | 4.54 21.50 | 4.21 ….... - H Somme et comptage des lignes : - Comptage du nombre de livres dont la date d'impression et de dépôt légal ne sont pas précisées SELECT count(*) FROM livres WHERE date_impression IS NULL AND depot_legal IS NULL; count ------19 - Nombre total d'employés des imprimeries SELECT sum (nb_employes) FROM imprimeurs; sum -----1297 Page 35 /42 PostgreSQL sous Debian 5 Version 1.00 - I GROUP BY : - Comptage du nombre de livres de chaque prix SELECT count(*) FROM livres GROUP BY prix; count ------4 1 2 …..... - Prix moyen pour chaque collection SELECT avg (prix) FROM livres GROUP BY code_collection; avg --------------------9.5333333333333333 5.5000000000000000 16.9500000000000000 25.6500000000000000 9.5000000000000000 36.1750000000000000 56.0500000000000000 7.7440000000000000 55.0500000000000000 5.0166666666666667 25.7800000000000000 6.9500000000000000 18.0000000000000000 - J HAVING : - Noms d'auteurs apparaissant au moins 2 fois SELECT count(nom), nom FROM auteurs GROUP BY nom HAVING count(nom) >1; count | nom -------+------Page 36 /42 PostgreSQL sous Debian 5 Version 1.00 2 | Guén - K IN : - Affichage de code, de l'intitulé et du thème des collections dont le thème est roman, essais ou anticipation SELECT code_collection, intitule, theme FROM collections WHERE theme IN ('romans','essais','anticipation'); code_collection | intitule | theme -----------------+-----------------+-------------6 | SF | anticipation 8 | Lecture Passion | romans 11 | Amour toujours | romans 13 | Réflexions | essais - L ALL : - Nom de l'auteur vivant le plus âgé SELECT nom, prenom, date_naissance FROM auteurs WHERE date_naissance = ALL (SELECT min(date_naissance) FROM auteurs WHERE date_deces IS NULL); nom | prenom | date_naissance ----------+--------+---------------Fournier | Louis | 15/10/1947 - M ANY : - Auteurs ayant le même âge mais pas le même nom que les auteurs qui portent les noms Murzeau ou Leroux SELECT nom, prenom FROM auteurs WHERE date_naissance = ANY (SELECT date_naissance FROM auteurs WHERE nom != 'Murzeau' | 'Leroux'); - N Imbriquée : - Affichage du titre du livre le moins cher SELECT titre FROM livres WHERE prix = (SELECT min (prix) FROM livres); titre ---------------------Romance de printemps Page 37 /42 PostgreSQL sous Debian 5 Version 1.00 IV.14.Requêtes SQL avancées telephone bureau employes telephone nom bureau 10 3265 Martin 10 16 4526 dupont 15 Durand 16 Requête SELECT * FROM employes NATURAL JOIN telephone; donnant le résultat : • 10 Martin 3265 16 Durand 4526 SELECT * FROM employes INNER JOIN telephone USING (bureau); donne le même résultat si USING (bureau) est utilisé, sinon le résultat sera : • Martin 10 10 3265 Durand 16 16 4526 Jointure interne des colonnes « identifiant_auteur » et « id_auteur » entre les tables « auteurs » et « ecrit_par » • SELECT * FROM auteurs NATURAL JOIN ecrit_par WHERE identifiant_auteur = id_auteur; IV.15.Vu, Règles, Droits et Tables système NOM PRENOM POSTE Dupont Jean 2256 Durand Marc Colomb • Martin 2445 Pierre 4777 CREATE VIEW vue_personnel AS SELECT * FROM personnel WHERE poste > 4000; - Création d'une vue nommée « EditeursAnnees80 » contenant le code, le nom et le nombre d'employés des maisons d'édition créées entre le 12 Février 1980 inclus et le 15 Octobre 1989 exclus CREATE VIEW EditeursAnnees80 AS SELECT code_edition, nom, nombre_employes Page 38 /42 PostgreSQL sous Debian 5 Version 1.00 FROM editions WHERE date_creation >= '1980-02-12' AND date_creation < '1989-10-15'; CREATE VIEW centralivres=> \dv Liste des relations Schéma | Nom | Type | Propriétaire ---------+------------------+------+-------------gestion | editeursannees80 | vue | tsgeri - Création d'une vue nommée « AuteursDefunts » qui contiendra les auteurs décédés CREATE VIEW AuteursDefunts AS SELECT nom, prenom, date_deces FROM auteurs WHERE date_deces IS NOT NULL; CREATE VIEW centralivres=> \dv Liste des relations Schéma | Nom | Type | Propriétaire ---------+------------------+------+-------------gestion | auteursdefunts | vue | tsgeri gestion | editeursannees80 | vue | tsgeri - Création d'une vue « LivresEtCollections » contenant ISBN, le titre des livres, le prix, l'intitulé de la collection et le code des éditions dont ils font partie CREATE VIEW LivresEtCollections AS SELECT isbn, titre, prix, intitule, code_edition FROM livres, collections; CREATE VIEW centralivres=> \dv Liste des relations Schéma | Nom | Type | Propriétaire ---------+---------------------+------+-------------gestion | auteursdefunts gestion | editeursannees80 | vue | tsgeri | vue | tsgeri gestion | livresetcollections | vue | tsgeri - Création d'une règle « InsertionLivres » qui, à chaque insertion dans la table livres, affichera le titre du livre et le nom de la collection concernée par cet ajout CREATE RULE InsertionLivres AS ON INSERT TO livres DO ALSO SELECT titre, intitule Page 39 /42 PostgreSQL sous Debian 5 Version 1.00 FROM livres, collections; - Création d'une table temporaire nommée R292 à partir de la requête suivante 'quel est le nombre d'entrepôts dans chaque ville ?' CREATE TEMPORARY TABLE R292 ( - Schéma de la base de donnée où a été enregistrée la table temporaire - Après une déconnexion, la table est-elle encore accessible ? Les tables temporaires sont automatiquement supprimées à la fin d'une session ou, optionnelement, à la fin de la transaction en cours avec la commande COMMIT. - Nombre de bases de données hébergées par Postgres Il y a 5 bases de données hébergées par Postgres en tapant « \l » IV.16.Transactions - Lancement d'une transaction et insertion de l'auteur Michel Barjart, portant le numéro 46, de nationalité française, né le 05 Mai 1978, et validation de la transaction BEGIN TRANSACTION; BEGIN INSERT INTO auteurs VALUES (46, 'Barjart', 'Michel', 'française', '1978-05-05', NULL); INSERT 0 1 COMMIT; COMMIT - Lancement d'une transaction et suppression de l'auteur Pablo Cisa qui porte le numéro 17 puis affichage du contenu de la table « auteurs ». - Validation de la transaction. Postgres a t'il validé ou annulé les commandes qui précèdent la fin de la transaction ? BEGIN TRANSACTION; BEGIN DELETE FROM auteurs WHERE identifiant_auteur = 17; DELETE 1 SELECT * FROM auteurs; identifiant_auteur | nom | prenom | nationalite | date_naissance | date_deces Page 40 /42 PostgreSQL sous Debian 5 Version 1.00 --------------------+-----------------+--------------+-------------+----------------+-----------1 | Arrouas | Henry | inconnue 2 | Fournier | Louis | belge 3 | Dausmenil | Alexandre | 05/06/1971 | 15/10/1947 | inconnue | | | | …... COMMIT; COMMIT Postgres a validé les commandes qui précèdent la fin de la transaction quand la commande COMMIT est validée. Par contre, si la commande ROLLBACK est validé, la transaction sera annulée. IV.17.Fonction SQL et langage procédural PL/pgSQL - Création d'une fonction SQL nommé « PrixHorsTVA » qui prend en paramètre un prix et renvoie sa valeur hors TVA, arrondie à 2 décimales CREATE FUNCTION PrixHorsTVA (prix numeric) RETURNS numeric AS $$ SELECT round(prix*0.196,2) FROM livres; $$ LANGUAGE SQL RETURNS NULL ON NULL INPUT; - Avec la fonction PL/SQL CREATE FUNCTION PrixHorsTVA (prix numeric) RETURNS real AS $$ DECLARE BEGIN SELECT round(prix*0.196,2) FROM livres; END; $$ LANGUAGE PLPGSQL; IV.18.Déclencheurs CREATE TRIGGER tbefore BEFORE INSERT INTO OR UPDATE OR DELETE ON table FOR EACH ROW EXECUTE PROCEDURE trigf (); CREATE TRIGGER tafter AFTER INSERT OR UPDATE OR DELETE ON table FOR EACH ROW EXECUTE PROCEDURE trigf (); Page 41 /42 PostgreSQL sous Debian 5 Version 1.00 V. CONCLUSION Un apparentissage des commandes de PostgreSQL par le TP sur divers exercises permet de comprendre le fonctionnement et de pouvoir créer, supprimer ou modifier une base de données. Page 42 /42