Création d'une base de données

CREATE SCHEMA video; -- Création des tables SET SEARCH_PATH TO video; CREATE TABLE genres ( codegenre VARCHAR (10) PRIMARY KEY, libellegenre VARCHAR(10) NOT NULL ); CREATE TABLE pays ( codepays VARCHAR (10) PRIMARY KEY, pays VARCHAR (25) NOT NULL ); CREATE TABLE acteurs ( id SERIAL PRIMARY KEY, nomacteur VARCHAR (20), prenomacteur VARCHAR (20), sexe VARCHAR (10), codepays VARCHAR (10) REFERENCES pays (codepays) ); CREATE TABLE realisateurs ( id SERIAL PRIMARY KEY, nomrealisateur VARCHAR (20) NOT NULL, prenomrealisateur VARCHAR (20) NOT NULL, codepays VARCHAR (10) REFERENCES pays (codepays) ); CREATE TABLE films ( id VARCHAR (200) PRIMARY KEY, titre VARCHAR (255), producteur VARCHAR (40), codepays VARCHAR (10) REFERENCES pays (codepays), annee INT, duree NUMERIC, resume VARCHAR (4000), affiche VARCHAR (200), note NUMERIC ); CREATE TABLE roles ( idfilm VARCHAR (200) REFERENCES films (id), idacteur SERIAL REFERENCES acteurs (id), role VARCHAR (10), PRIMARY KEY (idfilm, idacteur) ); CREATE TABLE classificationsfilms ( idfilm VARCHAR (200) REFERENCES films (id), codegenre VARCHAR (10) REFERENCES genres (codegenre), PRIMARY KEY (idfilm, codegenre) ); CREATE TABLE realisations ( idfilm VARCHAR (200) REFERENCES films (id), idrealisateur SERIAL REFERENCES realisateurs (id), PRIMARY KEY (idfilm, idrealisateur) ); CREATE TABLE villes ( codeville SERIAL PRIMARY KEY, nomville VARCHAR (20), codepostal INT ); CREATE TABLE clients ( numeroclient SERIAL PRIMARY KEY, nomclient VARCHAR (20), prenomclient VARCHAR (20), titre VARCHAR (50), adresse1 VARCHAR (30), adresse2 VARCHAR (30), codeville SERIAL REFERENCES villes (codeville), telephone VARCHAR (20), dateadhesion VARCHAR (20), dateexpiration VARCHAR (20) ); CREATE TABLE supports ( codesupport VARCHAR(3) PRIMARY KEY, intitule VARCHAR (20) ); CREATE TABLE videos ( id SERIAL PRIMARY KEY, idfilm VARCHAR (200) REFERENCES films (id), duree INT, codesupport VARCHAR (3) REFERENCES supports (codesupport), langue VARCHAR (10), dateachat VARCHAR (20), commentaires VARCHAR (20) ); CREATE TABLE locations ( idvideo SERIAL REFERENCES videos (id), numeroclient SERIAL REFERENCES clients (numeroclient), datelocation VARCHAR (20), dateretour VARCHAR (20), tarif NUMERIC, retourvalide VARCHAR (10), PRIMARY KEY (idvideo, numeroclient, datelocation) );

-- PAYS INSERT INTO pays (codepays, pays) VALUES ('BRA', 'Brazil'); INSERT INTO pays (codepays, pays) VALUES ('CHN', 'ChinA'); INSERT INTO pays (codepays, pays) VALUES ('DEU', 'Germany'); INSERT INTO pays (codepays, pays) VALUES ('ESP', 'Spain'); INSERT INTO pays (codepays, pays) VALUES ('FRA', 'France'); INSERT INTO pays (codepays, pays) VALUES ('IND', 'India'); INSERT INTO pays (codepays, pays) VALUES ('ITA', 'Italy'); INSERT INTO pays (codepays, pays) VALUES ('JPN', 'Japan'); INSERT INTO pays (codepays, pays) VALUES ('USA', 'United States of America'); INSERT INTO pays (codepays, pays) VALUES ('NZL', 'New Zealand'); INSERT INTO pays (codepays, pays) VALUES ('GBR', 'GBR'); INSERT INTO pays (codepays, pays) VALUES ('Can', 'Canada'); INSERT INTO pays (codepays, pays) VALUES ('NEW', 'New Zealand'); INSERT INTO pays (codepays, pays) VALUES ('CAN', 'Canada');

SELECT nomacteur, prenomacteur, COUNT(videos.id), SUM(tarif) FROM acteurs INNER JOIN roles ON acteurs.id = roles.idacteur INNER JOIN films ON roles.idfilm = films.id INNER JOIN videos ON films.id = videos.idfilm INNER JOIN locations ON videos.id = locations.idvideo GROUP BY nomacteur, prenomacteur ORDER BY SUM(tarif) DESC LIMIT 5;

Cette requête permet d'extraire la liste des 5 acteurs les plus rentables.

Résultat :


Procédure stockée pour calculer le périmètre d'un rectangle :

CREATE OR REPLACE FUNCTION afficher_perimetre_rectangle (longeur INT, largeur INT) RETURNS VOID AS $$ DECLARE perimetre INT = (longeur + largeur) * 2; BEGIN RAISE INFO 'Longueur = %, Largeur = %, Périmètre = %', longeur, largeur, perimetre; END $$ LANGUAGE plpgsql; SELECT afficher_perimetre_rectangle (10, 15);

Résultat :

Fonction pour calculer un PGCD :

CREATE OR REPLACE FUNCTION pgcd (chiffre1 INT, chiffre2 INT) RETURNS INT AS $$ BEGIN WHILE chiffre1 <> chiffre2 LOOP IF chiffre1 > chiffre2 then chiffre1 = chiffre1 - chiffre2; ELSE chiffre2 = chiffre2 - chiffre1; END IF; END LOOP; return chiffre1; END $$ LANGUAGE plpgsql; SELECT pgcd (24, 64);

Résultat :