Vous êtes sur la page 1sur 6

Introduction

Bases de Données Relationnelles ! SQL : Structured Query Language


! SQL est normalisé
" SQL 2: adopté (SQL 92)
SQL " SQL 3: adopté (SQL 99)

Standard d'accès aux bases de données


Le langage de définition
!

" relationnelles
des données de SQL " et relationnel-objets

! Ce chapitre du cours : SQL relationnel


uniquement
BD.5.2

SQL : Trois langages Terminologie


! Langage de définition de données (LDD/DDL) ! Relation –> table
" création de relations : CREATE TABLE
" modification de relations: ALTER TABLE ! Tuple –> ligne (row)
" suppression de relations: DROP TABLE
" vues, index …. : CREATE VIEW ... ! Attribut –> colonne (column)
! Langage de manipulation de données (LMD /DML) ! Identifiant –> clé primaire (primary key)
insertion de tuples: INSERT
"
clé secondaire (unique)
" mise à jour des tuples: UPDATE
" suppression de tuples: DELETE ! Identifiant externe
! Langage de requêtes (LMD/DML) –> clé externe (foreign key)
" SELECT ….... FROM ....... WHERE ..........

BD.5.3 BD.5.4

Langage de Définition de Données CREATE TABLE


! Commandes pour créer, modifier et supprimer les ! Commande créant une table en donnant son nom,
éléments du schéma (table, vue, index...) ses attributs et ses contraintes
! CREATE TABLE : créer une table ! CREATE TABLE nom-table
( {nom-col type-col [DEFAULT valeur]
! CREATE VIEW : créer une vue particulière sur les [ [CONSTRAINT] contrainte-col] }*
données à partir d’un SELECT [ [CONSTRAINT] contrainte-table ]* )
=> table dérivée | AS requête-SQL ;
! DROP TABLE / VIEW : supprimer une table ou une ! Légende :
vue " {a | b} : a ou b
! ALTER TABLE / VIEW : modifier une table ou une " [option]
vue. " * : applicable autant de fois que souhaité
" mot en capitale : mot clé
BD.5.5 BD.5.6
Deux CREATE TABLE CREATE TABLE AS / CREATE VIEW
! CREATE TABLE nom_table ! CREATE TABLE Etudiant
( {nom-col type-col [DEFAULT val] [ [CONSTRAINT] contrainte-col] }*
( nom VARCHAR(20),
[ [CONSTRAINT] contrainte-table]* ) | AS requête-SQL ;
prénom VARCHAR(15),
CREATE TABLE Doctorant
cycle CHAR(1) )
!

( nom VARCHAR(20),
prénom VARCHAR(15),
année_insc DECIMAL(4) DEFAULT 2006 ) ;

! INSERT INTO Etudiant VALUES


! CREATE TABLE Doctorant ( 'Rochat' , 'Annie' , 2 )
AS SELECT nom, prénom, année_inscr
! INSERT INTO Etudiant VALUES
FROM Etudiant WHERE statut='Doctorant' ;
( 'Smith' , 'John' , 1 )
=> Création du schéma ET des tuples
BD.5.7
….. BD.5.8

CREATE TABLE AS CREATE VIEW


! CREATE VIEW VEtud2 AS
SELECT nom, prénom
FROM Etudiant WHERE cycle=2

VETUD2 : SELECT nom, prénom FROM Etudiant WHERE cycle = 2

! CREATE TABLE Etud2 AS


SELECT nom, prénom
FROM Etudiant WHERE cycle=2 Etudiant
Rochat ... 2 Etud2
Smith ... 1 Rochat ...
Muller ... 1 Duval ...
Duval ... 2
BD.5.9 BD.5.10

Les vues sont dynamiques Domaines de valeurs


! Un nouvel étudiant :
INSERT INTO Etudiant VALUES (‘Dupont’, ‘André’, 2) CHAR(nb)
VARCHAR(max)
VETUD2 : SELECT nom, prénom FROM Etudiant WHERE cycle = 2
INTEGER
NUMERIC(n,p)
DATE
Etudiant Etud2
TIME
Rochat ... 2
Smith ... 1
Rochat ... TIMESTAMP
Duval ...
Muller ... 1
Duval ... 2

Dupont ... 2

Dupont apparaît dans VEtud2, mais pas dans Etud2BD.5.11 BD.5.12


Contraintes Attribut obligatoire / facultatif
! contrainte-col : contrainte sur une colonne ! Contrainte sur une colonne
" NOT NULL
" DEFAULT value
! Attribut obligatoire : NOT NULL
" PRIMARY KEY CREATE TABLE Pays
" UNIQUE (nom VARCHAR(20) NOT NULL ,
" REFERENCES nom-table [(nom-col)] [action] capitale VARCHAR(20) NOT NULL ,
" CHECK ( condition) surface INTEGER ,
! contrainte-table : contraintes sur une table …)
" PRIMARY KEY (nom-col*)
! Attribut facultatif :
" UNIQUE (nom-col*)
" FOREIGN KEY (nom-col*) REFERENCES nom-table " Si possible éviter les valeurs nulles en donnant une
[(nom-col*)] [action] valeur par défaut
" CHECK ( condition) " CREATE TABLE Doctorant ( ...
année_insc DECIMAL(4) DEFAULT 2006 ...)
BD.5.13 BD.5.14

Identifiants : clé primaire / PRIMARY KEY : exemples


secondaire
! PRIMARY KEY (A1, A2, …) ! CREATE TABLE Pays
" La clé primaire (si elle existe) . En SQL les lignes ( nom VARCHAR(20) PRIMARY KEY ,
doubles sont possibles ! capitale VARCHAR(20) … )
" choisir l'identifiant le plus efficace
! CREATE TABLE Employé
" attribut référencé par défaut dans les identifiants
externes ( nom VARCHAR(30) ,
" pas de valeur nulle possible prénom VARCHAR(30) ,
c-à-d NOT NULL automatiquement adresse VARCHAR(60) , …
! UNIQUE (A1, A2, …) CONSTRAINT Pk_emp PRIMARY KEY (nom,
" une clé secondaire (s'il en existe) prénom) )
" contrainte d'intégrité pour les autres identifiants ! contrainte de colonne et de table
" valeur nulle permise (sauf si NOT NULL) BD.5.15 BD.5.16

UNIQUE : exemples Clé externe : FOREIGN KEY


! CREATE TABLE Etudiant CREATE TABLE Etudiant (N°E …)
( AVS CHAR(11) PRIMARY KEY , CREATE TABLE Cours (NomCours …)
N°Etudiant CHAR(6) UNIQUE , CREATE TABLE Suit
nom VARCHAR(20) , ( N°Etud CHAR(9) ,
prénom VARCHAR(30) , … NomC VARCHAR(25) ,
CONSTRAINT UNIQUE (nom, prénom) ) PRIMARY KEY (N°Etud , NomC) ,
FOREIGN KEY (N°Etud) REFERENCES Etudiant ,
! Contrainte de colonne et de table
FOREIGN KEY (NomC) REFERENCES Cours )

! PRIMARY KEY et UNIQUE sont incompatibles

BD.5.17 BD.5.18
FOREIGN KEY (suite) Intégrité référentielle
! Les clés externes référencent par défaut la clé ! REFERENCES nom-table [(nom-col)] [action]
primaire de la table référencée " Qu'est ce qui se passe quand on détruit/m.à.j. une clé
primaire ou unique qui est référencée par un tuple
" CREATE TABLE Employé
(foreign key) d'une autre table?
(AVS CHAR(11) PRIMARY KEY,
N°emp CHAR(6) UNIQUE , … )
" CREATE TABLE Département
" CREATE TABLE Département (N°dep VARCHAR(18) PRIMARY KEY,
(N°dep VARCHAR(18) PRIMARY KEY,
chefN° CHAR(11) REFERENCES Employé,… )
chefN° CHAR(11) REFERENCES Employé , … )

! Une clé externe peut référencer une clé secondaire ! Soit le tuple (N°dep=Ventes, chefN°=12345, …)
de la table référencée => à préciser dans la table Département
" CREATE TABLE Département2 Que se passe-t-il si l’on détruit l'employé d'AVS
(N°dep VARCHAR(18) PRIMARY KEY, 12345 dans la table Employé ?
chefN° CHAR(6) REFERENCES Employé (N°emp) , … )
BD.5.19 BD.5.20

"Referential triggered action" Contraintes (rappel)


! Deux circonstances ! Trois options ! contrainte-col : contrainte sur une colonne
" NOT NULL
" ON DELETE " SET NULL
SET DEFAULT: valeur par défaut " DEFAULT
" ON UPDATE "
si elle existe, sinon NULL " PRIMARY KEY
" CASCADE : on répercute la m.à.j. " UNIQUE
" REFERENCES nom-table [(nom-col)] [action]
! CREATE TABLE Département " CHECK ( condition)
( N°dep VARCHAR(18) PRIMARY KEY,
! contrainte-table : contraintes sur une table
chefN° CHAR(11) REFERENCES Employé (N°emp)
" PRIMARY KEY (nom-col*)
ON DELETE SET NULL
" UNIQUE (nom-col*)
ON UPDATE CASCADE , " FOREIGN KEY (nom-col*) REFERENCES nom-table
…)
[(nom-col*)] [action]
" CHECK ( condition)
! Si la clause n'existe pas : refus du DELETE ou UPDATE
BD.5.21 BD.5.22

Contrainte CHECK (condition) CREATE TRIGGER


! Condition que chaque ligne de la table doit vérifier ! Contrainte d'intégrité
! Contrainte de colonne et de table " simple => clause CHECK dans CREATE TABLE
" complexe => un TRIGGER
" CREATE TABLE Employé
( AVS CHAR(11) PRIMARY KEY , ! CREATE TRIGGER
nom VARCHAR(20) NOT NULL, " nouvelle
instruction Evènement-Condition-Action
prénoms VARCHAR(30) ,
" QUAND événement
âge NUMBER CHECK (âge>16 AND âge<70) ,
INSERT / DELETE /UPDATE
sexe CHAR CHECK (sexe IN ('M', 'F')) , #

salaire NUMBER , SI condition-SQL


commission NUMBER , ALORS action
CONSTRAINT checkSalaire # refus / instructions PL/SQL
CHECK (salaire + commission <= 7000) )
BD.5.23 BD.5.24
TRIGGER : exemple CREATE TRIGGER initPrerequis
! Institut FormaPerm : Pour tout tuple de BEFORE INSERT OR UPDATE ON Prerequis
FOR EACH ROW
Prérequis <nomC, nomCprérequis>, le cycle DECLARE cyclePrerequis NUMBER(1,0);
de nomCprérequis dans Cours doit être cycleCours NUMBER(1,0);
inférieur ou égal à celui de nomC BEGIN
SELECT cycle INTO cyclePrerequis FROM Cours WHERE
Cours.nomC = :new.nomCprerequis;
QUAND : INSERT, UPDATE Prérequis SELECT cycle INTO cycleCours FROM Cours WHERE
Cours.nomC = :new.nomC;
SI : le cycle de nomCprérequis dans Cours est IF (cyclePrerequis > cycleCours) THEN
supérieur à celui de nomC raise_application_error(-20040,'** le cycle du cours ne
ALORS : refuser l'insertion ou la mise à jour peut pas etre inferieur a celui du prerequis **');
END IF;
END;
BD.5.25 BD.5.26

DROP TABLE ALTER TABLE


! DROP : supprimer une table ! Modifier la définition d’une table :
" supprime la table et tout son contenu " Changer le nom de la table
mot clé : RENAME
! DROP TABLE nom-table [CASCADE CONSTRAINTS] " Ajouter une colonne ou une contrainte
mot clé : ADD
" Modifier une colonne ou une contrainte
! CASCADE CONSTRAINTS mot clé : MODIFY
" Supprime toutes les contraintes de clé externe " Supprimer une colonne ou une contrainte
référençant cette table
mot clé : DROP
" Si on cherche à détruire une table dont certains attributs
sont référencés sans spécifier CASCADE CONSTRAINT: " renommer une colonne ou une contrainte
refus du DROP mot clé : RENAME
BD.5.27 BD.5.28

ALTER TABLE (format) Exemple : Institut FormaPerm


ALTER TABLE nom-table ! CREATE TABLE Personne
( n°P INTEGER ,
{ RENAME TO nouveau-nom-table |
nom VARCHAR(30) NOT NULL ,
ADD ( { nom-col type-col [DEFAULT valeur] adr VARCHAR(100) NOT NULL ,
[contrainte-col]* }* ) | PRIMARY KEY (n°P ) )

MODIFY ( nom-col [type-col] [DEFAULT valeur]


[contrainte-col]* ) |
! CREATE TABLE PersonnePrénoms
DROP COLUMN nom-col [CASCADE CONSTRAINTS] | ( n°P INTEGER ,
RENAME COLUMN nom-col TO nouveau-nom-col prénom VARCHAR(30) NOT NULL ,
n°prénom INTEGER ,
}
PRIMARY KEY (n°P , n°prénom ) ,
UNIQUE (n°P , prénom ) ,
FOREIGN KEY (n°P) REFERENCES Personne ON DELETE CASCADE
)
BD.5.29 BD.5.30
Exemple FormaPerm (2) Exemple FormaPerm (3)
! CREATE TABLE Etudiant ! CREATE TABLE Enseignant
( n°P INTEGER NOT NULL , ( n°P INTEGER ,
n°E INTEGER , tel INTEGER NOT NULL ,
dateN DATE NOT NULL , statut VARCHAR(30) NOT NULL ,
PRIMARY KEY (n°E ) , banque VARCHAR(30) NOT NULL ,
UNIQUE (n°P ) , agence VARCHAR(30) NOT NULL ,
FOREIGN KEY (n°P) REFERENCES Personne ) compte INTEGER NOT NULL ,
PRIMARY KEY (n°P ) ,
FOREIGN KEY (n°P) REFERENCES Personne )

! CREATE TABLE EtudiantEtudes ! CREATE TABLE Cours


( n°E INTEGER , ( nomC VARCHAR(30) ,
année INTEGER NOT NULL , cycle INTEGER NOT NULL ,
diplôme VARCHAR(30) , n°Ens INTEGER NOT NULL ,
PRIMARY KEY (n°E , diplôme ) , PRIMARY KEY (nomC ) ,
FOREIGN KEY (n°E) REFERENCES Etudiant ON DELETE CASCADE FOREIGN KEY (n°Ens) REFERENCES Enseignant )
)
BD.5.31 BD.5.32

Exemple FormaPerm (4) Exemple FormaPerm (5)


! CREATE TABLE Obtenu ! CREATE TABLE Prérequis
( n°E INTEGER , ( nomC VARCHAR(30) ,
nomC VARCHAR(30) ,
nomCprérequis VARCHAR(30) ,
note NUMERIC(2,1) NOT NULL ,
année INTEGER NOT NULL , PRIMARY KEY (nomC , nomCprérequis ) ,
PRIMARY KEY (n°E , nomC ) , FOREIGN KEY (nomC) REFERENCES Cours ,
FOREIGN KEY (n°E) REFERENCES Etudiant.n°E , FOREIGN KEY (nomCprérequis) REFERENCES Cours )
FOREIGN KEY (nomC) REFERENCES Cours )

! CREATE TABLE Inscrit


( n°E INTEGER ,
nomC VARCHAR(30) ,
PRIMARY KEY (n°E , nomC ) ,
FOREIGN KEY (n°E) REFERENCES Etudiant.n°E ,
FOREIGN KEY (nomC) REFERENCES Cours )
BD.5.33 BD.5.34

Vous aimerez peut-être aussi