Vous êtes sur la page 1sur 65

Introduction aux langage SQL

Alexandre Mesl e 6 octobre 2013

Table des mati` eres


1 Notes de cours 1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Quest-ce quun SGBDR ? . . . . . . . . . . . . 1.1.2 SQL . . . . . . . . . . . . . . . . . . . . . . . . 1.1.3 Connexion ` a une base de donn ees . . . . . . . . 1.1.4 Organisation relationnelle des donn ees . . . . . 1.2 Contraintes d eclaratives . . . . . . . . . . . . . . . . . 1.2.1 Valeurs par d efaut . . . . . . . . . . . . . . . . 1.2.2 Champs non renseign es . . . . . . . . . . . . . 1.2.3 Cl e primaire . . . . . . . . . . . . . . . . . . . 1.2.4 Cl e etrang` ere . . . . . . . . . . . . . . . . . . . 1.2.5 Syntaxe alternative . . . . . . . . . . . . . . . . 1.3 Introduction aux requ etes . . . . . . . . . . . . . . . . 1.3.1 Compl ements sur SELECT . . . . . . . . . . . . 1.3.2 Instruction WHERE . . . . . . . . . . . . . . . . . 1.3.3 Conditions . . . . . . . . . . . . . . . . . . . . 1.3.4 Suppression . . . . . . . . . . . . . . . . . . . . 1.3.5 Mise ` a jour . . . . . . . . . . . . . . . . . . . . 1.4 Jointures . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Principe . . . . . . . . . . . . . . . . . . . . . . 1.4.2 Produit cart esien . . . . . . . . . . . . . . . . . 1.4.3 Jointure . . . . . . . . . . . . . . . . . . . . . . 1.4.4 Jointures re exives . . . . . . . . . . . . . . . . 1.5 Agr egation de donn ees . . . . . . . . . . . . . . . . . . 1.5.1 Fonctions dagr egation . . . . . . . . . . . . . . 1.5.2 Groupage . . . . . . . . . . . . . . . . . . . . . 1.6 Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 D enition . . . . . . . . . . . . . . . . . . . . . 1.6.2 Syntaxe . . . . . . . . . . . . . . . . . . . . . . 1.6.3 Application . . . . . . . . . . . . . . . . . . . . 1.6.4 Suppression . . . . . . . . . . . . . . . . . . . . 1.7 Requ etes imbriqu ees . . . . . . . . . . . . . . . . . . . 1.7.1 Sous requ etes renvoyant une valeur scalaire . . 1.7.2 Sous requ etes renvoyant une colonne . . . . . . 1.7.3 Sous requ etes non correl ees renvoyant une table 1.7.4 Sous requ etes correl ees . . . . . . . . . . . . . . 1.8 Compl ements sur les types . . . . . . . . . . . . . . . . 1.8.1 Types num eriques . . . . . . . . . . . . . . . . 1.8.2 Types chaine de caract` eres . . . . . . . . . . . 1.8.3 Types date . . . . . . . . . . . . . . . . . . . . 1.8.4 La fonction inclassable . . . . . . . . . . . . . . 1.8.5 Contraintes CHECK . . . . . . . . . . . . . . . . 3 3 3 3 3 4 6 6 6 6 6 7 8 8 8 8 10 10 11 11 12 12 13 15 15 17 19 19 19 19 20 21 21 22 23 24 26 26 27 27 28 28

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Exercices 2.1 Contraintes d eclaratives . 2.2 Introduction aux requ etes 2.3 Jointures . . . . . . . . . 2.4 Agr egation de donn ees . . 2.5 Vues . . . . . . . . . . . . 2.6 Requ etes imbriqu ees . . . 2.7 Compl ements sur les types 2.8 R evisions . . . . . . . . . 3 Corrig es 3.1 Contraintes d eclaratives . 3.2 Introduction aux requ etes 3.3 Jointures . . . . . . . . . 3.4 Agr egation de donn ees . . 3.5 Vues . . . . . . . . . . . . 3.6 Requ etes imbriqu ees . . . 3.7 Compl ements sur les types 3.8 R evisions . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

29 29 30 32 34 35 36 37 38 39 39 41 43 45 46 47 49 50 51 51 51 51 53 53 53 54 55 55 55 57 58 60 62 64

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

A Scripts de cr eation de tables A.1 Livraisons Sans contraintes . . . . A.1.1 Oracle . . . . . . . . . . . . A.1.2 mySql . . . . . . . . . . . . A.2 Modules et prerequis . . . . . . . . A.2.1 Oracle . . . . . . . . . . . . A.2.2 mySql . . . . . . . . . . . . A.3 G eom etrie . . . . . . . . . . . . . . A.4 Livraisons . . . . . . . . . . . . . . A.4.1 Oracle . . . . . . . . . . . . A.4.2 MySql . . . . . . . . . . . . A.5 Arbre g en ealogique . . . . . . . . . A.6 Comptes bancaires . . . . . . . . . A.7 Comptes bancaires avec exceptions A.8 Secr etariat p edagogique . . . . . . A.9 Mariages . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

Chapitre 1

Notes de cours
1.1
1.1.1

Introduction
Quest-ce quun SGBDR ?

Un SGBD (Syst` eme de Gestion de Bases de Donn ees) est un logiciel qui stocke des donn ees de fa con organis ees et coh erentes. Un SGBDR (Syst` eme de Gestion de Bases de Donn ees Relationnelles) est le type particulier de SGBD qui fera lobjet de ce cours. Il vous sera d ecrit plus tard ce qui fait quune bases de donn ees est relationnelle. Les bases de donn ees les plus r epandues sont : Oracle, qui est consid er e comme un des SGBDR les plus performants. Microsoft SQL Server, la mouture de microsoft, qui est int egr e au framework .NET. mySQL, un logiciel libre fonctionnant souvent de pair avec Apache et Php, et de ce fait tr` es r epandu dans la programmation web. Access, incorpor e` a Microsoft Oce. Il pr esente l enorme avantage de mettre ` a disposition de lutilisateur une interface graphique. En contrepartie il est mono-utilisateur et de faible capacit e. Les SGBDRs sont g en eralement des serveurs auxquels des clients se connectent, il doivent supporter plusieurs connections simultan ees. Les clients dialoguent alors avec le serveur pour lire ou ecrire des donn es dans la base.

1.1.2

SQL

Le SQL, Structured Query Language, est un langage Standard permettant ` a un client de communiquer des instructions ` a la base de donn ees. Il se d ecline en quatre parties : le DDL (Data denition language) comporte les instructions qui permettent de d enir la fa con dont les donn ees sont repr esent ees. le DML (Data manipulation language) permet d ecrire dans la base et donc de modier les donn ees. le DQL (Data query language) est la partie la plus complexe du SQL, elle permet de lire les donn ees dans la base ` a laide de requ etes. le DCL (Data control language), qui ne sera pas vu dans ce cours permet de g erer les droits dacc` es aux donn ees. A cela sajoute des extensions proc edurales du SQL (appel e PL/SQL en Oracle). Celui-ci permet d ecrire des scripts ex ecut es par le serveur de base de donn ees.

1.1.3

Connexion ` a une base de donn ees

Dans une base de donn ees relationnelle, les donn ees sont stock ees dans des tables. Une table est un tableau ` a deux entr ees. Nous allons nous connecter ` a une base de donn ees pour observer les tables. Oracle Sous oracle, le client sappelle SQL+, le compte utilisateur par d efaut a pour login scott et password tiger. La liste des tables sache en utilisant linstruction SELECT TABLE_NAME F R O M USER_TABLES On ache la liste des colonnes dune table avec linstruction DESC nomdelatable Le contenu dune table sache avec linstruction 3

SELECT F R O M nomdelatable ;

mySQL La m ethode la plus simple pour sinitier ` a mysql est dutiliser un kit de easyphp, wamp, etc. Vous disposez dans ce cas dune option vous permettant douvrir une console mysql. La liste des bases de donn ees stock ees dans le serveur sobtient avec linstruction show databases ; On se connecte a ` lune des bases de donn ees avec linstruction connect nomdelabase ; Une fois dans la base, on obtient la liste des tables avec linstruction show tables ; On ache la liste des colonnes dune table avec linstruction desc nomdelatable ; Le contenu dune table sache avec linstruction SELECT F R O M nomdelatable ;

1.1.4

Organisation relationnelle des donn ees

Nous utiliserons pour commencer les types suivants : num erique entier : int num erique ` a point xe : number (Oracle seulement) num erique ` a point ottant : real cha ne de caract` eres : varchar(taille) ou varchar2(taille) (Oracle seulement). Cr eer des tables La syntaxe permettant de cr eer une table est CREATE TABLE nomdelatable ( descriptioncolonne1 , . . . , descriptioncolonnen ) ; La description dune colonne se fait avec la syntaxe suivante : nomcolonne type optionseventuelles Par exemple : create table client ( numcli number , nomcli varchar2 ( 2 5 6 ) );

Ajouter une ligne dans une table La syntaxe de linstruction permettant dins erer une ligne dans une table est la suivante : INSERT INTO nomdelatable ( nomcolonne1 , . . . , nomcolonnen ) VALUES ( valeurcolonne1 , . . . , valeurcolonnen ) Par exemple les instructions suivantes INSERT INTO CLIENT ( numcli , nom ) VALUES ( 1 , Marcel ) ; INSERT INTO CLIENT ( numcli , nom ) VALUES ( 2 , Bernard ) ;

nous donnent numcli nomcli 1 Marcel 2 Bernard Attention, chaque commande SQL se termine par un point-virgule !

1.2
1.2.1

Contraintes d eclaratives
Valeurs par d efaut

create table client ( numcli number , nom varchar2 ( 2 5 6 ) default Moi , prenom varchar2 ( 2 5 6 ) ) fait de Moi le nom par d efaut.

1.2.2

Champs non renseign es

create table client ( numcli number , nom varchar2 ( 2 5 6 ) NOT NULL, prenom varchar2 ( 2 5 6 ) NOT NULL ) force la saisie des champs nom et pr enom.

1.2.3

Cl e primaire

Une cl e primaire est : toujours renseign ee unique On peut pr eciser PRIMARY KEY dans la cr eation de table create table client ( numcli number PRIMARY KEY, nom varchar2 ( 2 5 6 ) , prenom varchar2 ( 2 5 6 ) ) La colonne numcli est cl e primaire, toute insertion ne respectant pas la contraine de cl e primaire sera refus ee par le SGBD.

1.2.4

Cl e etrang` ere

Dans le cas o` u lon souhaite garder en m emoire des factures emises par des clients, la fa con de faire est de cr eer une deuxi` eme table contenant la liste des factures : create table facture ( numfact number PRIMARY KEY, montantFacture number numcli number REFERENCES CLIENT ( numCli ) ); Le champ numCli dans cette table est cl e etrang` ere, ce qui signie quune ligne ne pourra etre ins er ee dans la table facture que si le numcli de cette ligne existe dans la colonne numcli de la table client. La syntaxe est REFERENCES <nomtable > (< nomcolonne >)

1.2.5

Syntaxe alternative

Il est possible de d enir les contraintes apr` es la cr eation dune table. ALTER TABLE nomtable A D D [CONSTRAINT nomcontrainte ] descriptioncontrainte ; descriptioncontrainte dune cl e primaire : PRIMARY KEY( colonne1 , . . . , colonnen ) descriptioncontrainte dune cl e etrang` ere : FOREIGN KEY( colonne1 , . . . , colonnen ) REFERENCES tablereferencee ( colonne1 , . . . , colonnen ) Il est aussi possible de placer une descriptioncontrainte dans le CREATE TABLE. Par exemple, create table facture ( numfact number , montantFacture number numcli number , PRIMARY KEY ( numfact ) , FOREIGN KEY nucli REFERENCES CLIENT ( numcli ) ); On remarque quil est possible de nommer une contrainte. Cest utile si on souhaite la supprimer : ALTER TABLE nomtable DROP CONSTRAINT nomcontrainte ; Pour lister les contraintes sous Oracle, on utilise la commande : SELECT F R O M USER_CONSTRAINTS ; Sous mySQL : SHOW TABLE STATUS ;

1.3
1.3.1

Introduction aux requ etes


Compl ements sur SELECT

Il est possible dutiliser SELECT pour nacher que certaines colonnes dune table. Syntaxe : SELECT <colonne_1 > , <colonne_2 > , . . . , <colonne_n > F R O M <table > Cette instruction sappelle une requ ete, elle achera pour chaque ligne de la table les valeurs des colonnes colonne1 a colonnen . Il est possible de supprimer les lignes en double ` ` a laide du mot-cl e DISTINCT. Par exemple : SELECT DISTINCT <colonne_1 > , <colonne_2 > , . . . , <colonne_n > F R O M <table > Pour trier les donn ees, on utilise ORDER BY. Exemple : SELECT <colonne_1 > , <colonne_2 > , . . . , <colonne_n > F R O M <table > O R D E R BY <colonne_1bis > , <colonne_2bis > , . . . , <colonne_nbis > Cette instruction trie les donn ees par colonne1bis croissants. En cas d egalit e, le tri est fait par colonne2bis croissants, etc. Pour trier par ordre d ecroissant, on ajoute DESC apr` es le nom de la colonne choisie comme crit` ere d ecroissant. Par exemple : SELECT <colonne_1 > , <colonne_2 > , . . . , <colonne_n > F R O M <table > O R D E R BY <colonne_1bis > DESC, <colonne_2bis > , . . . , <colonne_nbis >

1.3.2

Instruction WHERE

Cette instruction permet de ne s electionner que certaines lignes de la table. Par exemple la requ ete SELECT nom_client , prenom_client F R O M client W H E R E numero_client = 1 va acher les nom et pr enom du client dont le num ero est 1. La syntaxe g en erale est SELECT <colonne_1 > , <colonne_2 > , . . . , <colonne_n > F R O M <table > W H E R E <condition > condition sera evalu ee pour chaque ligne de la table, et seules celles qui v eeront cette condition feront partie du r esultat de la requ ete.

1.3.3

Conditions

Comparaison Les conditions peuvent etre des relations d egalit e (=), de di erence (<>), din egalit e (<, >, >= ou <=) sur des colonnes : numero_client = 2 nom_client = Chirac prenom_client <> Hubert salary < 230 taxes >= 23000

N egation La n egation dune condition sobtient ` a laide de NOT. Par exemple, il est possible de r e-ecrire les conditions ci-avant : NOT NOT NOT NOT NOT ( numero_client <> 2 ) ( nom_client <> Chirac ) ( prenom_client = Hubert ) ( salary >= 2 3 0 ) ( taxes < 2 3 0 0 0 )

Connecteurs logiques De m eme, vous avez ` a votre disposition tous les connecteurs logiques binaires : AND, OR. Ainsi, les deux conditions suivantes sont les m emes : NOT( ( nom = Bush ) A N D ( prenom <> Medor ) ) ( nom <> Bush ) OR ( prenom = Medor )

NULLit e Un champ non renseign e a la valeur NULL, dans une comparaison, NULL nest jamais egal ` a quelque valeur quil soit ! La condition suivante est toujours fausse : NULL = NULL; La requ ete suivante ne renvoie aucune ligne : SELECT F R O M EMP W H E R E COMM= NULL; Pour tester la nullit e dun champ, on utilise IS NULL, par exemple : SELECT F R O M EMP W H E R E COMM IS NULL; La non-nullit e se teste de deux fa cons : W H E R E NOT ( COMM IS NULL) ; W H E R E COMM IS NOT NULL

Encadrement Une valeur num erique peut etre encadr ee ` a laide de lop erateur BETWEEN, par exemple les deux conditions suivantes sont equivalentes : SALAIRE B E T W E E N 1000 A N D 5000 ( SALAIRE >= 1 0 0 0 ) A N D ( SALAIRE <= 5 0 0 0 )

Inclusion Lop erateur IN permet de tester lappartenance ` a une liste de valeurs. Les deux propositions suivantes sont equivalentes NAME IN ( Mesle , Bush , Medor ) ( NAME = Mesle ) OR ( NAME = Bush ) OR ( NAME = Medor )

LIKE LIKE sert ` a comparer le contenu dune variable ` a un litt eral g en erique. Par exemple, la condition NAME LIKE M % sera v eri ee si NAME commence par un M. Ca fonctionne aussi sur les valeurs de type num erique, la condition SALARY LIKE %000000000

sera v eri ee si SALARY se termine par 000000000. Le caract` ere % peut remplacer dans le litt eral nimporte que suite, vide ou non, de caract` eres ; il a le m eme r ole que * en DOS et en SHELL. Le caract` ere remplace un et un seul caract` ere dans le litt eral. Par exemple, la condition NAME LIKE B s% ne sera v eri ee que si NAME commence par un B et contient un s en troisi` eme position.

1.3.4

Suppression

Lexpression DELETE F R O M <NOMTABLE > W H E R E <CONDITION > eace de la table NOMTABLE toutes les lignes v eriant condition. Attention ! La commande DELETE F R O M <NOMTABLE > eace toutes les lignes de la table NOMTABLE !

1.3.5

Mise ` a jour

Lexpression UPDATE <NOMTABLE > SET <colonne_1 > = <valeur_1 > , <colonne_2 > = <valeur_2 > , ... , <colonne_n > = <valeur_n > W H E R E <CONDITION > modie les lignes de la table NOMTABLE v eriant condition. Elle aecte au champ colonnei la valeur valeuri . Par exemple, UPDATE CLIENT SET NAME = Medor W H E R E LUNCH = Bones aecte la valeur M edor aux champs noms de toutes les lignes dont la valeur LUNCH est egale ` a Bones. Il est possible, dans une modication, dutiliser les valeurs des autres champs de la ligne, voire m eme lancienne valeur de ce champ. Par exemple, UPDATE CLIENT SET SALARY = SALARY + 5000 augmente tous les salaires de 5000 (choisissez lunit e !).

10

1.4
1.4.1

Jointures
Principe

Etant donn e le code ci-dessous, CREATE TABLE MODULE ( numMod number primary key , nomMod varchar2 ( 3 0 ) ); CREATE TABLE PREREQUIS ( numMod number references MODULE ( numMod ) , numModPrereq number references MODULE ( numMod ) , noteMin number ( 2 ) DEFAULT 10 NOT NULL , PRIMARY KEY( numMod , numModPrereq ) ); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO MODULE MODULE MODULE MODULE MODULE MODULE MODULE MODULE VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1 , (2 , (3 , (4 , (5 , (6 , (7 , (8 , ORacle ) ; C++ ) ; C ) ; Algo ) ; Merise ) ; PL/SQL O r a c l e ) ; mySQL ) ; Algo avancee ) ; VALUES ( 1 , 5 ) ; VALUES ( 2 , 3 ) ; VALUES ( 6 , 5 ) ; VALUES ( 8 , 5 ) ; VALUES ( 7 , 5 ) ;

PREREQUIS PREREQUIS PREREQUIS PREREQUIS PREREQUIS PREREQUIS

( numMod , numModPrereq ) ( numMod , numModPrereq ) VALUES ( 6 , 1 , 1 2 ) ; ( numMod , numModPrereq ) ( numMod , numModPrereq ) ( numMod , numModPrereq )

Si on souhaite conna tre les num eros des modules prerequis pour sinscrire dans le module PL/SQL Oracle, il nous faut tout dabord le num ero de ce module : SQL> SELECT numMod F R O M module W H E R E nomMod = PL/SQL O r a c l e ; NUMMOD 6 Ensuite, cherchons les num eros des modules pr erequis pour sinscrire dans le module num ero 6, SQL> SELECT numModPrereq F R O M prerequis W H E R E numMod = 6 ; NUMMODPREREQ 1 5 Et pour nir, allons r ecup erer les noms de ces modules, SQL> SELECT nomMod F R O M module W H E R E numMod IN ( 1 , 5 ) ; NOMMOD Oracle Merise

11

Vous etes probablement tous en train de vous demander sil nexiste pas une m ethode plus simple et plus rapide, et surtout une fa con dautomatiser ce que nous venons de faire. Il existe un moyen de s electionner des donn ees dans plusieurs tables simultan ement. Pour traiter la question ci-dessus il susait de saisir : SQL> SELECT m2 . nomMod 2 F R O M module m1 , module m2 , prerequis p 3 W H E R E m1 . numMod = p . numMod A N D m2 . numMod = p . numModprereq 4 A N D m1 . nomMod = PL/SQL O r a c l e ; NOMMOD Oracle Merise Le but de ce chapitre est dexpliciter ce type de commande.

1.4.2

Produit cart esien

Linstruction SELECT ... FROM ... peut s etendre de la fa con suivante : SELECT <listecolonnes > F R O M <listetables > Lexemple ci-dessous vous montre le r esultat dune telle commande. SQL> SELECT F R O M proposer , produit ; NUMFOU NUMPROD PRIX NUMPROD NOMPROD 1 1 200 1 Roue de secours 1 1 200 2 Poupee Batman 1 1 200 3 Cotons tiges 1 1 200 4 Cornichons 1 2 15 1 Roue de secours 1 2 15 2 Poupee Batman 1 2 15 3 Cotons tiges 1 2 15 4 Cornichons 2 2 1 1 Roue de secours 2 2 1 2 Poupee Batman 2 2 1 3 Cotons tiges NUMFOU NUMPROD PRIX NUMPROD NOMPROD 2 2 1 4 Cornichons 3 3 2 1 Roue de secours 3 3 2 2 Poupee Batman 3 3 2 3 Cotons tiges 3 3 2 4 Cornichons 16 ligne ( s ) selectionnee ( s ) . Placer une liste de tables dans le FROM revient ` a former toutes les combinaisons de lignes possibles. Cependant, cela a relativement peu de sens.

1.4.3

Jointure

Il serait plus int eressant, dans le cas pr esent, de ne voir sacher que des lignes dont les num eros de produits concordent. Pour ce faire, il sut dutiliser WHERE. Par exemple, SQL> SELECT F R O M proposer , produit 2 W H E R E proposer . numprod = produit . numprod ;

12

NUMFOU NUMPROD PRIX NUMPROD NOMPROD 1 1 200 1 Roue de secours 2 2 1 2 Poupee Batman 1 2 15 2 Poupee Batman 3 3 2 3 Cotons tiges Nous avons mis en correspondance des lignes de la table proposer avec des lignes de la table produit en utilisant le fait que numprod est une cl e etrang` ere dans proposer. Comme la colonne numprod apparait deux fois dans la requ ete, il est n ecessaire de la pr exer par le nom de la table de sorte que chaque colonne puisse etre d esign ee de fa con non ambigu e. Si on veut mettre face ` a face les noms des produits et les noms des fournisseurs, il sut de saisir la requ ete SQL> SELECT nomfou , nomprod 2 F R O M produit , fournisseur , proposer 3 W H E R E produit . numProd = proposer . numProd 4 A N D fournisseur . numFou = proposer . numFou ; NOMFOU f1 f2 f1 f3 NOMPROD Roue de secours Poupee Batman Poupee Batman Cotons tiges

1.4.4

Jointures re exives

En utilisant la syntaxe suivante, il est possible de rennomer les tables, F R O M <table_1> <table_1_renommee > , . . . , <table_n> <table_n_renommee > Reformulons la requ ete ci-dessus, SQL> SELECT nomfou , nomprod 2 F R O M produit p , fournisseur f , proposer pr 3 W H E R E p . numProd = pr . numProd 4 A N D f . numFou = pr . numFou ; NOMFOU f1 f2 f1 f3 NOMPROD Roue de secours Poupee Batman Poupee Batman Cotons tiges

Le renommage permet entre autres de faire des jointures r eexives, cest ` a dire entre une table et elle m eme. Par exemple, en reprenant la table intervalle, SQL> SELECT F R O M intervalle ; BORNEINF BORNESUP 0 30 2 3 2 56 5 10 7 32 8 27 12 3 12 30 21 8 34 26

13

10 ligne ( s ) selectionnee ( s ) . La commande ci-dessous ache tous les couples dintervalles ayant une borne en commun, SQL> SELECT F R O M intervalle i , intervalle j 2 W H E R E ( i . borneInf = j . borneInf OR i . borneSup = j . borneSup ) 3 A N D i . rowid <> j . rowid ; BORNEINF BORNESUP BORNEINF BORNESUP 0 30 12 30 2 3 2 56 2 3 12 3 2 56 2 3 12 3 2 3 12 3 12 30 12 30 0 30 12 30 12 3 8 ligne ( s ) selectionnee ( s ) . Que ceux qui ont du courage reformulent la requ ete sans utiliser le rowid !

14

1.5
1.5.1

Agr egation de donn ees


Fonctions dagr egation

Exemple introductif Nous voulons conna tre le nombre de lignes de table produit. Deux fa cons de proc eder : 1. Solution moche SQL> SELECT F R O M PRODUIT ; NUMPROD 1 2 3 4 NOMPROD Roue de secours Poupee Batman Cotons tiges Cornichons

4 ligne ( s ) selectionnee ( s ) . On a la r eponse avec le nombre de lignes s electionn ees. 2. Solution belle SQL> SELECT count ( ) F R O M PRODUIT ; C O U N T( ) 4 1 ligne selectionnee . La r eponse est le r esultat de la requ ete. D enition Une fonction dagr egation retourne une valeur calcul ee sur toutes les lignes de la requ ete (nombre, moyenne...). Nous allons utiliser les suivantes : COUNT(col) : retourne le nombre de lignes dont le champ col est non NULL. AVG(col) : retourne la moyenne des valeurs col sur toutes les lignes dont le champ col est non NULL. MAX(col) : retourne la plus grande des valeurs col sur toutes les lignes dont le champ col est non NULL. MIN(col) : retourne la plus petite des valeurs col sur toutes les lignes dont le champ col est non NULL. SUM(col) : retourne la somme des valeurs col sur toutes les lignes dont le champ col est non NULL. Exemples dutilisation Lexemple suivant retourne le prix du produit propos e au prix maximal. SQL> SELECT M A X( prix ) 2 F R O M PROPOSER ; M A X( PRIX ) 200 1 ligne selectionnee . Il est possible de renommer la colonne MAX(prix), en utilisant le mot cl e AS : SQL> SELECT M A X( prix ) AS PRIX_MAXIMAL 2 F R O M PROPOSER ; PRIX_MAXIMAL

15

200 1 ligne selectionnee . Les requ etes suivantes r ecup` erent le nom du fournisseur proposant larticle Poup ee Batman au prix le moins elev e: SQL> SELECT MIN( prix ) AS PRIX_MINIMUM 2 F R O M PROPOSER PR , PRODUIT P 3 W H E R E PR . numprod = P . numprod 4 A N D nomprod = Poupee Batman ; PRIX_MINIMUM 1 1 ligne selectionnee . SQL> SELECT nomfou 2 F R O M FOURNISSEUR F , PROPOSER PR , PRODUIT P 3 W H E R E F . numfou = PR . numfou 4 A N D PR . numprod = P . numprod 5 A N D nomprod = Poupee Batman 6 A N D prix = 1 ; NOMFOU f2 1 ligne selectionnee . Il est possible de faire cela avec une seule requ ete en r ecup erant le prix minimum dans une requ ete imbriqu ee. Mais cela sera pour un cours ult erieur. Compl ements sur COUNT On r ecup` ere le nombre de ligne retourn ees par une requ ete en utilisant COUNT(*). Par exemple, si on souhaite conna tre le nombre de produits propos es par le fournisseur f1 : SQL> 2 3 4 SELECT C O U N T( ) AS NB_PROD F R O M FOURNISSEUR F , PROPOSER P W H E R E F . numfou = P . numfou A N D nomfou = f 1 ;

NB_PROD 2 1 ligne selectionnee . On aurait aussi pu saisir : SQL> 2 3 4 SELECT C O U N T( numprod ) AS NB_PROD F R O M FOURNISSEUR F , PROPOSER P W H E R E F . numfou = P . numfou A N D nomfou = f 1 ;

NB_PROD 2 1 ligne selectionnee .

16

Pour conna tre le nombre de produits propos es, cest ` a dire dont le numprod a une occurence dans la table PROPOSER, on proc` ede de la fa con suivante : SQL> SELECT C O U N T(DISTINCT numprod ) AS NB_PRODUITS_PROPOSES 2 F R O M PROPOSER ; NB_PRODUITS_PROPOSES 3 1 ligne selectionnee . Le DISTINCT nous sert ` a eviter quun m eme produit propos e par des fournisseurs di erents soit comptabilis e plusieurs fois.

1.5.2

Groupage

Linstruction GROUP BY Les op erations dagr egation consid er ees jusqu` a maintenant portent sur la totalit e des lignes retourn ees par les requ etes, linstruction GROUP BY permet de former des paquets ` a lint erieur desquels les donn ees seront agr eg ees. Cette instruction sutilise de la mani` ere suivante SELECT . . . F R O M ... W H E R E. . . G R O U P BY <liste_colonnes > O R D E R BY . . . La liste des colonnes sert de crit` ere pour r epartir les lignes dans des paquets de lignes. Si par exemple nous souhaitons acher la liste des nombres de produits propos es par chaque fournisseur : SQL> SELECT nomfou , C O U N T( numprod ) AS NB_PRODUITS_PROPOSES 2 F R O M FOURNISSEUR F , PROPOSER P 3 W H E R E F . numfou = P . numfou 4 G R O U P BY nomfou ; NOMFOU NB_PRODUITS_PROPOSES f1 2 f2 1 f3 1 3 ligne ( s ) selectionnee ( s ) .

Linstruction HAVING Supposons que de la requ ete pr ec edente, nous ne souhaitions garder que les lignes pour lesquelles la valeur NB PRODUITS PROPOSES est egale ` a 1. Ajouter une condition dans WHERE serait inutile, le ltrage occasionn e par WHERE est eectu e avant lagr egation. Il nous faudrait une instruction pour ninclure que des groupes de donn ees r epondant certains crit` eres. Linstruction utilis ee pour ce faire est HAVING. Son utilisation est la suivante : SELECT . . . F R O M ... W H E R E ... G R O U P BY . . . HAVING <condition > O R D E R BY . . . Par exemple,

17

SQL> SELECT nomfou , C O U N T( numprod ) AS NB_PRODUITS_PROPOSES 2 F R O M FOURNISSEUR F , PROPOSER P 3 W H E R E F . numfou = P . numfou 4 G R O U P BY nomfou 5 HAVING C O U N T( numprod ) = 1 6 O R D E R BY nomfou DESC; NOMFOU NB_PRODUITS_PROPOSES f3 1 f2 1 2 ligne ( s ) selectionnee ( s ) . Achons les noms des fournisseurs qui ont livr e strictement plus dun produit di erent (toutes livraisons confondues), SQL> SELECT nomfou 2 F R O M FOURNISSEUR F , DETAILLIVRAISON D 3 W H E R E F . numfou = D . numfou 4 G R O U P BY nomfou 5 HAVING count (DISTINCT D . numprod ) > 1 ; NOMFOU f1 1 ligne selectionnee .

18

1.6
1.6.1

Vues
D enition

Une vue est une table contenant des donn ees calcul ees sur celle dune autre table. Les donn ees dune vue sont tout le temps ` a jour. Si vous modiez les donn ees dune des tables sur lesquelles est calcul ee la vue, alors les modications sont automatiquement r epercut ees sur la vue.

1.6.2

Syntaxe

Appr eciez la simplicit e de la syntaxe : CREATE VIEW <nom_vue> AS <requete>

1.6.3

Application

Par exemple, la requ ete suivante met en correpondance les noms des produits avec le nombre de fournisseurs qui le proposent : SQL> 2 3 4 5 6 SELECT nomprod , C O U N T( numfou ) AS NB_FOURNISSEURS F R O M PRODUIT P LEFT OUTER JOIN PROPOSER PR ON P . numprod = PR . numprod G R O U P BY nomprod O R D E R BY C O U N T( numfou ) ;

NOMPROD NB_FOURNISSEURS Cornichons 0 Cotons tiges 1 Roue de secours 1 Poupee Batman 2 4 ligne ( s ) selectionnee ( s ) . Ce type de requ ete sera explit e dans un cours ult erieur. Pour le moment, notez juste que les outils dont vous disposez pour le moment ne vous permettront pas de formuler une requ ete achant les noms des produits nayant aucun fournisseur. Cr eons une vue pour ne pas avoir ` a se farcir la requ ete chaque fois que nous aurons besoin de ces informations : SQL> 2 3 4 5 6 7 CREATE VIEW NB_FOURNISSEURS_PAR_PRODUIT AS SELECT nomprod , C O U N T( numfou ) AS NB_FOURNISSEURS F R O M PRODUIT P LEFT OUTER JOIN PROPOSER PR ON P . numprod = PR . numprod G R O U P BY nomprod O R D E R BY C O U N T( numfou ) ;

Vue creee . Une fois cr e ee, on peut interroger une vue de la m eme fa con quon interroge une table : SQL> SELECT 2 F R O M NB_FOURNISSEURS_PAR_PRODUIT ; NOMPROD NB_FOURNISSEURS Cornichons 0 Cotons tiges 1 Roue de secours 1 Poupee Batman 2

19

4 ligne ( s ) selectionnee ( s ) . Notez que toute modication dans la table PROPOSER ou PRODUIT sera imm ediatement r epercut ee sur la vue. SQL> INSERT INTO PROPOSER VALUES ( 3 , 4 , 9 ) ; 1 ligne creee . SQL> SELECT 2 F R O M NB_FOURNISSEURS_PAR_PRODUIT ; NOMPROD NB_FOURNISSEURS Cornichons 1 Cotons tiges 1 Roue de secours 1 Poupee Batman 2 4 ligne ( s ) selectionnee ( s ) . Maintenant, nous souhaitons voir sacher, pour tout i, le nombre de produits propos es par exactement i fournisseurs. SQL> SET head off SQL> SELECT I l y a | | C O U N T( NOMPROD ) | | p r o d u i t ( s ) q u i e s t / s o n t | | 2 p r o p o s e ( s ) par | | NB_FOURNISSEURS | | f o u r n i s s e u r ( s ) . 3 F R O M NB_FOURNISSEURS_PAR_PRODUIT 4 G R O U P BY NB_FOURNISSEURS 5 O R D E R BY NB_FOURNISSEURS ; Il y a 3 produit ( s ) qui est / sont propose ( s ) par 1 fournisseur ( s ) . Il y a 1 produit ( s ) qui est / sont propose ( s ) par 2 fournisseur ( s ) . 2 ligne ( s ) selectionnee ( s ) . SQL> SET head on

1.6.4

Suppression

On supprime une vue avec linstruction suivante : DROP VIEW <nom_vue > ;

20

1.7

Requ etes imbriqu ees

Oracle permet dimbriquer les requ etes, cest-` a-dire de placer des requ etes dans les requ etes. Une requ ete imbriqu ee peut renvoyer trois types de r esultats : une valeur scalaire une colonne une table

1.7.1

Sous requ etes renvoyant une valeur scalaire

Le r esultat dune requ ete est dit scalaire sil comporte une seule ligne et une seule colonne. Par exemple : SQL> SELECT C O U N T( ) F R O M PERSONNE ; C O U N T( ) 21 On peut placer dans une requ ete une sous-requ ete calculant un r esultat scalaire. Un tel type de sous-requ ete se place soit comme une colonne suppl ementaire, soit comme une valeur servant ` a evaluer des conditions (WHERE ou HAVING). Colonne ctive On peut ajouter une colonne dans une requ ete, et choisir comme valeurs pour cette colonne le r esultat dune requ ete. Ce type de requ ete est souvent une alternative ` a GROUP BY. Par exemple, la requ ete suivante nous renvoie, pour tout produit, le nombre de fournisseurs proposant ce produit : SQL> SELECT nomprod , (SELECT C O U N T( ) 2 F R O M PROPOSER PR 3 W H E R E PR . numprod = P . numprod ) 4 AS NB_FOURNISSEURS 5 F R O M PRODUIT P ; NOMPROD NB_FOURNISSEURS Roue de secours 1 Poupee Batman 2 Cotons tiges 1 Cornichons 0

Conditions complexes On peut construire une condition en utilisant le r esultat dune requ ete. Pour notre exemple, d eclarons dabord une vue contenant le nombre darticles propos es par chaque fournisseur, SQL> CREATE VIEW NB_PROD_PAR_FOU AS 2 SELECT numfou , (SELECT C O U N T( ) 3 F R O M PROPOSER P 4 W H E R E P . numfou = F . numfou ) 5 AS NB_PROD 6 F R O M FOURNISSEUR F ; Vue creee . Ensuite, recherchons les noms des fournisseurs proposant le plus de produits : SQL> SELECT nomfou 2 F R O M FOURNISSEUR F , NB_PROD_PAR_FOU N 3 W H E R E F . numfou = N . numfou 4 A N D NB_PROD = (SELECT M A X( NB_PROD ) 5 F R O M NB_PROD_PAR_FOU ) ;

21

NOMFOU f1 La requ ete SELECT MAX(NB PROD) FROM NB PROD PAR FOU est evalu ee avant, et son r esultat lui est substitu e dans lexpression de la requ ete. Comme on a SQL> SELECT M A X( NB_PROD ) F R O M NB_PROD_PAR_FOU ; M A X( NB_PROD ) 2 Alors la requ ete pr ec edente, dans ce contexte, est equivalente ` a SQL> SELECT nomfou 2 F R O M FOURNISSEUR F , NB_PROD_PAR_FOU N 3 W H E R E F . numfou = N . numfou 4 A N D NB_PROD = 2 ; NOMFOU f1

INSERT et UPDATE On peut placer dans des instructions de mises ` a jour ou dinsertions des requ etes imbriqu ees. Par exemple, SQL> INSERT INTO PERSONNE ( numpers , nom , prenom ) 2 VALUES ( (SELECT M A X( numpers ) + 1 F R O M PERSONNE ) , 3 Darth , Vador ) ; 1 ligne creee . SQL> UPDATE PERSONNE SET 2 pere = (SELECT numpers 3 F R O M PERSONNE 4 W H E R E nom = S o c r a t e 5 A N D prenom IS NULL) , 6 mere = (SELECT numpers 7 F R O M PERSONNE 8 W H E R E nom = Fabian 9 A N D prenom = Lara ) 10 W H E R E numpers = (SELECT numpers 11 F R O M PERSONNE 12 W H E R E nom = Darth 13 A N D prenom = Vador ) ; 1 ligne mise a jour .

1.7.2

Sous requ etes renvoyant une colonne

On consid` ere une colonne comme une liste de valeurs, on peut tester lappartance dun el ement ` a cette liste ` a laide de lop erateur IN. On peut sen servir comme une alternative aux jointures, par exemple, r e ecrivons la requ ete de la section pr ec edente. La requ ete suivante nous renvoie le nombre de produits propos es par les fournisseurs proposant le plus de produits : SQL> SELECT M A X( NB_PROD ) F R O M NB_PROD_PAR_FOU ; M A X( NB_PROD ) 2

22

Maintenant, recherchons les num eros des fournisseurs proposant un tel nombre de produits : SQL> SELECT N . numfou 2 F R O M NB_PROD_PAR_FOU N 3 W H E R E NB_PROD = (SELECT M A X( NB_PROD ) 4 F R O M NB_PROD_PAR_FOU ) ; NUMFOU 1 Notons que sil existe plusieurs fournisseurs proposant 2 produits, cette requ ete renverra plusieurs lignes. Cest donc par hasard quelle ne retourne quune ligne. Le num ero du fournisseur proposant le plus de produits est donc le 1. Cherchons ce fournisseur : SQL> SELECT nomfou 2 F R O M FOURNISSEUR F 3 W H E R E F . numfou IN ( 1 ) ; NOMFOU f1 Il sut donc dans la requ ete ci-dessous de remplacer le 1 par la requ ete qui a retourn e 1. On a nalement : SQL> SELECT nomfou 2 F R O M FOURNISSEUR F 3 W H E R E F . numfou IN (SELECT N . numfou 4 F R O M NB_PROD_PAR_FOU N 5 W H E R E NB_PROD = (SELECT M A X( NB_PROD ) 6 F R O M NB_PROD_PAR_FOU ) ) ; NOMFOU f1

1.7.3

Sous requ etes non correl ees renvoyant une table

On peut remplacer le nom dune table dans la clause FROM par une sous-requ ete. Par exemple, la requ ete suivante renvoie une table. SQL> SELECT 2 (SELECT C O U N T( ) 3 F R O M PROPOSER PR 4 W H E R E PR . numfou = F . numfou 5 ) AS NB_PROD 6 F R O M FOURNISSEUR F ; NB_PROD 2 1 1 0 Cette table contient, pour chaque fournisseur, le nombre de produits propos es. Si lon souhaite conna tre le plus grand nombre de produits propos es, on se sert du r esultat de la requ ete ci-dessus comme dune table : SQL> SELECT M A X( NB_PROD ) AS MAX_NB_PROD 2 F R O M 3 (SELECT 4 (SELECT C O U N T( ) 23

5 6 7 8 9

F R O M PROPOSER PR W H E R E PR . numfou = F . numfou ) AS NB_PROD F R O M FOURNISSEUR F );

MAX_NB_PROD 2 Ce type de requ ete est une alternative aux vues. R ecup erons maintenant les noms des fournisseurs proposant le plus de produits (sans jointure et sans vue !) : SQL> SELECT nomfou 2 F R O M FOURNISSEUR 3 W H E R E numfou IN 4 (SELECT numfou 5 F R O M 6 (SELECT numfou , 7 (SELECT C O U N T( ) 8 F R O M PROPOSER PR 9 W H E R E PR . numfou = F . numfou 10 ) AS NB_PROD 11 F R O M FOURNISSEUR F 12 ) N 13 W H E R E NB_PROD = 14 (SELECT M A X( NB_PROD ) 15 F R O M 16 (SELECT numfou , 17 (SELECT C O U N T( ) 18 F R O M PROPOSER PR 19 W H E R E PR . numfou = F . numfou 20 ) AS NB_PROD 21 F R O M FOURNISSEUR F 22 ) N 23 ) 24 ); NOMFOU f1 Vous constatez que la solution utilisant les vues est nettement plus simple.

1.7.4

Sous requ etes correl ees

Une sous-requ ete peut etre de deux types : simple : Elle evalu ee avant la requ ete principale correl ee : Elle est evalu ee pour chaque ligne de la requ ete principale Par exemple, la requ ete suivante renvoie le nombre de produits livr es pour chaque fournisseur. Elle contient une sous-requ ete correl ee. SQL> SELECT numfou , 2 (SELECT S U M( qte ) 3 F R O M DETAILLIVRAISON D 4 W H E R E D . numfou = F . numfou 5 ) NB_PROD_L 6 F R O M FOURNISSEUR F ; NUMFOU NB_PROD_L 24

1 2 3 4

45 10

Cette m eme requ ete, une fois evalu ee, peut server de requ ete non correl ee si on souhaite conna tre les noms de ces fournisseurs : SQL> SELECT nomfou , NB_PROD_L 2 F R O M FOURNISSEUR F , 3 (SELECT numfou , 4 (SELECT S U M( qte ) 5 F R O M DETAILLIVRAISON D 6 W H E R E D . numfou = F . numfou 7 ) NB_PROD_L 8 F R O M FOURNISSEUR F 9 ) L 10 W H E R E F . numfou = L . numfou ; NOMFOU NB_PROD_L f1 45 f2 f3 10 f4 Amusons-nous : quel sont, pour chaque fournisseur, les produits qui ont et e les plus livr es ? SQL> SELECT nomfou , nomprod 2 F R O M FOURNISSEUR F , PRODUIT P , 3 (SELECT FF . numfou , PP . numprod 4 F R O M FOURNISSEUR FF , PRODUIT PP 5 W H E R E 6 (SELECT S U M( qte ) 7 F R O M DETAILLIVRAISON L 8 W H E R E L . numfou = FF . numfou 9 A N D L . numprod = PP . numprod 10 ) 11 = 12 (SELECT M A X( NB_PROD_L ) 13 F R O M 14 (SELECT numfou , S U M( qte ) AS NB_PROD_L 15 F R O M DETAILLIVRAISON L 16 G R O U P BY numprod , numfou 17 ) Q 18 W H E R E Q . numfou = FF . numfou 19 ) 20 G R O U P BY numfou , numprod 21 ) M 22 W H E R E M . numprod = P . numprod 23 A N D M . numfou = F . numfou ; NOMFOU f1 f3 NOMPROD Roue de secours Cotons tiges

Dans la requ ete pr ec edente, quelles sous-requ etes sont correl ees et lesquelles ne le sont pas ?

25

1.8
1.8.1

Compl ements sur les types


Types num eriques

NUMBER(p, s) d enit un type num erique de au plus (p s) chires avant la virgule et au plus s chires apr` es la virgule. SQL> CREATE TABLE TOTO 2 ( tutu number ( 4 , 2 ) 3 ); Table creee . SQL> INSERT INTO TOTO VALUES( 1 0 . 2 ) ; 1 ligne creee . SQL> INSERT INTO TOTO VALUES( 1 0 ) ; 1 ligne creee . SQL> INSERT INTO TOTO VALUES( . 0 1 ) ; 1 ligne creee . SQL> INSERT INTO TOTO VALUES( 2 1 . 0 1 ) ; 1 ligne creee . SQL> INSERT INTO TOTO VALUES( 2 1 . 0 ) ; 1 ligne creee . SQL> INSERT INTO TOTO VALUES( 2 1 . 0 1 2 ) ; 1 ligne creee . SQL> INSERT INTO TOTO VALUES( 3 2 1 . 0 ) ; INSERT INTO TOTO VALUES( 3 2 1 . 0 ) ERREUR a la ligne 1 : ORA 01438: valeur incoherente avec la precision indiquee pour cette colonne

SQL> INSERT INTO TOTO VALUES( 3 2 1 ) ; INSERT INTO TOTO VALUES( 3 2 1 ) ERREUR a la ligne 1 : ORA 01438: valeur incoherente avec la precision indiquee pour cette colonne

SQL> SELECT 2 F R O M TOTO ; TUTU 10 ,2 10 ,01 21 ,01

26

21 21 ,01 6 ligne ( s ) selectionnee ( s ) .

1.8.2

Types chaine de caract` eres

Une petite liste de propri et es et de fonctions qui peuvent servir : Pour concat ener deux cha nes de caract` eres, on utilise lop erateur || Il est aussi possible de comparer deux chaines de caract` eres avec >, lordre consid er e est lordre dictionnaire (ou lexicographique). La longueur sobtient avec la fonction LENGTH. On extrait une sous-chaine de caract` eres de longueur l ` a partir de lindice i (les indices commencent ` a 1) de la cha ne s avec la fonction SUBSTR(S, i, l). Par exemple, SUBSTR(oracle, 3, 2) = ac UPPER convertit en majuscules, LOWER convertit en minuscules.

1.8.3

Types date

Une date en SQL est consid er e comme un point dans le temps. On le convertit en chaine de carat` eres avec la u format est une cha ne de caract` eres optionnelle. Par exemple, fonction to char(date, format), o` SQL> SELECT to_char ( dateli ) AS DT 2 F R O M LIVRAISON ; DT 30/10/06 30/10/06 SQL> SELECT to_char ( dateli , yyyy ) AS ANNEE 2 F R O M LIVRAISON ; ANNE 2006 2006 SQL> SELECT to_char ( dateli , yyyy /mm/ dd ) AS DT 2 F R O M LIVRAISON ; DT 2006/10/30 2006/10/30 SQL> SELECT to_char ( dateli , yyyymmdd ) AS DT 2 F R O M LIVRAISON ; DT 20061030 20061030 On convertit une chaine de caract` eres en date avec la fonction to date(date, format). Par exemple : SQL> UPDATE LIVRAISON 2 SET dateli = to_date ( 1934 | | to_char ( dateli , mmdd ) , yyyymmdd ) ; 2 ligne ( s ) mise ( s ) a jour . SQL> SELECT 2 F R O M LIVRAISON ;

27

NUMFOU NUMLI DATELI 1 1 30/10/34 3 1 30/10/34 SQL> UPDATE LIVRAISON 2 SET dateli = to_date ( 2006 | | to_char ( dateli , mmdd ) , yyyymmdd ) ; 2 ligne ( s ) mise ( s ) a jour . SQL> SELECT F R O M LIVRAISON ; NUMFOU NUMLI DATELI 1 1 30/10/06 3 1 30/10/06

1.8.4

La fonction inclassable

nvl(valeur1, valeur2) renvoie valeur1 si valeur1 est non NULL, valeur2 sinon. Par exemple, SQL> DELETE F R O M TOTO ; 6 ligne ( s ) supprimee ( s ) . SQL> SELECT S U M( tutu ) 2 F R O M TOTO ; S U M( TUTU )

SQL> SELECT nvl (S U M( tutu ) , 0 ) 2 F R O M TOTO ; NVL (S U M( TUTU ) , 0 ) 0

1.8.5

Contraintes CHECK

La contrainte d eclarative de type permet de tester une condition portant les lignes de la table prises une par une. La syntaxe est : ALTER TABLE nomtable A D D CONSTRAINT nomcontrainte C H E C K( condition ) ; Par exemple, SQL> ALTER TABLE EMP A D D CONSTRAINT ck_salary C H E C K( SAL > 0 ) ; Table modifiee . SQL> INSERT INTO EMP ( EMPNO , SAL ) VALUES ( 1 5 , 1); INSERT INTO EMP ( EMPNO , SAL ) VALUES ( 1 5 , 1) ERREUR a la ligne 1 : ORA 02290: violation de contraintes ( SCOTT . CK_SALARY ) de verification Une contrainte de type CHECK ne peut pas contenir de requ etes ni de valeurs non constantes (sysdate par exemple).

28

Chapitre 2

Exercices
2.1 Contraintes d eclaratives

Nous nous proposons de modier le script de cr eation de table de lannexe A.1.

Exercice 1
Modiez le script de fa con ` a ce que les saisies des valeurs suivantes soit obligatoire : Le prix des articles propos es La quantit e des produits livr es

Exercice 2
Rep erez les colonnes, couples de colonnes, voire triplets de colonnes, ` a choisir comme cl es primaires. Modiez le script de fa con ` a ce que cela se fasse.

Exercice 3
Faites de m eme pour les cl es etrang` eres, sans oublier quil ne peut gurer dans une livraison que des produits propos es par le fournisseur qui eectue cette livraison.

Exercice 4
Ins erez quelques lignes dans chaque table.

Exercice 5
Rep erez toutes les contraintes des questions pr ec edentes dans user constraints, supprimez-les.

Exercice 6
Red enissez toutes ces contraintes avec la syntaxe ALTER TABLE

29

2.2

Introduction aux requ etes

Nous souhaitons g erer un secr etatiat p edagogique avec la base de A.2. Les sorties g en er ees par les deux premi` eres questions sont donn ees. Apr` es, c a sera ` a vous de v erier si les r esultats de vos requ etes est coh erent ou non.

Exercice 1
Acher la liste des noms des modules. Oracle C++ C Algo Merise PL/SQL Oracle mySQL Algo avanc e 8 ligne(s) s electionn ee(s).

Exercice 2
Acher la liste des num eros des modules prerequis pour dautres modules. 1 3 5 3 ligne(s) s electionn ee(s).

Exercice 3
En utilisant le r esultat de la requ ete pr ec edente, et lop erateur IN, achez les noms de ces trois modules.

Exercice 4
Augmentez les notesMin n ecessaires pour sinscrire en Algo avanc e de deux points. Celles n ecessaires pour aller en PL/SQL Oracle dun point.

Exercice 5
Achez, par ordre de noteMin croissantes, les num eros des modules n ecessaires pour acc eder au module PL/SQL Oracle.

Exercice 6
Achez les num eros des modules dans lequels je ne peux pas minscrire avec 10 en merise.

Exercice 7
Achez les noms de tous les modules dont le libell e contient les mots Algo ou SQL.

Exercice 8
On utilisera pour les questions suivantes les tables de A.3.

30

Exercice 9
La table RECTANGLE contient des rectangles sp eci es par les coordonn ees de deux sommets diam etralement oppos es, leurs ar etes sont parall` eles aux axes. Certains rectangles ont des coordonn ees erronn ees, cest-` a dire que soit ils sont des segments, soit les coordonn ees de certains points ne sont pas dans le bon ordre. Supprimez, avec une seule instruction, tous les rectangles-segments.

Exercice 10
Achez tous les intervalles contenant la valeur 10.

Exercice 11
Acher tous les intervalles qui contiennent [5, 7]. Puis tous les intervalles contenus dans [5, 35]. Puis tous les intervalles ayant une intersection non vide avec [15, 20].

Exercice 12
Certains des rectangles sont pathologiques, dans le sens o` u les valeurs des coordonn ees font que lon na pas un point en haut ` a gauche et un en bas ` a droite. Acher ` a ces rectangles.

Exercice 13
Certains rectangles mal d enis peuvent etre r epar es si on permute les valeurs de xHautGauche et de xBasDroit et/ou celles de yHautGauche et de yBasDroit. Faites-le avec deux instructions UPDATE.

Exercice 14
Soit le point de coordonn ees (x, y ) = (2, 2), acher les coordonn ees des rectangles qui contiennent ce point.

Exercice 15
Acher tous les rectangles ayant une intersection non vide avec le rectangle (4, 9, 5, 10).

31

2.3

Jointures

Reprenons pour ce tp la base de donn ees de A.4.

Exercice 1
Acher tous les noms des produits dont le num ero a une occurrence dans la table PROPOSER. NOMPROD -----------------------------Cotons tiges Poup ee Batman Roue de secours

Exercice 2
Acher tous les noms des fournisseurs dont le num ero a une occurrence dans la table PROPOSER. NOMFOU -----------------------------f1 f2 f3

Exercice 3
Acher les noms des fournisseurs avec pour chaque fournisseur la liste des produits propos es. NOMFOU -----------------------------f1 f1 f2 f3 NOMPROD -----------------------------Roue de secours Poup ee Batman Poup ee Batman Cotons tiges

Exercice 4
Acher les nom des fournisseurs proposant des Poup ees Batman par ordre de prix croissant.

Exercice 5
Acher les dates des livraisons eectu ees par le fournisseur f1 ;

Exercice 6
Acher les noms de tous les produits d ej` a livr es par le fournisseur f3 ;

Exercice 7
Acher toutes les lignes de la table LIVRAISON correspondant ` a des livraisons dans lesquelles gure le produit Poup ee Batman.

Exercice 8
Pour les exercices suivants, nous travaillerons sur les donn ees de A.5. Dans les questions o` u il vous est demand e de formuler des requ etes retournant plusieurs personnes, il faut quil y ait une ligne par personne. Acher les noms et les pr enoms des enfants de Robert Baratheon. +-----------+----------+ | nom | prenom | +-----------+----------+ | NULL | Gendry | 32

| Baratheon | Joffrey | | Baratheon | Tommen | | Baratheon | Myrcella | +-----------+----------+ 4 rows in set (0.00 sec)

Exercice 9
Acher les noms et pr enoms des parents de Stannis Baratheon +-----------+---------+ | nom | prenom | +-----------+---------+ | Estermont | Cassana | | Baratheon | Steffon | +-----------+---------+ 2 rows in set (0.00 sec)

Exercice 10
Acher les noms et pr enoms des enfants de Robert Baratheon et Cersei Lannister.

Exercice 11
Acher les noms et pr enoms des fr` eres de Renly Baratheon.

Exercice 12
Acher les noms et pr enoms des cousins de Shireen Baratheon du cot e de son p` ere.

Exercice 13
Acher les nom et pr enom du demi-fr` ere (du cot e de leur p` ere) des enfants de Cersei Lannister.

Exercice 14
Acher les nom et pr enom de la m` ere des enfants de Tywin Lannister.

Exercice 15
Acher les noms et pr enoms des neveux l egitimes de Stannis Baratheon.

Exercice 16
Acher les noms et pr enoms des m` eres des petits-enfants de Cassana Estermont.

Exercice 17
Acher les nom et pr enom des parents et grand-parents de Tommen Baratheon. +-----------+---------+ | nom | prenom | +-----------+---------+ | Estermont | Cassana | | Baratheon | Steffon | | Lannister | Joanna | | Lannister | Tywin | +-----------+---------+ 4 rows in set (0.00 sec) Noubliez pas : une ligne par personne.

33

2.4

Agr egation de donn ees

Nous utiliserons les donn ees de A.4. Il est demand e dans chaque exercice de formuler une requ ete.

Exercice 1
Donner le nombre de fournisseurs.

Exercice 2
Donner le nombre de fournisseurs ayant d ej` a eectu e une livraison.

Exercice 3
Quel est le prix du produit propos e au prix le plus elev e par f1 ?

Exercice 4
Combien de produits sont propos es par chaque fournisseur proposant au moins un produit ?

Exercice 5
Acher le nombre de produits qui ne sont propos es par aucun fournisseur.

Exercice 6
Acher, pour chaque produit (dont on achera le nom), le nombre de fournisseurs layant d ej` a livr e.

Exercice 7
Donner pour chaque livraison le nom du fournisseur, le numero de livraison et le nombre de produits livr es.

Exercice 8
Donner pour chaque livraison le nom du fournisseur, le numero de livraison, la date et le montant de la facture.

Exercice 9
Donner les noms des produits qui ne sont propos es que par un seul fournisseur.

Exercice 10
Donner les noms des fournisseurs qui ont livr e au moins une fois chaque produit quils proposent.

34

2.5

Vues

Nous utiliserons les donn ees de A.4. Nh esitez pas, pour tester vos requ etes et ` a ins erer dautres donn ees dans la base.

Exercice 1
Cr eez une vue achant pour chaque produit ayant d ej` a et e livr e le num ero du produit et la somme des quantit es livr ees (toutes livraisons confondues).

Exercice 2
Achez la quantit e totale livr ee du produit dont la quantit e totale livr ee est la plus elev ee.

Exercice 3
Cr eez une vue achant pour chaque livraison, le montant de la facture.

Exercice 4
Cr eez une vue achant pour chaque fournisseur, le total des factures sur toutes les livraisons.

Exercice 5
Achez le total des factures du fournisseur dont le total des factures est le moins elev e.

Exercice 6
Achez le nombre de produits distincts livr es par le fournisseur ayant livr e le plus de produits distincts. Par nombre de produits distincts, on entend sans tenir compte de la quantit e.

35

2.6

Requ etes imbriqu ees

Nous utiliserons les donn ees de A.4. Presque tous les stratag` emes sont autoris es, vous pouvez utiliser des fonctions dagr egation, des vues, et des requ etes imbriqu ees. Bon courage, laspirine nest pas fournie.

Exercice 1
Donner, pour chaque fournisseur (acher son nom), le nombre de produits propos es, m eme si ce fournisseur nen propose aucun. Il est interdit dutiliser OUTER JOIN !

Exercice 2
Acher les noms des fournisseurs qui proposent le produit num ero 2, il est interdit de faire des jointures !

Exercice 3
Acher les noms des fournisseurs qui proposent des poup ees Batman.

Exercice 4
Acher les noms des fournisseurs qui ont d ej` a livr e des poup ees Batman.

Exercice 5
Quels sont les noms des fournisseurs qui ont d ej` a livr e tous leurs produits au moins une fois ?

Exercice 6
Donner, pour chaque fournisseur (acher son nom), le produit propos e au prix le plus elev e.

Exercice 7
Pour chaque produit p, quel sont les noms des fournisseurs qui, sur toutes ses livraisons, ont livr e la plus grande quantit e cumul ee de produits p.

Exercice 8
Acher le nombre de produits propos es par les fournisseurs proposant le moins de produits. Normalement, un 0 devrait sacher... Pas un 1.

Exercice 9
Acher le(s) nom(s) du(des) fournisseur(s) proposant le moins de produits.

Exercice 10
Acher, pour chaque produit, le(s) nom(s) du(des) fournisseur(s) qui la(ont) le plus livr e (en quantit e cumul ee).

36

2.7

Compl ements sur les types

Vous modierez pour faire ces exercices le script de cr eation de tables de A.4.

Exercice 1
Rendez, ` a laide de contraintes de type CHECK les saisies des champs qte, prix et dateli oligatoires.

Exercice 2
Emp echez la saisie de prix n egatifs ou nuls et de quantit es n egatives ou nulles.

Exercice 3
On sait que la base a et e cr e ee vers le mois dOctobre 2006, emp echez lajout de livraisons ant erieures ` a ce mois.

Exercice 4
Impl ementez une contrainte d eclarative emp echant les livraisons les premiers mai de chaque ann ee.

Exercice 5
Impl ementez une contrainte d eclarative obligeant les noms des produits ` a commencer par une majuscule et ` a ne comporter ensuite sur des minuscules. Si lajout dune des contraintes est refus ee, demandez vous pourquoi et faites le n ecessaire (une commande UPDATE sera la bienvenue...) pour y rem edier.

37

2.8

R evisions

Nous utiliserons les donn ees de A.4.

Exercice 1
Donner le nombre de fournisseurs ayant eectu e un nombre de livraisons sup erieur au egal ` a deux.

Exercice 2
Quelles sont les ann ees pendant lesquelles le plus de livraisons ont et e eectu ees ?

Exercice 3
Parmi les fournisseurs qui ont livr e au moins une fois chaque produit quils proposent, quels sont les derniers ` a avoir eectu e une livraison.

38

Chapitre 3

Corrig es
3.1
D R O P D R O P D R O P D R O P D R O P

Contraintes d eclaratives
TABLE TABLE TABLE TABLE TABLE DETAILLIVRAISON ; LIVRAISON ; PROPOSER ; PRODUIT ; FOURNISSEUR ;

q u e s t i o n s 1 , 2 e t 3

CREATE TABLE P R O D U I T ( n u m p r o d number P R I M A R Y KEY, n o m p r o d varchar2 ( 3 0 ) ) ; CREATE TABLE F O U R N I S S E U R ( n u m f o u number P R I M A R Y KEY, n o m f o u varchar2 ( 3 0 ) ) ; CREATE TABLE P R O P O S E R ( n u m f o u number , n u m p r o d number , p r i x number N O T NULL, P R I M A R Y KEY ( n u m f o u , n u m p r o d ) , FOREIGN KEY ( n u m f o u ) R E F E R E N C E S f o u r n i s s e u r ( n u m f o u ) , FOREIGN KEY ( n u m p r o d ) R E F E R E N C E S p r o d u i t ( n u m p r o d ) ) ; CREATE TABLE L I V R A I S O N ( n u m f o u number , n u m l i number , d a t e l i date d e f a u l t s y s d a t e , P R I M A R Y KEY ( n u m f o u , n u m l i ) , FOREIGN KEY ( n u m f o u ) R E F E R E N C E S f o u r n i s s e u r ( n u m f o u ) ) ; CREATE TABLE D E T A I L L I V R A I S O N ( n u m f o u number , n u m l i number , n u m p r o d number , q t e number N O T NULL, P R I M A R Y KEY ( n u m f o u , n u m l i , n u m p r o d ) , FOREIGN KEY ( n u m f o u , n u m l i ) R E F E R E N C E S l i v r a i s o n ( n u m f o u , n u m l i ) , FOREIGN KEY ( n u m f o u , n u m p r o d ) R E F E R E N C E S p r o p o s e r ( n u m f o u , n u m p r o d ) ) ; q u e s t i o n 4 INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO PRODUIT PRODUIT PRODUIT PRODUIT values values values values (1 , (2 , (3 , (4 , Roue de s e c o u r s ) ; Poup e e Batman ) ; Cotons t i g e s ) ; Cornichons ) ; (1 , (2 , (3 , (4 , 1, 2, 2, 3, f1 f2 f3 f4 ); ); ); );

FOURNISSEUR FOURNISSEUR FOURNISSEUR FOURNISSEUR PROPOSER PROPOSER PROPOSER PROPOSER

values values values values (1 , (1 , (2 , (3 ,

values values values values

200); 15); 1); 2); 1); 2); 1);

INSERT INTO L I V R A I S O N ( n u m f o u , n u m l i ) values ( 1 , INSERT INTO L I V R A I S O N ( n u m f o u , n u m l i ) values ( 1 , INSERT INTO L I V R A I S O N ( n u m f o u , n u m l i ) values ( 3 , INSERT INTO D E T A I L L I V R A I S O N values ( 3 , 1 , 3 , 1 0 ) ; INSERT INTO D E T A I L L I V R A I S O N values ( 1 , 1 , 1 , 2 5 ) ;

39

INSERT INTO D E T A I L L I V R A I S O N values ( 1 , 1 , 2 , 2 0 ) ; INSERT INTO D E T A I L L I V R A I S O N values ( 1 , 2 , 1 , 1 5 ) ; INSERT INTO D E T A I L L I V R A I S O N values ( 1 , 2 , 2 , 1 7 ) ; q u e s t i o n 5 Le s c r i p t c i d e s s o u s va vous a f f i c h e r l a s o l u t i o n . Vous pouvez p r o c e d e r de deux f a cons : c o p i e r c o l l e r c e t t e s o l u t i o n a f f i c h ee par c e t t e s e r i e de commandes

set und off set heading off set feed off s e l e c t a l t e r t a b l e | | t a b l e _ n a m e | | drop c o n s t r a i n t c o n s t r a i n t _ n a m e | | ; from u s e r _ c o n s t r a i n t s where t a b l e _ n a m e in ( PRODUIT , FOURNISSEUR , PROPOSER , LIVRAISON , DETAILLIVRAISON ) A N D c o n s t r a i n t _ t y p e IN ( R , P ) O R D E R BY c o n s t r a i n t _ t y p e DESC ; s e t u n d on s e t h e a d i n g on s e t f e e d on p l a c e r c e c i dans l e f i c h i e r dp . s q l e t l e x e c u t e r en s a i s i s s a n t @ <cheminabsolu >/dp . s q l set trimout off ; Set f e e d o f f ; set echo off ; set heading off ; set termout off ; set verify off ; s e t space 0 ; SET N E W P A G E 0 ; SET P A G E S I Z E 0 ; spool drop_constraints . lst s e l e c t a l t e r t a b l e | | t a b l e _ n a m e | | drop c o n s t r a i n t c o n s t r a i n t _ n a m e | | ; from u s e r _ c o n s t r a i n t s where t a b l e _ n a m e in ( PRODUIT , FOURNISSEUR , PROPOSER , LIVRAISON , DETAILLIVRAISON ) A N D c o n s t r a i n t _ t y p e IN ( R , P ) O R D E R BY c o n s t r a i n t _ t y p e DESC ; spool off @drop_constraints . lst s e t t r i m o u t on ; Set f e e d on ; s e t e c h o on ; s e t h e a d i n g on ; s e t t e r m o u t on ; s e t v e r i f y on ; q u e s t i o n 6

||

||

a l t e r t a b l e p r o d u i t add constraint p k _ p r o d u i t P R I M A R Y KEY ( n u m p r o d ) ; a l t e r t a b l e f o u r n i s s e u r add constraint p k _ f o u r n i s s e u r P R I M A R Y KEY ( n u m f o u ) ; a l t e r t a b l e p r o p o s e r add constraint p k _ p r o p o s e r P R I M A R Y KEY ( n u m f o u , n u m p r o d ) ; a l t e r t a b l e l i v r a i s o n add constraint p k _ l i v r a i s o n P R I M A R Y KEY ( n u m f o u , n u m l i ) ; a l t e r t a b l e d e t a i l l i v r a i s o n add constraint p k _ d e t a i l _ l i v r a i s o n P R I M A R Y KEY ( n u m f o u , n u m l i , n u m p r o d ) ; a l t e r t a b l e p r o p o s e r add constraint f k _ p r o p o s e r _ f o u r n i s s e u r FOREIGN KEY ( n u m f o u ) REFERENCES fournisseur ( numfou ) ; a l t e r t a b l e p r o p o s e r add c o n s t r a i n t f k _ p r o p o s e r _ p r o d u i t FOREIGN KEY ( n u m p r o d ) REFERENCES produit ( numprod ) ; a l t e r t a b l e l i v r a i s o n add c o n s t r a i n t f k _ l i v r a i s o n FOREIGN KEY ( n u m f o u ) REFERENCES fournisseur ( numfou ) ; a l t e r t a b l e d e t a i l l i v r a i s o n add c o n s t r a i n t f k _ d e t a i l _ l i v r a i s o n FOREIGN KEY ( n u m f o u , n u m l i ) REFERENCES livraison ( numfou , numli ) ; a l t e r t a b l e d e t a i l l i v r a i s o n add c o n s t r a i n t f k _ d e t a i l _ l i v r a i s o n _ p r o p o s e r FOREIGN KEY ( n u m f o u , n u m p r o d ) REFERENCES proposer ( numfou , numprod ) ;

40

3.2

Introduction aux requ etes

E x e r c i c e 1 SELECT n o m M o d F R O M MODULE ; E x e r c i c e 2 SELECT DISTINCT n u m M o d P r e r e q F R O M PREREQUIS E x e r c i c e 3 SELECT n o m M o d F R O M MODULE W H E R E n u m M o d IN ( 1 , 3 , 5 ) ; E x e r c i c e 4 SQL > SELECT F R O M MODULE W H E R E n o m M o d = Algo avanc ee ; NUMMOD NOMMOD 8 Algo avanc ee 1 ligne se lectionn ee . SQL > U P D A T E p r e r e q u i s SET n o t e M i n = 12 W H E R E numMod = 8; SQL > SELECT F R O M module W H E R E n o m M o d = PL/SQL O r a c l e ; NUMMOD NOMMOD 6 PL / SQL Oracle 1 ligne se lectionn ee . SQL > U P D A T E p r e r e q u i s SET n o t e M i n = 11 W H E R E numMod = 6; E x e r c i c e 5 SELECT n u m M o d P r e r e q , n o t e M i n F R O M PREREQUIS W H E R E numMod = 6 O R D E R BY n o t e M i n ; E x e r c i c e 6 SELECT n u m M o d F R O M prerequis W H E R E numModPrereq = 5 A N D noteMin > 10; E x e r c i c e 7 SELECT n o m M o d F R O M module W H E R E n o m M o d LIKE %Algo% OR n o m M o d LIKE %SQL% ; E x e r c i c e 8 DELETE F R O M intervalle W H E R E borneSup < borneInf ; E x e r c i c e 9 DELETE F R O M rectangle W H E R E xHautGauche = xBasDroit OR y H a u t G a u c h e = y B a s D r o i t ; E x e r c i c e 10 SELECT F R O M intervalle W H E R E 10 B E T W E E N borneInf A N D borneSup ; E x e r c i c e 11 SELECT F R O M intervalle W H E R E b o r n e I n f <= 5 A N D b o r n e S u p >= 7 ; SELECT F R O M intervalle W H E R E b o r n e I n f >= 5 A N D b o r n e S u p <= 3 5 ; SELECT

41

F R O M intervalle W H E R E (15 B E T W E E N borneInf A N D borneSup ) OR ( 2 0 B E T W E E N borneInf A N D borneSup ) OR ( b o r n e I n f B E T W E E N 15 A N D 20); E x e r c i c e 12 SELECT F R O M rectangle W H E R E ( xHautGauche > xBasDroit ) OR ( y H a u t G a u c h e < y B a s D r o i t ) ; E x e r c i c e 13 U P D A T E r e c t a n g l e SET xHautGauche = xBasDroit , xBasDroit = xHautGauche W H E R E xHautGauche > xBasDroit ; U P D A T E r e c t a n g l e SET yHautGauche = yBasDroit , yBasDroit = yHautGauche W H E R E yHautGauche < yBasDroit ; E x e r c i c e 14 SELECT F R O M rectangle W H E R E (2 B E T W E E N xHautGauche A N D xBasDroit ) A N D (2 B E T W E E N yBasDroit A N D yHautGauche ) ;

42

3.3

Jointures

E x e r c i c e 1 SELECT d i s t i n c t n o m p r o d F R O M produit , proposer W H E R E produit . numprod = proposer . numprod ; E x e r c i c e 2 SELECT d i s t i n c t n o m f o u F R O M fournisseur f , proposer p W H E R E f . numfou = p . numfou ; E x e r c i c e 3 SELECT n o m f o u , n o m p r o d F R O M f o u r n i s s e u r f , p r o d u i t p , p r o p o s e r pr W H E R E f . numfou = pr . numfou A N D pr . n u m p r o d = p . n u m p r o d ; E x e r c i c e 4 SELECT n o m f o u , p r i x F R O M f o u r n i s s e u r f , p r o d u i t p , p r o p o s e r pr W H E R E f . numfou = pr . numfou A N D pr . n u m p r o d = p . n u m p r o d A N D n o m P r o d = Poup e e Batman O R D E R BY p r i x ; E x e r c i c e 5 SELECT d a t e l i F R O M livraison l , fournisseur f W H E R E l . numfou = f . numfou A N D f . nomFou = f1 ; E x e r c i c e 6 SELECT n o m p r o d F R O M fournisseur f , produit p , W H E R E nomfou = f3 A N D f . numfou = l . numfou A N D l . numfou = d . numfou A N D l . numli = d . numli A N D d . numprod = p . numprod A N D dateli < sysdate ; E x e r c i c e 7 SELECT l . n u m f o u , l . n u m l i , d a t e l i F R O M produit p , livraison l , detaillivraison d W H E R E p . numprod = d . numprod A N D l . numfou = d . numfou A N D l . numli = d . numli A N D p . n o m p r o d = Poup e e Batman ; E x e r c i c e 8 SELECT e n f a n t . nom , e n f a n t . p r e n o m F R O M personne enfant , personne robert W H E R E enfant . pere = robert . numpers A N D r o b e r t . n o m = Baratheon A N D r o b e r t . p r e n o m = Robert ; E x e r c i c e 9 SELECT p a r e n t . nom , p a r e n t . p r e n o m F R O M personne stannis , personne parent W H E R E ( s t a n n i s . p e r e = p a r e n t . n u m p e r s OR s t a n n i s . m e r e = p a r e n t . n u m p e r s ) A N D s t a n n i s . n o m = Baratheon A N D stannis . prenom = Stannis ; E x e r c i c e 10 SELECT e n f a n t . nom , e n f a n t . p r e n o m F R O M personne enfant , personne robert , personne cersei W H E R E enfant . pere = robert . numpers A N D enfant . mere = cersei . numpers A N D r o b e r t . n o m = Baratheon A N D r o b e r t . p r e n o m = Robert A N D cersei . nom = Lannister A N D cersei . prenom = Cersei ; E x e r c i c e 11 SELECT f r e r e . nom , f r e r e . p r e n o m F R O M personne frere , personne renly W H E R E frere . pere = renly . pere A N D frere . mere = renly . mere A N D r e n l y . n o m = Baratheon A N D r e n l y . p r e n o m = Renly A N D f r e r e . n u m p e r s <> r e n l y . n u m p e r s ;

detaillivraison d ,

livraison l

43

E x e r c i c e 12 SELECT c o u s i n . nom , c o u s i n . p r e n o m F R O M p e r s o n n e cousin , p e r s o n n e oncle , p e r s o n n e pere , p e r s o n n e s h i r e e n W H E R E s h i r e e n . n o m = Baratheon A N D shireen . prenom = Shireen A N D shireen . pere = pere . numpers A N D pere . pere = oncle . pere A N D pere . mere = oncle . mere A N D p e r e . n u m p e r s <> o n c l e . n u m p e r s A N D o n c l e . n u m p e r s IN ( c o u s i n . p e r e , c o u s i n . m e r e ) ; / A t t e n t i o n , s u r c e r t a i n e s v e r s i o n s de mysql , l e s NULL f o n t b u g g e r l e moteur de r e q u e t e s . / E x e r c i c e 13 SELECT DISTINCT d e m i f r e r e . nom , d e m i f r e r e . p r e n o m F R O M personne demifrere , personne cersei , personne enfant W H E R E cersei . nom = Lannister A N D cersei . prenom = Cersei A N D enfant . mere = cersei . numpers A N D enfant . pere = demifrere . pere A N D e n f a n t . m e r e <> d e m i f r e r e . m e r e ; E x e r c i c e 14 SELECT DISTINCT m e r e . nom , m e r e . p r e n o m F R O M p e r s o n n e tywin , p e r s o n n e mere , p e r s o n n e enfant W H E R E tywin . nom = Lannister A N D t y w i n . p r e n o m = Tywin A N D enfant . mere = mere . numpers A N D enfant . pere = tywin . numpers ; E x e r c i c e 15 SELECT n e v e u . nom , n e v e u . p r e n o m F R O M personne neveu , personne stannis , personne frere W H E R E stannis . prenom = Stannis A N D s t a n n i s . n o m = Baratheon A N D frere . pere = stannis . pere A N D frere . mere = stannis . mere A N D f r e r e . n u m p e r s <> s t a n n i s . n u m p e r s A N D f r e r e . n u m p e r s IN ( n e v e u . p e r e , n e v e u . m e r e ) A N D neveu . pere IS N O T NULL A N D neveu . mere IS N O T NULL; / A t t e n t i o n , s u r c e r t a i n e s v e r s i o n s de mysql , l e s NULL f o n t b u g g e r l e moteur de r e q u e t e s . / E x e r c i c e 16 SELECT DISTINCT b r u . nom , b r u . p r e n o m F R O M personne petitenfant , personne enfant , personne cassana , personne bru W H E R E enfant . mere = cassana . numpers A N D e n f a n t . n u m p e r s IN ( p e t i t e n f a n t . p e r e , p e t i t e n f a n t . m e r e ) A N D bru . numpers = petitenfant . mere A N D c a s s a n a . n o m = Estermont A N D c a s s a n a . p r e n o m = Cassana ; E x e r c i c e 17 SELECT DISTINCT g r a n d p a r e n t . nom , g r a n d p a r e n t . p r e n o m F R O M personne tommen , personne parent , personne grandparent W H E R E t o m m e n . n o m = Baratheon A N D t o m m e n . p r e n o m = Tommen A N D g r a n d p a r e n t . n u m p e r s IN ( p a r e n t . p e r e , p a r e n t . m e r e ) A N D p a r e n t . n u m p e r s IN ( t o m m e n . p e r e , t o m m e n . m e r e ) ;

44

3.4

Agr egation de donn ees

E x e r c i c e 1 SELECT C O U N T( ) F R O M FOURNISSEUR ; E x e r c i c e 2 SELECT C O U N T(DISTINCT N U M F O U ) F R O M LIVRAISON ; E x e r c i c e 3 SELECT M A X( p r i x ) AS P R I X _ M A X F R O M P R O P O S E R PR , F O U R N I S S E U R F W H E R E F . numfou = PR . numfou A N D nomfou = f1 ; E x e r c i c e 4 SELECT n o m f o u , count (DISTINCT n u m p r o d ) AS N B _ P R O D _ P R O P O S E S F R O M FOURNISSEUR F , PROPOSER P W H E R E F . numfou = P . numfou G R O U P BY n o m f o u ; E x e r c i c e 5 SELECT C O U N T(DISTINCT P . n u m p r o d ) count (DISTINCT P R . n u m p r o d ) F R O M P R O D U I T P , P R O P O S E R PR ; E x e r c i c e 6 SELECT n o m p r o d , C O U N T(DISTINCT D . n u m f o u ) F R O M PRODUIT P , DETAILLIVRAISON D W H E R E P . numprod = D . numprod G R O U P BY n o m p r o d ; E x e r c i c e 7 SELECT n o m f o u , L . n u m l i , d a t e l i , C O U N T( n u m p r o d ) AS N B _ P R O D U I T S F R O M FOURNISSEUR F , LIVRAISON L , DETAILLIVRAISON D W H E R E F . numfou = L . numfou A N D D . numfou = L . numfou A N D D . numli = L . numli G R O U P BY n o m f o u , L . n u m l i , d a t e l i ; E x e r c i c e 8 SELECT n o m f o u , L . n u m l i , d a t e l i , S U M( q t e p r i x ) AS T O T A L F R O M FOURNISSEUR F , LIVRAISON L , DETAILLIVRAISON D , PROPOSER P W H E R E F . numfou = L . numfou A N D D . numfou = L . numfou A N D D . numli = L . numli A N D P . numfou = F . numfou A N D D . numprod = P . numprod G R O U P BY n o m f o u , L . n u m l i , d a t e l i ; E x e r c i c e 9 SELECT n o m p r o d F R O M P R O D U I T P , P R O P O S E R PR W H E R E P . n u m p r o d = PR . n u m p r o d G R O U P BY n o m p r o d HAVING C O U N T( D . n u m f o u ) = 1 ; E x e r c i c e 10 SELECT n o m f o u F R O M FOURNISSEUR F , PROPOSER P , DETAILLIVRAISON L W H E R E F . numfou = P . numfou A N D L . numfou = F . numfou G R O U P BY n o m f o u HAVING C O U N T(DISTINCT P . n u m p r o d ) = C O U N T(DISTINCT L . n u m p r o d ) ;

45

3.5

Vues

E x e r c i c e 1 CREATE VIEW Q U A N T I T E _ L I V R E E _ P A R _ P R O D U I T AS SELECT n u m p r o d , S U M( q t e ) AS Q U A N T I T E _ L I V R E E F R O M DETAILLIVRAISON G R O U P BY n u m p r o d ; E x e r c i c e 2 SELECT M A X( Q U A N T I T E _ L I V R E E ) F R O M QUANTITE_LIVREE_PAR_PRODUIT ; E x e r c i c e 3 CREATE VIEW F A C T U R E _ P A R _ L I V R A I S O N AS SELECT D . n u m f o u , D . n u m l i , S U M( q t e p r i x ) AS M O N T A N T _ F A C T U R E F R O M P R O P O S E R PR , D E T A I L L I V R A i S O N D wHERE P R . n u m f o u = D . n u m f o u A N D D . n u m p r o d = PR . n u m p r o d G R O U P BY D . n u m f o u , D . n u m l i ; E x e r c i c e 4 CREATE VIEW F A C T U R E _ P A R _ F O U R N I S S E U R AS SELECT n u m f o u , S U M( M O N T A N T _ F A C T U R E ) AS T O T A L _ F A C T U R E F R O M FACTURE_PAR_LIVRAISON G R O U P BY n u m f o u ; E x e r c i c e 5 SELECT MIN( T O T A L _ F A C T U R E ) F R O M FACTURE_PAR_FOURNISSEUR ; E x e r c i c e 6 CREATE VIEW N B _ P R O D _ D I S T _ L I V R E S _ P A R _ F O U AS SELECT DISTINCT n u m f o u , C O U N T(DISTINCT n u m p r o d ) AS N B _ P R O D U I T S _ D I S T I N C T S _ L I V R E S F R O M DETAILLIVRAISON G R O U P BY n u m f o u ; SELECT M A X( N B _ P R O D U I T S _ D I S T I N C T S _ L I V R E S ) F R O M NB_PROD_DIST_LIVRES_PAR_FOU ;

46

3.6

Requ etes imbriqu ees

E x e r c i c e 1 SELECT n o m f o u , (SELECT C O U N T( n u m p r o d ) F R O M PROPOSER P W H E R E P . numfou = F . numfou ) AS N B _ P R O D _ P R O P O S E S F R O M FOURNISSEUR F ; E x e r c i c e 2 SELECT n o m f o u F R O M FOURNISSEUR W H E R E n u m f o u IN (SELECT n u m f o u F R O M PROPOSER W H E R E numprod = 2 ) ; E x e r c i c e 3 SELECT n o m f o u F R O M FOURNISSEUR W H E R E n u m f o u IN (SELECT n u m f o u F R O M PROPOSER W H E R E numprod = (SELECT n u m p r o d F R O M PRODUIT W H E R E n o m p r o d = Poup e e Batman ) ); E x e r c i c e 4 SELECT n o m f o u F R O M FOURNISSEUR W H E R E n u m f o u IN (SELECT n u m f o u F R O M DETAILLIVRAISON W H E R E n u m p r o d IN (SELECT n u m p r o d F R O M PRODUIT W H E R E n o m p r o d = Poup e e Batman ) ); E x e r c i c e 5 SELECT n o m f o u F R O M FOURNISSEUR F W H E R E (SELECT C O U N T( ) F R O M P R O P O S E R PR W H E R E F . numfou = PR . numfou ) > 0 A N D (SELECT C O U N T(DISTINCT n u m p r o d ) F R O M DETAILLIVRAISON D W H E R E F . numfou = D . numfou ) = (SELECT C O U N T( ) F R O M P R O P O S E R PR W H E R E F . numfou = PR . numfou ); E x e r c i c e 6 SELECT n o m f o u , (SELECT n o m p r o d F R O M PRODUIT P W H E R E P . n u m p r o d IN (SELECT n u m p r o d F R O M PROPOSER PR1 W H E R E PR1 . numfou = F . numfou A N D prix = (SELECT M A X( p r i x ) F R O M PROPOSER PR2 W H E R E PR2 . numfou = F . numfou ) ) ) F R O M FOURNISSEUR F ; E x e r c i c e 7

47

CREATE VIEW N B _ P R O D _ L I V R E S _ P A R _ F O U AS SELECT n u m f o u , n u m p r o d , S U M( q t e ) AS Q T E F R O M DETAILLIVRAISON G R O U P BY n u m f o u , n u m p r o d ; SELECT n o m p r o d , n o m f o u F R O M FOURNISSEUR F , PRODUIT P W H E R E (SELECT Q T E F R O M NB_PROD_LIVRES_PAR_FOU D W H E R E D . numprod = P . numprod A N D D . numfou = F . numfou ) = (SELECT M A X( Q T E ) F R O M NB_PROD_LIVRES_PAR_FOU D W H E R E D . numprod = P . numprod ); E x e r c i c e 8 SELECT MIN( N B _ P R O D ) F R O M (SELECT (SELECT C O U N T( ) F R O M P R O P O S E R PR W H E R E PR . numfou = F . numfou ) AS N B _ P R O D F R O M FOURNISSEUR F ); E x e r c i c e 9 SELECT n o m f o u F R O M FOURNISSEUR W H E R E n u m f o u IN (sELECT n u m f o u F R O M (SELECT n u m f o u , (SELECT C O U N T( ) F R O M P R O P O S E R PR W H E R E F . numfou = PR . numfou ) AS N B _ P R O D F R O M FOURNISSEUR F ) W H E R E NB_PROD = (SELECT MIN( N B _ P R O D ) F R O M (SELECT n u m f o u , (SELECT C O U N T( ) F R O M P R O P O S E R PR W H E R E F . numfou = PR . numfou ) AS N B _ P R O D F R O M FOURNISSEUR F ) ) ); E x e r c i c e 10 SELECT n o m p r o d , n o m f o u F R O M PRODUIT P , FOURNISSEUR F , (SELECT F 1 . n u m f o u , P 1 . n u m p r o d F R O M F O U R N I S S E U R F1 , P R O D U I T P 1 W H E R E (SELECT S U M( Q T E ) F R O M DETAILLIVRAiSON D W H E R E D . numfou = F1 . numfou A N D D . n u m p r o d = P1 . n u m p r o d ) = (SELECT M A X( N B _ L I V ) F R O M (SELECT n u m p r o d , S U M( Q T E ) AS N B _ L I V F R O M DETAILLIVRAiSON D G R O U P BY n u m p r o d , n u m f o u ) Q W H E R E Q . n u m p r o d = P1 . n u m p r o d ) ) M W H E R E P . numprod = M . numprod A N D F . numfou = M . numfou ;

48

3.7

Compl ements sur les types

E x e r c i c e 1 ALTER TABLE L I V R A I S O N A D D CONSTRAINT c k _ d a t e _ m a n d a t o r y C H E C K ( dateli IS N O T NULL ) ; ALTER TABLE P R O P O S E R A D D CONSTRAINT c k _ p r i c e _ m a n d a t o r y C H E C K ( prix IS N O T NULL ) ; ALTER TABLE D E T A I L L I V R A I S O N A D D CONSTRAINT c k _ q t e _ m a n d a t o r y C H E C K ( qte IS N O T NULL ) ; E x e r c i c e 2 ALTER TABLE P R O P O S E R A D D CONSTRAINT c k _ p r i c e _ p o s i t i v e C H E C K ( prix > 0 ) ; ALTER TABLE D E T A I L L I V R A I S O N A D D CONSTRAINT c k _ q t e _ p o s i t i v e C H E C K ( qte > 0 ) ; E x e r c i c e 3 ALTER TABLE L I V R A I S O N A D D CONSTRAINT c k _ o c t o b r e _ 2 0 0 6 C H E C K ( t o _ c h a r ( d a t e l i , yyyymm ) >= 200610 ) ; E x e r c i c e 4 ALTER TABLE L I V R A I S O N A D D CONSTRAINT c k _ f e t e _ d u _ t r a v a i l C H E C K ( t o _ c h a r ( d a t e l i , mmdd ) <> 0501 ) ; E x e r c i c e 5 U P D A T E P R O D U I T SET n o m p r o d = upper ( substr ( n o m p r o d , 1 , 1 ) ) | | substr ( n o m p r o d , 2 , L E N G T H ( n o m p r o d ) 1 ) ; ALTER TABLE P R O D U I T A D D CONSTRAINT c k _ m a j u s c u l e _ p r o d u i t C H E C K ( upper ( substr ( n o m p r o d , 1 , 1 ) ) = substr ( n o m p r o d , 1 , 1 ) ) ; U P D A T E F O U R N I S S E U R SET n o m f o u = upper ( substr ( n o m f o u , 1 , 1 ) ) | | substr ( n o m f o u , 2 , L E N G T H ( n o m f o u ) 1 ) ; ALTER TABLE F O U R N I S S E U R A D D CONSTRAINT c k _ m a j u s c u l e _ f o u r n i s s e u r C H E C K ( upper ( substr ( n o m f o u , 1 , 1 ) ) = substr ( n o m f o u , 1 , 1 ) ) ;

49

3.8

R evisions

E x e r c i c e 1 SELECT n o m f o u F R O M FOURNISSEUR F W H E R E ( SELECT C O U N T( ) F R O M LIVRAISON L W H E R E L . numfou = F . numfou ) >= 2 ; E x e r c i c e 2 CREATE VIEW L I V R A I S O N S _ P A R _ A N N E E AS SELECT A N N E E , C O U N T( ) AS N B _ L I V R A I S O N S F R O M ( SELECT t o _ c h a r ( d a t e l i , yyyy ) AS A N N E E , n u m f o u , n u m l i F R O M LIVRAISON ) G R O U P BY A N N E E ; SELECT A N N E E F R O M LIVRAISONS_PAR_ANNEE W H E R E NB_LIVRAISONS = ( SELECT M A X( N B _ L I V R A I S O N S ) F R O M LIVRAISONS_PAR_ANNEE ); E x e r c i c e 3 CREATE VIEW F O U _ K I _ O N T _ T O U _ L I V R E AS SELECT n u m f o u F R O M FOURNISSEUR F W H E R E (SELECT C O U N T( ) F R O M P R O P O S E R PR W H E R E PR . numfou = F . numfou ) = (SELECT C O U N T(DISTINCT n u m p r o d ) F R O M DETAILLIVRAISON D W H E R E D . numfou = F . numfou ); CREATE VIEW D E R N I E R E _ L I _ P A R _ F O U AS SELECT n u m f o u , M A X( d a t e l i ) AS D A T E _ M A X F R O M LIVRAISON G R O U P BY n u m f o u ; SELECT n o m f o u F R O M FOURNISSEUR W H E R E n u m f o u IN ( SELECT F . n u m f o u F R O M FOU_KI_ONT_TOU_LIVRE F , DERNIERE_LI_PAR_FOU D W H E R E F . numfou = D . numfou A N D DATE_MAX = ( SELECT M A X( D A T E _ M A X ) F R O M FOU_KI_ONT_TOU_LIVRE F , DERNIERE_LI_PAR_FOU D W H E R E F . numfou = D . numfou ) );

50

Annexe A

Scripts de cr eation de tables


A.1 Livraisons Sans contraintes

Attention : Le num ero de livraison est une cl e secondaire, cest-` a-dire un num ero unique etant donn e un fournisseur.

A.1.1

Oracle

CREATE TABLE P R O D U I T ( n u m p r o d number , n o m p r o d varchar2 ( 3 0 ) ) ; CREATE TABLE F O U R N I S S E U R ( n u m f o u number , n o m f o u varchar2 ( 3 0 ) ) ; CREATE TABLE P R O P O S E R ( n u m f o u number , n u m p r o d number , p r i x number ) ; CREATE TABLE L I V R A I S O N ( n u m f o u number , n u m l i number , d a t e l i date d e f a u l t s y s d a t e ); CREATE TABLE D E T A I L L I V R A I S O N ( n u m f o u number , n u m l i number , n u m p r o d number , q t e number ) ;

A.1.2
drop drop drop drop drop

mySql
PRODUIT ; FOURNISSEUR ; PROPOSER ; LIVRAISON ; DETAILLIVRAISON ;

table table table table table

CREATE TABLE P R O D U I T ( n u m p r o d integer , n o m p r o d varchar ( 3 0 ) ) ; CREATE TABLE F O U R N I S S E U R ( n u m f o u integer , n o m f o u varchar ( 3 0 ) ) ; CREATE TABLE P R O P O S E R ( n u m f o u integer , n u m p r o d integer , prix real ) ; CREATE TABLE L I V R A I S O N ( n u m f o u integer , n u m l i integer , d a t e l i date ); CREATE TABLE D E T A I L L I V R A I S O N ( n u m f o u integer ,

51

n u m l i integer , n u m p r o d integer , qte integer ) ;

52

A.2

Modules et prerequis

les modules sont r epertori es dans une table, et les modules pr e-requis pour sy inscrire (avec la note minimale) se trouvent dans la table prerequis. Une ligne de la table PREREQUIS nous indique que pour sinscrire dans le module num ero numMod, il faut avoir eu au moins noteMin au module numModPrereq.

A.2.1

Oracle

CREATE TABLE M O D U L E ( n u m M o d number primary key , n o m M o d varchar2 ( 3 0 ) ); CREATE TABLE P R E R E Q U I S ( n u m M o d number r e f e r e n c e s M O D U L E ( n u m M o d ) , n u m M o d P r e r e q number r e f e r e n c e s M O D U L E ( n u m M o d ) , n o t e M i n number ( 2 ) DEFAULT 10 N O T NULL , P R I M A R Y KEY( n u m M o d , n u m M o d P r e r e q ) ); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO MODULE MODULE MODULE MODULE MODULE MODULE MODULE MODULE VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1 , (2 , (3 , (4 , (5 , (6 , (7 , (8 , Oracle ) ; C ++ ) ; C ) ; Algo ) ; Merise ) ; PL/SQL O r a c l e ) ; mySQL ) ; c e ); Algo avancA , numModPrereq ) , numModPrereq ) (6 , 1 , 12); , numModPrereq ) , numModPrereq ) , numModPrereq ) VALUES ( 1 , VALUES ( 2 , VALUES ( 6 , VALUES ( 8 , VALUES ( 7 , 5); 3); 5); 5); 5);

PREREQUIS PREREQUIS PREREQUIS PREREQUIS PREREQUIS PREREQUIS

( numMod ( numMod VALUES ( numMod ( numMod ( numMod

A.2.2

mySql

CREATE TABLE M O D U L E ( n u m M o d i n t primary key , n o m M o d varchar ( 3 0 ) ) t y p e =i n n o D B ; CREATE TABLE P R E R E Q U I S ( n u m M o d int , n u m M o d P r e r e q int , n o t e M i n i n t DEFAULT 10 N O T NULL , P R I M A R Y KEY( n u m M o d , n u m M o d P r e r e q ) , FOREIGN KEY ( n u m M o d ) r e f e r e n c e s M O D U L E ( n u m M o d ) , FOREIGN KEY ( n u m M o d P r e r e q ) r e f e r e n c e s M O D U L E ( n u m M o d ) ) t y p e =i n n o D B ; INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO MODULE MODULE MODULE MODULE MODULE MODULE MODULE MODULE VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1 , (2 , (3 , (4 , (5 , (6 , (7 , (8 , Oracle ) ; C ++ ) ; C ) ; Algo ) ; Merise ) ; PL/SQL O r a c l e ) ; mySQL ) ; c e ); Algo avancA

INSERT INSERT INSERT INSERT INSERT INSERT

INTO INTO INTO INTO INTO INTO

PREREQUIS PREREQUIS PREREQUIS PREREQUIS PREREQUIS PREREQUIS

( numMod ( numMod VALUES ( numMod ( numMod ( numMod

, numModPrereq ) , numModPrereq ) (6 , 1 , 12); , numModPrereq ) , numModPrereq ) , numModPrereq )

VALUES ( 1 , VALUES ( 2 , VALUES ( 6 , VALUES ( 8 , VALUES ( 7 ,

5); 3); 5); 5); 5);

53

A.3

G eom etrie

La table INTERVALLE contient des intervalles sp eci es par leurs bornes inf erieure et sup erieure. Supprimer de la table intervalle tous les intervalles qui nen sont pas avec une seule instruction.
CREATE TABLE I N T E R V A L L E ( borneInf N U M B E R , borneSup N U M B E R , P R I M A R Y KEY ( b o r n e I n f , b o r n e S u p ) ) ; CREATE TABLE R E C T A N G L E ( xHautGauche N U M B E R , yHautGauche N U M B E R , xBasDroit N U M B E R , yBasDroit N U M B E R , P R I M A R Y KEY ( x H a u t G a u c h e , y H a u t G a u c h e , x B a s D r o i t , INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTERVALLE INTERVALLE INTERVALLE INTERVALLE INTERVALLE INTERVALLE INTERVALLE INTERVALLE INTERVALLE INTERVALLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE RECTANGLE VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (2 , (12 , (2 , (12 , (8 , (34 , (5 , (7 , (0 , (21 , 56); 30); 3); 3); 27); 26); 10); 32); 30); 8);

yBasDroit ) ) ;

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

(2 , 12 , 5 , 7 ) ; (2 , 12 , 1 , 1 3 ) ; (10 , 13 , 1 , 1 1 ) ; (10 , 13 , 10 , 1 1 ) ; (2 , 7 , 5 , 13); (21 , 73 , 15 , 2 2 ) ; (1 , 2 , 3 , 4); (1 , 5 , 3 , 2); (1 , 6 , 3 , 6); (4 , 2 , 1 , 4); (2 , 3 , 4 , 0); (5 , 4 , 2 , 1);

54

A.4
A.4.1

Livraisons
Oracle

CREATE TABLE P R O D U I T ( n u m p r o d number , n o m p r o d varchar2 ( 3 0 ) ) ; CREATE TABLE F O U R N I S S E U R ( n u m f o u number , n o m f o u varchar2 ( 3 0 ) ) ; CREATE TABLE P R O P O S E R ( n u m f o u number , n u m p r o d number , p r i x number N O T NULL ) ; CREATE TABLE L I V R A I S O N ( n u m f o u number , n u m l i number , d a t e l i date d e f a u l t s y s d a t e ); CREATE TABLE D E T A I L L I V R A I S O N ( n u m f o u number , n u m l i number , n u m p r o d number , q t e number N O T NULL ) ; a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO p r o d u i t add c o n s t r a i n t p k _ p r o d u i t ( numprod ) ; f o u r n i s s e u r add c o n s t r a i n t p k _ f o u r n i s s e u r ( numfou ) ; p r o p o s e r add c o n s t r a i n t p k _ p r o p o s e r ( numfou , numprod ) ; l i v r a i s o n add c o n s t r a i n t p k _ l i v r a i s o n ( numfou , numli ) ; d e t a i l l i v r a i s o n add c o n s t r a i n t p k _ d e t a i l _ l i v r a i s o n ( numfou , numli , numprod ) ; p r o p o s e r add c o n s t r a i n t f k _ p r o p o s e r _ f o u r n i s s e u r ( numfou ) REFERENCES fournisseur ( numfou ) ; p r o p o s e r add c o n s t r a i n t f k _ p r o p o s e r _ p r o d u i t ( numprod ) REFERENCES produit ( numprod ) ; l i v r a i s o n add c o n s t r a i n t f k _ l i v r a i s o n ( numfou ) REFERENCES fournisseur ( numfou ) ; d e t a i l l i v r a i s o n add c o n s t r a i n t f k _ d e t a i l _ l i v r a i s o n ( numfou , numli ) REFERENCES livraison ( numfou , numli ) ; d e t a i l l i v r a i s o n add c o n s t r a i n t f k _ d e t a i l _ l i v r a i s o n _ p r o p o s e r ( numfou , numprod ) REFERENCES proposer ( numfou , numprod ) ; PRODUIT PRODUIT PRODUIT PRODUIT values values values values (1 , (2 , (3 , (4 , Roue de s e c o u r s ) ; c e Batman ) ; PoupA Cotons t i g e s ) ; Cornichons ) ; (1 , (2 , (3 , (4 , 1, 2, 2, 3, f1 f2 f3 f4 ); ); ); );

FOURNISSEUR FOURNISSEUR FOURNISSEUR FOURNISSEUR PROPOSER PROPOSER PROPOSER PROPOSER

values values values values (1 , (1 , (2 , (3 ,

values values values values

200); 15); 1); 2); 1); 2); 1);

INSERT INTO L I V R A I S O N ( n u m f o u , n u m l i ) values ( 1 , INSERT INTO L I V R A I S O N ( n u m f o u , n u m l i ) values ( 1 , INSERT INTO L I V R A I S O N ( n u m f o u , n u m l i ) values ( 3 , INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO DETAILLIVRAISON DETAILLIVRAISON DETAILLIVRAISON DETAILLIVRAISON DETAILLIVRAISON values values values values values (3 , (1 , (1 , (1 , (1 , 1, 1, 1, 2, 2, 3, 1, 2, 1, 2, 10); 25); 20); 15); 17);

A.4.2
drop drop drop drop drop

MySql
DETAILLIVRAISON ; LIVRAISON ; PROPOSER ; FOURNISSEUR ; PRODUIT ;

table table table table table

CREATE TABLE P R O D U I T

55

( n u m p r o d int , n o m p r o d varchar ( 3 0 ) ) ; CREATE TABLE F O U R N I S S E U R ( n u m f o u int , n o m f o u varchar ( 3 0 ) ) ; CREATE TABLE P R O P O S E R ( n u m f o u int , n u m p r o d int , prix int N O T NULL ) ; CREATE TABLE L I V R A I S O N ( n u m f o u int , n u m l i int , d a t e l i date ); CREATE TABLE D E T A I L L I V R A I S O N ( n u m f o u int , n u m l i int , n u m p r o d int , qte int N O T NULL ) ; a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table P R I M A R Y KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY a l t e r table FOREIGN KEY INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO P R O D U I T add c o n s t r a i n t p k _ p r o d u i t ( numprod ) ; F O U R N I S S E U R add c o n s t r a i n t p k _ f o u r n i s s e u r ( numfou ) ; P R O P O S E R add c o n s t r a i n t p k _ p r o p o s e r ( numfou , numprod ) ; L I V R A I S O N add c o n s t r a i n t p k _ l i v r a i s o n ( numfou , numli ) ; D E T A I L L I V R A I S O N add c o n s t r a i n t p k _ d e t a i l _ l i v r a i s o n ( numfou , numli , numprod ) ; P R O P O S E R add c o n s t r a i n t f k _ p r o p o s e r _ f o u r n i s s e u r ( numfou ) REFERENCES FOURNISSEUR ( numfou ) ; P R O P O S E R add c o n s t r a i n t f k _ p r o p o s e r _ p r o d u i t ( numprod ) REFERENCES PRODUIT ( numprod ) ; L I V R A I S O N add c o n s t r a i n t f k _ l i v r a i s o n ( numfou ) REFERENCES FOURNISSEUR ( numfou ) ; D E T A I L L I V R A I S O N add c o n s t r a i n t f k _ d e t a i l _ l i v r a i s o n ( numfou , numli ) REFERENCES LIVRAISON ( numfou , numli ) ; D E T A I L L I V R A I S O N add c o n s t r a i n t f k _ d e t a i l _ l i v r a i s o n _ p r o p o s e r ( numfou , numprod ) REFERENCES PROPOSER ( numfou , numprod ) ; PRODUIT PRODUIT PRODUIT PRODUIT values values values values (1 , (2 , (3 , (4 , Roue de s e c o u r s ) ; Poupee Batman ) ; Cotons t i g e s ) ; Cornichons ) ; (1 , (2 , (3 , (4 , 1, 2, 2, 3, f1 f2 f3 f4 ); ); ); );

FOURNISSEUR FOURNISSEUR FOURNISSEUR FOURNISSEUR PROPOSER PROPOSER PROPOSER PROPOSER

values values values values (1 , (1 , (2 , (3 ,

values values values values

200); 15); 1); 2);

INSERT INTO L I V R A I S O N values ( 1 , 1 , n o w ( ) ) ; INSERT INTO L I V R A I S O N values ( 1 , 2 , n o w ( ) ) ; INSERT INTO L I V R A I S O N values ( 3 , 1 , n o w ( ) ) ; INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO DETAILLIVRAISON DETAILLIVRAISON DETAILLIVRAISON DETAILLIVRAISON DETAILLIVRAISON values values values values values (3 , (1 , (1 , (1 , (1 , 1, 1, 1, 2, 2, 3, 1, 2, 1, 2, 10); 25); 20); 15); 17);

56

A.5

Arbre g en ealogique

La table PERSONNE, le champ pere contient le num ero du p` ere de la personne, le champ mere contient le num ero de la m` ere de la personne.
CREATE TABLE p e r s o n n e ( numpers int P R I M A R Y KEY, n o m varchar ( 3 0 ) , p r e n o m varchar ( 3 0 ) , p e r e int , m e r e int , FOREIGN KEY ( p e r e ) R E F E R E N C E S p e r s o n n e ( n u m p e r s ) , FOREIGN KEY ( m e r e ) R E F E R E N C E S p e r s o n n e ( n u m p e r s ) ); insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into into into into personne personne personne personne personne personne personne personne personne personne personne personne personne personne personne personne values values values values values values values values values values values values values values values values ( 1 , Estermont , Cassana , NULL, NULL ) ; ( 2 , Baratheon , S t e f f o n , NULL, NULL ) ; ( 3 , Baratheon , Renly , 2 , 1 ) ; ( 4 , Baratheon , S t a n n i s , 2 , 1 ) ; ( 5 , Baratheon , Robert , 2 , 1 ) ; ( 1 2 , L a n n i s t e r , Joanna , NULL, NULL ) ; ( 1 3 , L a n n i s t e r , Tywin , NULL, NULL ) ; (9 , Lannister , Cersei , 13 , 1 2 ) ; ( 6 , NULL, Gendry , 5 , NULL ) ; ( 8 , Baratheon , Tommen , 5 , 9 ) ; ( 7 , Baratheon , J o f f r e y , 5 , 9 ) ; ( 1 0 , Baratheon , M y r c e l l a , 5 , 9 ) ; ( 1 1 , L a n n i s t e r , Jaime , 1 3 , 1 2 ) ; ( 1 4 , L a n n i s t e r , Tyrion , 1 3 , 1 2 ) ; ( 1 5 , F l o r e n t , S e l y s e , NULL, NULL ) ; ( 1 6 , Baratheon , S h i r e e n , 4 , 1 5 ) ;

57

A.6
D R O P D R O P D R O P D R O P D R O P D R O P

Comptes bancaires
OPERATION ; TYPEOPERATION ; COMPTECLIENT ; TYPECCL ; PERSONNEL ; CLIENT ;

TABLE TABLE TABLE TABLE TABLE TABLE

CREATE TABLE C L I E N T ( n u m c l i number , n o m c l i varchar2 ( 3 0 ) , p r e n o m c l i varchar2 ( 3 0 ) , a d r e s s e varchar2 ( 6 0 ) , t e l varchar ( 1 0 ) ); CREATE TABLE P E R S O N N E L ( n u m p e r s number , n o m p e r s varchar2 ( 3 0 ) , p r e n o m p e r s varchar2 ( 3 0 ) , m a n a g e r number , s a l a i r e number ); CREATE TABLE T Y P E C C L ( n u m t y p e c c l number , n o m t y p e c c l varchar2 ( 3 0 ) ); CREATE TABLE C O M P T E C L I E N T ( n u m c l i number , n u m c c l number , n u m t y p e c c l number , d a t e c c l date d e f a u l t s y s d a t e not null , n u m p e r s number ); CREATE TABLE T Y P E O P E R A T I O N ( n u m t y p e o p e r number , n o m t y p e o p e r varchar2 ( 3 0 ) ); CREATE TABLE O P E R A T I O N ( n u m c l i number , n u m c c l number , n u m o p e r number , n u m t y p e o p e r number , d a t e o p e r date d e f a u l t s y s d a t e not null , m o n t a n t o p e r number not null , l i b e l o p e r varchar2 ( 3 0 ) ); ALTER TABLE C L I E N T A D D ( CONSTRAINT p k _ c l i e n t P R I M A R Y KEY ( n u m c l i ) , CONSTRAINT c k _ t e l e p h o n e C H E C K( L E N G T H ( t e l )=10) ); ALTER TABLE P E R S O N N E L A D D ( CONSTRAINT p k _ p e r s o n n e l P R I M A R Y KEY ( n u m p e r s ) , CONSTRAINT c k _ s a l a i r e C H E C K( S A L A I R E >= 1 2 5 4 . 2 8 ) ); ALTER TABLE T Y P E C C L A D D CONSTRAINT p k _ t y p e c c l P R I M A R Y KEY ( n u m t y p e c c l ) ; ALTER TABLE T Y P E O P E R A T I O N A D D CONSTRAINT p k _ t y p e o p e r a t i o n P R I M A R Y KEY ( n u m t y p e o p e r ) ; ALTER TABLE C O M P T E C L I E N T A D D ( CONSTRAINT p k _ c o m p t e c l i e n t P R I M A R Y KEY ( n u m c l i , n u m c c l ) , CONSTRAINT f k _ c c l _ t y p e c c l FOREIGN KEY ( n u m t y p e c c l ) REFERENCES TYPECCL ( numtypeccl ) , CONSTRAINT f k _ c c l _ c l i e n t FOREIGN KEY ( n u m c l i ) REFERENCES CLIENT ( numcli ) , CONSTRAINT f k _ c c l _ p e r s o n n e l FOREIGN KEY ( n u m p e r s ) REFERENCES PERSONNEL ( numpers ) ); ALTER TABLE O P E R A T I O N A D D (

58

CONSTRAINT p k _ o p e r a t i o n P R I M A R Y KEY ( n u m c l i , n u m c c l , n u m o p e r ) , CONSTRAINT f k _ o p e r _ c c l FOREIGN KEY ( n u m c l i , n u m o p e r ) REFERENCES COMPTECLIENT ( numcli , numccl ) , CONSTRAINT f k _ o p e r _ c o d e o p e r FOREIGN KEY ( n u m t y p e o p e r ) REFERENCES typeoperation ( numtypeoper ) , CONSTRAINT m o n t a n t _ o p e r a t i o n C H E C K( m o n t a n t o p e r <> 0 ) ); INSERT INTO T Y P E C C L VALUES ( (SELECT n v l (M A X( n u m t y p e c c l ) , 0 ) + 1 F R O M TYPECCL ), Compte c o u r a n t ) ; INSERT INTO T Y P E C C L VALUES ( (SELECT n v l (M A X( n u m t y p e c c l ) , 0 ) + 1 F R O M TYPECCL ), livret ); INSERT INTO T Y P E C C L VALUES ( (SELECT n v l (M A X( n u m t y p e c c l ) , 0 ) + 1 F R O M TYPECCL ), PEL ) ; INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), c pAt dA esp Aces ); INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), c lAvement prA ); INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), virement ) ; INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), retrait );

59

A.7
D R O P D R O P D R O P D R O P D R O P D R O P

Comptes bancaires avec exceptions


OPERATION ; COMPTECLIENT ; TYPECCL ; TYPEOPERATION ; PERSONNEL ; CLIENT ;

TABLE TABLE TABLE TABLE TABLE TABLE

CREATE TABLE C L I E N T ( n u m c l i number , n o m c l i varchar2 ( 3 0 ) , p r e n o m c l i varchar2 ( 3 0 ) , a d r e s s e varchar2 ( 6 0 ) , t e l varchar ( 1 0 ) ); CREATE TABLE P E R S O N N E L ( n u m p e r s number , n o m p e r s varchar2 ( 3 0 ) , p r e n o m p e r s varchar2 ( 3 0 ) , m a n a g e r number , s a l a i r e number ); CREATE TABLE T Y P E C C L ( n u m t y p e c c l number , n o m t y p e c c l varchar2 ( 3 0 ) ); CREATE TABLE C O M P T E C L I E N T ( n u m c l i number , n u m c c l number , n u m t y p e c c l number , d a t e c c l date d e f a u l t s y s d a t e not null , n u m p e r s number ); CREATE TABLE T Y P E O P E R A T I O N ( n u m t y p e o p e r number , n o m t y p e o p e r varchar2 ( 3 0 ) ); CREATE TABLE O P E R A T I O N ( n u m c l i number , n u m c c l number , n u m o p e r number , n u m t y p e o p e r number , d a t e o p e r date d e f a u l t s y s d a t e not null , m o n t a n t o p e r number not null , l i b e l o p e r varchar2 ( 3 0 ) ); ALTER TABLE C L I E N T A D D ( CONSTRAINT p k _ c l i e n t P R I M A R Y KEY ( n u m c l i ) , CONSTRAINT c k _ t e l e p h o n e C H E C K( L E N G T H ( t e l )=10) ); ALTER TABLE P E R S O N N E L A D D ( CONSTRAINT p k _ p e r s o n n e l P R I M A R Y KEY ( n u m p e r s ) , CONSTRAINT c k _ s a l a i r e C H E C K( S A L A I R E >= 1 2 5 4 . 2 8 ) ); ALTER TABLE T Y P E C C L A D D CONSTRAINT p k _ t y p e c c l P R I M A R Y KEY ( n u m t y p e c c l ) ; ALTER TABLE T Y P E O P E R A T I O N A D D CONSTRAINT p k _ t y p e o p e r a t i o n P R I M A R Y KEY ( n u m t y p e o p e r ) ; ALTER TABLE C O M P T E C L I E N T A D D ( CONSTRAINT p k _ c o m p t e c l i e n t P R I M A R Y KEY ( n u m c l i , n u m c c l ) , CONSTRAINT f k _ c c l _ t y p e c c l FOREIGN KEY ( n u m t y p e c c l ) REFERENCES TYPECCL ( numtypeccl ) , CONSTRAINT f k _ c c l _ c l i e n t FOREIGN KEY ( n u m c l i ) REFERENCES CLIENT ( numcli ) , CONSTRAINT f k _ c c l _ p e r s o n n e l FOREIGN KEY ( n u m p e r s ) REFERENCES PERSONNEL ( numpers ) ); ALTER TABLE O P E R A T I O N A D D (

60

CONSTRAINT p k _ o p e r a t i o n P R I M A R Y KEY ( n u m c l i , n u m c c l , n u m o p e r ) , CONSTRAINT f k _ o p e r _ c c l FOREIGN KEY ( n u m c l i , n u m o p e r ) REFERENCES COMPTECLIENT ( numcli , numccl ) , CONSTRAINT f k _ o p e r _ c o d e o p e r FOREIGN KEY ( n u m t y p e o p e r ) REFERENCES typeoperation ( numtypeoper ) , CONSTRAINT m o n t a n t _ o p e r a t i o n C H E C K( m o n t a n t o p e r <> 0 A N D m o n t a n t o p e r >= 1000 A N D m o n t a n t o p e r <= 1 0 0 0 ) ); INSERT INTO T Y P E C C L VALUES ( (SELECT n v l (M A X( n u m t y p e c c l ) , 0 ) + 1 F R O M TYPECCL ), Compte c o u r a n t ) ; INSERT INTO T Y P E C C L VALUES ( (SELECT n v l (M A X( n u m t y p e c c l ) , 0 ) + 1 F R O M TYPECCL ), livret ); INSERT INTO T Y P E C C L VALUES ( (SELECT n v l (M A X( n u m t y p e c c l ) , 0 ) + 1 F R O M TYPECCL ), PEL ) ; INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), c pAt dA esp Aces ); INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), c lAvement prA ); INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), virement ) ; INSERT INTO T Y P E O P E R A T I O N VALUES ( (SELECT n v l (M A X( n u m t y p e o p e r ) , 0 ) + 1 F R O M TYPEOPERATION ), retrait );

61

A.8
D R O P D R O P D R O P D R O P D R O P D R O P

Secr etariat p edagogique


RESULTAT ; EXAMEN ; PREREQUIS ; INSCRIPTION ; MODULE ; ETUDIANT ;

TABLE TABLE TABLE TABLE TABLE TABLE

CREATE TABLE E T U D I A N T ( n u m E t u d number , n o m varchar2 ( 4 0 ) , p r e n o m varchar2 ( 4 0 ) , d a t e n a i s s date , c i v i l i t e varchar2 ( 4 ) , p a t r o n y m e varchar2 ( 4 0 ) , n u m s e c u varchar2 ( 1 5 ) N O T NULL ) ; CREATE TABLE M O D U L E ( c o d M o d number , n o m M o d varchar2 ( 1 5 ) , e f f e c M a x number DEFAULT 3 0 ) ; CREATE TABLE E X A M E N ( c o d M o d number , c o d E x a m number , d a t e E x a m date ) ; CREATE TABLE I N S C R I P T I O N ( n u m E t u d number , c o d M o d number , d a t e I n s c date d e f a u l t s y s d a t e ) ; CREATE TABLE P R E R E Q U I S ( c o d M o d number , c o d M o d P r e r e q number , n o t e M i n number ( 4 , 2 ) N O T NULL ) ; CREATE TABLE R E S U L T A T ( c o d M o d number , c o d E x a m number , n u m E t u d number , n o t e number ( 4 , 2 ) ) ; ALTER TABLE E T U D I A N T A D D CONSTRAINT p k _ e t u d i a n t P R I M A R Y KEY ( n u m E t u d ) ; ALTER TABLE M O D U L E A D D CONSTRAINT p k _ m o d u l e P R I M A R Y KEY ( c o d M o d ) ; ALTER TABLE E X A M E N A D D CONSTRAINT p k _ e x a m e n P R I M A R Y KEY ( c o d M o d , c o d E x a m ) ; ALTER TABLE P R E R E Q U I S A D D CONSTRAINT p k _ p r e r e q u i s P R I M A R Y KEY ( c o d M o d , c o d M o d P r e r e q ) ; ALTER TABLE I N S C R I P T I O N A D D CONSTRAINT p k _ i n s c r i p t i o n P R I M A R Y KEY ( c o d M o d , n u m E t u d ) ; ALTER TABLE R E S U L T A T A D D CONSTRAINT p k _ r e s u l t a t P R I M A R Y KEY ( c o d M o d , n u m E t u d , c o d E x a m ) ; ALTER TABLE I N S C R I P T I O N A D D (CONSTRAINT f k _ i n s c r i p t i o n _ e t u d i a n t FOREIGN KEY ( n u m E t u d ) REFERENCES ETUDIANT ( numEtud ) , CONSTRAINT f k _ i n s c r i p t i o n _ m o d u l e FOREIGN KEY ( c o d M o d ) REFERENCES MODULE ( codMod ) ) ; ALTER TABLE P R E R E Q U I S A D D (CONSTRAINT f k _ p r e r e q u i s _ c o d m o d FOREIGN KEY ( c o d M o d ) REFERENCES MODULE ( codMod ) , CONSTRAINT f k _ p r e r e q u i s _ c o d m o d p r e r e q FOREIGN KEY ( c o d M o d P r e r e q ) REFERENCES MODULE ( codMod ) ) ; ALTER TABLE E X A M E N A D D CONSTRAINT f k _ e x a m e n FOREIGN KEY ( c o d M o d ) REFERENCES MODULE ( codMod ) ; ALTER TABLE R E S U L T A T A D D (CONSTRAINT f k _ r e s u l t a t _ e x a m e n FOREIGN KEY ( c o d M o d , c o d E x a m ) REFERENCES EXAMEN ( codMod , codExam ) , CONSTRAINT f k _ r e s u l t a t _ i n s c r i p t i o n FOREIGN KEY ( c o d M o d , n u m E t u d ) REFERENCES INSCRIPTION ( codMod , numEtud ) ) ;

62

ALTER TABLE E T U D I A N T A D D (CONSTRAINT c k _ c i v i l i t e C H E C K ( c i v i l i t e IN ( Mr , Mme , M l l e ) ), CONSTRAINT c k _ c i v i l i t e _ n u m s e c u C H E C K ( SUBSTR( n u m s e c u , 1 , 1 ) = 2 OR p a t r o n y m e I S NULL ), CONSTRAINT c k _ l e n g t h _ n u m s e c u C H E C K ( l e n g t h ( n u m s e c u ) = 15 ), CONSTRAINT c k _ a n n e e _ n u m s e c u C H E C K ( t o _ c h a r ( d a t e n a i s s , yy ) = substr ( n u m s e c u , 2 , 2 ) ) );

63

A.9

Mariages

CREATE TABLE P E R S O N N E ( n u m p e r s number P R I M A R Y KEY, n o m varchar2 ( 3 0 ) N O T NULL, p r e n o m varchar2 ( 3 0 ) , pere REFERENCES PERSONNE ( numpers ) , mere REFERENCES PERSONNE ( numpers ) ); CREATE TABLE M A R I A G E ( nummari N U M B E R REFERENCES PERSONNE ( numpers ) , numfemme N U M B E R REFERENCES PERSONNE ( numpers ) , d a t e m a r i a g e DATE DEFAULT S Y S D A T E , d a t e d i v o r c e DATE DEFAULT NULL, P R I M A R Y KEY( n u m m a r i , n u m f e m m e , d a t e M a r i a g e ) );

64