Vous êtes sur la page 1sur 134

LOG660 - Bases de données de haute performance

Cours 1 – Introduction au modèle relationnel

Hiver 2011
C. Desrosiers

Département de génie logiciel et des TI


Concepts de base

  Domaine : ensemble de valeurs


  Relation : ensemble de tuples
  SQL : multi-ensemble
colonne /
attribut

noClient nomClient noTéléphone


10 Luc Sansom (999)999-9999
ligne / 20 Dollard Tremblay (888)888-8888
tuple 30 Lin Bô (777)777-7777
table /
40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555 relation
60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 2


suite

  Deux facettes du concept de table


–  Schéma d'une table (table schema)
  définition de son type (intention)

  ex: Client(noClient, nomClient, noTéléphone)

–  Instance ou extension d'une table


  état de la table
  ~ variable qui contient un ensemble de lignes
  modifications d ’état
  Schéma relationnel
–  ensemble de schémas de tables

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 3


Instance de BD VentesPleinDeFoin
Table Co m m an d e Table Clie n t
noCommande dateCommande noClient noClient nomClient noTéléphone
1 01/06/2000 10 10 Luc Sansom (999)999-9999
2 02/06/2000 20 20 Dollard Tremblay (888)888-8888
3 02/06/2000 10 30 Lin Bô (777)777-7777
4 05/07/2000 10 40 Jean Leconte (666)666-6666
5 09/07/2000 30 50 Hafedh Alaoui (555)555-5555
6 09/07/2000 20 60 Marie Leconte (666)666-6666
7 15/07/2000 40 70 Simon Lecoq (444)444-4419
8 15/07/2000 40 80 Dollard Tremblay (333)333-3333
Table Dé tailLivrais o n Table Liv rais o n
Table Lig n e Co m m and e
noLivraison noCommande noArticle quantitéLivrée noLivraison dateLivraison
noCommande noArticle quantité
100 1 10 7 100 3/06/2000
1 10 10
100 1 70 5 101 4/06/2000
1 70 5
101 1 10 3 102 4/06/2000
1 90 1
102 2 40 2 103 5/06/2000
2 40 2
102 2 95 1 104 7/07/2000
2 95 3
100 3 20 1 105 9/07/2000
3 20 1
4 40 1 103 1 90 1
4 50 1 104 4 40 1
5 70 3 105 5 70 2
5 10 5 Table Artic le
5 20 5 noArticle description prixUnitaire quantitéEnStock
6 10 5 10 Cèdre en boule 10.99 10
6 40 1 20 Sapin 12.99 10
7 50 1 40 Epinette bleue 25.99 10
7 95 2 50 Chêne 22.99 10
8 20 3 60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
Département de génie 95 Génévrier
logiciel et des TI 15.99 10
© R. Godin, C. Desrosiers - Hiver 2011 4
Contrainte de domaine et de valeur non
nulle

  T(A1 : D1, A2 : D2, …, An : Dn)


–  Di : domaine de Ai
  Valeur nulle
–  Comportement particulier
–  Valeur inconnue
–  Valeur non applicable
–  ...

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 5


Clé primaire et contrainte d'entité

  Clé unique (unique key)


–  ou superclé (superkey )
–  identifiant
  Clé candidate (candidate key)
–  clé unique minimale
  Clé primaire (primary key)
–  sert de mécanisme de référence aux lignes de la table
  Contrainte d'entité (entity constraint)
‒  ∃ clé primaire
–  non nulle

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 6


Contrainte d'intégrité référentielle

  Clé étrangère non nulle → clé primaire

Clé étrangère Clé primaire

Table Commande Table Client


noCommande dateCommande noClient noClient nomClient noTéléphone
1 01/06/2000 10 10 Luc Sansom (999)999-9999
2 02/06/2000 20 20 Dollard Tremblay (888)888-8888
3 02/06/2000 10 30 Lin Bô (777)777-7777
4 05/07/2000 10 40 Jean Leconte (666)666-6666
5 09/07/2000 30 50 Hafedh Alaoui (555)555-5555
6 09/07/2000 20 60 Marie Leconte (666)666-6666
7 15/07/2000 40 70 Simon Lecoq (444)444-4419
8 15/07/2000 40 80 Dollard Tremblay (333)333-3333

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 7


Algèbre relationnelle

  Opérations de manipulation de données


  Entrée
–  une table : opération unaire
–  deux tables : opération binaire

  Sortie
–  une table
–  permet la composition
  Origine de SQL (« SQUARE de IBM, San Jose »)
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 8
Sélection (σ)

Table Artic le
noArticle description prixUnitaire quantitéEnStock
10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10

σ prixUnitaire < 20.00 ET noArticle > 30 (Article)

noArticle description prixUnitaire quantitéEnStock


60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
95 Génévrier 15.99 10

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 9


Projection (π)

Table Co m m an d e
noCommande dateCommande noClient
1 01/06/2000 10
2 02/06/2000 20
3 02/06/2000 10
4 05/07/2000 10
5 09/07/2000 30
6 09/07/2000 20
7 15/07/2000 40
8 15/07/2000 40

π noClient, dateCommande (Commande)


noClient dateCommande
10 01/06/2000
20 02/06/2000
10 02/06/2000
10 05/07/2000
30 09/07/2000
20 09/07/2000
40 15/07/2000

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 10


Expressions complexes

Table Co m m an d e
noCommande dateCommande noClient
1 01/06/2000 10
2 02/06/2000 20
3 02/06/2000 10
4 05/07/2000 10
5 09/07/2000 30
6 09/07/2000 20
7 15/07/2000 40
8 15/07/2000 40

σ dateCommande > 05/07/2000 Commande


noCommande dateCommande noClient
5 09/07/2000 30
6 09/07/2000 20
7 15/07/2000 40
8 15/07/2000 40

π noClient, dateCommande (σ dateCommande > 05/07/2000 Commande)


noClient dateCommande
30 09/07/2000
20 09/07/2000
40 15/07/2000

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 11


Produit cartésien (×)

Table Clie n t Table Co m m an d e


noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
20
30
Dollard Tremblay
Lin Bô
(888)888-8888
(777)777-7777
... 2
3
02/06/2000
02/06/2000
20
10
40 Jean Leconte (666)666-6666 4 05/07/2000 10
50 Hafedh Alaoui (555)555-5555 5 09/07/2000 30
60 Marie Leconte (666)666-6666 6 09/07/2000 20
70 Simon Lecoq (444)444-4419 7 15/07/2000 40
80 Dollard Tremblay (333)333-3333 8 15/07/2000 40

Client × Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 2 02/06/2000 20
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
10 Luc Sansom (999)999-9999 5 09/07/2000 30
10 Luc Sansom (999)999-9999 6 09/07/2000 20
10 Luc Sansom (999)999-9999 7 15/07/2000 40
10 Luc Sansom (999)999-9999 8 15/07/2000 40
20 Dollard Tremblay (888)888-8888 1 01/06/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
20 Dollard Tremblay (888)888-8888 3 02/06/2000 10
… … … … … …
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 12
Exemple. Produire les informations au sujet des Clients
et de leurs Commandes
Client × Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 2 02/06/2000 20
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
10 Luc Sansom (999)999-9999 5 09/07/2000 30
10 Luc Sansom (999)999-9999 6 09/07/2000 20
10 Luc Sansom (999)999-9999 7 15/07/2000 40

clé primaire = clé étrangère


10
20
Luc Sansom
Dollard Tremblay
(999)999-9999
(888)888-8888
8
1
15/07/2000
01/06/2000
40
10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
20 Dollard Tremblay (888)888-8888 3 02/06/2000 10
… … … … … …

σ Client.noClient = Commande.noClient (Client × Commande)


Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
20 Dollard Tremblay (888)888-8888 6 09/07/2000 20
30 Lin Bô (777)777-7777 5 09/07/2000 30
40 Jean Leconte (666)666-6666 7 15/07/2000 40
40 Jean Leconte (666)666-6666 8 15/07/2000 40

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 13


Exemple. Produire les informations au sujet des Clients
et de leurs Commandes
σ Client.noClient = Commande.noClient (Client × Commande)
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
20 Dollard Tremblay (888)888-8888 6 09/07/2000 20
30 Ye San Le Sou (777)777-7777 5 09/07/2000 30
40 Jean Leconte (666)666-6666 7 15/07/2000 40
40 Jean Leconte (666)666-6666 8 15/07/2000 40

Colonne redondante
π Client.noClient, nomClient, noTéléphone, noCommande, dateCommande (…))
Client.noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/06/2000
10 Luc Sansom (999)999-9999 3 02/06/2000
10 Luc Sansom (999)999-9999 4 05/07/2000
20 Dollard Tremblay (888)888-8888 2 02/06/2000
20 Dollard Tremblay (888)888-8888 6 09/07/2000
30 Ye San Le Sou (777)777-7777 5 09/07/2000
40 Jean Leconte (666)666-6666 7 15/07/2000
40 Jean Leconte (666)666-6666 8 15/07/2000

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 14


Jointure naturelle ()
Colonnes communes : colonnes de jointure ou clé de jointure
Table Clie n t Table Co m m an d e
noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
30 Lin Bô (777)777-7777 3 02/06/2000 10
40 Jean Leconte (666)666-6666 4 05/07/2000 10
50 Hafedh Alaoui (555)555-5555 5 09/07/2000 30
60 Marie Leconte (666)666-6666 6 09/07/2000 20
70 Simon Lecoq (444)444-4419 7 15/07/2000 40
80 Dollard Tremblay (333)333-3333 8 15/07/2000 40

Schéma : union des


Client  Commande
colonnes
noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/06/2000
10 Luc Sansom (999)999-9999 3 02/06/2000
10 Luc Sansom (999)999-9999 4 05/07/2000
20 Dollard Tremblay (888)888-8888 2 02/06/2000
20 Dollard Tremblay (888)888-8888 6 09/07/2000
30 Lin Bô (777)777-7777 5 09/07/2000
40 Jean Leconte (666)666-6666 7 15/07/2000
40 Jean Leconte (666)666-6666 8 15/07/2000
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 15
Sélectionner les nomClient qui ont commandé
au moins un plant d'herbe à puce

<<Table>>
<<Table>>
Article
Client
{Clé prim aire : noArticle}
{Clé prim aire : noClient}
noArticle : INTEGER
noCl ien t : INT EGER
des cription : VARCHAR
nom Client : VARCHAR
prixUnitaire : DECIMAL
noTéléphone : VARCHAR
quantitéEnStock : INTEGER

<<Table>> <<Table>>
Com m ande LigneCom m ande
{Clé pr im aire : no Co m m ande} {Cl é pri maire : no Co mm ande, noArticl e}
noComm ande : INTEGER noComm ande : INTEGER
date Co mm ande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INT EGER

<<Table>>
<<Table>> DétailLivrais on
Livrais on {Clé prim aire : noLivrais on, noCom m ande, noArticle}
{Clé prim aire : noLivrais on} noLivrai son : INTEGER
noLivrais on : INTEGER noCom m a nde : INTEGER
dateLivrais on : DATE noArticle : INT EGER
quantitéLivrée : INTEGER

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 16


Sélectionner les nomClient qui ont commandé
au moins un plant d'herbe à puce
<<Table>>
<<Table>>
Article
Client
{Clé prim aire : noArticle}
{Clé prim aire : noClient}
noArticle : INTEGER
noCl ien t : INT EGER
des cription : VARCHAR
nom Client : VARCHAR
prixUnitaire : DECIMAL
noTéléphone : VARCHAR
quantitéEnStock : INTEGER

<<Table>> <<Table>>
Com m ande LigneCom m ande
{Clé pr im aire : no Co m m ande} {Cl é pri maire : no Co mm ande, noArticl e}
noComm ande : INTEGER noComm ande : INTEGER
date Co mm ande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INT EGER

<<Table>>
<<Table>> DétailLivrais on
Livrais on {Clé prim aire : noLivrais on, noCom m ande, noArticle}
{Clé prim aire : noLivrais on} noLivrai son : INTEGER
noLivrais on : INTEGER noCom m a nde : INTEGER
dateLivrais on : DATE noArticle : INT EGER
quantitéLivrée : INTEGER

π nomClient (σ description = “Herbe à puce ”

(Client  Commande  LigneCommande  Article))


Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 17
Formulations équivalentes

  π nomClient (σ description = “Herbe à puce ” (Client


Commande  LigneCommande  Article))
  π nomClient (σ description = “Herbe à puce ” (((Client 
Commande)  LigneCommande)  Article))
  π nomClient (σ description = “Herbe à puce ” (((Client 
LigneCommande)  Commande)  Article))
  …

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 18


Quelques règles d ’équivalence
•  Eclatement d'une sélection conjonctive (SE)
–  σ e1 ET e2 (T) = σ e1 (σ e2 (T))
•  Commutativité de la sélection (SC)
–  σ e1 (σ e2 (T)) = σ e2 (σ e1 (T))
•  Elimination des projections en cascades (PE)
–  π liste1 (π liste2 (T)) = π liste1 (T)
•  Commutativité de la jointure (JC)
–  T1  T2 = T1  T2
•  Associativité de la jointure (JA)
–  T1  (T2  T3) = (T1  T2)  T3

  Voir évaluation des requêtes

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 19


Représentation sous forme d ’arbre de
l ’expression algébrique
  π nomClient (σ description = “Herbe à puce ” (((Client  Commande)  LigneCommande)  Article))

π nomClient

σ description = «Herbe à puce»

Article

LigneCommande

Client Commande

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 20


Cas d ’une clé de jointure composée

Table Lig n e Co m m and e Table Dé tailLivrais o n


noCommande noArticle quantité noLivraison noCommande noArticle quantitéLivrée
1 10 10 100 1 10 7
1 70 5 100 1 70 5
1 90 1 101 1 10 3
2 40 2 102 2 40 2
2 95 3 102 2 95 1
3 20 1 100 3 20 1
4 40 1 103 1 90 1
4 50 1 104 4 40 1
5 70 3 105 5 70 2
5 10 5
5
6
20
10
5
5
LigneCommande  DétailLivraison
6 40 1
7 50 1 noCommande noArticle quantité noLivraison quantitéLivrée
7 95 2 1 10 10 100 7
8 20 3 1 10 10 101 3
1 70 5 100 5
1 90 1 103 1
2 40 2 102 2
2 95 3 102 1
3 20 1 100 1
4 40 1 104 1
5 70 3 105 2

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 21


Opération renommer (ρ)
  Quels sont les Clients qui ont le même numéro de téléphone?
Table Clie n t Table Clie n t2
noClient nomClient noTéléphone noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999 10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777 30 Lin Bô (777)777-7777
40
50
Jean Leconte
Hafedh Alaoui
(666)666-6666
(555)555-5555
ρ Client2 (Client) 40
50
Jean Leconte
Hafedh Alaoui
(666)666-6666
(555)555-5555
60 Marie Leconte (666)666-6666 60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419 70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333 80 Dollard Tremblay (333)333-3333

π Client.noClient, Client2.noClient, (σ Client.noTéléphone = Client2.noTéléphone (Client × ρ Client2 (Client)))


Client. noClient Client2.noClient
40 60
60 40
10 10
20 20
30 30
40 40
50 50
60 60
70 70
80 80
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 22
Jointure-θ
Table Clie n t Table Co m m an d e altérée
noClient nomClient noTéléphone noCommande dateCommande numéroClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
30 Lin Bô (777)777-7777 3 02/06/2000 10
40 Jean Leconte (666)666-6666 4 05/07/2000 10
50 Hafedh Alaoui (555)555-5555 5 09/07/2000 30
60 Marie Leconte (666)666-6666 6 09/07/2000 20
70 Simon Lecoq (444)444-4419 7 15/07/2000 40
80 Dollard Tremblay (333)333-3333 8 15/07/2000 40

Client  noClient = numéroClient Commande altérée =


σ noClient = numéroClient (Client × Commande altérée)
noClient nomClient noTéléphone noCommande dateCommande numéroClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
20 Dollard Tremblay (888)888-8888 6 09/07/2000 20
30 Ye San Le Sou (777)777-7777 5 09/07/2000 30
40 Jean Leconte (666)666-6666 7 15/07/2000 40
40 Jean Leconte (666)666-6666 8 15/07/2000 40

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 23


Jointure externe
  Inclure les « célibataires »
•  La jointure externe à gauche
•  T1 = T2 (célibataires de T1 )

•  La jointure externe à droite


•  T1 = T2

•  La jointure externe pleine


•  T1 == T2

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 24


Produire les informations au sujet des Clients et de leurs Commandes
incluant les informations sur les Clients qui n’ont pas placé de
Commande
Table Clie n t Table Co m m an d e
noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
30 Lin Bô (777)777-7777 3 02/06/2000 10
40 Jean Leconte (666)666-6666 4 05/07/2000 10
50 Hafedh Alaoui (555)555-5555 5 09/07/2000 30
60 Marie Leconte (666)666-6666 6 09/07/2000 20
70 Simon Lecoq (444)444-4419 7 15/07/2000 40
80 Dollard Tremblay (333)333-3333 8 15/07/2000 40

Client = Commande
noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/06/2000
10 Luc Sansom (999)999-9999 3 02/06/2000
10 Luc Sansom (999)999-9999 4 05/07/2000
20 Dollard Tremblay (888)888-8888 2 02/06/2000
20 Dollard Tremblay (888)888-8888 6 09/07/2000
30 Lin Bô (777)777-7777 5 09/07/2000
40 Jean Leconte (666)666-6666 7 15/07/2000
40 Jean Leconte (666)666-6666 8 15/07/2000
50 Hafedh Alaoui (555)555-5555 null null
60 Marie Leconte (666)666-6666 null null
70 Simon Lecoq (444)444-4419 null null
80 Dollard Tremblay (333)333-3333 null null

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 25


Semi-jointure ()

Table Clie n t Table Co m m an d e


noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
30 Lin Bô (777)777-7777 3 02/06/2000 10
40 Jean Leconte (666)666-6666 4 05/07/2000 10
50 Hafedh Alaoui (555)555-5555 5 09/07/2000 30
60 Marie Leconte (666)666-6666 6 09/07/2000 20
70 Simon Lecoq (444)444-4419 7 15/07/2000 40
80 Dollard Tremblay (333)333-3333 8 15/07/2000 40

Client Commande

noClient nomClient noTéléphone


10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 26


Opérations ensemblistes (∪,∩, -)

  Schémas compatibles
Table T 1 Table T 2
A B A B
1 1 2 2
2 2 3 3

T1 ∪ T2
A B T1 ∩ T2 T1 - T2 T2 – T1
1 1 A B A B A B
2 2 2 2 1 1 3 3
3 3

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 27


Ensemble minimal d'opérations de
l'algèbre relationnelle
  Sélection (σ)
  Projection (π)
  Produit cartésien (×)
  Union (∪)
  Différence (-)
  Renommage (ρ)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 28


LOG660 - Bases de données de haute
performance

Cours 1 – Le langage SQL

Hiver 2011
C. Desrosiers

Département de génie logiciel et des TI


Le langage SQL

  Structured
Query Language
  Norme établie pour SGBD relationnel
  Partie LDD (DDL)
–  Conceptuel : CREATE SCHEMA, TABLE,...
–  Externe : CREATE VIEW, GRANT,…
–  Interne : CREATE INDEX, CLUSTER,...
  Partie LMD (DML)
–  SELECT, INSERT, DELETE, UPDATE

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 30


Spécification du schéma relationnel
avec SQL (LDD SQL)

  Niveau conceptuel
–  Schéma des tables (TABLE)
  CREATE TABLE.
–  Domaines (DOMAIN)
  SQL2 intermédiaire : CREATE DOMAIN
–  Contraintes d'intégrité
  PRIMARY KEY, FOREIGN KEY, UNIQUE KEY,
CHECK, ASSERTION, TRIGGER

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 31


Spécification du schéma relationnel
avec SQL (suite)
  Niveau externe
–  Vues (VIEW)
  définie à partir d'autres tables (CREATE VIEW). Elle
apparaît à l'utilisateur comme une table normale alors
qu'elle est en réalité dérivée à partir d'autres tables
normales ou virtuelles.
–  Privilèges d'accès
  GRANT

  Niveau interne
–  non standardisé (e.g. CREATE INDEX)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 32


Environnement, catalogue, schéma et
utilisateur SQL

Environnement SQL

Catalogue c1

Schéma c1.s1
Table Table Schéma c1.s2
c1.s1.t1 c1.s1.t2
Table
View c1.s2.t1
c1.s1.v1

Catalogue c2

Schéma c2.s1

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 33


Utilisateur (user)

  Identificateur d ’utilisateur
–  authorizationID
–  non standardisé
  Mécanisme d ’authentification
–  e.g. mot de passe
  Utilisateur possède privilèges

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 34


Dialecte Oracle

  DATABASE ~ catalogue
–  une instance Oracle monte une DATABASE à la fois
  Nom du SCHEMA
–  = authorizationID du propriétaire
  CLUSTER Oracle
–  ≠ cluster de l ’environnement SQL2
–  = méthode d ’organisation de données par grappe

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 35


Création du schéma d'une table en SQL
(CREATE TABLE)

  Forme simple
CREATE TABLE Client
(noClient INTEGER,
nomClient VARCHAR(15),
noTéléphone VARCHAR(15)
)
  Transmise à l ’interprète du LDD
–  vérification
–  création de la table
  schéma stocké dans dictionnaire de données
  allocation des structures physiques
–  clause non standardisée pour organisation primaire

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 36


Syntaxe générale du CREATE TABLE
CREATE TABLE nomDeLaTable
(spécificationDeColonne,
[,spécificationDeColonne]...
[,spécificationDeContrainte]...)
  Syntaxe de spécificationDeColonne
nomColonne [type|domaine] [DEFAULT valeurDeDéfaut]
[NULL | NOT NULL] [UNIQUE | PRIMARY KEY]
[REFERENCES nomTable[listeColonnes]]
[[CONSTRAINT nomContrainte] CHECK (conditionSQL)]
  Syntaxe de spécificationDeContrainte
[CONSTRAINT nomContrainte]
{PRIMARY KEY listeColonnes|
FOREIGN KEY listeColonnes REFERENCES nomTable[listeColonnes]
[MATCH {PARTIAL|FULL}]
[ON DELETE {NO ACTION|CASCADE|SET NULL|SET DEFAULT}]
[ON UPDATE {NO ACTION|CASCADE|SET NULL|SET DEFAULT}]|
CHECK (conditionSQL)
}
[[NOT] DEFERRABLE INITIALLY {DEFERRED|IMMEDIATE}]

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 37


Exemple VentesPleinDeFoin
(script Oracle) CREATE TABLE Client
(noClient
nomClient
INTEGER
VARCHAR(20)
NOT NULL,
NOT NULL,
noTéléphone VARCHAR(15) NOT NULL,
PRIMARY KEY (noClient)
)

CREATE TABLE Article


(noArticle INTEGER NOT NULL,
description VARCHAR(20),
prixUnitaire DECIMAL(10,2) NOT NULL,
quantitéEnStock INTEGER DEFAULT 0 NOT NULL
CHECK (quantitéEnStock >= 0),
PRIMARY KEY (noArticle))
/
CREATE TABLE Commande
(noCommande INTEGER NOT NULL,
dateCommande DATE NOT NULL,
noClient INTEGER NOT NULL,
PRIMARY KEY (noCommande),
FOREIGN KEY (noClient) REFERENCES Client
)

CREATE TABLE LigneCommande


(noCommande INTEGER NOT NULL,
noArticle INTEGER NOT NULL,
quantité INTEGER NOT NULL
CHECK (quantité > 0),
PRIMARY KEY (noCommande, noArticle),
FOREIGN KEY (noCommande) REFERENCES Commande,
FOREIGN KEY (noArticle) REFERENCES Article
)

CREATE TABLE Livraison


(noLivraison INTEGER NOT NULL,
dateLivraison DATE NOT NULL,
PRIMARY KEY (noLivraison)
)

CREATE TABLE DétailLivraison


(noLivraison INTEGER NOT NULL,
noCommande INTEGER NOT NULL,
noArticle INTEGER NOT NULL,
quantitéLivrée INTEGER NOT NULL
CHECK (quantitéLivrée > 0),
PRIMARY KEY (noLivraison, noCommande, noArticle),
FOREIGN KEY (noLivraison) REFERENCES Livraison,

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 38


Dialecte Oracle
  NUMBER(p,[c])
–  numérique exact; p entre 1 et 38
–  c doit être entre -84 et +127 (défaut, c =0)
  valeur négative signifie un arrondissement.
  VARCHAR2(n) : n ≤ 4000
  RAW(n)
–  Binaire de taille n octets (n ≤ 2000).
  LONG(n)
–  Chaîne de caractères de taille variable (n ≤ 2G)
–  Maximum une colonne LONG par table
  LONG RAW(n)
–  Binaire de taille variable (n ≤ 2G).
–  Maximum une colonne de type LONG RAW par table

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 39


Dialecte Oracle (suite)

  DATE
–  ~TIMESTAMP SQL2
  Mécanisme d ’internationalisation
–  Paramètre de configuration NLS_LANG
  CHARACTER SET
  DATE_FORMAT
  ...
  ALTER SESSION
–  pour modifier
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY'
  LOB : taille max 4G
  BFILE : fichier externe
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 40
Suppression d’une table (DROP TABLE)

DROP TABLE nomTable [RESTRICT|CASCADE]


  RESTRICT
–  rejet si élément dépendant existe
  ex: FOREIGN KEY
  CASCADE
–  supprime élément dépendant

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 41


Modification du schéma de table
(ALTER TABLE)

  Syntaxe
ALTER TABLE nomTable
{ADD COLUMN spécificationColonne|
DROP COLUMN nomColonne [RESTRICT|CASCADE]|
ADD spécificationContrainte|
DROP nomContrainte [RESTRICT|CASCADE]|
ALTER nomColonne SET DEFAULT valeurDéfaut|
ALTER nomColonne DROP DEFAULT}

ALTER TABLE Client


ADD COLUMN age INTEGER CHECK(age >0)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 42


Requêtes SQL (SELECT)

  Syntaxe de requêteSQL
selectSQL |
(requêteSQL) {UNION|INTERSECT|EXCEPT} (requêteSQL)

  Syntaxe du selectSQL
SELECT {[ALL|DISTINCT] expression [AS nomColonne]
[,expression [AS nomColonne]]…}|*
FROM table [AS nomTable [(nomColonne[,nomColonne])]]]
[,table [AS nomTable [(nomColonne[,nomColonne])]]]]…
[WHERE conditionSQL]
[GROUP BY nomColonne [,nomColonne]…
[HAVING conditionSQL]
[ORDER BY nomColonne [ASC|DESC] [,nomColonne[ASC|DESC]]…]

  ...

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 43


Syntaxe de conditionSQL

{conditionSimple
(conditionSQL)|
NOT(conditionSQL)|
conditionSQL AND conditionSQL |
conditionSQL OR conditionSQL}

  Syntaxe (incomplète) de la conditionSimple :


{expression {=|<|>|<=|>=|<>} expression|
expression BETWEEN expression AND expression|
expression {IS NULL |IS NOT NULL}|
expression {IN |NOT IN} listeConstantes|
expression {LIKE |NOT LIKE} patron}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 44


Jointure naturelle avec SELECT-FROM-
WHERE
  Produire les informations au sujet des Clients et de leurs Commandes
SELECT Client.noClient, nomClient, noTéléphone, noCommande,
dateCommande
FROM Client, Commande
WHERE Client.noClient = Commande.noClient
Client.noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/06/2000
10 Luc Sansom (999)999-9999 3 02/06/2000
10 Luc Sansom (999)999-9999 4 05/07/2000
20 Dollar Tremblay (888)888-8888 2 02/06/2000
20 Dollar Tremblay (888)888-8888 6 09/07/2000
30 Lin Bô (777)777-7777 5 09/07/2000
40 Jean Leconte (666)666-6666 7 15/07/2000
40 Jean Leconte (666)666-6666 8 15/07/2000

π Client.noClient, nomClient, noTéléphone, noCommande, dateCommande


(σ Client.noCliente = Commande.noClient (Client × Commande))

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 45


Jointure avec JOIN (SQL2
intermédiaire)
  Produire les informations au sujet des Clients et de leurs Commandes

SELECT *
FROM Client NATURAL JOIN Commande {SQL2}

Client  Commande

Client NATURAL JOIN Commande {Illégal!}

  Jointure-θ (si noms de colonnes de jointure sont différents)

SELECT *
FROM Client JOIN Commande ON
Client.noClient = Commande.numéroCLient {SQL2}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 46


Définition d'un alias (clause AS)

  ~ renommer (ρ)
SELECT Client.noClient, nomClient, noTéléphone, noCommande,
dateCommande
FROM Client, Commande
WHERE Client.noClient = Commande.noClient

SELECT Cl.noClient, nomClient, noTéléphone, noCommande,


dateCommande
FROM Client AS Cl, Commande AS Co
WHERE Cl.noClient = Co.noClient

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 47


Auto-jointure

  Quels sont les Clients qui ont le même numéro de téléphone?

SELECT Client.noClient, Client2.noClient


FROM Client, Client AS Client2
WHERE Client.noTéléphone = Client2.noTéléphone

π Client.noClient, Client2.noClient, (σ Client.noTéléphone = Client2.noTéléphone (Client × ρ Client2 (Client)))

SELECT noClient, noClient2


FROM Client NATURAL JOIN {SQL2}
Client AS Client2(noClient2, nomClient2, noTéléphone)

π noClient, noClient2 (Client  ρ Client2(noClient2, nomClient2, noTéléphone) (Client))

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 48


Jointure externe (OUTER JOIN)

  Produire les informations au sujet des Clients et de leurs Commandes incluant


les informations sur les Clients qui n’ont pas placé de Commande

Client =  Commande
SELECT *
FROM Client NATURAL LEFT OUTER JOIN Commande {SQL2}

  Oracle
–  « + » après colonne pour inclure la valeur NULL

SELECT *
FROM Client,Commande
WHERE Client.noClient = Commande.noClient(+)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 49


Opérations ensemblistes (UNION,
INTERSECT, EXCEPT)
  Produire les noms et numéros de téléphone des Employés qui sont aussi des Clients de la pépinière

Table Clie n t
noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888
Table Em p lo y é
30 Lin Bô (777)777-7777
codeEmployé nomEmployé noTéléphone
40 Jean Leconte (666)666-6666
CASD1 Dollard Tremblay (888)888-8888
50 Hafedh Alaoui (555)555-5555
PIOY1 Yan Piochuneshot 911
60 Marie Leconte (666)666-6666
LAFH1 Yvan Lafleur (111)111-1111
70 Simon Lecoq (444)444-4419
HASC1 Jean Leconte (666)666-6666
80 Dollard Tremblay (333)333-3333

(SELECT nomClient as nomPersonne, noTéléphone


FROM Client)
INTERSECT
(SELECT nomEmployé as nomPersonne, noTéléphone
FROM Employé)

nomPersonne noTéléphone
Dollard Tremblay (888)888-8888
Jean Leconte (666)666-6666
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 50
Opérateurs

Symbole Signification
+ Somme
- Différence
* Produit
/ Division
|| Concaténation de chaîne (SQL2)

  Conversions automatiques entre types


compatibles

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 51


Pseudo-colonnes

  Les Commandes de la journée


SELECT *
FROM Commande
WHERE dateCommande = CURRENT_DATE

  CURRENT TIME
  CURRENT TIMESTAMP
–  SYSDATE Oracle
  CURRENT_USER (ou USER)
  SESSION_USER

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 52


Sélection par un CASE

  Produire la quantité qui a été livrée pour l'Article #50 de la Commande #4


Table Dé tailLivrais o n
noLivraison noCommande noArticle quantitéLivrée
100 1 10 7
100 1 70 5
101 1 10 3
102 2 40 2
102 2 95 1
100 3 20 1
103 1 90 1
104 4 40 1
105 5 70 2

SELECT
CASE
WHEN SUM(quantitéLivrée) IS NULL THEN 0
ELSE SUM(quantitéLivrée)
END AS quantitéTotaleLivrée
FROM DétailLivraison
WHERE noArticle = 50 AND noCommande = 4
quantitéTotaleLivrée
0

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 53


Quelques fonctions SQL2

  POSITION(patron IN chaîne)
  CHARACTER_LENGTH(chaîne)
  OCTET_LENGTH (chaîne)
  BIT_LENGTH(chaîne)
  EXTRACT(champ FROM dateOuTime)
  SUBSTRING (chaîne FROM indiceDébut FOR nombreCaractères)
  UPPER | LOWER (chaîne)
  TRIM ([LEADING|TRAILING|BOTH] caractère FROM chaîne)
  CAST(expression AS type)
  …
  Voir documentation du SGBD

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 54


Expressions de DATE Oracle
SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
--------
02-02-05
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY HH24:MI:SS';

Session altered.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
05-02-2002 09:08:26

SQL> SELECT TO_DATE('05/02/2000', 'DD/MM/YYYY') FROM DUAL;

TO_DATE('05/02/2000
-------------------
05-02-2000 00:00:00

SQL> SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY') FROM DUAL;

TO_CHAR(SY
----------
22/01/2002

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 55


Opérations sur DATE
SQL> SELECT SYSDATE + INTERVAL '1' DAY FROM DUAL;

SYSDATE+INTERVAL'1'
-------------------
23-01-2002 16:02:18

SQL> SELECT SYSDATE - INTERVAL '1' DAY FROM DUAL;

SYSDATE-INTERVAL'1'
-------------------
21-01-2002 16:02:18

SQL> SELECT SYSDATE + 1 FROM DUAL;

SYSDATE+1
-------------------
23-01-2002 16:02:18

SQL> SELECT SYSDATE + 1/24 FROM DUAL;

SYSDATE+1/24
-------------------
22-01-2002 17:02:18

SQL> SELECT SYSDATE + INTERVAL '30' SECOND FROM DUAL;

SYSDATE+INTERVAL'30
-------------------
22-01-2002 16:02:48

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 56


Fonctions de groupe

  Lenombre d'Articles différents à vendre ainsi


que le prixUnitaire moyen des Articles
SELECT COUNT(*) AS nombreArticles,
AVG(prixUnitaire) AS prixMoyen
FROM Article

nombreArticles prixMoyen
10 19.49

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 57


suite

SELECT Count(DISTINCT prixUnitaire) AS nombrePrix


FROM Article

nombrePrix
6

SELECT Count(prixUnitaire) AS nombrePrixNonNull


FROM Article

nombrePrixNonNull
10

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 58


Partition d'une table avec la clause
GROUP BY
  Produire le nombre de Commandes passées par chacun des Clients
qui ont passé au moins une Commande
SELECT noClient, COUNT(*) AS nombreCommandes
FROM Commande
GROUP BY noClient
Table Co m m an d e
noCommande dateCommande noClient
1 01/06/2000 10
3 02/06/2000 10 noClient nombreCommandes
4 05/07/2000 10 10 3
2 02/06/2000 20 20 2
6 09/07/2000 20
30 1
5 09/07/2000 30
7 15/07/2000 40
40 2
8 15/07/2000 40

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 59


Clause HAVING

  Produire le nombre de Commandes passées par chacun des Clients


qui ont passé deux Commandes ou plus
SELECT noClient, COUNT(*) AS nombreCommandes
FROM Commande
GROUP BY noClient
HAVING COUNT(*) >= 2
Table Co m m an d e
noCommande dateCommande noClient
1 01/06/2000 10
3 02/06/2000 10 noClient nombreCommandes
4 05/07/2000 10
10 3
2 02/06/2000 20
6 09/07/2000 20 20 2
5 09/07/2000 30 30 1
7 15/07/2000 40 40 2
8 15/07/2000 40

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 60


Tri du résultat (ORDER BY)

  Les Clients en ordre alphabétique du nom


SELECT *
FROM Client
ORDER BY nomClient

SELECT *
FROM Client
ORDER BY nomClient DESC, noTéléphone ASC

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 61


SELECT imbriqué: élément de (IN)

  Les Clients qui ont passé au moins une Commande


SELECT *
FROM Client
WHERE noClient IN
(SELECT noClient
FROM Commande)

Client  Commande
SELECT DISTINCT Client.noClient, nomClient, noTéléphone
FROM Client, Commande
WHERE Client.noClient = Commande.noClient

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 62


SELECT imbriqué qui retourne une ligne

  Sélectionner les Commandes du Client Hugh Paycheck


SELECT *
FROM Commande
WHERE noClient =
(SELECT noClient
FROM Client
WHERE nomClient = 'Hugh Paycheck')

  Exception si plusieurs lignes retournées par SELECT imbriqué

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 63


SELECT imbriqué corrélé

  Produire les informations au sujet des Clients qui ont


passé au moins une Commande
SELECT *
FROM Client
WHERE 0 < Référence à une
(SELECT COUNT(*) colonne non locale
FROM Commande
WHERE noClient = Client.noClient)
POUR chaque ligne de Client
Exécuter le SELECT suivant :
(SELECT COUNT(*)
FROM Commande
WHERE noClient = Client.noClient)
SI le compte retourné > 0
Placer la ligne de Client dans la table du résultat à retourner
FIN SI
FIN POUR

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 64


Test d’ensemble vide (EXISTS)

  Produire les informations au sujet des Clients qui ont


passé au moins une Commande

SELECT *
FROM Client
WHERE EXISTS
(SELECT *
FROM Commande
WHERE noClient = Client.noClient)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 65


Test de double (UNIQUE)

  Vérifier s'il y a plus d’un Client qui porte le même nom


NOT UNIQUE
(SELECT nomClient FROM Client)

  Clients qui ont passé au moins deux Commandes


SELECT *
FROM Client
WHERE NOT UNIQUE
(SELECT noClient
FROM Commande
WHERE noClient = Client.noClient)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 66


Quantificateurs (ALL, SOME/ANY)

  Commandes passées après la dernière Livraison (date ultérieure)


SELECT * FROM Commande
WHERE dateCommande > ALL
(SELECT dateLivraison
FROM Livraison)
  Commandes passées après au moins une des Livraisons
SELECT * FROM Commande
WHERE dateCommande > ANY
(SELECT dateLivraison
FROM Livraison)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 67


SELECT imbriqué dans le FROM

  Produire les noClient et dateCommande des Commandes dont la


dateCommande est supérieure au 05/07/2000

SELECT noClient, dateCommande


FROM
(SELECT * {SQL 2}
FROM Commande
WHERE dateCommande > '05/07/2000'
)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 68


Opérations de mise à jour des tables

 Insert
 Delete
 Update

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 69


Insertion dans une table (INSERT)

  Insérer une nouvelle ligne dans la table Client


INSERT INTO Client
VALUES (100, 'G. Lemoyne-Allaire', '911')

  Changer l ’ordre de défaut


INSERT INTO Client(nomClient, noClient, noTéléphone)
VALUES ('G. Lemoyne-Allaire', 100, '911')

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 70


Insertion à partir d ’un SELECT

  Produire les lignes de DétailLivraison pour la


Livraison #106 à partir des LigneCommandes de la
Commande #7
INSERT INTO DétailLivraison
SELECT 106, noCommande, noArticle, quantité
FROM LigneCommande
WHERE noCommande = 7

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 71


Suppression de lignes (DELETE)

  Supprimer toutes les lignes de la table Client


DELETE FROM Client

  Supprimer le Client #70 de la table Client


DELETE FROM Client
WHERE noClient = 70

  Supprimer les Clients qui n'ont pas passé de Commande


DELETE FROM Client
WHERE noClient NOT IN
(SELECT DISTINCT noClient
FROM Commande)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 72


Modification de lignes (UPDATE)

  Changer le noTéléphone du Client #10 pour (222)222-2222


UPDATE Client
SET noTéléphone = '(222)222-2222'
WHERE noClient = 10

  Augmenter tous les prixUnitaires des Articles de 10%


UPDATE Article
SET prixUnitaire = prixUnitaire * 1.1

  Modification de plusieurs colonnes à la fois


UPDATE Article
SET prixUnitaire = 12.99, quantitéEnStock = 5
WHERE noArticle = 10

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 73


Table virtuelle (VIEW)

Table Artic le
noArticle description prixUnitaire quantitéEnStock
10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10
CREATE VIEW ArticlePrixModique AS
SELECT noArticle, description, prixUnitaire
FROM Article
WHERE prixUnitaire < 15
VIEW Artic le PrixMo d iqu e
noArticle description prixUnitaire
SELECT *
10 Cèdre en boule 10.99
FROM ArticlePrixModique 20 Sapin 12.99
70 Herbe à puce 10.99
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 74
Implémentation des tables virtuelles

  Résolution des vues par modification de requête


CREATE VIEW ArticlePrixModique AS
SELECT noArticle, description, prixUnitaire
FROM Article
WHERE prixUnitaire < 15

SELECT *
FROM ArticlePrixModique

SELECT *
FROM (
SELECT noArticle, description, prixUnitaire
FROM Article
WHERE prixUnitaire < 15)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 75


Résolution des vues par matérialisation

  Table stockée
  Redondance

  Maintenance de la cohérence
  Meilleure performance du SELECT
  Moins bonne performance des mises à jour
  Entrepôts de données

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 76


Indépendance logique des données et
encapsulation par les tables virtuelles

  Catalogue (noArticle, description, prixUnitaire)


  Inventaire (noArticle, quantitéEnStock)
CREATE VIEW Article (noArticle, description, prixUnitaire, quantitéEnStock)AS
SELECT C.noArticle, description, prixUnitaire, quantitéEnStock
FROM Catalogue AS C, Inventaire AS I
WHERE C.noArticle = I.noArticle

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 77


Sécurité par les tables virtuelles

CREATE VIEW User_Tables AS


SELECT *
FROM Tables
WHERE Table_Owner = CURRENT_USER

GRANT SELECT ON User_Tables TO PUBLIC

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 78


LOG660 - Bases de données de haute performance

Cours 1 – Interface de programmation


Application / BD

Hiver 2011
C. Desrosiers

Département de génie logiciel et des TI


Interface entre SQL et un programme

  SQL incomplet
  Défaut d'impédance (impedance mismatch)
–  modèle de données BD ≠
–  modèle de données du langage de programmation

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 80


Interface programmatique (Call-Level
Interface - SQL/CLI)
  API spécifique au SGBD
–  e.g. Oracle Call Interface (OCI)

–  non portable

  API normalisée
–  standard de facto ODBC
  développé par Microsoft pour le C

–  pilote ODBC pour client/serveur


–  SQL/CLI de SQL:1999 inspirée de ODBC
–  JDBC pour Java

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 81


SQL enchâssé (Embedded SQL)

  Code SQL dans le source du langage hôte


  Syntaxe spéciale
  Pré-compilation
–  Oracle : pro*C/C++, pro*COBOL, …, SQLJ
  Moins portable
–  pré-compilateur spécifique au SGBD
–  traduit en API du SGBD
  SQLJ (partie 0) traduit en API standard JDBC

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 82


Extension procédurale à SQL
(Persistent Stored Modules - SQL/PSM)

  SQL +
–  structures de contrôle
–  procédures, fonctions, packages
–  support direct des types SQL pour les variables
–  exécution au niveau serveur de BD
  Oracle
–  PL/SQL

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 83


Bloc PL/SQL

[DECLARE
déclaration [déclaration] ...]

BEGIN
séquenceEnoncés
[EXCEPTION
exception_énoncé [exception_énoncé] ...]
END

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 84


Exécution d’un bloc sous SQL*plus

SQL> DECLARE
2 laQuantitéEnStock Article.quantitéEnStock%TYPE;
3 BEGIN
4 SELECT quantitéEnStock INTO laQuantitéEnStock
5 FROM Article
6 WHERE noArticle = 10;
7 IF laQuantitéEnStock = 0 THEN
8 DBMS_OUTPUT.PUT_LINE('L article est en rupture de stock');
9 ELSE
10 DBMS_OUTPUT.PUT('Quantité en stock :');
11 DBMS_OUTPUT.PUT_LINE(laQuantitéEnStock);
12 END IF;
13 EXCEPTION
14 WHEN NO_DATA_FOUND THEN
15 DBMS_OUTPUT.PUT_LINE('Numéro d article inexistant');
16 WHEN OTHERS THEN
17 RAISE_APPLICATION_ERROR(-20001,'Erreur soulevée par le SELECT');
18 END;
19 /
Quantité en stock :20

PL/SQL procedure successfully completed.

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 85


Déclaration de variables PL/SQL
(DECLARE)

leNoClient Client.noClient%TYPE;

leNoClient INTEGER;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 86


Transfert d'une valeur de colonne d'un
SELECT dans une variable (clause INTO)

SELECT noClient, dateCommande


INTO leNoClient, laDateCommande
FROM Commande
WHERE noCommande = leNoCommande;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 87


Affectation en PL/SQL

laQuantitéEnAttente:= laQuantitéCommandée -laQuantitéLivrée;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 88


Structure de contrôle IF

IF (laQuantitéLivrée IS NULL) THEN


DBMS_OUTPUT.PUT_LINE(' livraison en attente');
ELSE
laQuantitéEnAttente:= laQuantitéCommandée -laQuantitéLivrée;
IF (laQuantitéEnAttente = 0) THEN
DBMS_OUTPUT.PUT_LINE(' livraison complétée');
ELSE
DBMS_OUTPUT.PUT (' quantité en attente :');
DBMS_OUTPUT.PUT_LINE(laQuantitéEnAttente);
END IF ;
END IF ;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 89


Boucles (LOOP, FOR, WHILE)

LOOP
séquenceEnoncés
END LOOP ;

FOR indice IN [REVERSE] valeurInitiale..valeurFinale LOOP


séquenceEnoncés
END LOOP ;

WHILE condition LOOP


séquenceEnoncés
END LOOP ;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 90


Traitement d'exception (EXCEPTION,
RAISE)

  Déclarer
nomException EXCEPTION;

  Soulever
RAISE nomException

  Attraper
WHEN nomException THEN
séquenceÉnoncés

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 91


Curseur PL/SQL (CURSOR)
CURSOR lignesCommande(unNoCommande Commande.noCommande%TYPE)IS
SELECT noArticle, quantité
FROM LigneCommande
WHERE LigneCommande.noCommande = unNoCommande ;

OPEN lignesCommande(leNoCommande);
-- Le OPEN ouvre le CURSOR en lui passant les paramètres

LOOP
FETCH lignesCommande INTO leNoArticle, laQuantitéCommandée;
-- Le FETCH retourne la ligne suivante

EXIT WHEN lignesCommande%NOTFOUND;


-- %NOTFOUND est un attribut du CURSOR qui permet de déterminer
-- si le FETCH a atteint la fin de la table

END LOOP;

-- Le CLOSE ferme le CURSOR


CLOSE lignesCommande;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 92


Boucle FOR pour curseur PL/SQL
FOR uneLigne IN lignesCommande(leNoCommande) LOOP

DBMS_OUTPUT.PUT('noArticle :');
DBMS_OUTPUT.PUT(uneLigne.noArticle);
DBMS_OUTPUT.PUT(' quantité commandée:');
DBMS_OUTPUT.PUT(uneLigne.quantité);

-- Chercher la quantité déjà livrée


SELECT SUM(quantitéLivrée)
INTO laQuantitéLivrée
FROM DétailLivraison
WHERE noArticle = uneLigne.noArticle AND
noCommande = leNoCommande ;

IF (laQuantitéLivrée IS NULL) THEN


DBMS_OUTPUT.PUT_LINE(' livraison en attente');
ELSE
laQuantitéEnAttente:= uneLigne.quantité -laQuantitéLivrée;
IF (laQuantitéEnAttente = 0) THEN
DBMS_OUTPUT.PUT_LINE(' livraison complétée');
ELSE
DBMS_OUTPUT.PUT (' quantité en attente :');
DBMS_OUTPUT.PUT_LINE(laQuantitéEnAttente);
END IF ;
END IF ;
END LOOP;

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 93


Procédures et fonctions PL/SQL
stockées
SQL> CREATE FUNCTION fQuantitéEnStock
2 (unNoArticle Article.noArticle%TYPE)
3 RETURN Article.quantitéEnStock%TYPE IS
4
5 uneQuantitéEnStock Article.quantitéEnStock%TYPE;
6 BEGIN
7 SELECT quantitéEnStock
8 INTO uneQuantitéEnStock
9 FROM Article
10 WHERE noArticle = unNoArticle;
11 RETURN uneQuantitéEnStock;
12 END fQuantitéEnStock;
13
14 /

Function created.
SQL> select fQuantitéEnStock(10) from dual;

FQUANTITÉENSTOCK(10)
--------------------
10

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 94


Procédure stockée
SQL> CREATE PROCEDURE pModifierQuantitéEnStock
2 (unNoArticle Article.noArticle%TYPE,
3 nouvelleQuantitéEnStock Article.quantitéEnStock%TYPE) IS
4 BEGIN
5 UPDATE Article
6 SET quantitéEnStock = nouvelleQuantitéEnStock
7 WHERE noArticle = unNoArticle;
8 END pModifierQuantitéEnStock;
9 /

Procedure created.

SQL> EXECUTE pModifierQuantitéEnStock(10,20);

PL/SQL procedure successfully completed.

SQL> SELECT * FROM Article WHERE noArticle = 10;

NOARTICLE DESCRIPTION PRIXUNITAIRE QUANTITÉENSTOCK


---------- -------------------- ------------ ---------------
10 Cèdre en boule 10,99 20

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 95


Privilèges dans une routine stockée

  Privilèges de l'appelant (invoker rights)


CREATE PROCEDURE pModifierQuantitéEnStock
(unNoArticle Article.noArticle%TYPE,
nouvelleQuantitéEnStock Article.quantitéEnStock%TYPE)
AUTHID CURRENT_USER IS
BEGIN
UPDATE Article
SET quantitéEnStock = nouvelleQuantitéEnStock
WHERE noArticle = unNoArticle;
END pModifierQuantitéEnStock;

  Privilèges de la routine (definer rights)


–  privilèges du créateur
–  par défaut

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 96


JDBC

  API standard pour JAVA


  http://java.sun.com/products/jdbc/
  Ensemble de classes
  Besoin d ’installer un pilote JDBC dans
l ’environnement JAVA

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 97


Chargement d'un pilote JDBC et
établissement d'une connexion

  Charger les pilotes JDBC d ’ Oracle


Class.forName ("oracle.jdbc.driver.OracleDriver");

  Établir une connexion avec le pilote OCI8 pour un


serveur Oracle local
Connection uneConnection =
DriverManager.getConnection
("jdbc:oracle:oci8:@", "toto", "secret");

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 98


Création d’un énoncé SQL (Statement)
<<Interface>>
Statement
Statement unEnoncéSQL = uneConnection.createStatement ();
executeQuery(arg0 : S tring) : ResultSet
executeUpdate(arg0 : St ring) : int
close() : void
getMaxFieldSize() : int
setMaxFieldSize(arg0 : int) : void
getMaxRows() : int
setMaxRows(arg0 : int) : void
setE scapeProcessing(arg0 : boolean) : void
getQueryTimeout() : int
setQueryTimeout(arg0 : int) : void
cancel() : void
getW arnings() : SQLWarning
clearWarnings() : void
setCursorName(arg0 : String) : void
execute(arg0 : String) : boolean
getResultSet() : ResultSet
getUpdat eCount() : int
getMoreResults() : boolean
setFet chDirection(arg0 : int) : void
getFet chDirection() : int
setFet chSize(arg0 : int) : void
getFet chSize() : int
getResultSetConcurrency() : int
getResultSetType() : int
addBatch(arg0 : String) : void
clearBatc h() : void
executeBatch() : int[]
getConnection() : Connection

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 99


Exécution d'une opération de mise à jour
(INSERT, DELETE, UPDATE)
import java.sql.*;

class ClientInsertJDBC
{
public static void main (String args [])
throws SQLException, ClassNotFoundException, java.io.IOException
{
// Charger le pilote JDBC d'Oracle
Class.forName ("oracle.jdbc.driver.OracleDriver");

// Connexion à une BD
Connection uneConnection =
DriverManager.getConnection ("jdbc:oracle:oci8:@", "godin", "oracle");

// Création d'un énoncé associé à la Connection


Statement unEnoncéSQL = uneConnection.createStatement ();

// Insertion d'une ligne dans la table Client


int n = unEnoncéSQL.executeUpdate
("INSERT INTO CLIENT " +
"VALUES (100, 'G. Lemoyne-Allaire', '911')");
System.out.println ("Nombre de lignes inserees:" + n);

// Fermeture de l'énoncé et de la connexion


unEnoncéSQL.close();
uneConnection.close();
}
}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 100


Exécution d'un SELECT (ResultSet)
… Début analogue à l'exemple précédent

// Création d'un énoncé associé à la Connexion


Statement unEnoncéSQL = uneConnection.createStatement();

// Exécution d'un SELECT


ResultSet résultatSelect = unEnoncéSQL.executeQuery
("SELECT noClient, nomClient "+
"FROM CLIENT " +
"WHERE noClient > 40");

// Itérer sur les lignes du résultat du SELECT et extraire les valeurs


// des colonnes dans des variables JAVA

while (résultatSelect.next ()){


int noClient = résultatSelect.getInt ("noClient");
String nomClient = résultatSelect.getString ("nomClient");
System.out.println ("Numéro du client:" + noClient);
System.out.println ("Nom du client:" + nomClient);
}
}
}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 101


Support des types SQL:1999 sous JDBC 2

CREATE TABLE tableBlob (


idBlob INTEGER PRIMARY KEY,
imageBLOB)

// Chercher le BLOB locator


ResultSet unResultSet = unEnoncéSQL.executeQuery ("SELECT * FROM tableBlob WHERE idBlob = 1");
if (unResultSet.next()){

int idBlob = unResultSet.getInt(1);


Blob unBlob = unResultSet.getBlob(2);

// Chercher la taille du BLOB et l'afficher


int taille = (int)unBlob.length();
System.out.println("Taille du BLOB" + taille);

// Lire le BLOB dans un tableau d'octets


byte octets[] = unBlob.getBytes(1, taille);

// Créer un fichier contenant les octets lus


FileOutputStream unFichier =
new FileOutputStream("C:/forte4j/Development/ExemplesJDBC/CopieCoq1.gif");
unFichier.write(octets);
unFichier.close();

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 102


Compilation et exécutions multiples
avec la classe PreparedStatement

  Compilation avec paramètres


PreparedStatement unEnoncéSQL = uneConnection.prepareStatement
("SELECT noClient, nomClient "+ Statement
"FROM CLIENT " +
"WHERE noClient > ?");
unEnoncéSQL.setInt(1,40);
ResultSet résultatSelect = unEnoncéSQL.executeQuery();
PreparedStatement

CallableStatement

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 103


Exécution en lot (batch) sous JDBC 2

// Création d'un PreparedStatement associé à la Connection


PreparedStatement unEnoncéSQL = uneConnection.prepareStatement
("INSERT INTO Client VALUES(?,?,?)");

// Ajout d'un INSERT dans le lot


unEnoncéSQL.setInt(1,90);
unEnoncéSQL.setString(2,"Edgar Degas");
unEnoncéSQL.setString(3,"(222)222-2222");
unEnoncéSQL.addBatch();

// Ajout d'un autre INSERT dans le lot


unEnoncéSQL.setInt(1,100);
unEnoncéSQL.setString(2,"Claude Monet");
unEnoncéSQL.setString(3,"(111)111-1111");
unEnoncéSQL.addBatch();

// Exécution du lot en un appel


int [] résultats = unEnoncéSQL.executeBatch();

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 104


Exécution d'une procédure ou fonction
stockée (CallableStatement)

// Création d'un appel de fonction associé à la Connection


CallableStatement unCall =
uneConnection.prepareCall("{ ? = call fQuantitéEnStock(?)}");

// Spécification du paramètre d'entrée


unCall.setInt(2,10);
// Inscription de la sortie
unCall.registerOutParameter(1, java.sql.Types.INTEGER);
// Exécution de l'appel
unCall.execute();
// Récupération de la sortie
int laQuantite = unCall.getInt(1);

System.out.println("Quantité en stock :"+laQuantite);


};
unCall.close();
uneConnection.close();

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 105


Appel de procédure stockée

CallableStatement unCall =
uneConnection.prepareCall("{call pModifierQuantitéEnStock(?,?)}");

// Spécification des paramètres d'entrée


unCall.setInt(1,10);
unCall.setInt(2,20);
// Exécution de l'appel
unCall.execute();
unCall.close();
uneConnection.close();

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 106


Gestion des transactions

  Pardéfaut : auto-commit
  Pour modifier
uneConnection.setAutoCommit(false);
  Pour un commit explicite :
uneConnection.commit();
  Pour un rollback :
uneConnection.rollback();

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 107


LOG660 - Bases de données de haute performance

Cours 1 – Gestion des contraintes

Hiver 2011
C. Desrosiers

Département de génie logiciel et des TI


Gestion des contraintes d’intégrité en
SQL

  Contrainte d'intégrité statique


–  respectée pour chacun des états de la BD
–  mécanismes déclaratifs
  PRIMARY KEY, UNIQUE, NOT NULL, DOMAIN, FOREIGN KEY, CHECK,
ASSERTION

–  procédural
  TRIGGER (SQL:1999)

  Contrainte d'intégrité dynamique


–  contrainte sur changements d'états
–  référence aux états successifs
–  TRIGGER, REFERENCES ON DELETE…, ON UPDATE ...

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 109


Contrainte de domaine

  Types SQL
–  INTEGER
–  CHAR
–  ...
  NOT NULL
  CHECK
  CREATE DOMAIN

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 110


Contrainte NOT NULL

CREATE TABLE Client


(noCLIENT INTEGER NOT NULL,
nomClient VARCHAR(15) NOT NULL,
noTéléphone VARCHAR(15) NOT NULL
)

  Par défaut : NULL

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 111


Contrainte CHECK sur une colonne

  Le noClient est supérieur à 0 et inférieur à 100,000


CREATE TABLE Client
(noCLIENT INTEGER NOT NULL
CHECK(noClient >0 AND noClient < 100000),
nomClient VARCHAR(15) NOT NULL,
noTéléphone VARCHAR(15) NOT NULL
)

CREATE TABLE Client


(noCLIENT INTEGER NOT NULL,
nomClient VARCHAR(15) NOT NULL,
noTéléphone VARCHAR(15) NOT NULL,
CHECK(noClient >0 AND noClient < 100000)
)
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 112
Contrainte d'intégrité référentielle
(FOREIGN KEY REFERENCES)

  Le noClient de la table Commande fait référence à


la clé primaire noClient de la table Client
CREATE TABLE Commande
(noCommande INTEGER NOT NULL,
dateCommande DATE NOT NULL,
noClient INTEGER NOT NULL,
PRIMARY KEY (noCommande),
FOREIGN KEY (noClient) REFERENCES Client(noClient)
)

  La table Client doit d ’abord être créée


–  privilège REFERENCES sur Client
  PRIMARY KEY ou UNIQUE
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 113
Politique de gestion de la contrainte
d'intégrité référentielle

  Tentative de mise à jour de la clé primaire


CREATE TABLE Commande
(noCommande INTEGER NOT NULL,
dateCommande DATE NOT NULL,
noClient INTEGER NOT NULL,
PRIMARY KEY (noCommande),
FOREIGN KEY (noClient) REFERENCES Client(noClient)
)

DELETE FROM Client WHERE noClient = 10

  Options
–  NO ACTION
–  CASCADE
–  SET NULL
–  SET DEFAULT
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 114
Oracle

  Défaut
–  ON DELETE NO ACTION
–  ON UPDATE NO ACTION
  Supporte aussi
–  ON DELETE CASCADE
–  ON DELETE SET NULL (version 8i)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 115


Check inter-ligne d'une même table
  Concerne plusieurs lignes
  Le prixUnitaire d'un Article ne peut dépasser le prix
moyen de plus de $40.00
CREATE TABLE Article
(noArticle INTEGER NOT NULL,
description VARCHAR(20),
prixUnitaire DECIMAL(10,2) NOT NULL,
quantitéEnStock INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (noArticle),
CHECK (prixUnitaire-20 <= (SELECT AVG(prixUnitaire)
FROM Article))
)
  Vérifié uniquement pour la ligne touchée :la contrainte peut être violée !
  Pas supporté par Oracle

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 116


CHECK inter-tables
  Concerne plusieurs tables
<<Table>> <<Table>>
Prêt PrêtArchivé
{Clé prim aire : idPrêt} {Clé prim aire: idPrêt}
idPrêt idPrêt
datePrêt dateRetour
idMem bre idExem plaire

CREATE TABLE PrêtArchivé


(idPrêt INTEGER NOT NULL,
dateRetour DATE NOT NULL,
idExemplaire INTEGER NOT NULL,
PRIMARY KEY (idPrêt),
FOREIGN KEY (idPrêt) REFERENCES Prêt,
CHECK (dateRetour >=
SELECT datePrêt
FROM Prêt
WHERE Prêt.idPrêt = PrêtArchivé.idPrêt)
)
  Vérifié uniquement pour la ligne touchée : la contrainte peut être violée !
  Pas supporté par Oracle

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 117


Nom de contrainte (clause
CONSTRAINT)

CREATE TABLE Client


(noCLIENT INTEGER NOT NULL,
nomClient VARCHAR(15) NOT NULL,
noTéléphone VARCHAR(15) NOT NULL,
CONSTRAINT contNoClient CHECK(noClient >0 AND noClient < 100000)
)

  DROP CONSTRAINT contNoClient


  SET CONSTRAINT contNoClient …
  Identification de la contrainte qui est violée à
l ’exécution

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 118


Gâchettes (TRIGGER)

  Procédure
–  déclenchée par événement pré-déterminé (INSERT, DELETE, UPDATE)
–  exécutée au niveau serveur de BD
  BD active
  Utilité
–  maintien de contraintes d ’intégrité
  statique
  dynamique
  alternative aux mécanismes déclaratifs (CHECK, ASSERTION, ...)
–  préférer mécanisme déclaratif
–  maintien d ’éléments dérivés
  colonnes dérivées
  copies dans BD répartie
  ...
–  historique des mises à jour
  AUDIT
–  sécurité

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 119


Lorsqu'une augmentation du prixUnitaire d'un Article est
tentée, il faut limiter l'augmentation à 10% du prix en
cours

CREATE TRIGGER BUArticleBornerAugmentationPrix


BEFORE UPDATE OF prixUnitaire ON Article
REFERENCING
OLD ROW AS ligneAvant
NEW ROW AS ligneAprès
FOR EACH ROW
WHEN (ligneAprès.prixUnitaire > ligneAvant.prixUnitaire*1.1)
BEGIN
ligneAprès.prixUnitaire = ligneAvant.prixUnitaire*1.1;
END
UPDATE Article
SET prixUnitaire = 15.99
WHERE noArticle = 10
noArticle description prixUnitaire
ligneAvant 10 Cèdre en boule 10.99

ligneAprès 10 Cèdre en boule 15.99 ligneAprès 10 Cèdre en boule 12.09

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 120


Utilisation d'un TRIGGER pour le
maintien d'une contrainte d'intégrité
dynamique

  Empêcher une augmentation du prixUnitaire


d'un Article au delà de 10% du prix en cours
CREATE TRIGGER BUArticleEmpêcherAugmentationPrixTropElevée
BEFORE UPDATE OF prixUnitaire ON Article
REFERENCING
OLD ROW AS ligneAvant
NEW ROW AS ligneAprès
FOR EACH ROW
WHEN (ligneAprès.prixUnitaire > ligneAvant.prixUnitaire*1.1)
BEGIN
souleverUneException;
END

  Oracle
–  RAISE_APPLICATION_ERROR
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 121
Utilisation d'un TRIGGER pour le
maintien d'une contrainte d'intégrité
statique

  0 < noClient < 100000


CREATE TRIGGER BIUClientVérifierNoClient
BEFORE INSERT OR UPDATE OF noClient ON Client
REFERENCING
NEW ROW AS ligneAprès
FOR EACH ROW
WHEN (ligneAprès.noClient <=0) OR
(ligneAprès.noClient > 100000)
BEGIN
souleverUneException;
END

  N.B. CHECK est préférable !


Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 122
Étude de cas

  Lors d'une nouvelle livraison, la quantité à livrer ne


peut dépasser la quantité en stock disponible
CREATE TRIGGER BIDétLivVérifierQuantitéEnStock
BEFORE INSERT ON DétailLivraison
REFERENCING
NEW ROW AS ligneAprès
FOR EACH ROW
WHEN ligneAprès.quantitéLivrée >
(SELECT quantitéEnStock
FROM Article
WHERE noArticle = ligneAprès.noArticle)
BEGIN
souleverUneException;
END

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 123


CHECK SQL2 inadéquat

CREATE TABLE DétailLivraison


(noLivraison INTEGER NOT NULL,
noCommande INTEGER NOT NULL,
noArticle INTEGER NOT NULL,
quantitéLivrée INTEGER NOT NULL,
PRIMARY KEY (noLivraison,noCommande, noArticle),
FOREIGN KEY (noLivraison) REFERENCES Livraison(noLivraison),
FOREIGN KEY (noCommande, noArticle) REFERENCES
LigneCommande(noCommande, noArticle),
CHECK (0 <=
SELECT quantitéEnStock-quantitéLivrée
FROM Article
WHERE noArticle = DétailLivraison.noArticle)
)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 124


Ajuster la quantitéEnStock
CREATE TRIGGER AIDétLivAjusterQuantitéEnStock
AFTER INSERT ON DétailLivraison
REFERENCING
NEW ROW AS ligneAprès
FOR EACH ROW
BEGIN
UPDATE Article
SET quantitéEnStock = quantitéEnStock -
ligneAprès.quantitéLivrée
WHERE noArticle = ligneAprès.noArticle;
END

CREATE TRIGGER AUDétLivAjusterQuantitéEnStock


AFTER UPDATE OF quantitéLivrée ON DétailLivraison
REFERENCING
OLD ROW AS ligneAvant
NEW ROW AS ligneAprès
FOR EACH ROW
BEGIN
UPDATE Article
SET quantitéEnStock = quantitéEnStock -
(ligneAprès.quantitéLivrée-ligneAvant.quantitéLivrée)
WHERE noArticle = ligneAvant.noArticle;
END

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 125


Ne permettre que la modification de la
quantitéLivrée dans la table
DétailLiraison

CREATE TRIGGER BUDétLivEmpêcherModif


BEFORE UPDATE OF noLivraison, noCommande, noArticle
ON DétailLivraison
BEGIN
souleverUneException;
END

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 126


TRIGGER de niveau STATEMENT

  Exécution du corps une seule fois pour


plusieurs lignes mises à jours dans le même
énoncé
CREATE TRIGGER BUDétLivEmpêcherModif
BEFORE UPDATE OF noLivraison, noCommande, noArticle
ON DétailLivraison
BEGIN
souleverUneException;
END

REFERENCING
OLD TABLE AS nomAvant
NEW TABLE AS nomAprès

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 127


Ordre d'exécution des TRIGGER

Exécuter les TRIGGER BEFORE STATEMENT


Pour chaque ligne touchée par l'opération
Exécuter les TRIGGER BEFORE ROW
Exécuter l'opération
Exécuter les TRIGGER AFTER ROW
Fin pour
Exécuter les TRIGGER AFTER STATEMENT

  Attention aux circularités !

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 128


Limites des TRIGGER

  Ne peuvent être DEFERRED


  Complexes à coder
  Contraintes particulières aux dialectes

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 129


Particularités des TRIGGER Oracle
  Pas de SELECT dans le WHEN
  :NEW, :OLD
  Omettre le mot-clé ROW dans REFERENCING
  Corps en PL/SQL (voir chapitre 4).
  Syntaxe :nomColonne
  Pas de COMMIT/ROLLBACK dans un TRIGGER
–  procédure PL/SQL RAISE_APPLICATION_ERROR
  Intervalle [-20000, -20999] pour code d’erreur
  IF INSERTING, DELETING, UPDATING.
  Événements non standards
–  INSTEAD OF, STARTUP, LOGON, ...
  Problème avec table en mutation (modifiée par l'événement déclencheur)
  etc.

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 130


Problème des tables en mutation
CREATE TABLE Statistiques
(noStat INTEGER NOT NULL,
nombreClients INTEGER NOT NULL,
PRIMARY KEY (noStat))

CREATE TRIGGER AIMettreAJourNbClients


After INSERT ON Client
FOR EACH ROW
DECLARE
total INTEGER;
BEGIN
SELECT COUNT(*) INTO total
FROM Client ;

UPDATE Statistiques
SET nombreClients = total
WHERE idStat = ID_STAT_NB_CLIENTS;
END

SQL> INSERT INTO Client VALUES (…)


{Exception : Table Client en mutation}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 131


Problème des tables en mutation

  Solution 1: AUTONOMOUS_TRANSACTION!
CREATE TRIGGER AIMettreAJourNbClients
After INSERT ON Client
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
total INTEGER;
BEGIN
SELECT COUNT(*) INTO total
FROM Client;

UPDATE Statistiques
SET nombreClients = total
WHERE idStat = ID_STAT_NB_CLIENTS;
COMMIT;
! END
  Considère la transaction comme indépendante
  La mise-à-jour peut être erronée car la nouvelle insertion n’est
pas considérée
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 132
Problème des tables en mutation
  Solution 2: TRIGGER de niveau STATEMENT
CREATE TRIGGER AIMettreAJourNbClients
After INSERT ON Client
DECLARE
total INTEGER;
BEGIN
SELECT COUNT(*) INTO total
FROM Client;

UPDATE Statistiques
SET nombreClients = total
WHERE idStat = ID_STAT_NB_CLIENTS;
END
!
  On supprime le FOR EACH ROW
  La mise à jour est faite une seule fois à la fin

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 133


Problème des tables en mutation
  Solution 3: Éviter le problème complètement
CREATE TRIGGER AIMettreAJourNbClients
After INSERT ON Client
FOR EACH ROW
BEGIN
UPDATE Statistiques
SET nombreClients = nombreClients+1
WHERE idStat = ID_STAT_NB_CLIENTS;
END
!
  Meilleure solution
  Pas toujours possible

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 134

Vous aimerez peut-être aussi