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

Documents pareils