Vous êtes sur la page 1sur 66

Conception des

Bases de Donnes

Chapitre 8
SQL
(Structured Query
Language)
2

LDD

Language de Dfinition des Donnes

(1/29)

Permet la dfinition et la mise jour du schma


relationnel de la base de donnes (mode
administration).
Il est compos des ordres suivants :

CREATE TABLE
DROP TABLE
ALTER TABLE
CREATE INDEX
DROP INDEX
CREATE VIEW
DROP VIEW

LDD

(2/29)

Cration des tables

Syntaxe simple :
CREATE TABLE nom_table (
nom_colonne_1 type_colonne_1,
nom_colonne_2 type_colonne_2,

nom_colonne_n type_colonne_n
);
NB: lemploi des majuscules et minuscules
est indiffrent sauf pour le nom des tables. 4

LDD

(3/29)

Cration des tables


Les principaux types de donnes utilisables :

Char(n) Chane de caractres de longueur fixe = n (n=255)


Varchar2(n) Chane de caractres de longueur variable
Number Entier ou rel
Number (p) Entier (dau plus p chiffres)
Number(p,d) Dcimal sur p positions en tout

(sparateur dcimal Compris), dont d chiffres dcimaux


Date le format dpend de la configuration d'Oracle. Le plus
souvent c'est jj/mm/aaaa
Long Chane longue ; restriction : par table, pas plus dune
colonne de type long
5

LDD

(4/29)

Cration des tables

Autres proprits
NOT NULL : Indique qu'on est oblig de
mettre une valeur dans la colonne
UNIQUE : Indique que les valeurs dans la
colonne doivent tre toutes diffrentes
(comme pour les cls, sauf que ce n'est pas
une cl)
DEFAULT : Permet d'indiquer une valeur
par dfaut la cration d'une nouvelle ligne
6

LDD

(5/29)

Cration des tables

Exemple1:
CREATE TABLE employe
( empno NUMBER(8) NOT NULL,
nom VARCHAR2(20),
fonction VARCHAR2 (10),
sal NUMBER (8,2),
code_service CHAR(3),
date_embauche DATE ) ;

LDD

(6/29)

Cration des tables

Exemple2:
CREATE TABLE compte
( num_cpte NUMBER(11) NOT NULL,
type_cpt VARCHAR2(5) DEFAULT "chque",
solde NUMBER(10, 2) DEFAULT 0, );

LDD

(7/29)

Cration des tables


Les contraintes dintgrit (1/4)
Une contrainte d'intgrit est une rgle qui
permet d'assurer la validit (cohrence) des
donnes stockes dans une base.
Le SGBD contrle les contraintes d'intgrit
chaque modification dans les tables (saisies,
modification ou suppression).
Les contraintes de colonne s'crivent tout
simplement aprs la colonne laquelle elles
se rapportent.
9

LDD

(8/29)

Cration des tables


Les contraintes dintgrit (2/4)
Attention, on ne met pas de virgule entre la
dfinition de la colonne et celle de la contrainte.
Les diffrentes contraintes que l'on peut dfinir
sont :
non nullit (obligation) : NOT NULL La
colonne ne peut pas contenir de valeurs NULL.
unicit : UNIQUE Toutes les valeurs de la
(des) colonne(s) doivent tre diffrentes ou
NULL
10

LDD

(9/29)

Cration des tables

Les contraintes dintgrit (3/4)


cl primaire : PRIMARY KEY Chaque ligne de la
table doit avoir une valeur diffrente pour la ou les
colonnes qui font partie de la cl primaire. Les
valeurs NULL sont rejetes.
primary key = unique + not null
valeur par dfaut : DEFAULT : Permet de spcifier
une valeur par dfaut la colonne (dans le cas o
aucune valeur n'est explicitement donne)
11

LDD

(10/29)

Cration des tables

Les contraintes dintgrit (4/4)


intgrit de domaine : CHECK : Permet
de spcifier les valeurs acceptables pour
une colonne.
intgrit rfrentielle (cl trangre) :
FOREIGN KEY Cette colonne fait
rfrence une colonne cl d'une autre
table.
12

LDD

(11/29)

Cration des tables


Exemple de contrainte dobligation NOT NULL
Cette contrainte permet de rendre obligatoire la
saisie d'une colonne.

CREATE TABLE PERSONNE


(NomPers Varchar2(30) NOT NULL,
PrnomPers Varchar2(30) );
Il faut obligatoirement que le nom ait une
valeur.
13

LDD

(12/29)

Cration des tables

Exemple de Contrainte d'unicit : UNIQUE


Cette contrainte permet de contrler que chaque ligne a
une valeur unique pour la colonne ou l'ensemble de
colonnes uniques (pas de doublons)
Sur une seule colonne
CREATE TABLE PERSONNE
(
Tlphone CHAR(10) UNIQUE
);
14

LDD

(13/29)

Cration des tables


Sur plusieurs colonnes
CREATE TABLE PERSONNE
( NomPers Varchar2(30) NOT NULL,
PrnomPers Varchar2(30),
UNIQUE (NomPers, PrnomPers) );
Une telle contrainte indique qu'on ne pourra pas
avoir deux personnes ayant le mme nom et le
mme prnom.

15

LDD

(14/29)

Cration des tables


Exemple de Contrainte de cl primaire (1/3)
La contrainte de cl primaire permet d'indiquer que la ou
les colonnes sont uniques et ne peuvent pas avoir de
valeur nulle. On peut dire que :
Si la table possde une cl compose d'une seule
colonne, alors il est possible de l'indiquer juste aprs la
colonne cl.

CREATE TABLE PERSONNE


(idPers PRIMARY KEY, );
16

LDD

(15/29)

Cration des tables


Exemple de Contrainte de cl primaire (2/3)
Si la table a une cl compose de plusieurs colonnes,
alors il est impossible d'indiquer PRIMARY KEY au
niveau des colonnes.
CREATE TABLE PERSONNE
(NomPers Varchar2(30) PRIMARY KEY,
PrnomPers Varchar2(30) PRIMARY KEY, );

17

LDD

(16/29)

Cration des tables

Exemple de Contrainte de cl primaire (3/3)


On doit dclarer la cl part, aprs la
dclaration des colonnes.
CREATE TABLE PERSONNE
(NomPers Varchar2(30),
PrnomPers Varchar2(30),
PRIMARY KEY (NomPers, PrnomPers) );
18

LDD

(17/29)

Cration des tables

Exemple de contrainte DEFAULT


CREATE TABLE PERSONNE
(idPers PRIMARY KEY,
NomPers Varchar2(30) NOT NULL,
PrnomPers Varchar2(30) DEFAULT 'prnom
inconnu',
DateNaiss Date DEFAULT CURRENT DATE);
Ainsi, si on insre la personne 100, Ben Amor, alors les
valeurs de ses champs seront : 100, Ben Amor', 'prnom
inconnu', 10/12/11'
19

LDD

(18/29)

Cration des tables


Exemple de Contrainte de domaine : CHECK (1/2)
La dfinition des types de donnes pour chaque
colonne dfinit dj un domaine pour les valeurs.
On peut encore restreindre les domaines grce
la clause CHECK.
Attention, cette contrainte est trs "coteuse" en
temps.
Syntaxe : aprs le mot cl CHECK, on indique
entre parenthses le critre vrifier.
20

LDD

(19/29)

Cration des tables


Exemple de Contrainte de domaine : CHECK (1/2)
CREATE TABLE personne
( idpers Number PRIMARY KEY,
NomPers Varchar2(30) NOT NULL,
PrenomPers Varchar2(30) DEFAULT 'prnom inconnu',
age Number CHECK (age >= 0 AND age < 130),
etat_civil Varchar2(20) CHECK (etat_civil IN ('mari(e)',
clibataire', 'veuf(ve)', 'divorc(e)') );

21

LDD

(20/29)

Cration des tables


REMARQUES

Il est possible de donner un nom chaque


contrainte (sinon le systme en donne un
par dfaut).
Il suffit de faire prcder la contrainte par le
mot-cl CONSTRAINT suivi de son nom.

22

LDD

(21/29)

Cration des tables

Exemple
CREATE TABLE PERSONNE
( idpers Number CONSTRAINT cl_primaire PRIMARY
KEY, nom Varchar2(30) CONSTRAINT nom_existant
NOT NULL, prenom Varchar2(30) CONSTRAINT
prnom_par_dfaut DEFAULT 'prnom inconnu',
age Number CONSTRAINT verify_age
CHECK (age >= 0 AND age < 130),
etat_civil Varchar2(20) CONSTRAINT
domaine_tat_civil CHECK (etat_civil IN ('mari(e)',
clibataire', 'veuf(ve)', 'divorc(e)'));
23

LDD

(22/29)

Cration des tables


Exemple de contrainte dIntgrit rfrentielle :
REFERENCES (1/3)
L'intgrit rfrentielle permet de vrifier la cohrence
des liens entre tables, lors de l'ajout, de la
suppression et de la modification de lignes.
Elle est utilise lorsqu'on a une cl trangre.
Elle permet d'assurer que toute valeur de cl
trangre correspond bien une valeur de cl
primaire de la table lie.

Soit le modle relationnel suivant :

CLIENT (id_client, Nom_client, )


FACTURE (code_fact, #id_client, )

24

LDD

(23/29)

Cration des tables


Exemple de contrainte dIntgrit rfrentielle :
REFERENCES (2/3)
Traduction en SQL :
CREATE TABLE CLIENT
(id_client Number PRIMARY KEY,
Nom_client Varchar2(30) NOT NULL, );
CREATE TABLE FACTURE
(code_fact Number PRIMARY KEY,
id_client Number REFERENCES CLIENT
(id_client) );

25

LDD

(24/29)

Cration des tables


Exemple de contrainte dIntgrit rfrentielle :
REFERENCES (3/3)
On indique le mot cl REFERENCES aprs la cl
trangre, puis le nom de la table qui est en relation
suivi entre parenthse de la cl primaire de cette
table rfrence.

26

LDD

(25/29)

Cration des tables


L'application de l'intgrit rfrentielle implique
plusieurs choses :
on ne peut pas ajouter une facture avec un id_client qui n'existe
pas dans la table client (sinon un message d'erreur apparat). Il
faut d'abord crer le client avant de crer sa facture.
on ne peut pas supprimer un client s'il existe des factures qui lui
correspondent. Il faut d'abord supprimer toutes les factures qui le
concernent avant de pouvoir le supprimer
on ne peut pas modifier l'id_client dans la table client s'il existe
des factures qui le concernent.
On peut modifier l'id_client de facture seulement si on choisit un
id_client qui existe dans la table client.

Cela revient vrifier que toutes les factures


correspondent toujours un client qui existe.

27

LDD

(26/29)

Modification des tables

Ajout dune ou plusieurs colonnes


ALTER TABLE nom_table
ADD (nom_colonne type_colonne);
On peut ajouter plusieurs colonnes en les
sparant par des virgules dans les parenthses
du ADD
Exemple:

ALTER TABLE service


ADD (budget number(6) ) ;

28

LDD

(27/29)

Modification des tables

Modification dun type ou de toute autre


proprit d'une colonne
ALTER TABLE nom_table
MODIFY (nom_colonne
nouveau_type_et/ou_nouvelle_proprit);

Exemple:

ALTER TABLE employe


MODIFY (sal number(10,2), fonction
varchar2(30) ) ;

29

LDD

(28/29)

Renommage des tables

RENAME TABLE nom_table TO


nouveau_nom_table;

Exemple :
RENAME employe to salarie;

30

LDD

(29/29)

Suppression des tables

DROP TABLE nom_table;


Exemple
DROP table employe ;
DROP table salarie ;

31

LMD

Language de Manipulation des Donnes (1/9)

Insertion de lignes (INSERT INTO)


Syntaxe :

Premire forme :
On indique explicitement le nom des colonnes qu'on
veut valoriser, et on indique les valeurs dans le mme
ordre.
INSERT INTO nom_table (nom_colonne1, nom_colonne2, )
VALUES(valeur_colonne1, valeur_colonne2, );

32

LMD

(2/9)

Insertion de lignes (INSERT INTO)


Exemple
INSERT INTO employe(NumEmp, NomEmp, sal, fonction,
code_service)
VALUES(12, 'Dupont', 1800, 'comptable', 2);

Remarque!! On nest pas oblig de respecter l'ordre


initial des colonnes, ni de toutes les indiquer. En effet
les colonnes qui ont une valeur par dfaut ou qui
peuvent avoir une valeur nulle, si elles n'apparaissent
pas, sont mises soit NULL, soit leur valeur par
dfaut.
33

LMD

(3/9)

Insertion de lignes (INSERT INTO)


Deuxime forme : On n'indique pas les noms de
colonnes. Mais alors il faut absolument respecter l'ordre
dans lequel elles ont t cres et les valoriser toutes
(ou crire explicitement NULL)

INSERT INTO nom_table


VALUES(valeur_colonne_1, valeur_colonne_2,)

Exemple :
INSERT INTO employe VALUES(12, 'Dupont',
comptable', 1800, 2, NULL)
34

LMD

(4/9)

Suppression de lignes (DELETE FROM)


DELETE permet de supprimer une ou plusieurs lignes, qui
vrifie(nt) une condition.
Syntaxe
DELETE FROM nom_table
WHERE condition(s);
Exemple 1 : Suppression de tous les comptables du service 3
DELETE FROM employe
WHERE code_service = 3
AND function = 'comptable';
Exemple 2 : Suppression de l'employ numro 10
DELETE FROM employe
WHERE NumEmp = 10;
35

LMD

(5/9)

Modification de lignes (UPDATE SET)


Permet de modifier la valeur d'une colonne pour
une ou plusieurs lignes en particulier (qui
vrifie(nt) un critre)
Syntaxe
UPDATE nom_table
SET nom_colonne = valeur
WHERE condition(s);
Exemple : Augmentation de 10% de tous les informaticiens
UPDATE employe
SET sal = sal * 1.1
WHERE function = 'informaticien'; 36

LMD

(6/9)

Modification de lignes (UPDATE SET)

Pour modifier la valeur d'une colonne de la


mme manire pour toutes les lignes, il suffit
de ne pas indiquer de condition.
Exemple : augmenter tous les employs de1%
UPDATE employe
SET sal = sal * 1.01;
37

LMD

(7/9)

Modification de lignes (UPDATE SET)

On peut aussi modifier plusieurs


colonnes en mme temps, en sparant
les affectations par une virgule
UPDATE SET nom_colonne_1 =
valeur_1, nom_colonne_2 = valeur_2,

Exemple :
UPDATE employe SET NumDept=1,
38
sal=2000 WHERE code_service=13;

LMD

(8/9)

Modification de lignes (UPDATE SET)


On peut utiliser le rsultat d'une requte pour affecter de
nouvelles valeurs
UPDATE nom_table
SET (colonne [, colonne ] ) = ( Requte )
[ WHERE condition ];
Dans cette deuxime forme, les parenthses (clause
SET) sont inutiles si une seule colonne est cite ;

39

LMD

(9/9)

Modification de lignes (UPDATE SET)


le nombre de colonnes retournes par la requte
doit tre gal au nombre de colonnes
mentionnes dans SET.
La requte ne doit renvoyer quune seule ligne.
Exemple :
UPDATE emp SET (job, sal) = (SELECT job, sal
FROM emp
WHERE empno=1);

40

LID

Language dinterrogation des Donnes (1/19)

Projection (SELECTFROM)

Syntaxe
SELECT [DISTINCT]
(<nomattribut1>, [<nomattribut2,] ) | *

FROM <nom de table> ;


La clause DISTINCT permet dliminer les
doublons : si dans le rsultat plusieurs lignes
sont identiques, une seule sera conserve.
Le symbole * permet dobtenir tous les attributs
sans avoir tous les citer.
41

LID

(2/19)

Projection (SELECTFROM)
Exemple1 : Liste des numros et noms
demploys
SELECT NomEmp, Numemp FROM emp ;
Exemple2 : Liste de tous les employs
SELECT * FROM emp ;
Exemple3 : Liste des fonctions occupes dans
lentreprise
SELECT job FROM emp ;

42

LID

(3/19)

Projection (SELECTFROM)
Remarque : la requte renvoie plusieurs
lignes identiques.
Liste des fonctions occupes dans
lentreprise (avec suppression des lignes
identiques)
SELECT distinct job FROM emp ;

43

LID

(4/19)

Projection (SELECTFROM)
La clause ORDER BY
Permet de trier les rsultats suivant diffrentes
expressions (souvent des noms de colonnes) par ordre
croissant (ASC) ou dcroissant (DESC).
Loption ASC est prise par dfaut pour chacune des
expressions cites.
Exemple : Liste des employs par salaires dcroissants

SELECT NomEmp, Sal


FROM emp
ORDER BY Sal DESC;
44

LID

(5/19)

Slection/Restriction (WHERE)

Syntaxe
SELECT [DISTINCT]
(<nomattribut1>, [<nomattribut2,] ) | *

FROM <noms des tables>


WHERE <condition de recherche>
[ AND <condition de recherche> ];
Une condition de recherche est de la forme :
argument1 oprateur argument2
45

LID

(6/19)

Slection/Restriction (WHERE)
Exemple1 : Liste des employs appartenant au
dpartement 20
SELECT NomEmp, NumEmp FROM emp
WHERE deptno = 20 ;
Exemple2 : Liste des employs occupant la
fonction de vendeur ou analyste
SELECT NomEmp, NumEmp FROM emp
WHERE job IN ( vendeur, analyste) ;
46

LID

(7/19)

Slection/Restriction (WHERE)
Exemple3 : Liste des employs
embauchs au mois de septembre 2010
SELECT NomEmp, NumEmp, DatEmb
FROM emp
WHERE DatEmb BETWEEN 01/09/10
AND 30/09/10 ;

47

LID

(8/19)

Slection/Restriction (WHERE)
Exemple 4 :Liste des employs dont le salaire est
compris entre 2000 et 3000
SELECT * FROM emp
WHERE sal between 2000 AND 3000 ;
Exemple 5 : Liste des employs dont le nom
commence par un J
SELECT * FROM emp
WHERE NomEmp LIKE "J%";
48

LID

(9/19)

Jointure

Syntaxe
SELECT [DISTINCT]
(<nomattribut1>, [<nomattribut2,] ) | *
FROM <noms des tables>
WHERE <condition de jointure>
[ AND <condition de recherche> ];

49

LID

(10/19)

Jointure

Exemple : Liste des employs ainsi que le


nom de leur dpartement
SELECT NomEmp, NomDept
FROM emp, dept
WHERE emp.NumDept = dept.NumDept;

50

LID

(11/19)

Jointure

Remarque: Il est possible dutiliser un


alias pour renommer les tables.
Exemple :
SELECT NomEmp, NomDept
FROM emp E, dept D
WHERE E.NumDept = D.NumDept;

51

LID

(12/19)

Requtes imbriques (Sous-requtes)

Une sous-requte ou requte imbrique


est une requte incorpore dans la clause
WHERE ou HAVING dune autre requte
permettant de limiter les donnes
retournes.
Le rsultat retourn par la requte
imbrique est utilis dans la condition de
slection de la requte principale.
52

LID

(13/19)

Requtes imbriques (Sous-requtes)


Syntaxe:
SELECT colonne FROM table1
WHERE colonne oprateur (SELECT colonne
FROM table 2
WHERE condition);

53

LID

(14/19)

Requtes imbriques (Sous-requtes)


Remarque1 : Loprateur peut tre :
- de comparaison (=,>,<,) lorsque le rsultat de la
sous-requte est une valeur unique
- dappartenance (IN, NOT IN, EXISTS, ) lorsque
le rsultat de la sous-requte est un ensemble
Remarque2 : Les parenthses sont obligatoires
Remarque3 : La sous-requte doit dclarer le
mme nombre de colonnes que dans la clause
WHERE
54

LID

(15/19)

Requtes imbriques (Sous-requtes)


Utilisation de loprateur EXISTS/NOT EXISTS
Cet oprateur permet de chercher la prsence
dune ligne rpondant certains critres dans
une table spcifique. Il vrifie si une sousrequte retourne au moins une ligne

55

LID

(16/19)

Requtes imbriques (Sous-requtes)


Le prdicat EXISTS permet de tester l'existence ou
l'absence de donnes dans la sous-requte.
Si la sous-requte renvoie au moins une ligne, le
prdicat est vrai. Dans le cas contraire le prdicat
valeur fausse.
La condition EXISTS est vraie si la requte imbrique nest
pas vide.

Exemple : Donner les noms des services ayant au


moins une personne embauche aprs le 01/01/11.
SELECT NomServ FROM Service
WHERE EXISTS (SELECT * FROM Personne
WHERE Date_EmbP >01/01/11
56

LID

(17/19)

Requtes imbriques (Sous-requtes)

Loprateur NOT EXISTS permet


dobtenir la division de deux relations.
Exemple : Q8 TD

57

LID

(18/19)

Groupement (GROUP BY)

Linstruction
GROUP
BY
sert

rassembler tous les enregistrements qui


contiennent des donnes dans la ou les
colonnes spcifies et va permettre
lutilisation des fonctions dagrgation sur
une ou plusieurs colonnes

58

LID

(19/ 19)

Groupement (GROUP BY)


Syntaxe :
SELECT col1, col2, , fct dagrgat (col n)
FROM nom_table
WHERE conditions avant groupement
GROUP BY col1, col2, , coln
HAVING conditions de groupement;

59

Les oprateurs ensemblistes

(1/7)

UNION

L'oprateur UNION combine le rsultat


de deux requtes SQL en liminant les
lignes retournes par les deux requtes
(doublons). UNION agit sur toutes les
colonnes.
L'oprateur UNION ALL retourne toutes
les lignes sans liminer les doublons.
60

Les oprateurs ensemblistes

(2/7)

UNION

Syntaxe
SELECT col1, col2 FROM table1
WHERE ...
UNION
SELECT col1, col2 FROM table2
WHERE ...

61

Les oprateurs ensemblistes

(3/7)

INTERSECT

L'oprateur INTERSECT retourne


uniquement le rsultat communs aux deux
requtes.
INTERSECT agit sur toutes les colonnes.
L'inversion des tables dans
une intersection ne change pas le rsultat.
62

Les oprateurs ensemblistes

(4/7)

INTERSECT

Syntaxe
SELECT col1, col2 FROM table1
WHERE ...
INTERSECT
SELECT col1, col2 FROM table2
WHERE ...

63

Les oprateurs ensemblistes

(5/7)

MINUS

L'oprateur MINUS retourne les lignes de


la premire requte qui ne se trouvent
pas dans la deuxime requte.
MINUS agit sur toutes les colonnes.
L'inversion des tables avec MINUS
change le rsultat.
64

Les oprateurs ensemblistes

(6/7)

MINUS

Syntaxe
SELECT col1, col2 FROM table1
WHERE ...
MINUS
SELECT col1, col2 FROM table2
WHERE ...

65

Les oprateurs ensemblistes

(7/7)

Deux rgles essentielles pour combiner


les ensembles de rsultats de deux
requtes :
Le nombre et l'ordre des colonnes doivent
tre identiques dans toutes les requtes.
Les types de donnes doivent tre
compatibles.

66