Université Hassan 1 Faculté des Sciences et Techniques de ...

81
Université Hassan 1 er Faculté des Sciences et Techniques de Settat COURS DE BASES DE DONNÉES Conception et Gestion des Bases de Données Transactionnel Structured Query Language Professeur Laachfoubi Nabil Département des Mathématiques et Informatique

Transcript of Université Hassan 1 Faculté des Sciences et Techniques de ...

Page 1: Université Hassan 1 Faculté des Sciences et Techniques de ...

Universiteacute Hassan 1er Faculteacute des Sciences et Techniques de Settat

COURS DE BASES DE DONNEacuteES

Conception et Gestion des Bases de Donneacutees

Transactionnel Structured Query Language

Professeur Laachfoubi Nabil

Deacutepartement des Matheacutematiques et Informatique

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique

Table des matiegraveres

A LAlgegravebre de Boole et Diagrammes de Venn (Rappels) 4

A1 Deacutefinition 4

A2 Les opeacuterateurs logiques 4

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole 5

A4 Diagrammes de Venn 7

B Les similitudes entre la vision ensembliste et la vision relationnelle9

C Passage drsquoune vision ensembliste agrave une vision relationnelle 12

D Le langage TSQL (Transactionnel Structured Query Language) 16

D1 Les opeacuterateurs et leur prioriteacute 16

D2 Les variables 17

D3 Les structures conditionnelles 18

D4 Les structures iteacuteratives 18

D5 Les mots cleacutes usuels et leur prioriteacute 18

D6 Les cateacutegories de commandes TSQL 19

E La base de donneacutees laquoBoutiqueraquo 19

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage) 22

F1 Syntaxe du laquoSELECTraquo 22

F1a) Les options usuelles du laquoSELECTraquo 22

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles 26

F1c) Les options usuelles du laquoFROMraquo 28

F1d) Les options usuelles du laquoWHEREraquo 31

F1e) Les options usuelles du laquoGROUP BYraquo 35

F1f) Lrsquooption laquoINTOraquo 42

F2 Syntaxe de lrsquolaquoINSERTraquo 43

F3 Syntaxe de lrsquolaquoUPDATEraquo 45

F4 Syntaxe du laquoDELETEraquo 48

G Le TSQL pour manipuler les structures (Data Defintion Langage) 52

G1 Manipulations usuelles des bases de donneacutees 52

G1a) Le laquoCREATE DATABASEraquo 52

G1b) LrsquolaquoALTER DATABASEraquo 54

G1c) Le laquoDROP DATABASEraquo 56

G2 Manipulations usuelles des tables 56

G2a) Le laquoCREATE TABLEraquo 56

G2b) Le laquoUPDATE TABLEraquo 58

G2c) Le laquoDROP TABLEraquo 59

G3 Manipulations usuelles des vues 60

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo 60

G4 Manipulations usuelles des proceacutedures stockeacutees 61

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo 61

G5 Manipulations usuelles des fonctions 64

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo 64

G6 Manipulations usuelles des triggers 67

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo 67

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo 68

H Les curseurs 68

I Conception des Bases de Donneacutees avec Merise 72

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo 72

I1a) Les entiteacutes et les identifiants 72

I1b) Les associations et les cardinaliteacutes 72

(1) Les associations binaires 73

(2) Les associations reacuteflexives 73

(3) Les associations n-aires 74

(4) Les associations plurielles 74

I1c) Les regravegles de normalisation 75

I1d) Les formes normales 77

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo 79

I3 Le modegravele physique des donneacutees laquoMPDraquo 80

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 4 sur 81

A LAlgegravebre de Boole et Diagrammes de Venn (Rappels)

A1 Deacutefinition

Lrsquoalgegravebre de Boole et le chapitre des matheacutematiques qui permet drsquoadapter les techniques du calcul algeacutebrique

agrave des variables booleacuteennes (vrai ou faux true ou false ou encore 0 ou 1) et plus geacuteneacuteralement agrave des expressions

booleacuteennes

Exemples illustrant lutilisation de lalgegravebre de boole dans une communication teacuteleacutephonique entre deux

personnes

Communication = (Eacutemetteur deacutecroche) ET (Reacutecepteur deacutecroche)

Communication est laquo vrai raquo si lrsquoeacutemetteur deacutecroche ET que le reacutecepteur deacutecroche aussi

Deacutecrocher = (Sonnerie ET Deacutecision de reacutepondre) OU (deacutecision dappeler)

Deacutecrocher est laquo vrai raquo si on entend la sonnerie ET que lon deacutecide de reacutepondre ou alors si lon deacutecide tout

simplement dappeler

A2 Les opeacuterateurs logiques

Soit A et B deux variables booleacuteennes prenant soit la valeur 0 soit la valeur 1

Le reacutesultat de lopeacuteration A ET B est vrai uniquement lorsqursquoagrave la fois A et B sont vrais Dans les autres cas A ET

B donne un reacutesultat faux

Le reacutesultat de lopeacuteration A OU B est faux uniquement lorsque A et B sont tous les deux faux Dans les autres

cas A OU B donne un reacutesultat vrai

Le reacutesultat de lopeacuteration NOT A (neacutegation de A) est vrai uniquement lorsque A est faux Reacuteciproquement le

reacutesultat de lopeacuteration NOT A est faux uniquement lorsque A est vrai

Le reacutesultat de lopeacuteration A XOR B est vrai uniquement lorsque A est la neacutegation de B ou inversement Dans le

cas ougrave A et B sont eacutegaux le reacutesultat de lopeacuteration est faux

On verra un peu plus loin dans ce cours que les opeacuterateurs logiques sont tregraves utiliseacutes dans les requecirctes de

manipulation des donneacutees notamment pour la clause where La maitrise de ces opeacuterateurs joue un rocircle

primordial dans loptimisation des requecirctes SQL

Pour mieux comprendre ces opeacuterateurs on va eacutetudier leur similitude avec les opeacuterateurs dintersection dunion

et de neacutegation car finalement quand on manipule les donneacutees des tables dans une base de donneacutees avec le

langage SQL en reacutealiteacute on est en train de travailler sur des ensembles

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 5 sur 81

Soit A et B deux ensemble lopeacuterateur sera assimileacute agrave lintersection cap pour les ensembles et agrave lopeacuterateur

ET pour lalgegravebre de boole lopeacuterateur + sera assimileacute agrave lunion U pour les ensembles et agrave lopeacuterateur

OU pour lalgegravebre de boole lopeacuterateur macr sera assimileacute agrave la neacutegation pour les ensembles et agrave lopeacuterateur

NOT pour lalgegravebre de boole

Interpreacutetation

A B repreacutesente lintersection ce sont donc les eacuteleacutements appartenant en mecircme temps agrave lensemble A et agrave

lensemble B (A ET B)

A + B repreacutesente lunion ce sont donc les eacuteleacutements appartenant agrave lensemble A auxquels sont ajouteacutes les

eacuteleacutements de lensemble B (A OU B)

A repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble A (NOT A)

B repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble B (NOT B)

Etant donneacute que dans lalgegravebre de boole une variable ne peut contenir quune seule valeur et quon ne traite

que deux valeurs possibles (vrai 1) et (faux 0) lensemble E est constitueacute donc des valeurs vrai faux ou

encore 01 ce qui a pour conseacutequence le fait suivant la neacutegation de (vrai 1) cest (faux 0) et la neacutegation de

(faux 0) cest (vrai 1)

Dans le langage C agrave titre dexemple la seule valeur eacutequivalente agrave faux est la valeur zeacutero toutes les valeurs

diffeacuterentes de zeacutero sont consideacutereacutees comme vrai En effet les instructions if (-150) et if (150) sont toutes les

deux consideacutereacutees comme vraie alors que linstruction if (0) est consideacutereacutee comme fausse Il est doc primordiale

de ne pas confondre les termes neacutegation et opposeacute

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole

Remarque importante ne pas confondre les opeacuterateurs + et utiliseacutes dans le cadre de lalgegravebre de boole avec

ceux utiliseacutes pour les opeacuterations arithmeacutetiques

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 6 sur 81

La commutativiteacute

a + b = b + a ab = ba

Lassociativiteacute

(a + b) + c = a + (b + c) = a + b + c

(ab)c = a(bc) = abc

La distributiviteacute

a(b + c) = ab + ac

a + (bc) = (a + b)(a + c)

Lidempotence a + a + a + + a = a

aaa a = a

Leacuteleacutement neutre a + 0 = a

a1 = a

Leacuteleacutement nulliteacute 0a = 0

1 + a = 1

Labsorption a + ab = a

a(a + b) = a

La simplification

La redondance

La compleacutementariteacute

La dualiteacute Le theacuteoregraveme dual est formuleacute agrave partir du theacuteoregraveme de base en remplaccedilant les

eacuteleacutements 0 par des 1 (respectivement les 1 par des 0) et les ( ) par des ( + )

(respectivement les ( + ) par des ( ))

Exemple

a + a = a possegravede un eacutequivalent dual rarr aa = a

La loi de Morgan

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 2: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique

Table des matiegraveres

A LAlgegravebre de Boole et Diagrammes de Venn (Rappels) 4

A1 Deacutefinition 4

A2 Les opeacuterateurs logiques 4

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole 5

A4 Diagrammes de Venn 7

B Les similitudes entre la vision ensembliste et la vision relationnelle9

C Passage drsquoune vision ensembliste agrave une vision relationnelle 12

D Le langage TSQL (Transactionnel Structured Query Language) 16

D1 Les opeacuterateurs et leur prioriteacute 16

D2 Les variables 17

D3 Les structures conditionnelles 18

D4 Les structures iteacuteratives 18

D5 Les mots cleacutes usuels et leur prioriteacute 18

D6 Les cateacutegories de commandes TSQL 19

E La base de donneacutees laquoBoutiqueraquo 19

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage) 22

F1 Syntaxe du laquoSELECTraquo 22

F1a) Les options usuelles du laquoSELECTraquo 22

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles 26

F1c) Les options usuelles du laquoFROMraquo 28

F1d) Les options usuelles du laquoWHEREraquo 31

F1e) Les options usuelles du laquoGROUP BYraquo 35

F1f) Lrsquooption laquoINTOraquo 42

F2 Syntaxe de lrsquolaquoINSERTraquo 43

F3 Syntaxe de lrsquolaquoUPDATEraquo 45

F4 Syntaxe du laquoDELETEraquo 48

G Le TSQL pour manipuler les structures (Data Defintion Langage) 52

G1 Manipulations usuelles des bases de donneacutees 52

G1a) Le laquoCREATE DATABASEraquo 52

G1b) LrsquolaquoALTER DATABASEraquo 54

G1c) Le laquoDROP DATABASEraquo 56

G2 Manipulations usuelles des tables 56

G2a) Le laquoCREATE TABLEraquo 56

G2b) Le laquoUPDATE TABLEraquo 58

G2c) Le laquoDROP TABLEraquo 59

G3 Manipulations usuelles des vues 60

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo 60

G4 Manipulations usuelles des proceacutedures stockeacutees 61

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo 61

G5 Manipulations usuelles des fonctions 64

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo 64

G6 Manipulations usuelles des triggers 67

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo 67

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo 68

H Les curseurs 68

I Conception des Bases de Donneacutees avec Merise 72

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo 72

I1a) Les entiteacutes et les identifiants 72

I1b) Les associations et les cardinaliteacutes 72

(1) Les associations binaires 73

(2) Les associations reacuteflexives 73

(3) Les associations n-aires 74

(4) Les associations plurielles 74

I1c) Les regravegles de normalisation 75

I1d) Les formes normales 77

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo 79

I3 Le modegravele physique des donneacutees laquoMPDraquo 80

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 4 sur 81

A LAlgegravebre de Boole et Diagrammes de Venn (Rappels)

A1 Deacutefinition

Lrsquoalgegravebre de Boole et le chapitre des matheacutematiques qui permet drsquoadapter les techniques du calcul algeacutebrique

agrave des variables booleacuteennes (vrai ou faux true ou false ou encore 0 ou 1) et plus geacuteneacuteralement agrave des expressions

booleacuteennes

Exemples illustrant lutilisation de lalgegravebre de boole dans une communication teacuteleacutephonique entre deux

personnes

Communication = (Eacutemetteur deacutecroche) ET (Reacutecepteur deacutecroche)

Communication est laquo vrai raquo si lrsquoeacutemetteur deacutecroche ET que le reacutecepteur deacutecroche aussi

Deacutecrocher = (Sonnerie ET Deacutecision de reacutepondre) OU (deacutecision dappeler)

Deacutecrocher est laquo vrai raquo si on entend la sonnerie ET que lon deacutecide de reacutepondre ou alors si lon deacutecide tout

simplement dappeler

A2 Les opeacuterateurs logiques

Soit A et B deux variables booleacuteennes prenant soit la valeur 0 soit la valeur 1

Le reacutesultat de lopeacuteration A ET B est vrai uniquement lorsqursquoagrave la fois A et B sont vrais Dans les autres cas A ET

B donne un reacutesultat faux

Le reacutesultat de lopeacuteration A OU B est faux uniquement lorsque A et B sont tous les deux faux Dans les autres

cas A OU B donne un reacutesultat vrai

Le reacutesultat de lopeacuteration NOT A (neacutegation de A) est vrai uniquement lorsque A est faux Reacuteciproquement le

reacutesultat de lopeacuteration NOT A est faux uniquement lorsque A est vrai

Le reacutesultat de lopeacuteration A XOR B est vrai uniquement lorsque A est la neacutegation de B ou inversement Dans le

cas ougrave A et B sont eacutegaux le reacutesultat de lopeacuteration est faux

On verra un peu plus loin dans ce cours que les opeacuterateurs logiques sont tregraves utiliseacutes dans les requecirctes de

manipulation des donneacutees notamment pour la clause where La maitrise de ces opeacuterateurs joue un rocircle

primordial dans loptimisation des requecirctes SQL

Pour mieux comprendre ces opeacuterateurs on va eacutetudier leur similitude avec les opeacuterateurs dintersection dunion

et de neacutegation car finalement quand on manipule les donneacutees des tables dans une base de donneacutees avec le

langage SQL en reacutealiteacute on est en train de travailler sur des ensembles

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 5 sur 81

Soit A et B deux ensemble lopeacuterateur sera assimileacute agrave lintersection cap pour les ensembles et agrave lopeacuterateur

ET pour lalgegravebre de boole lopeacuterateur + sera assimileacute agrave lunion U pour les ensembles et agrave lopeacuterateur

OU pour lalgegravebre de boole lopeacuterateur macr sera assimileacute agrave la neacutegation pour les ensembles et agrave lopeacuterateur

NOT pour lalgegravebre de boole

Interpreacutetation

A B repreacutesente lintersection ce sont donc les eacuteleacutements appartenant en mecircme temps agrave lensemble A et agrave

lensemble B (A ET B)

A + B repreacutesente lunion ce sont donc les eacuteleacutements appartenant agrave lensemble A auxquels sont ajouteacutes les

eacuteleacutements de lensemble B (A OU B)

A repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble A (NOT A)

B repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble B (NOT B)

Etant donneacute que dans lalgegravebre de boole une variable ne peut contenir quune seule valeur et quon ne traite

que deux valeurs possibles (vrai 1) et (faux 0) lensemble E est constitueacute donc des valeurs vrai faux ou

encore 01 ce qui a pour conseacutequence le fait suivant la neacutegation de (vrai 1) cest (faux 0) et la neacutegation de

(faux 0) cest (vrai 1)

Dans le langage C agrave titre dexemple la seule valeur eacutequivalente agrave faux est la valeur zeacutero toutes les valeurs

diffeacuterentes de zeacutero sont consideacutereacutees comme vrai En effet les instructions if (-150) et if (150) sont toutes les

deux consideacutereacutees comme vraie alors que linstruction if (0) est consideacutereacutee comme fausse Il est doc primordiale

de ne pas confondre les termes neacutegation et opposeacute

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole

Remarque importante ne pas confondre les opeacuterateurs + et utiliseacutes dans le cadre de lalgegravebre de boole avec

ceux utiliseacutes pour les opeacuterations arithmeacutetiques

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 6 sur 81

La commutativiteacute

a + b = b + a ab = ba

Lassociativiteacute

(a + b) + c = a + (b + c) = a + b + c

(ab)c = a(bc) = abc

La distributiviteacute

a(b + c) = ab + ac

a + (bc) = (a + b)(a + c)

Lidempotence a + a + a + + a = a

aaa a = a

Leacuteleacutement neutre a + 0 = a

a1 = a

Leacuteleacutement nulliteacute 0a = 0

1 + a = 1

Labsorption a + ab = a

a(a + b) = a

La simplification

La redondance

La compleacutementariteacute

La dualiteacute Le theacuteoregraveme dual est formuleacute agrave partir du theacuteoregraveme de base en remplaccedilant les

eacuteleacutements 0 par des 1 (respectivement les 1 par des 0) et les ( ) par des ( + )

(respectivement les ( + ) par des ( ))

Exemple

a + a = a possegravede un eacutequivalent dual rarr aa = a

La loi de Morgan

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 3: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo 60

G4 Manipulations usuelles des proceacutedures stockeacutees 61

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo 61

G5 Manipulations usuelles des fonctions 64

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo 64

G6 Manipulations usuelles des triggers 67

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo 67

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo 68

H Les curseurs 68

I Conception des Bases de Donneacutees avec Merise 72

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo 72

I1a) Les entiteacutes et les identifiants 72

I1b) Les associations et les cardinaliteacutes 72

(1) Les associations binaires 73

(2) Les associations reacuteflexives 73

(3) Les associations n-aires 74

(4) Les associations plurielles 74

I1c) Les regravegles de normalisation 75

I1d) Les formes normales 77

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo 79

I3 Le modegravele physique des donneacutees laquoMPDraquo 80

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 4 sur 81

A LAlgegravebre de Boole et Diagrammes de Venn (Rappels)

A1 Deacutefinition

Lrsquoalgegravebre de Boole et le chapitre des matheacutematiques qui permet drsquoadapter les techniques du calcul algeacutebrique

agrave des variables booleacuteennes (vrai ou faux true ou false ou encore 0 ou 1) et plus geacuteneacuteralement agrave des expressions

booleacuteennes

Exemples illustrant lutilisation de lalgegravebre de boole dans une communication teacuteleacutephonique entre deux

personnes

Communication = (Eacutemetteur deacutecroche) ET (Reacutecepteur deacutecroche)

Communication est laquo vrai raquo si lrsquoeacutemetteur deacutecroche ET que le reacutecepteur deacutecroche aussi

Deacutecrocher = (Sonnerie ET Deacutecision de reacutepondre) OU (deacutecision dappeler)

Deacutecrocher est laquo vrai raquo si on entend la sonnerie ET que lon deacutecide de reacutepondre ou alors si lon deacutecide tout

simplement dappeler

A2 Les opeacuterateurs logiques

Soit A et B deux variables booleacuteennes prenant soit la valeur 0 soit la valeur 1

Le reacutesultat de lopeacuteration A ET B est vrai uniquement lorsqursquoagrave la fois A et B sont vrais Dans les autres cas A ET

B donne un reacutesultat faux

Le reacutesultat de lopeacuteration A OU B est faux uniquement lorsque A et B sont tous les deux faux Dans les autres

cas A OU B donne un reacutesultat vrai

Le reacutesultat de lopeacuteration NOT A (neacutegation de A) est vrai uniquement lorsque A est faux Reacuteciproquement le

reacutesultat de lopeacuteration NOT A est faux uniquement lorsque A est vrai

Le reacutesultat de lopeacuteration A XOR B est vrai uniquement lorsque A est la neacutegation de B ou inversement Dans le

cas ougrave A et B sont eacutegaux le reacutesultat de lopeacuteration est faux

On verra un peu plus loin dans ce cours que les opeacuterateurs logiques sont tregraves utiliseacutes dans les requecirctes de

manipulation des donneacutees notamment pour la clause where La maitrise de ces opeacuterateurs joue un rocircle

primordial dans loptimisation des requecirctes SQL

Pour mieux comprendre ces opeacuterateurs on va eacutetudier leur similitude avec les opeacuterateurs dintersection dunion

et de neacutegation car finalement quand on manipule les donneacutees des tables dans une base de donneacutees avec le

langage SQL en reacutealiteacute on est en train de travailler sur des ensembles

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 5 sur 81

Soit A et B deux ensemble lopeacuterateur sera assimileacute agrave lintersection cap pour les ensembles et agrave lopeacuterateur

ET pour lalgegravebre de boole lopeacuterateur + sera assimileacute agrave lunion U pour les ensembles et agrave lopeacuterateur

OU pour lalgegravebre de boole lopeacuterateur macr sera assimileacute agrave la neacutegation pour les ensembles et agrave lopeacuterateur

NOT pour lalgegravebre de boole

Interpreacutetation

A B repreacutesente lintersection ce sont donc les eacuteleacutements appartenant en mecircme temps agrave lensemble A et agrave

lensemble B (A ET B)

A + B repreacutesente lunion ce sont donc les eacuteleacutements appartenant agrave lensemble A auxquels sont ajouteacutes les

eacuteleacutements de lensemble B (A OU B)

A repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble A (NOT A)

B repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble B (NOT B)

Etant donneacute que dans lalgegravebre de boole une variable ne peut contenir quune seule valeur et quon ne traite

que deux valeurs possibles (vrai 1) et (faux 0) lensemble E est constitueacute donc des valeurs vrai faux ou

encore 01 ce qui a pour conseacutequence le fait suivant la neacutegation de (vrai 1) cest (faux 0) et la neacutegation de

(faux 0) cest (vrai 1)

Dans le langage C agrave titre dexemple la seule valeur eacutequivalente agrave faux est la valeur zeacutero toutes les valeurs

diffeacuterentes de zeacutero sont consideacutereacutees comme vrai En effet les instructions if (-150) et if (150) sont toutes les

deux consideacutereacutees comme vraie alors que linstruction if (0) est consideacutereacutee comme fausse Il est doc primordiale

de ne pas confondre les termes neacutegation et opposeacute

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole

Remarque importante ne pas confondre les opeacuterateurs + et utiliseacutes dans le cadre de lalgegravebre de boole avec

ceux utiliseacutes pour les opeacuterations arithmeacutetiques

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 6 sur 81

La commutativiteacute

a + b = b + a ab = ba

Lassociativiteacute

(a + b) + c = a + (b + c) = a + b + c

(ab)c = a(bc) = abc

La distributiviteacute

a(b + c) = ab + ac

a + (bc) = (a + b)(a + c)

Lidempotence a + a + a + + a = a

aaa a = a

Leacuteleacutement neutre a + 0 = a

a1 = a

Leacuteleacutement nulliteacute 0a = 0

1 + a = 1

Labsorption a + ab = a

a(a + b) = a

La simplification

La redondance

La compleacutementariteacute

La dualiteacute Le theacuteoregraveme dual est formuleacute agrave partir du theacuteoregraveme de base en remplaccedilant les

eacuteleacutements 0 par des 1 (respectivement les 1 par des 0) et les ( ) par des ( + )

(respectivement les ( + ) par des ( ))

Exemple

a + a = a possegravede un eacutequivalent dual rarr aa = a

La loi de Morgan

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 4: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 4 sur 81

A LAlgegravebre de Boole et Diagrammes de Venn (Rappels)

A1 Deacutefinition

Lrsquoalgegravebre de Boole et le chapitre des matheacutematiques qui permet drsquoadapter les techniques du calcul algeacutebrique

agrave des variables booleacuteennes (vrai ou faux true ou false ou encore 0 ou 1) et plus geacuteneacuteralement agrave des expressions

booleacuteennes

Exemples illustrant lutilisation de lalgegravebre de boole dans une communication teacuteleacutephonique entre deux

personnes

Communication = (Eacutemetteur deacutecroche) ET (Reacutecepteur deacutecroche)

Communication est laquo vrai raquo si lrsquoeacutemetteur deacutecroche ET que le reacutecepteur deacutecroche aussi

Deacutecrocher = (Sonnerie ET Deacutecision de reacutepondre) OU (deacutecision dappeler)

Deacutecrocher est laquo vrai raquo si on entend la sonnerie ET que lon deacutecide de reacutepondre ou alors si lon deacutecide tout

simplement dappeler

A2 Les opeacuterateurs logiques

Soit A et B deux variables booleacuteennes prenant soit la valeur 0 soit la valeur 1

Le reacutesultat de lopeacuteration A ET B est vrai uniquement lorsqursquoagrave la fois A et B sont vrais Dans les autres cas A ET

B donne un reacutesultat faux

Le reacutesultat de lopeacuteration A OU B est faux uniquement lorsque A et B sont tous les deux faux Dans les autres

cas A OU B donne un reacutesultat vrai

Le reacutesultat de lopeacuteration NOT A (neacutegation de A) est vrai uniquement lorsque A est faux Reacuteciproquement le

reacutesultat de lopeacuteration NOT A est faux uniquement lorsque A est vrai

Le reacutesultat de lopeacuteration A XOR B est vrai uniquement lorsque A est la neacutegation de B ou inversement Dans le

cas ougrave A et B sont eacutegaux le reacutesultat de lopeacuteration est faux

On verra un peu plus loin dans ce cours que les opeacuterateurs logiques sont tregraves utiliseacutes dans les requecirctes de

manipulation des donneacutees notamment pour la clause where La maitrise de ces opeacuterateurs joue un rocircle

primordial dans loptimisation des requecirctes SQL

Pour mieux comprendre ces opeacuterateurs on va eacutetudier leur similitude avec les opeacuterateurs dintersection dunion

et de neacutegation car finalement quand on manipule les donneacutees des tables dans une base de donneacutees avec le

langage SQL en reacutealiteacute on est en train de travailler sur des ensembles

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 5 sur 81

Soit A et B deux ensemble lopeacuterateur sera assimileacute agrave lintersection cap pour les ensembles et agrave lopeacuterateur

ET pour lalgegravebre de boole lopeacuterateur + sera assimileacute agrave lunion U pour les ensembles et agrave lopeacuterateur

OU pour lalgegravebre de boole lopeacuterateur macr sera assimileacute agrave la neacutegation pour les ensembles et agrave lopeacuterateur

NOT pour lalgegravebre de boole

Interpreacutetation

A B repreacutesente lintersection ce sont donc les eacuteleacutements appartenant en mecircme temps agrave lensemble A et agrave

lensemble B (A ET B)

A + B repreacutesente lunion ce sont donc les eacuteleacutements appartenant agrave lensemble A auxquels sont ajouteacutes les

eacuteleacutements de lensemble B (A OU B)

A repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble A (NOT A)

B repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble B (NOT B)

Etant donneacute que dans lalgegravebre de boole une variable ne peut contenir quune seule valeur et quon ne traite

que deux valeurs possibles (vrai 1) et (faux 0) lensemble E est constitueacute donc des valeurs vrai faux ou

encore 01 ce qui a pour conseacutequence le fait suivant la neacutegation de (vrai 1) cest (faux 0) et la neacutegation de

(faux 0) cest (vrai 1)

Dans le langage C agrave titre dexemple la seule valeur eacutequivalente agrave faux est la valeur zeacutero toutes les valeurs

diffeacuterentes de zeacutero sont consideacutereacutees comme vrai En effet les instructions if (-150) et if (150) sont toutes les

deux consideacutereacutees comme vraie alors que linstruction if (0) est consideacutereacutee comme fausse Il est doc primordiale

de ne pas confondre les termes neacutegation et opposeacute

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole

Remarque importante ne pas confondre les opeacuterateurs + et utiliseacutes dans le cadre de lalgegravebre de boole avec

ceux utiliseacutes pour les opeacuterations arithmeacutetiques

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 6 sur 81

La commutativiteacute

a + b = b + a ab = ba

Lassociativiteacute

(a + b) + c = a + (b + c) = a + b + c

(ab)c = a(bc) = abc

La distributiviteacute

a(b + c) = ab + ac

a + (bc) = (a + b)(a + c)

Lidempotence a + a + a + + a = a

aaa a = a

Leacuteleacutement neutre a + 0 = a

a1 = a

Leacuteleacutement nulliteacute 0a = 0

1 + a = 1

Labsorption a + ab = a

a(a + b) = a

La simplification

La redondance

La compleacutementariteacute

La dualiteacute Le theacuteoregraveme dual est formuleacute agrave partir du theacuteoregraveme de base en remplaccedilant les

eacuteleacutements 0 par des 1 (respectivement les 1 par des 0) et les ( ) par des ( + )

(respectivement les ( + ) par des ( ))

Exemple

a + a = a possegravede un eacutequivalent dual rarr aa = a

La loi de Morgan

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 5: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 5 sur 81

Soit A et B deux ensemble lopeacuterateur sera assimileacute agrave lintersection cap pour les ensembles et agrave lopeacuterateur

ET pour lalgegravebre de boole lopeacuterateur + sera assimileacute agrave lunion U pour les ensembles et agrave lopeacuterateur

OU pour lalgegravebre de boole lopeacuterateur macr sera assimileacute agrave la neacutegation pour les ensembles et agrave lopeacuterateur

NOT pour lalgegravebre de boole

Interpreacutetation

A B repreacutesente lintersection ce sont donc les eacuteleacutements appartenant en mecircme temps agrave lensemble A et agrave

lensemble B (A ET B)

A + B repreacutesente lunion ce sont donc les eacuteleacutements appartenant agrave lensemble A auxquels sont ajouteacutes les

eacuteleacutements de lensemble B (A OU B)

A repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble A (NOT A)

B repreacutesente la neacutegation ce sont donc tous les eacuteleacutements nappartenant pas agrave lensemble B (NOT B)

Etant donneacute que dans lalgegravebre de boole une variable ne peut contenir quune seule valeur et quon ne traite

que deux valeurs possibles (vrai 1) et (faux 0) lensemble E est constitueacute donc des valeurs vrai faux ou

encore 01 ce qui a pour conseacutequence le fait suivant la neacutegation de (vrai 1) cest (faux 0) et la neacutegation de

(faux 0) cest (vrai 1)

Dans le langage C agrave titre dexemple la seule valeur eacutequivalente agrave faux est la valeur zeacutero toutes les valeurs

diffeacuterentes de zeacutero sont consideacutereacutees comme vrai En effet les instructions if (-150) et if (150) sont toutes les

deux consideacutereacutees comme vraie alors que linstruction if (0) est consideacutereacutee comme fausse Il est doc primordiale

de ne pas confondre les termes neacutegation et opposeacute

A3 Quelques theacuteoregravemes et lois de lalgegravebre de boole

Remarque importante ne pas confondre les opeacuterateurs + et utiliseacutes dans le cadre de lalgegravebre de boole avec

ceux utiliseacutes pour les opeacuterations arithmeacutetiques

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 6 sur 81

La commutativiteacute

a + b = b + a ab = ba

Lassociativiteacute

(a + b) + c = a + (b + c) = a + b + c

(ab)c = a(bc) = abc

La distributiviteacute

a(b + c) = ab + ac

a + (bc) = (a + b)(a + c)

Lidempotence a + a + a + + a = a

aaa a = a

Leacuteleacutement neutre a + 0 = a

a1 = a

Leacuteleacutement nulliteacute 0a = 0

1 + a = 1

Labsorption a + ab = a

a(a + b) = a

La simplification

La redondance

La compleacutementariteacute

La dualiteacute Le theacuteoregraveme dual est formuleacute agrave partir du theacuteoregraveme de base en remplaccedilant les

eacuteleacutements 0 par des 1 (respectivement les 1 par des 0) et les ( ) par des ( + )

(respectivement les ( + ) par des ( ))

Exemple

a + a = a possegravede un eacutequivalent dual rarr aa = a

La loi de Morgan

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 6: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 6 sur 81

La commutativiteacute

a + b = b + a ab = ba

Lassociativiteacute

(a + b) + c = a + (b + c) = a + b + c

(ab)c = a(bc) = abc

La distributiviteacute

a(b + c) = ab + ac

a + (bc) = (a + b)(a + c)

Lidempotence a + a + a + + a = a

aaa a = a

Leacuteleacutement neutre a + 0 = a

a1 = a

Leacuteleacutement nulliteacute 0a = 0

1 + a = 1

Labsorption a + ab = a

a(a + b) = a

La simplification

La redondance

La compleacutementariteacute

La dualiteacute Le theacuteoregraveme dual est formuleacute agrave partir du theacuteoregraveme de base en remplaccedilant les

eacuteleacutements 0 par des 1 (respectivement les 1 par des 0) et les ( ) par des ( + )

(respectivement les ( + ) par des ( ))

Exemple

a + a = a possegravede un eacutequivalent dual rarr aa = a

La loi de Morgan

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 7: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 7 sur 81

A4 Diagrammes de Venn

Etant donneacute que dans les bases de donneacutees relationnelles les tables sont lieacutees agrave travers des attributs ayant des

valeurs communes (cleacutes primaires et cleacutes eacutetrangegraveres) extraire des donneacutees agrave partir de ces tables consiste agrave

eacutevaluer des expressions algeacutebriques sur des ensembles

Ci-dessous des exemples dopeacuterations sur deux ensembles A et B

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 8: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 8 sur 81

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 9: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 9 sur 81

B Les similitudes entre la vision ensembliste et la vision relationnelle

Une jointure permet de mettre en relation plusieurs tables afin den extraire des donneacutees conditionneacutees par

des comparaisons de colonnes A limage des diagrammes de Venn il existe plusieurs types de jointures Savoir

quel type de jointure utiliser deacutepend en reacutealiteacute des informations que lon souhaite extraire

Pour simplifier les choses dans un premier temps consideacuterons la table TA avec une seule colonne ida et la

table TB avec une seule colonne idb contenant respectivement les valeurs suivantes

TA(ida) = 1 2 3 4 5 6 et TB(idb) = 4 5 6 7 8 9

La jointure de la table TA avec la table TB est une opeacuteration permettant drsquoassocier les lignes de la table TA avec

celles de la table TB par le biais drsquoun preacutedicat pour creacuteer ainsi une troisiegraveme table virtuelle (en meacutemoire)

constitueacutee de deux colonnes ida et idb Geacuteneacuteralement ce preacutedicat repreacutesente le lien seacutemantique existant entre

les deux tables

Ce lien est caracteacuteriseacute par leacutegaliteacute de certaines valeurs de la colonne ida de la table TA avec celles de la colonne

idb de la Table TB (eacutegaliteacute entre la cleacute primaire et sa cleacute eacutetrangegravere sans tenir compte de linteacutegriteacute reacutefeacuterentielle1)

En partant donc de lhypothegravese que TA et TB contiennent chacune une seule colonne on peut faire les

constatations suivantes

- ida et idb possegravedent des valeurs communes 119879119860 cap 119879119861 = (4 4) (55) (6 6)

- ida possegravede des valeurs que idb ne possegravede pas 119879119860 cap 119879119861 = (1 empty) (2 empty) (3 empty) = 119879119860 minus 119879119861

- idb possegravede des valeurs que ida ne possegravede pas 119879119860 cap 119879119861 = (empty 7) (empty 8) (empty 9) = 119879119861 minus 119879119860

Repreacutesentation ensembliste de (TA ⋃ TB) TA ⋃ TB = (TA - TB) ⋃ (TA ⋂ TB) ⋃ (TB - TA)

Notons que lorsquon cherche agrave extraire les eacuteleacutements de lensemble (TA - TB) agrave travers une jointure entre TA et

TB en recherche en reacutealiteacute agrave faire correspondre les eacuteleacutements de TA qui ne sont pas contenus dans TB cagraved

(TA - TB) avec des eacuteleacutements de TB mais sachant que lintersection entre TB et (TA - TB) ne contient aucun

eacuteleacutement la jointure va donc associer chaque eacuteleacutement de lensemble (TA - TB) avec des valeurs nulles pour

1 Toute valeur de la cleacute eacutetrangegravere doit exister comme valeur de cleacute primaire (si idb est une cleacute eacutetrangegravere et ida une cleacute primaire cela

signifie que les valeurs de idb doivent exister dans ida idb sub ida)

TA

TB

ida idb

1 4

2 5

3 6

4 7

5 8

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 10: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 10 sur 81

chaque colonne de TB Si lon souhaite extraire uniquement les eacuteleacutements de (TA - TB) sans faire reacutefeacuterence aux

valeurs nulles il suffit de faire une projection2 uniquement sur la colonne ida de la table (TA - TB)

TA ___ Jointure

TA ⋂ TB

___ TB

ida ida idb idb

1 4 4 4

2 5 5 5

3 6 6 6

4 7

5 8

6 9

Repreacutesentation ensembliste de TA TB et TA ⋂ TB Repreacutesentation de la jointure TA ⋂ TB

Syntaxe simplifieacutee pour la jointure entre les tables TA et TB

SELECT | TAida | TBidb | TAida TBidb | TA | TB | TA TB | ida | idb | ida idb FROM TA [ INNER ] | LEFT | RIGHT | FULL [ OUTER ] JOIN TB ON TAida = TBidb

Remarques importantes

Le mot cleacute JOIN est obligatoire dans la requecircte de jointure

Les mots cleacutes INNER et OUTER sont optionnels

Le mot cleacute INNER est utiliseacute dans le cadre des jointures internes mais il reste optionnel cest la valeur par

deacutefaut

Le mot cleacute OUTER est utiliseacute dans le cadre des jointures externes mais il reste optionnel cest la valeur

par deacutefaut Toutefois il est obligatoire de preacuteciser la nature de cette jointure externe il existe trois sortes

de jointures externes

LEFT JOIN pour jointure gauche elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave gauche de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

droite Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

RIGHT JOIN pour jointure droite elle consiste agrave extraire tous les eacuteleacutements de la table situeacutee agrave droite de

cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table de

gauche Les eacuteleacutements qui ne possegravedent pas de correspondance seront associeacutes agrave des valeurs nulles

FULL JOIN il sagit de lunion entre la jointure gauche et la jointure droite elle consiste agrave extraire tous les

eacuteleacutements de la table situeacutee agrave gauche de cette instruction mecircme si tous les eacuteleacutements de cette table nont

pas de correspondance dans la table de droite et de les rajouter aux eacuteleacutements de la table situeacutee agrave droite

de cette instruction mecircme si tous les eacuteleacutements de cette table nont pas de correspondance dans la table

de gauche Les eacuteleacutements qui ne possegravedent pas de correspondance dans lautre table seront associeacutes agrave des

valeurs nulles

2 La projection consiste agrave afficher que les donneacutees de certaines colonnes dune table donneacutee

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 11: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 11 sur 81

Les requecirctes suivantes sont eacutequivalentes

SELECT FROM TA INNER JOIN TB ON TAida = TBidb SELECT FROM TA JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA LEFT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA LEFT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb SELECT FROM TA RIGHT JOIN TB ON TAida = TBidb

Idem pour

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb SELECT FROM TA FULL JOIN TB ON TAida = TBidb

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 12: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 12 sur 81

C Passage drsquoune vision ensembliste agrave une vision relationnelle

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

1)

INNER JOIN est identique agrave JOIN

SELECT FROM TA JOIN TB ON TAida = TBidb

------------

SELECT FROM TA INNER JOIN TB ON TAida = TBidb

------------

SELECT FROM TA TB WHERE TAida = TBidb

ida idb

4 4

5 5

6 6

2)

LEFT JOIN est identique agrave LEFT OUTER JOIN

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA LEFT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB) UNION SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

3)

RIGHT JOIN est identique agrave RIGHT OUTER JOIN

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA RIGHT OUTER JOIN TB ON TAida = TBidb

------------

SELECT TAida TBidb FROM TA TB WHERE TAida = TBidb UNION SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

ida idb

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 13: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 13 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

4)

FULL JOIN est identique agrave FULL OUTER JOIN (union avec intersection)

SELECT FROM TA FULL JOIN TB ON TAida = TBidb

------------

SELECT FROM TA FULL OUTER JOIN TB ON TAida = TBidb

ida idb

1 NULL

2 NULL

3 NULL

4 4

5 5

6 6

NULL 7

NULL 8

NULL 9

5)

Semi-jointure (intersection de TA et de TB)

SELECT TAida FROM TA WHERE EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA INTERSECT SELECT TBidb FROM TB

ida

4

5

6

6)

Anti semi-jointure avec NOT EXISTS NOT IN ou EXCEPT (TA - TB)

SELECT TAida FROM TA WHERE NOT EXISTS

(SELECT 1 FROM TB WHERE TAida = TBidb)

------------

SELECT TAida FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

------------

SELECT TAida FROM TA EXCEPT SELECT TBidb FROM TB

ida

1

2

3

7)

LEFT JOIN Exclusif (TA sans intersection)

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL

------------

SELECT TAida NULL AS idb FROM TA WHERE TAida NOT IN

(SELECT DISTINCT TBidb FROM TB)

ida idb

1 NULL

2 NULL

3 NULL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 14: Université Hassan 1 Faculté des Sciences et Techniques de ...

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 14 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

8)

RIGHT JOIN Exclusive (TB sans intersection)

SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

------------

SELECT NULL AS ida TBidb FROM TB WHERE TBidb NOT IN

(SELECT DISTINCT TAida FROM TA)

------------

SELECT NULL AS ida TBidb FROM TB WHERE NOT EXISTS

(SELECT 1 FROM TA WHERE TAida = TBidb)

ida idb

NULL 7

NULL 8

NULL 9

9)

FULL JOIN Exclusif (union sans intersection) repreacutesente lunion entre le left join exclusif et le right join exclusif

SELECT TAida TBidb FROM TA FULL JOIN TB ON TAida = TBidb WHERE TAida IS NULL OR TBidb IS NULL

------------

SELECT TAida TBidb FROM TA LEFT JOIN TB ON TAida = TBidb WHERE TBidb IS NULL UNION SELECT TAida TBidb FROM TA RIGHT JOIN TB ON TAida = TBidb WHERE TAida IS NULL

ida idb

1 NULL

2 NULL

3 NULL

NULL 7

NULL 8

NULL 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 15 sur 81

Ndeg Scheacutema Requecirctes fournissant le mecircme reacutesultat Reacutesultat

10)

CROSS JOIN (produit carteacutesien)

SELECT TAida TBidb FROM TA CROSS JOIN TB

------------

SELECT TAida TBidb FROM TA TB

Il est agrave noter que dans les deux requecirctes la condition de jointure

est absente Dans la premiegravere requecircte elle est agrave proscrire car elle

va geacuteneacuterer une erreur de syntaxe mais dans la deuxiegraveme requecircte

elle a eacuteteacute retireacutee volontairement En effet lideacutee consiste agrave

associer chaque ligne de la table TB avec toutes les lignes de la

table TA sans se preacuteoccuper du lien seacutemantique entre les donneacutees

Le reacutesultat du croisement contient 36 lignes

6 lignes de TA x 6 lignes de TB = 36 lignes

ida idb

1 4

2 4

3 4

4 4

5 4

6 4

1 5

2 5

3 5

4 5

5 5

6 5

1 6

2 6

3 6

4 6

5 6

6 6

1 7

2 7

3 7

4 7

5 7

6 7

1 8

2 8

3 8

4 8

5 8

6 8

1 9

2 9

3 9

4 9

5 9

6 9

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 16 sur 81

D Le langage TSQL (Transactionnel Structured Query Language)

Avant toute chose il est important de rappeler que TSQL est un langage de programmation speacutecifique agrave

Microsoft SQL Server Comme pour tous les langages de programmation il utilise un ensemble drsquoopeacuterateurs

de mots cleacutes et de structures Nous allons eacutetudier dans cette section les principaux eacuteleacutements de ce langage

D1 Les opeacuterateurs et leur prioriteacute

Le TSQL dispose drsquoun certain nombre drsquoopeacuterateurs et de mots cleacutes preacutefinis qui sexeacutecutent en respectant un

ordre de prioriteacute bien eacutetabli Voici donc une ideacutee non exhaustive sur la liste des opeacuterateurs la liste des mots

cleacutes et lordre de prioriteacute les concernant

Opeacuterateurs Arithmeacutetiques

+ Addition

- Soustraction

Multiplication

Division

Modulo (Reste de la division)

Opeacuterateurs de Comparaison et drsquoAffectation

= Comparaison ou affectation selon lrsquoutilisation

gt Supeacuterieur

gt= Supeacuterieur ou eacutegal

lt Infeacuterieur

lt= Infeacuterieur ou eacutegal

ltgt Diffeacuterent

expression IN (exp1 exp1 hellip expn) Compare expression agrave toutes les expressions de la liste

expression IS NULL Renvoie True si expression est NULL False dans le cas contraire

expression BETWEEN valmin AND valmax Recherche si la valeur de lrsquoexpression est comprise entre la valeur valmin et valmax Les bornes sont comprises

EXISTS (sous-requecircte) Renvoie True si la sous requecircte renvoie au moins une ligne

expression LIKE modegravele Permet de filtrer des donneacutees suivant un modegravele

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 17 sur 81

Opeacuterateurs Logiques

expression_1 AND expression_2 Retourne True si les deux expressions sont vraies

expression_1 OR expression_2 Retourne True si lrsquoune au moins des deux expressions est vraie

NOT expression Retourne True si lrsquoexpression est fausse

expression IS NULL Retourne True Si expression est NULL False dans le cas contraire

expression IS NOT NULL Retourne False Si expression est NULL True dans le cas contraire

Prioriteacute Opeacuterateurs arithmeacutetiques logiques de comparaison et daffectation

1 (Multiplication) (Division) (Modulo)

2 + (Positif) - (Neacutegatif) + (Addition) + (Concateacutenation) - (Soustraction)

3 = gt lt gt= lt= ltgt = gt lt (comparaisons)

4 NOT (Neacutegation)

5 AND

6 ALL ANY BETWEEN IN LIKE OR SOME

7 = (Affectation)

NB Pour les opeacuterateurs ayant la mecircme prioriteacute lexeacutecution se fera en fonction de lordre de leur apparition

dans les instructions de gauche vers la droite Pour imposer un ordre dexeacutecution particulier lusage des

parenthegraveses devient obligatoire

D2 Les variables

Essentiellement TSQL dispose de deux cateacutegories de variables celles deacutefinies par le deacuteveloppeur (elles doit

ecirctre preacutefixeacutee par le caractegravere laquoraquo) et celles preacutedeacutefinies dans le langage appeleacutees variables systegraveme (elles sont

preacutefixeacutee par le terme laquoraquo)

DECLARE

nom_variable [AS] type_donneacutee_scalaire [= valeur] | nom_curseur CURSOR

[ hellip ] |

nom_table [AS] TABLE (deacutefinition_colonnei | deacutefinition_contraintei [ hellip ])

deacutefinition_colonnei nom_colonnei type_donneacutee_scalaire [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [[DEFAULT valeur] | IDENTITY [(valeur_de_deacutepart valeur_du_pas)]] [[NULL | NOT NULL] | [PRIMARY KEY | UNIQUE] | CHECK (expression_logique)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 18 sur 81

deacutefinition_contraintei

PRIMARY KEY | UNIQUE (nom_colonnei [ hellip ]) | CHECK (expression_logique)

D3 Les structures conditionnelles

D4 Les structures iteacuteratives

D5 Les mots cleacutes usuels et leur prioriteacute

Prioriteacute Mot cleacute

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 TOP

NB Cet ordre est geacuteneacuteralement respecteacute Toutefois il existe des cas tregraves rares ougrave il est perturbeacute comme par

exemple lorsquil sagit dune conversion de types dans la clause laquoselectraquo Dans ce cas de figure la conversion

avec la fonction laquoconvertraquo sexeacutecutera avant la clause laquowhereraquo

A linstar des langages SQL permettant des reacutealiser des programmes le TSQL offre des instructions pour manipuler les donneacutees des instructions pour manipuler les structures et puis dautres pour creacuteer des programmes eacutelaboreacutes (proceacutedures stockeacutees fonctions deacuteclencheurs curseurs nouveaux types de donneacutees boucles )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 19 sur 81

D6 Les cateacutegories de commandes TSQL

Les commandes du langage laquoTSQLraquo sont reacutepertorieacutees dans plusieurs cateacutegories Nous allons dans ce qui suit

preacutesenter les quatre cateacutegories de ce langage

La cateacutegorie DML (DATA MANIPULATION LANGAGE) qui inclue des instructions permettant de manipuler les

donneacutees

SELECT INSERT UPDATE DELETE MERGE

La cateacutegorie DDL (DATA DEFINITION LANGAGE) qui inclue des instructions permettant de manipuler les

structures

CREATE ALTER DROP RENAME TRUNCATE COMMENT

La cateacutegorie DCL (DATA CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les droits des

utilisateurs

GRANT REVOKE

La cateacutegorie TCL (TRANSACTION CONTROL LANGAGE) qui inclue des instructions permettant de manipuler les

transactions

COMMIT ROLLBACK SAVEPOINT

E La base de donneacutees laquoBoutiqueraquo

Pour comprendre le reacutesultat produit par chaque requecircte nous allons nous baser sur la base de donneacutees

laquoBOUTIQUEraquo dont nous illustrons ci-dessous le scheacutema relationnel et les tables

Table laquoTClientsraquo

IdClient NomClient PrenomClient AdresseClient CodePostalClient VilleClient CAC

1 NA PA AA CA CASABLANCA 000

2 NB PB AB CB SALE 000

3 NC PC AC CC RABAT 000

4 ND PD AD CD CASABLANCA 000

5 NE PE AE CE SALE 000

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 20 sur 81

Table laquoTFacturesraquo

IdFacture IdClient DateFacturation

1 1 01102016

2 1 07102016

3 1 09102017

4 2 11102017

5 2 12102017

6 2 13102018

7 3 05112018

8 3 05122018

9 3 10122018

Table laquoTProduitsraquo

IdProduit DesignationProduit PrixUnitaireProduit TvaProduit

1 PA 1000 020

2 PB 1500 030

3 PC 2000 015

4 PD 2500 020

5 PE 3000 010

6 PF 4000 030

7 PG 5000 025

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 21 sur 81

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 22 sur 81

F Le TSQL pour manipuler les donneacutees (Data Manipulation Langage)

F1 Syntaxe du laquoSELECTraquo

SELECT ltoptions_du_selectgt [ INTO nouvelle_table ] [ FROM tables_sources ] [ WHERE conditions_de_recherche ] [ GROUP BY expression_de_reroupement ] [ HAVING condition_du_filtre ] [ ORDER BY ordre_affichage [ ASC | DESC ] ]

Notons quen dehors du mot cleacute laquoselectraquo les autres mots cleacutes sont optionnels Il existe donc une multitude

de possibiliteacutes pour les combiner ensemble Pour mieux illustrer ces cas de figues nous allons donner des

exemples dutilisation pour chaque mot cleacute Notons que lrsquoordre des options doit ecirctre respecteacute

F1a) Les options usuelles du laquoSELECTraquo

SELECT [DISTINCT | ALL ] [TOP ( expression ) [PERCENT] [ WITH TIES ] ] lt liste_des_attributs gt

Notons que le seul argument obligatoire pour le laquoselectraquo est la liste des attributs Ces attributs ne sont pas

forceacutement des noms de colonnes de tables existantes mais ccedila peut ecirctre eacutegalement des noms de colonnes

virtuelles (Alias) associeacutees agrave des expressions faisant reacutefeacuterence agrave des sous requecirctes ou agrave des calculs ou tout

simplement un moyen pour stockeacute un reacutesultat ou une valeur dans une variable

Exemple 1 Select ne faisant reacutefeacuterence agrave aucune table physique

SELECT Message = Bonjour tout le monde

Reacutesultat

Message

Bonjour tout le monde

SELECT Bonjour tout le monde AS Message

Reacutesultat

Message

Bonjour tout le monde

DECLARE VAL AS INT Deacuteclaration dune variable de type entier

SELECT VAL = 100 Affectation de la valeur 100 agrave cette variable

SELECT VAL AS Message

Reacutesultat

Message

100

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 23 sur 81

SELECT FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

Le dernier laquoSELECTraquo sappuie sur une table creacuteeacutee virtuellement pour ecirctre exploiteacutee durant dexeacutecution

de la requecircte

Exemple 2 Select utilisant le mot cleacute laquoFROMraquo sur une table physique

SELECT IdClient NomClient VilleClient FROM TCLIENTS

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Notons quon peut utiliser le mot cleacute laquoFROMraquo sur plusieurs tables sans faire reacutefeacuterence agrave la clause

laquoWHEREraquo pour eacutetablir les jointures qui lie ces table (voir produit carteacutesien plus haut) Mais on peut

eacutegalement rajouter cette clause pour eacutetablir les liens seacutemantiques entre ces tables ou pour speacutecifier

des conditions particuliegraveres agrave respecter pour extraire les reacutesultats

Exemple 3 Select utilisant le mot cleacute laquoDISTINCTraquo sur une ou plusieurs colonnes

SELECT DISTINCT VilleClient FROM TCLIENTS

Reacutesultat

VilleClient

CASABLANCA

SALE

RABAT

Notons que ce terme peut sappliquer eacutegalement sur plusieurs colonnes simultaneacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 24 sur 81

SELECT DISTINCT IdClient DateFacturation FROM TFACTURES

Reacutesultat

IdClient DateFacturation

1 01092016

1 03092016

2 02102016

2 03102016

3 05112016

Exemple 4 Select utilisant le mot cleacute laquoFROMraquo sur plusieurs tables physiques

SELECT DISTINCT DesignationProduit FROM TCLIENTS TFACTURES TCOMMANDES TPRODUITS WHERE TCLIENTSIdClient = 1 AND TCLIENTSIdClient = TFACTURESIdClient AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Cette requecircte permet dafficher la liste des produits acheteacutes par le client Ndeg 1 Etant donneacute qursquoelle

nrsquoaffiche aucun attribut de la table des clients et que le code client se trouve eacutegalement dans la table

des factures en tant que cleacute eacutetrangegravere on aurait pu lrsquooptimiser en retirant toute reacutefeacuterence agrave cette table

et en exploitant le code du client se trouvant dans la table des factures Cette opeacuteration va nous

permettre drsquoeacuteviter de faire un produit carteacutesien suppleacutementaire inutilement

SELECT DISTINCT DesignationProduit FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdClient = 1 AND TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit

Reacutesultat

DesignationProduit

PA

PB

PC

PD

PE

Exemple 5 Select utilisant le mot cleacute laquoALLraquo

laquoALLraquo permet de comparer chaque valeur dune colonne pour savoir si elle reacutepond agrave un critegravere donneacute

vis-agrave-vis dune liste de valeurs retourneacutees par une sous-requecircte Autrement dit ce mot permet de

veacuterifier si une valeur donneacutee reacutepond agrave une condition = ltgt gt gt= lt ou lt= pour lensemble

des valeurs retourneacutees par la sous-requecircte

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 25 sur 81

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE PrixUnitaireProduit ltgt ALL (sous-requecircte pour lextraction des prix multiples de 10 pour utiliser le modulo laquoraquo il faut convertir le prix en entier

SELECT PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 = 0 )

Pour retrouver le mecircme reacutesultat il est eacutevident quon aurait pu faire simplement avec la requecircte qui

suit mais on nrsquoaurait pas pu expliquer le fonctionnement du mot cleacute laquoALLraquo

SELECT DesignationProduit PrixUnitaireProduit FROM TPRODUITS WHERE CONVERT(int PrixUnitaireProduit)10 ltgt 0

Reacutesultat

DesignationProduit PrixUnitaireProduit

PB 1500

PD 2500

Exemple 6 Select utilisant le mot cleacute laquoTOPraquo

laquoTOPraquo permet drsquoextraire les n premiegraveres lignes ou alors un pourcentage de lignes dune table donneacutee

selon lrsquoordre de lecture de ces lignes Si la clause laquoORDER BYraquo est speacutecifieacutee avec le laquoSELECTraquo les lignes

sont tout dabord trieacutees avant lextraction

Lorsque le mot cleacute laquoWITH TIESraquo est utiliseacute conjointement avec laquoTOPraquo la clause laquoORDER BYraquo devient

obligatoire car le rocircle de ce mot cleacute est de rajouter parmi les lignes trieacutees toutes celles ayant le mecircme

classement que la derniegravere ligne extraire par laquoTOPraquo pour mieux comprendre voyons les reacutesultats des

3 requecirctes suivantes

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre de lecture

DesignationProduit TvaProduit

PA 020

PB 030

PC 015

PD 020

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 26 sur 81

SELECT TOP (4) DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOPraquo renvoie les 4 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020

PD 020

SELECT TOP (3) WITH TIES DesignationProduit TvaProduit FROM TPRODUITS ORDER BY TvaProduit ASC

Reacutesultat le laquoTOP WITH TIESraquo renvoie 3 + 1 premiegraveres lignes selon lordre du tri

DesignationProduit TvaProduit

PE 010

PC 015

PA 020 Derniegravere ligne du TOP(3)

PD 020 Ligne ajouteacutee par lrsquoinstruction WITH TIES

Le laquoTOPraquo renvoi les 3 premiegraveres lignes selon lordre de tri + les lignes ayant le mecircme classement que

la derniegravere ligne du TOP(3) Dans notre cas il sagit dune seule ligne concernant le produit PD avec une

tva de 020

F1b) Le laquoSELECTraquo utilisant les fonctions dagreacutegation usuelles

SELECT COUNT | MAX | MIN | AVG ( [ [ ALL | DISTINCT ] expression ] | ) [ AS alias ]

Notons que les accolades sont lagrave uniquement pour deacutesigner les termes obligatoires et les crochets pour deacutesigner les termes optionnels Le symbole laquoraquo fait reacutefeacuterence agrave toutes les colonnes des tables sur lesquelles opegravere la seacutelection Dans le cas des fonctions dagreacutegation ce symbole ne fonctionne quavec la fonction laquoCOUNTraquo Par ailleurs le terme laquoALLraquo est la valeur par deacutefaut il permet dappliquer la fonction dagreacutegation agrave toutes les valeurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 27 sur 81

--------------------------- COUNT ---------------------------

expression fait reacutefeacuterence agrave un argument de tous les types sauf les fonctions dagreacutegation les sous-

requecirctes les types image text et ntext

COUNT() renvoie le nombre de lignes dun select Les valeurs nulles laquoNULLraquo et les doublons sont

comptabiliseacutes

COUNT(ALL expression) eacutevalue lrsquoexpression pour chaque ligne puis renvoie le nombre de valeurs non

nulles laquoNULLraquo laquoALLraquo est la valeur par deacutefaut

COUNT(DISTINCT expression) eacutevalue lexpression pour chaque ligne drsquoun groupe et renvoie le nombre

de valeurs uniques et non nulles laquoNULLraquo

Pour un nombre de valeurs supeacuterieur agrave 231 - 1 cette fonction renvoie une erreur A ce moment il est

preacutefeacuterable dutilisez la fonction COUNT_BIG qui peut renvoyer un nombre de valeurs allant jusquagrave

263- 1

--------------------------- MAX ---------------------------

Cette fonction renvoie la valeur maximale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus grande valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MAX(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale laquoALLraquo est la valeur par

deacutefaut

MAX(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur maximale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

--------------------------- MIN ---------------------------

Cette fonction renvoie la valeur minimale de lexpression Elle ignore toutes les valeurs nulles laquoNULLraquo

Pour les colonnes de type chaine de caractegraveres elle renvoie la plus petite valeur dans lordre

alphabeacutetique Lorsque lexpression est eacutevalueacutee agrave nulle

laquoNULLraquo elle renvoie laquoNULLraquo

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction peut ecirctre appliqueacutee sur

des valeurs numeacuteriques chaines de caractegraveres ou encore de type laquodatetimeraquo agrave lexception des

fonctions dagreacutegation des sous-requecirctes et le type bit

MIN(ALL expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale laquoALLraquo est la valeur par

deacutefaut

MIN(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la valeur minimale le terme laquoDISTINCTraquo

na aucun effet sur le reacutesultat

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 28 sur 81

--------------------------- SUM ---------------------------

Cette fonction renvoie la somme des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

SUM(ALL expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

SUM(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la sommes des valeurs distinctes non

nulles laquoNULLraquo

--------------------------- AVG ---------------------------

Cette fonction renvoie la moyenne des valeurs relatives agrave lexpression Elle ignore toutes les valeurs

nulles laquoNULLraquo et ne peut ecirctre utiliseacutee que sur des colonnes contenant des valeurs numeacuteriques

expression fait reacutefeacuterence au nom dune colonne au nom dune fonction agrave une expression

arithmeacutetique ou de concateacutenation ou encore agrave une constante Cette fonction ne peut ecirctre appliqueacutee

que sur des valeurs numeacuteriques Les fonctions dagreacutegation les sous-requecirctes et le type bit ne sont pas

compatibles avec cette fonction

AVG(ALL expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs non nulles laquoNULLraquo

laquoALLraquo est la valeur par deacutefaut

AVG(DISTINCT expression) eacutevalue lrsquoexpression puis renvoie la moyenne des valeurs distinctes non

nulles laquoNULLraquo

F1c) Les options usuelles du laquoFROMraquo

FROM lt table_source1 table_source2 table_sourcen gt

Options usuelles pour laquotable_sourceiraquo table_physique [ [ AS ] tab_alias ] | table_view [ [ AS ] tab_alias ] | table_deriveacutee [ [ AS ] tab_alias ] [ ( col1 col2 colp ) ] | ltjointuregt

table_physique fait reacutefeacuterence agrave une table physique existante

table_view fait reacutefeacuterence agrave une vue preacutedeacutefinie (view table virtuelle)

table_deriveacutee fait reacutefeacuterence agrave une sous requecircte faisant office de table virtuelle

ltjointuregt expression exprimant les jointures entre des tables

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 29 sur 81

Une laquotable_physiqueraquo est une table dont la structure et les donneacutees sont meacutemoriseacutes de faccedilon

permanente sur le disque dur de lrsquoordinateur Pour les exemples de requecirctes utilisant des tables

physiques priegravere de se reacutefeacuterer aux exemples citeacutes plus haut (en page 22)

Une laquotable_viewraquo est une table virtuelle associeacutee aux reacutesultats drsquoune requecircte laquoselectraquo preacutedeacutefinie En

effet contrairement agrave une laquoviewraquo qui est ni plus ni moins qursquoune requecircte laquoselectraquo portant un nom et

preacuteenregistreacutee physiquement au niveau de la base de donneacutees la laquotable_viewraquo repreacutesente le reacutesultat

obtenu suite agrave lrsquoexeacutecution de la laquoviewraquo (vue en franccedilais) au niveau de la meacutemoire virtuelle Ce reacutesultat

nrsquoest visible que par la requecircte faisant appel agrave cette laquotable_viewraquo et sa dureacutee de vie est par conseacutequent

limiteacutee agrave cet appel Autrement dit on parlera drsquoune vue comme eacutetant le reacutesultat drsquoune requecircte

preacuteenregistreacutee qui peut ecirctre exploiteacute par drsquoautres requecirctes comme eacutetant une table temporaire qui

existera - au niveau de la RAM - le temps drsquoexeacutecution de ces requecirctes Pour les exemples de requecirctes

utilisant des vues priegravere de se reacutefeacuterer aux exemples citeacutes dans la section (G3 plus bas

Une laquotable_deriveacuteeraquo est identique agrave une laquotable_viewraquo agrave la diffeacuterence majeure qursquoelle nrsquoest pas associeacutee

agrave une requecircte preacuteenregistreacutee Son code est imbriqueacute agrave lrsquointeacuterieur drsquoune requecircte appelante on parle alors

de sous-requecircte Notons qursquoavec les tables deacuteriveacutees on peut utiliser plusieurs niveaux drsquoimbrication

Une laquojointureraquo fait reacutefeacuterence aux instructions de jointure permettant de lier les laquotable_sourceiraquo entre elles agrave travers une syntaxe speacutecifique Pour les exemples de requecirctes utilisant des jointures veuillez-vous reacutefeacuterer aux exemples citeacutes plus haut

Exemple 7 Le laquoFROMraquo utilisant une table deacuteriveacutee constitueacutee de valeurs constantes

SELECT IdMot Mot FROM ( VALUES (1 Bonjour) (2 Tout) (3 Le) (4 Monde) ) AS TableDerivee (IdMot Mot)

Reacutesultat

IdMot Mot

1 Bonjour

2 Tout

3 Le

4 Monde

laquoTableDeriveeraquo laquoIdMotraquo et laquoMotraquo sont des alias repreacutesentant respectivement le nom de

lrsquoensemble constitueacute par les couples de valeurs le nom associeacute agrave la premiegravere colonne de chaque

couple de valeurs le nom associeacute agrave la deuxiegraveme colonne de chaque couple de valeurs laquoTableDeriveeraquo

est donc assimileacutee agrave une variable de type table creacuteeacutee virtuellement agrave partir drsquoune liste fixe de valeurs

pour ecirctre exploiteacutee durant lexeacutecution du laquoSELECTraquo La porteacutee et la dureacutee de vie de cette table sont

donc limiteacutees au processus de la requecircte appelante

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 30 sur 81

Exemple 8 Le laquoFROMraquo utilisant une table deacuteriveacutee non constante (sous-requecircte)

SELECT TCIdClient TCNomClient TCVilleClient FROM ( SELECT FROM TCLIENTS ) AS TC

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

5 NE SALE

Exemple 9 Le laquoFROMraquo utilisant une jointure entre une table et une sous-requecircte

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS ( SELECT DISTINCT IdClient FROM TFACTURES ) AS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

Exemple 10 Le laquoFROMraquo utilisant une vue (view)

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT FROM TF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 31 sur 81

Reacutesultat

IdClient

1

2

3

Exemple 11 Le laquoFROMraquo utilisant la jointure entre une table et une vue

CREATE VIEW TF AS creacuteation drsquoune vue nommeacutee TF ( SELECT DISTINCT IdClient FROM TFACTURES )

------------

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS TF WHERE TCLIENTSIdClient = TFIdClient

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

3 NC RABAT

F1d) Les options usuelles du laquoWHEREraquo

WHERE lt conditions_de_recherche gt

Options usuelles pour laquoconditions_de_rechercheraquo [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) [ AND | OR [ NOT ] ltpreacutedicatgt | ( lt conditions_de_recherche gt ) ] [ n ] Options usuelles pour laquopreacutedicatraquo expression = | lt gt | = | gt | gt = | lt | lt = expression | expression [ NOT ] BETWEEN expression AND expression | expression_chaine [ NOT ] LIKE ltmodegravele_chainegt [ ESCAPE caractegravere ] | expression [ NOT ] IN (sous-requecircte | expression [ n ]) | expression [ NOT ] EXISTS (sous-requecircte) | expression IS [ NOT ] NULL | scalaire = | lt gt | = | gt | gt = | lt | lt = [ SOME | ANY | ALL] (sous-requecircte)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 32 sur 81

Option usuelles pour laquomodegravele_chaineraquo

Modegravele Pouvant ecirctre remplaceacute par

Chaicircne de de caractegraveres quelconque (mecircme vide)

_ Un caractegravere quelconque

[chaine] Un caractegravere parmi ceux figurant dans la chaine

[^chaine] Un caractegravere en dehors de ceux figurant dans la chaine

[car1ndashcarn] Un caractegravere parmi ceux se trouvant dans lrsquointervalle car1 agrave carn

[^car1ndashcarn] Un caractegravere en dehors de ceux se trouvant dans lrsquointervalle car1 agrave carn

Exemple 12 Le laquoWHEREraquo utilisant des opeacuterateurs logiques et de comparaison

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE ((IdClient gt= 1) AND (IdClient lt 3)) OR (IdClient gt= 5))

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

2 NB SALE

5 NE SALE

Exemple 13 Le laquoWHEREraquo utilisant BETWEEN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient BETWEEN 2 AND 4

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

3 NC RABAT

4 ND CASABLANCA

Exemple 14 Le laquoWHEREraquo utilisant LIKE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquoCasablancarsquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 33 sur 81

Reacutesultat

IdClient NomClient VilleClient

1 NA CASABLANCA

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec lrsquoopeacuterateur eacutegal (de comparaison)

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE VilleClient LIKE lsquorsquo + lsquoabrsquo + lsquorsquo

Reacutesultat Toutes les villes contenant la chaine de caractegraveres lsquoabrsquo

IdClient NomClient VilleClient

1 NA CASABLANCA

3 NC RABAT

4 ND CASABLANCA

On aurait pu obtenir le mecircme reacutesultat avec LIKE lsquoabrsquo

Exemple 15 Le laquoWHEREraquo utilisant IN

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient IN (2 4 5)

Reacutesultat

IdClient NomClient VilleClient

2 NB SALE

4 ND CASABLANCA

5 NE SALE

SELECT IdClient NomClient VilleClient FROM TCLIENTS WHERE IdClient NOT IN (SELECT DISTINCT IdClient FROM TFACTURES)

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 34 sur 81

Exemple 16 Le laquoWHEREraquo utilisant EXISTS

SELECT CIdClient CNomClient CVilleClient FROM TCLIENTS AS C WHERE NOT EXISTS ( SELECT FIdClient FROM TFACTURES AS F WHERE FIdClient = CIdClient )

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 17 Le laquoWHEREraquo utilisant IS NULL

SELECT TCLIENTSIdClient NomClient VilleClient FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFacturesIdClient WHERE TFacturesIdClient IS NULL

Reacutesultat Tous les clients qui nrsquoont pas de factures

IdClient NomClient VilleClient

4 ND CASABLANCA

5 NE SALE

Exemple 18 Le laquoWHEREraquo utilisant SOME (alias de ANY)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND IdProduit = SOME ( SELECT IdProduit FROM TPRODUITS WHERE PrixUnitaireproduit BETWEEN 20 AND 40 )

Reacutesultat Clients ayant acheteacute un produit dont le prix est compris entre 20 et 40

IdClient

1

2

3

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 35 sur 81

Exemple 19 Le laquoWHEREraquo utilisant ALL (incompatible avec Order By et Into dans un Select)

SELECT DISTINCT IdClient FROM TFACTURES TCOMMANDES WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND Qt_cmd gt= ALL ( SELECT DISTINCT Qt_cmd FROM TCOMMANDES WHERE IdProduit IN (1 2 3) )

Reacutesultat Clients ayant commandeacute une quantiteacute dun produit supeacuterieure ou eacutegale agrave celles relatives aux produits 1 2 et 3

IdClient

1

3

F1e) Les options usuelles du laquoGROUP BYraquo

GROUP BY [ lt colonne1 hellip colonnengt ] | [ ROLLUP | CUBE | GROUPING SETS(lt colonne1 hellip colonnengt) ]

Le laquoGROUP BYraquo est une instruction qui srsquoexeacutecute apregraves lrsquoeacutevaluation des conditions lieacutees agrave la clause

laquoWHEREraquo et qui permet drsquoeffectuer des regroupements de lignes selon les valeurs drsquoune ou de plusieurs

colonnes En effet toutes les valeurs identiques sur une colonne ou sur plusieurs colonnes seront rameneacutees

agrave une seule ligne avec la possibiliteacute drsquoeffectuer des calculs sur les lignes objet du groupement

lt colonnei gt Deacutesigne la colonne drsquoune table drsquoune table deacuteriveacutee ou encore drsquoune vue Les tables les tables

deacuteriveacutees ou encore les vues contenant ces colonnes doivent obligatoirement figurer dans la clause laquoFROMraquo

Toute colonne non calculable figurant dans le laquoSELECTraquo doit figurer obligatoirement dans la clause laquoGROUP

BYraquo Toutefois les alias figurant dans le laquoSELECTraquo ne sont pas autoriseacutes exception faite pour les alias des

tables deacuteriveacutees figurant dans la clause laquoFROMraquo Par ailleurs les tables deacuteriveacutees et les colonnes de type

image text ou ntext ne sont pas autoriseacutees

ltROLLUPgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du

groupement en retirant agrave chaque fois une colonne en partant de la droite vers la gauche pour eacutevaluer la

fonction drsquoagreacutegation

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo ROLLUP(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de de colonnes en diminuant le nombre

de colonnes de la droite vers la gauche

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 36 sur 81

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL NULL NULL total global

ltCUBEgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque combinaison de colonnes du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo CUBE(colonne1

colonne2 colonne3) creacutee des sous-totaux pour chaque combinaison de colonnes

colonne1 colonne2 colonne3 sous-total(par valeur du triplet (colonne1 colonne2 colonne3))

colonne1 colonne2 NULL sous-total(par valeur du doublet (colonne1 colonne2))

colonne1 NULL colonne3 sous-total(par valeur du doublet (colonne1 colonne3))

NULL colonne2 colonne3 sous-total(par valeur du doublet (colonne2 colonne3))

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

NULL NULL NULL total global

ltGROUPING SETSgt Permet drsquoeacutevaluer la fonction drsquoagreacutegation pour chaque colonne du groupement

A titre drsquoexemple dans le cas de la fonction drsquoagreacutegation laquoSUMraquo deacutefinie dans le laquoSELECTraquo GROUPING

SETS(colonne1 colonne2 colonne3) creacutee des sous-totaux pour chaque colonne

colonne1 NULL NULL sous-total(par valeur de (colonne1))

NULL colonne2 NULL sous-total(par valeur de (colonne2))

NULL NULL colonne3 sous-total(par valeur de (colonne3))

Lrsquoexemple ci-dessous illustre le regroupement de la table de commandes selon le code de la facture

Table laquoTCommandesraquo

IdFacture IdProduit Qt_Cmd

1 1 10

1 2 20

1 3 30

2 2 10

2 3 20

2 4 30

3 3 10

3 4 20

3 5 30

4 1 5

4 2 10

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 37 sur 81

4 3 15

5 2 5

5 3 10

5 4 15

6 3 20

6 4 20

6 5 20

7 3 3

7 4 4

7 5 5

8 1 10

8 2 20

8 3 30

9 2 2

9 3 3

9 4 4

Exemple 20 Le laquoGROUP BYraquo sur une colonne utilisant une seule table

SELECT IdFacture FROM TCOMMANDES GROUP BY IdFacture

SELECT IdFacture COUNT(IdProduit) AS NBP FROM TCOMMANDES GROUP BY IdFacture

Reacutesultat groupement par IdFacture puis en calculant le nombre de produits par facture

IdFacture

1

2

3

4

5

6

7

8

9

IdFacture NBP

1 3

2 3

3 3

4 3

5 3

6 3

7 3

8 3

9 3

Exemple 21 Le laquoGROUP BYraquo sur une colonne utilisant deux tables

SELECT IdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TCOMMANDES TPRODUITS WHERE TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdFacture

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 38 sur 81

Reacutesultat

IdFacture MF

1 120000

2 155500

3 182000

4 60000

5 77750

6 172000

7 35400

8 120000

9 22800

Exemple 22 Le laquoGROUP BYraquo sur deux colonnes utilisant plusieurs tables

SELECT IdClient TCOMMANDESIdFacture SUM (Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient TCOMMANDESIdFacture

Reacutesultat groupement par IdFacture et par IdClient et calcul du montant de la facture

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

2 4 60000

2 5 77750

2 6 172000

3 7 35400

3 8 120000

3 9 22800

Exemple 23 Le laquoGROUP BYraquo sur deux colonnes avec laquoROLLUPraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY ROLLUP(IdClient TFACTURESIdFacture)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 39 sur 81

Reacutesultat groupement par IdFacture et par IdClient avec laquoROLLUPraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

1 2 155500

1 3 182000

1 NULL 457500

2 4 60000

2 5 77750

2 6 172000

2 NULL 309750

3 7 35400

3 8 120000

3 9 22800

3 NULL 178200

NULL NULL 945450

Exemple 24 Le laquoGROUP BYraquo sur deux colonnes avec laquoCUBEraquo utilisant plusieurs tables

SELECT IdClient TFACTURESIdFacture SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY CUBE(IdClient TFACTURESIdFacture)

Reacutesultat groupement par IdFacture et par IdClient avec laquoCUBEraquo pour calculer les montants des factures le chiffre drsquoaffaire par client puis le chiffre drsquoaffaire reacutealiseacute avec lrsquoensemble des clients

IdClient IdFacture MF

1 1 120000

NULL 1 120000

1 2 155500

NULL 2 155500

1 3 182000

NULL 3 182000

2 4 60000

NULL 4 60000

2 5 77750

NULL 5 77750

2 6 172000

NULL 6 172000

3 7 35400

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 40 sur 81

NULL 7 35400

3 8 120000

NULL 8 120000

3 9 22800

NULL 9 22800

NULL NULL 945450

1 NULL 457500

2 NULL 309750

3 NULL 178200

Exemple 25 Le laquoGROUP BYraquo utilisant laquoGROUPING SETSraquo

SELECT idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA_MF FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY GROUPING SETS(idClient TFACTURESIdFacture DATEPART(yyyyDateFacturation))

Reacutesultat calcul des montants des factures du chiffre drsquoaffaire par anneacutee et du chiffre drsquoaffaire par client

IdClient IdFacture Anneacutee CA_MF

NULL NULL 2016 275500

NULL NULL 2017 319750

NULL NULL 2018 350200

NULL 1 NULL 120000

NULL 2 NULL 155500

NULL 3 NULL 182000

NULL 4 NULL 60000

NULL 5 NULL 77750

NULL 6 NULL 172000

NULL 7 NULL 35400

NULL 8 NULL 120000

NULL 9 NULL 22800

1 NULL NULL 457500

2 NULL NULL 309750

3 NULL NULL 178200

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 41 sur 81

Exemple 26 Le laquoGROUP BYraquo sur une expression utilisant plusieurs tables et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DATEPART(yyyyDateFacturation) ORDER BY Anneacutee ASC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee

Anneacutee CA

2016 275500

2017 319750

2018 350200

Exemple 27 Le laquoGROUP BYraquo utilisant laquoHAVINGraquo et laquoORDER BYraquo

SELECT DATEPART(yyyyDateFacturation) AS Anneacutee SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CA FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit AND DATEPART(yyyyDateFacturation) gt 2016 GROUP BY DATEPART(yyyy DateFacturation) HAVING SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) gt 3000 ORDER BY CA DESC

Reacutesultat calcul du chiffre drsquoaffaire par anneacutee avec des conditions dans les clauses laquoWHEREraquo et laquoHAVINGraquo

Anneacutee CA

2018 350200

2017 319750

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 42 sur 81

F1f) Lrsquooption laquoINTOraquo

INTO lt nom_nouvelle_table gt

Le laquoINTOraquo est une instruction qui permet de creacuteer une nouvelle table physique dont les attributs seront ceux qui figurent dans la clause laquoSELECTraquo

Exemple 28 Le laquoSELECT INTOraquo utilisant laquoGROUP BYraquo et laquoIDENTITYraquo

SELECT IDENTITY(INT 1 1) AS IdNewTab IdClient DesignationProduit SUM(Qt_CmdPrixUnitaireProduit(1 + TvaProduit)) AS CAP INTO NewTab FROM TFACTURES TCOMMANDES TPRODUITS WHERE TFACTURESIdFacture = TCOMMANDESIdFacture AND TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient DesignationProduit GO SELECT FROM NewTab

Reacutesultat creacuteation drsquoune nouvelle table laquo NewTab raquo contenant les chiffres drsquoaffaires des clients par produit

IdNewTab IdClient DesignationProduit CAP

1 1 PA 12000

2 2 PA 6000

3 3 PA 12000

4 1 PB 58500

5 2 PB 29250

6 3 PB 42900

7 1 PC 138000

8 2 PC 103500

9 3 PC 82800

10 1 PD 150000

11 2 PD 105000

12 3 PD 24000

13 1 PE 99000

14 2 PE 66000

15 3 PE 16500

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 43 sur 81

F2 Syntaxe de lrsquolaquoINSERTraquo

LrsquolaquoINSERTraquo permet drsquoajouter des lignes agrave une table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de cette

instruction nous allons nous appuyer sur la table laquoNewTabraquo creacuteeacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme eacutetant cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un

champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs en plus de lrsquoinsertion des lignes dans la table de destination le processus drsquoinsertion stocke les

lignes inseacutereacutees dans une table virtuelle speacuteciale nommeacutee laquoINSERTEDraquo Cette table adopte la structure et les

attributs de la table drsquoorigine En effet les colonnes de cette table sont automatiquement mappeacutees sur les

colonnes de la table sur laquelle est effectueacutee lrsquoinsertion

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations

drsquoinsertion nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 29 Insertion drsquoune nouvelle ligne constante

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200)

Exemple 30 Insertion de plusieurs lignes constantes

INSERT INTO NewTab (IdClient DesignationProduit CAP) VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 31 Insertion de plusieurs lignes constantes sans speacutecifier les noms des colonnes

- Les valeurs doivent ecirctre fournies dans lrsquoordre des champs dans la table INSERT INTO NewTab VALUES (20 PA 200) (30 PB 300) (40 PC 400)

Exemple 32 Insertion de plusieurs lignes constantes en speacutecifiant les valeurs pour la cleacute primaire

- Les valeurs 32 33 et 34 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (IdNewTab IdClient DesignationProduit CAP) VALUES (32 2 PA 20) (33 3 PA 30) (34 4 PA 40) SET IDENTITY_INSERT NewTab OFF

Exemple 33 Insertion de lignes constantes sans respecter lrsquoordre des colonnes dans la table

- Les valeurs 35 36 et 37 pour la cleacute primaire ne doivent pas exister dans la table SET IDENTITY_INSERT NewTab ON INSERT INTO NewTab (DesignationProduit IdClient CAP IdNewTab) VALUES (PA 2 20 35) (PA 3 30 36) (PA 4 40 37) SET IDENTITY_INSERT NewTab OFF

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 44 sur 81

Exemple 34 Insertion agrave travers un laquoSELECTraquo sans preacuteciser les colonnes de destination

- Lrsquoordre des colonnes dans le select doit correspondre agrave celui de la table - La colonne de la cleacute primaire ne doit pas ecirctre inseacutereacutee (risque de doublons) INSERT INTO NewTab SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 35 Insertion agrave travers un laquoSELECTraquo en preacutecisant les colonnes de destination

INSERT INTO NewTab (IdClient DesignationProduit CAP) SELECT IdClient DesignationProduit CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 36 Insertion agrave travers un laquoSELECTraquo sans respecter lrsquoordre des colonnes dans la table

INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 30

Exemple 37 Insertion agrave travers un laquoSELECTraquo en utilisant laquoINSERT TOPraquo sans laquoORDER BYraquo

- Order by dans lrsquoinsert nrsquoa aucun impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT TOP(3) INTO NewTab (DesignationProduit IdClient CAP) SELECT DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10

Exemple 38 Insertion agrave travers un laquoSELECT TOPraquo en utilisant laquoINSERTraquo avec laquoORDER BYraquo

- Order by dans le select agrave un impact sur lrsquoordre des lignes qui vont ecirctre ajouteacutees INSERT INTO NewTab (DesignationProduit IdClient CAP) SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 45 sur 81

Exemple 39 Insertion et affichage des lignes ajouteacutees avec laquoOUTPUT INSERTEDraquo

- INSERTED est le nom de la table temporaire qui contient les lignes ajouteacutees ou modifieacutees INSERT INTO NewTab (DesignationProduit IdClient CAP)

OUTPUT INSERTED SELECT TOP(3) DesignationProduit IdClient CAP FROM NewTab WHERE IdNewTab gt 10 ORDER BY CAP DESC

F3 Syntaxe de lrsquolaquoUPDATEraquo

LrsquolaquoUPDATEraquo permet de mettre agrave jour les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation

de cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le

champ laquoIdNewTabraquo comme eacutetant une cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement

comme un champ auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de modification stocke les lignes avant leur modification dans une table virtuelle

speacuteciale nommeacutee laquoDELETEDraquo et les lignes modifieacutees dans une table virtuelle nommeacutee laquoINSERTEDraquo Ces tables

adoptent la structure et les attributs de la table drsquoorigine En effet les colonnes des tables laquoINSERTEDraquo et

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la mise agrave

jour

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

modification nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 40 Modification de toutes les valeurs drsquoune colonne sans la clause laquoWHEREraquo

UPDATE NewTab SET CAP = CAP 120

Exemple 41 Modification des donneacutees conditionneacutee agrave travers la clause laquoWHEREraquo

UPDATE NewTab SET CAP = 10000 DesignationProduit = lsquoPArsquo IdClient = 3 WHERE IdNewTab = 11

Exemple 42 Modification des donneacutees en utilisant laquoDEFAULTraquo

DEFAULT fait reacutefeacuterence en prioriteacute agrave la valeur par deacutefaut mais si aucune valeur par deacutefaut nrsquoest deacutefinie et que NULL est autoriseacute crsquoest le NULL qui sera attribueacute au champ CAP UPDATE NewTab SET CAP = DEFAULT WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 46 sur 81

Exemple 43 Modification des donneacutees en utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire UPDATE TOP (3) NewTab SET CAP = CONVERT(INT CAP)

Exemple 44 Modification des donneacutees en utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement UPDATE NewTab SET CAP = CONVERT(INT CAP) FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 45 Modification des donneacutees en utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = CONVERT(INT CAP) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 46 Modification des donneacutees agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes modifieacutees agrave partir de deleted et inserted UPDATE NewTab SET CAP = ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T ) OUTPUT DELETEDIdNewTab DELETEDCAP AS OLD_CAP INSERTEDCAP AS NEW_CAP WHERE IdNewTab IN (13 14 15)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 47 sur 81

Exemple 47 Modification des donneacutees agrave travers une fonction

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END Mise agrave jour de la table agrave travers la fonction ne pas oublier drsquoutiliser le preacutefixe dbo UPDATE NewTab SET CAP = dbofct_ca_par_client_produit(IdClient DesignationProduit)

Exemple 48 Modification des donneacutees agrave travers une sous-requecircte retournant plusieurs lignes

UPDATE NewTab SET NewTabCAP = TSRNCAP FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit

Exemple 49 Modification des donneacutees agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la modification ne doit porter que sur les colonnes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 48 sur 81

UPDATE View_NewTab SET CAP = 100

Exemple 50 Modification des donneacutees agrave travers un alias

UPDATE NT SET NTCAP = 100 FROM NewTab AS NT JOIN TCLIENTS ON NTIdClient = TCLIENTSIdClient JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTIdClient IN (1 3) AND TvaProduit = 02 AND Qt_Cmd gt= 10

Exemple 51 Modification des donneacutees dans une variable de type table

La modification des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab WHERE IdNewTab gt 15 Mise agrave jour des donneacutees dans la variable locale UPDATE VarTab SET VarCAP += 10 Les donneacutees ont eacuteteacute modifieacutees au niveau de la variable locale SELECT FROM VarTab Les donneacutees restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

F4 Syntaxe du laquoDELETEraquo

Le laquoDELETEraquo permet de supprimer les lignes drsquoune table Pour illustrer les diffeacuterentes maniegraveres drsquoutilisation de

cette instruction nous allons nous appuyer sur la table laquoNewTabraquo creacutee preacuteceacutedemment en marquant le champ

laquoIdNewTabraquo comme cleacute primaire Rappelons que ce dernier champ eacutetait deacutefinie uniquement comme un champ

auto-increacutementale et non comme une cleacute primaire

Par ailleurs le processus de suppression stocke les lignes supprimeacutees dans une table virtuelle speacuteciale nommeacutee

laquoDELETEDraquo Cette table adopte la structure et les attributs de la table drsquoorigine En effet les colonnes de la table

laquoDELETEDraquo sont automatiquement mappeacutees sur les colonnes de la table sur laquelle est effectueacutee la

suppression

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 49 sur 81

Notons que dans les diffeacuterents exemples que nous allons preacutesenter dans cette section les opeacuterations de

suppression nrsquoont pas forceacutement un sens logique etou fonctionnel Elles sont preacutesenteacutees uniquement pour

eacutenumeacuterer les diffeacuterentes possibiliteacutes drsquoordre syntaxique

Exemple 52 Suppression de toutes les lignes de la table

DELETE NewTab TRUNCATE TABLE NewTab

Exemple 53 Suppression conditionneacutee agrave travers la clause laquoWHEREraquo

DELETE NewTab WHERE IdNewTab = 11

Exemple 54 Suppression utilisant la clause laquoTOPraquo sans la clause laquoORDER BYraquo

- TOP (3) renvoi les 3 premiegraveres lignes de faccedilon aleacuteatoire DELETE TOP (3) NewTab

Exemple 55 Suppression utilisant la clause laquoTOPraquo avec la clause laquoORDER BYraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement DELETE NewTab FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 56 Suppression utilisant les clauses laquoTOPraquo laquoORDER BYraquo avec laquoOUPUTraquo

- TOP (3) dans le select renvoi les 3 premiegraveres lignes selon le classement - OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED FROM (SELECT TOP (3) IdNewTab FROM NewTab ORDER BY CAP DESC) AS NT WHERE NTIdNewTab = NewTabIdNewTab

Exemple 57 Suppression conditionneacutee agrave travers une sous-requecircte retournant un scalaire

- OUTPUT Affiche les lignes supprimeacutees agrave partir de deleted DELETE NewTab OUTPUT DELETED WHERE CAP gt= ( SELECT AVG(TMCAP) FROM ( SELECT MIN(CAP) AS MCAP FROM NewTab GROUP BY DesignationProduit ) AS T )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 50 sur 81

Exemple 58 Suppression conditionneacutee agrave travers une fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire moyen par client et par produit CREATE FUNCTION fct_ca_moy_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAMP AS FLOAT SELECT CAMP = AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAMP END Suppression conditionneacutee agrave travers le calcul de la fonction ne pas oublier le preacutefixe dbo DELETE NewTab WHERE dbofct_ca_moy_par_client_produit (IdClient DesignationProduit) lt= 150

Exemple 59 Suppression agrave travers une sous-requecircte retournant plusieurs lignes

DELETE NewTab FROM ( SELECT DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS NCAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY DesignationProduit ) AS TSR WHERE NewTabDesignationProduit = TSRDesignationProduit AND NewTabCAP BETWEEN 05TSRNCAP AND TSRNCAP

Exemple 60 Suppression agrave travers une laquoVIEWraquo

La vue peut porter sur plusieurs tables mais la suppression ne doit porter que sur les lignes drsquoune seule table

CREATE VIEW View_NewTab AS Creacuteation drsquoune vue nommeacutee View_NewTab ( SELECT FROM NewTab WHERE IdNewTab gt 15 )

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 51 sur 81

DELETE View_NewTab

Exemple 61 Suppression agrave travers un alias

DELETE NT FROM NewTab AS NT JOIN TFACTURES ON NTIdClient = TFACTURESIdClient JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE NTDesignationProduit = TPRODUITSDesignationProduit AND TvaProduit lt 02 AND Qt_Cmd gt 20

Exemple 62 Suppression de donneacutees dans une variable de type table

La suppression des donneacutees dans une variable de type table nrsquoa aucune reacutepercussion sur la table physique Deacuteclaration drsquoune variable locale de type table DECLARE VarTab TABLE ( VarIdTab INT VarIdClient INT VarDesignation NVARCHAR(30) VarCAP FLOAT ) Insertion des donneacutees dans la variable locale INSERT INTO VarTab SELECT FROM NewTab Suppression des lignes dans la variable locale DELETE VarTab WHERE VarIdTab gt 15 Les lignes ont eacuteteacute supprimeacutees au niveau de la variable locale SELECT FROM VarTab Les lignes restent inchangeacutees au niveau de la table physique SELECT FROM NewTab WHERE IdNewTab gt 15

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 52 sur 81

G Le TSQL pour manipuler les structures (Data Defintion Langage)

G1 Manipulations usuelles des bases de donneacutees

G1a) Le laquoCREATE DATABASEraquo

Exemple 63 Creacuteation drsquoune base de donneacutees avec les valeurs par deacutefaut

IF DB_ID (TEST) IS NOT NULL Teste si la base lsquoTESTrsquo existe deacutejagrave DROP DATABASE TEST Supprime la base lsquoTESTrsquo sil elle existe CREATE DATABASE TEST Creacuteation de la base lsquoTESTrsquo

Cela revient agrave deacutefinir les valeurs par deacutefaut pour un certain nombre de paramegravetres

CREATE DATABASE TEST ON Creacuteation du fichier de donneacutees (

NAME = test FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtestmdf SIZE = 4160KB Taille de la base au deacutepart MAXSIZE = UNLIMITED Taille maximale que la base peut atteindre FILEGROWTH = 1024KB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1040KB Taille du journal au deacutepart MAXSIZE = 2048GB Taille maximale du journal FILEGROWTH = 10 Augmentation automatique de la taille du journal

)

Exemple 64 Creacuteation drsquoune base avec des valeurs utilisateur dans le groupe par deacutefaut

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY Creacuteation du fichier de donneacutees dans le groupe primaire (

NAME = test_data FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_datamdf SIZE = 5MB Taille de la base au deacutepart MAXSIZE = 50MB Taille maximale que la base peut atteindre FILEGROWTH = 1MB Augmentation automatique de taille de la base

) LOG ON Creacuteation du fichier journal (

NAME = test_log FILENAME = CProgram FilesMicrosoft SQL ServerMSSQL11MSSQLSERVER

MSSQLDATAtest_logldf SIZE = 1MB Taille du journal au deacutepart

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 53 sur 81

MAXSIZE = 50MB Taille maximale du journal FILEGROWTH = 1MB Augmentation automatique de la taille du journal

)

Exemple 65 Creacuteation drsquoune base avec plusieurs fichiers de donneacutees et de journaux

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test1_data FILENAME = DDATAtest1_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_data FILENAME = DDATAtest2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test3_data FILENAME = DDATAtest3_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

Exemple 66 Creacuteation drsquoune base avec plusieurs groupes de fichiers

IF DB_ID (TEST) IS NOT NULL DROP DATABASE TEST CREATE DATABASE TEST ON PRIMARY (

NAME = test_pri_data FILENAME = DDATAtest_pri_datamdf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 54 sur 81

) (

NAME = tes_sec1_data FILENAME = DDATAtest_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG1 (

NAME = test_fg1_sec1_data FILENAME = DDATAtest_fg1_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test_fg1_sec2_data FILENAME = DDATAtest_fg1_sec2_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) FILEGROUP FG2 (

NAME = test_fg2_sec1_data FILENAME = DDATAtest_fg2_sec1_datandf SIZE = 5MB MAXSIZE = 50MB FILEGROWTH = 1MB

) LOG ON (

NAME = test1_log FILENAME = EDATAtest1_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

) (

NAME = test2_log FILENAME = EDATAtest2_logldf SIZE = 1MB MAXSIZE = 50MB FILEGROWTH = 1MB

)

G1b) LrsquolaquoALTER DATABASEraquo

Exemple 67 Modification du nom de la base de donneacutees

ALTER DATABASE TEST MODIFY NAME = TEST2

Exemple 68 Modification du jeu de caractegraveres

ALTER DATABASE TEST COLLATE French_CI_AI

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 55 sur 81

Exemple 69 Ajout drsquoun fichier de donneacutees

ALTER DATABASE TEST ADD FILE (

NAME = tes_sec2_data FILENAME = DDATAtest_sec2_datandf SIZE = 5MB MAXSIZE = UNLIMITED FILEGROWTH = 5

)

Exemple 70 Ajout drsquoun groupe de deux fichiers de donneacutees

ALTER DATABASE TEST ADD FILEGROUP FG3 ALTER DATABASE TEST ADD FILE (

NAME = test_fg3_sec1_data FILENAME = DDATAtest_fg3_sec1_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test_fg3_sec2_data FILENAME = EDATAtest_fg3_sec2_datandf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) TO FILEGROUP FG3

Exemple 71 Ajout de deux fichiers de journalisation

ALTER DATABASE TEST ADD LOG FILE (

NAME = test3_log FILENAME = EDATAtest3_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 5

) (

NAME = test4_log FILENAME = FDATAtest4_logldf SIZE = 1MB MAXSIZE = UNLIMITED FILEGROWTH = 10

)

Exemple 72 Augmentation de la taille drsquoun fichier agrave 10 Mo

ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data SIZE = 10MB MAXSIZE = 60MB

)

Exemple 73 Reacuteduction de la taille drsquoun fichier agrave 6 Mo

DBCC SHRINKFILE (test_data 6)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 56 sur 81

Exemple 74 Deacuteplacement drsquoun fichier de donneacute vers un autre reacutepertoire

- il est neacutecessaire de deacutetacher la base de deacuteplacer le fichier physiquement puis drsquoattacher la base avant drsquoexeacutecuter ce code ALTER DATABASE TEST MODIFY FILE (

NAME = test1_data FILENAME = EDATABASEtest1_datamdf

)

G1c) Le laquoDROP DATABASEraquo

Exemple 75 Suppression drsquoune base de donneacutees

DROP DATABASE TEST

Exemple 76 Suppression de trois bases de donneacutees

DROP DATABASE TEST1 TEST2 TEST3

G2 Manipulations usuelles des tables

G2a) Le laquoCREATE TABLEraquo

Syntaxe

CREATE TABLE nom_table ( lt definition_et_contrainte_niveau_colonne gt | lt constraintes_niveau_table gt [ hellip ] | lt index_niveau_table gt [ hellip ] ) [ON groupe_fichiers | DEFAULT ]

lt definition_et_contrainte_niveau_colonne gt

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [MASKED WITH (FUNCTION = nom_fonction_masque)] [IDENTITY [(valeur_de_deacutepart valeur_du_pas)] [INDEX nom_index [CLUSTERED | NONCLUSTERED] [ON groupe_fichiers | DEFAULT]] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]] [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] [ON filegroup | DEFAULT] | FOREIGN KEY REFERENCES table_de_reacutefeacuterence [(colonne_de_reacutefeacuterence)] [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 57 sur 81

lt constraintes_niveau_table gt [ [CONSTRAINT nom_contrainte] PRIMARY KEY | UNIQUE [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON filegroup | DEFAULT] | [FOREIGN KEY] (colonne1 [ hellip ]) REFERENCES table_de_reacutefeacuterence (colonne_de_reacutefeacuterence1 [ hellip ]) [ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT] | CHECK (expression_logique) [ hellip ] ]

lt index_niveau_table gt [ INDEX nom_index [CLUSTERED | NONCLUSTERED] (colonne1 [ASC | DESC] [ hellip ]) [ON groupe_fichiers | DEFAULT] ]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 58 sur 81

G2b) Le laquoUPDATE TABLEraquo

Exemple 77 Modification drsquoune table

ALTER TABLE nom_table

[ ALTER COLUMN nom_colonne modification drsquoune colonne

type_donneacutee [(preacutecision [ eacutechelle] | max)]

[COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL]

|

ADD | DROP MASKED [WITH (FUNCTION = nom_fonction_masque)]]

] |

[ ADD ajout drsquoune ou de plusieurs colonnes

nom_colonne type_donneacutee [(preacutecision [ eacutechelle] | max)] [COLLATE idenfifiant_du_jeu_de_caractegraveres] [NULL | NOT NULL] [CONSTRAINT nom_contrainte_valeur_par_defaut [DEFAULT valeur_par_deacutefaut]]

[ hellip ] possibiliteacute de rajouter drsquoautres colonnes ]

| [

[WITH CHECK | NOCHECK] ADD ajout drsquoune ou de plusieurs contraintes avec ou sans controcircle des donneacutees [CONSTRAINT nom_contrainte]

PRIMARY KEY | UNIQUE | FOREIGN KEY(colonne1 [ hellip ]) REFERENCES table_reacutef [(colonne_reacutef1 [ hellip ])]

[ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT] [ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT]

| CHECK (expression_logique)

| DEFAULT valeur_par_deacutefaut FOR colonne

[ hellip ] possibiliteacute de rajouter drsquoautres contraintes

] |

[ DROP suppression drsquoune ou de plusieurs contraintes etou colonnes [CONSTRAINT] contrainte1 [ hellip ] | COLUMN colonne1 [ hellip ] [ hellip ] possibiliteacute de supprimer drsquoautres contraintes etou colonnes

] |

activation ou deacutesactivation de contraintes avec ou sans controcircle des donneacutees [[WITH CHECK | NOCHECK] CHECK | NOCHECK CONSTRAINT ALL | contrainte1 [ hellip ]]

| activationdeacutesactivation de plusieurs ou de tous les triggers de la table [ENABLE | DISABLE TRIGGER ALL | nom_trigger [ hellip ]]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 59 sur 81

G2c) Le laquoDROP TABLEraquo

Syntaxe

DROP TABLE nom_table1 [ hellip ]

Exemple 78 Creacuteation et modification de plusieurs tables

CREATE TABLE TCLIENTS2 ( IdClient int NOT NULL IDENTITY(11) NomClient nvarchar(30) NOT NULL PrenomClient nvarchar(30) NOT NULL AdresseClient nvarchar(100) NOT NULL CodePostalClient nvarchar(16) NOT NULL VilleClient nvarchar(30) NOT NULL CAC float NOT NULL CONSTRAINT PK_TCLIENTS2 PRIMARY KEY CLUSTERED (IdClient ASC) ) ON PRIMARY GO ALTER TABLE TCLIENTS2 ADD CONSTRAINT DF_TCLIENTS2_CAC DEFAULT ((00)) FOR CAC GO CREATE TABLE TPRODUITS2 ( IdProduit int NOT NULL IDENTITY(11) DesignationProduit nvarchar(30) NOT NULL PrixUnitaireProduit real NULL TvaProduit real NOT NULL PrixTTCProduit AS ((PrixUnitaireProduit(1 + TvaProduit))) CONSTRAINT PK_TPRODUITS2 PRIMARY KEY CLUSTERED (IdProduit ASC) ) ON PRIMARY GO CREATE TABLE TFACTURES2 ( IdFacture int NOT NULL IDENTITY(11) IdClient int NULL DateFacturation datetime NOT NULL CONSTRAINT DF_TFact2_DateFact DEFAULT (GETDATE()) CONSTRAINT PK_TFACTURES2 PRIMARY KEY CLUSTERED (IdFacture ASC) ) ON [PRIMARY] GO ALTER TABLE TFACTURES2 WITH CHECK ADD CONSTRAINT FK_TFACTURES2_TCLIENTS2 FOREIGN KEY(IdClient) REFERENCES TCLIENTS2 (IdClient) ON DELETE CASCADE GO ALTER TABLE TFACTURES2 CHECK CONSTRAINT FK_TFACTURES2_TCLIENTS2 GO CREATE TABLE TCOMMANDES2 ( IdFacture int NOT NULL IdProduit int NOT NULL Qt_Cmd real NULL CONSTRAINT PK_TCOMMANDES2 PRIMARY KEY CLUSTERED (IdFacture ASC IdProduit ASC) ) ON [PRIMARY] GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TFACTURES2 FOREIGN KEY (IdFacture) REFERENCES TFACTURES2 (IdFacture) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TFACTURES2 GO ALTER TABLE TCOMMANDES2 WITH CHECK ADD CONSTRAINT FK_TCOMMANDES2_TPRODUITS2 FOREIGN KEY(IdProduit) REFERENCES TPRODUITS2 (IdProduit) ON DELETE CASCADE GO ALTER TABLE TCOMMANDES2 CHECK CONSTRAINT FK_TCOMMANDES2_TPRODUITS2

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 60 sur 81

G3 Manipulations usuelles des vues

G3a) Le laquoCREATE VIEWraquo laquoALTER VIEWraquo laquoDROP VIEWraquo

Une vue est une table virtuelle dont la structure et le contenu sont deacutefinis agrave travers une requecircte laquoselectraquo agrave

partir drsquoune ou plusieurs tables Elle ne peut ecirctre creacuteeacutee que dans la base actuelle et ses donneacutees ne sont

chargeacutees en meacutemoire qursquoapregraves son appel Son rocircle et multiple elle permet

- De syntheacutetiser certaines donneacutees et traitements de faccedilon compreacutehensible

- DrsquoAssurer lrsquoeacutevolution de la structure des tables tout en restant compatible avec les applications clientes

- De seacutecuriser lrsquoaccegraves aux tables physiques

Une clause laquoselectraquo - associeacutee agrave la vue - doit respecter certaines regravegles

- Elle ne peut contenir une clause laquointoraquo

- Elle ne peut faire reacutefeacuterence agrave des tables temporaires

- Elle ne peut faire reacutefeacuterence agrave des variables de type table

- Elle ne peut contenir une clause laquoorder byraquo agrave moins que cette derniegravere ne soit lieacutee agrave un laquoselect top(x)raquo

Par ailleurs rappelons qursquoil est tout agrave fait possible de modifier une table physique agrave travers une vue mais

cela nrsquoest possible que sous des conditions

- Si la vue porte sur plusieurs tables agrave travers des jointures seule les donneacutees lieacutees agrave une table peuvent

faire lrsquoobjet drsquoune insertion drsquoune modification ou drsquoune suppression

- Les colonnes de la vue obtenues agrave travers un calcul agrave travers des fonctions drsquoagreacutegation ou agrave travers les

clauses laquounionraquo laquointersectraquo laquoexceptraquo et laquocrossjoinraquo ne peuvent faire lrsquoobjet drsquoune insertion drsquoune

modification ou drsquoune suppression

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant les termes

laquodistinctraquo ou laquogroup byraquo

- Lrsquoinsertion la modification ou encore la suppression ne peut srsquoopeacuterer sur une vue contenant agrave la fois les

termes laquotopraquo et laquowith check optionraquo

Syntaxe

CREATE VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

ALTER VIEW nom_vue [ (Colone1 hellip Colonnen) ] AS instruction_select [ WITH CHECK OPTION ]

DROP VIEW nom_vue

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 61 sur 81

Colone1 Lors de la creacuteation drsquoune vue on a la possibiliteacute de renommer les colonnes envoyeacutees agrave travers

la clause laquoselectraquo La speacutecification des noms de colonnes et donc optionnelle Par deacutefaut les noms des

colonnes da la vue seront ceux renvoyeacutes par le laquoselectraquo

instruction_select fait reacutefeacuterence agrave requecircte sql valide

with check option Lors de la modification drsquoune table agrave travers la vue cette options

veille au respect des conditions deacutefinies dans la clause laquoselectraquo et assure que les donneacutees

modifieacutees soient toujours disponibles dans la vue apregraves leur modification

Exemple 79 Creacuteation drsquoune vue

CREATE VIEW view_client_ca AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient

Exemple 80 Modification drsquoune vue

ALTER VIEW view_client_ca AS SELECT TOP(3) IdClient AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAMC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient ORDER BY AVG(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) DESC

Exemple 81 Suppression drsquoune vue apregraves veacuterification de son existence

IF DB_ID (view_client_ca) IS NOT NULL DROP VIEW view_client_ca

G4 Manipulations usuelles des proceacutedures stockeacutees

G4a) Le laquoCREATE PROCEDUREraquo laquoALTER PROCEDUREraquo laquoDROP PROCEDUREraquo

Une proceacutedure permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de reacuteeacutecrire toutes

les instructions de ce groupement

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 62 sur 81

Syntaxe

CREATE PROCEDURE nom_procedure [ Parami AS Typei [= Valeur_par_defaut ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

ALTER PROCEDURE nom_procedure [ Parami AS Typei [= DEFAULT ] [ OUTPUT | READONLY ] ] [ ] AS [ BEGIN ] instructions_sql [ ] [ END ]

DROP PROCEDURE nom_procedure

Exemple 82 Creacuteation drsquoune proceacutedure sans paramegravetres

CREATE PROCEDURE P1 AS SELECT TCLIENTS FROM TCLIENTS LEFT JOIN TFACTURES ON TCLIENTSIdClient = TFACTURESIdClient WHERE TFACTURESIdClient IS NULL GO Appel de la proceacutedure EXECUTE P1

Exemple 83 Creacuteation drsquoune proceacutedure avec deux paramegravetres

CREATE PROCEDURE P2 IdClient AS INT IdProduit AS INT AS SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND TPRODUITSIdProduit = Produit GROUP BY IdClient

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 63 sur 81

GO Possibiliteacutes drsquoappels de la proceacutedure pour le client 1 et le produit 2 EXECUTE P2 1 2 EXECUTE P2 IdClient = 1 IdProduit = 2 EXECUTE P2 IdProduit= 2 IdClient = 1

Exemple 84 Creacuteation drsquoune proceacutedure renvoyant deux jeux de reacutesultats

CREATE PROCEDURE P3 IdClient AS INT AS SELECT FROM TCLIENTS WHERE IdClient = IdClient SELECT FROM TFACTURES WHERE IdClient = IdClient GO Appel de la proceacutedure pour le client 1 EXECUTE P3 1

Exemple 85 Creacuteation drsquoune proceacutedure avec des valeurs par deacutefauts pour les paramegravetres

CREATE PROCEDURE P4 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) = CASA AS SELECT FROM TCLIENTS WHERE IdClient = IdClient AND VilleClient LIKE VilleClient + GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres EXECUTE P4 EXECUTE P4 4 EXECUTE P4 2 Sa

Exemple 86 Creacuteation drsquoune proceacutedure avec des paramegravetres scalaires en laquoOUTPUTraquo

CREATE PROCEDURE P5 IdClient AS INT = 1 VilleClient AS NVARCHAR(30) OUTPUT AS SELECT VilleClient = VilleClient FROM TCLIENTS WHERE IdClient = IdClient GO Possibiliteacutes drsquoappels avec les diffeacuterents paramegravetres DECLARE VC AS NVARCHAR(30) EXECUTE P5 3 VC OUTPUT PRINT VC EXECUTE P5 VilleClient = VC OUTPUT PRINT VC

Exemple 87 Creacuteation drsquoune proceacutedure avec un paramegravetres de type table

Cela neacutecessite la creacuteation drsquoun nouveau type deacutefinit par le deacuteveloppeur CREATE TYPE TAB AS TABLE (IdProd INT DesProd NVARCHAR(30) Prix FLOAT) GO CREATE PROCEDURE P6 TAB AS TAB READONLY AS DECLARE VarTab AS TAB INSERT INTO VarTab SELECT FROM TAB SELECT FROM VarTab GO

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 64 sur 81

Possibiliteacute drsquoappel DECLARE NewTab AS TAB INSERT INTO NewTab VALUES (1 Prod1 100)

(2 Prod2 200) (3 Prod3 300)

EXECUTE P6 NewTab

Exemple 88 Modification drsquoune proceacutedure

ALTER PROCEDURE P6 TAB AS TAB READONLY AS SELECT FROM TAB

Exemple 89 Suppression drsquoune proceacutedure

DROP PROCEDURE P6

G5 Manipulations usuelles des fonctions

G5a) Le laquoCREATE FUNCTIONraquo laquoALTER FUNCTION raquo laquoDROP FUNCTIONraquo

Une fonction permet de regrouper plusieurs traitements sous une seule et mecircme entiteacute identifiable agrave

travers un nom unique que lrsquoon peut par la suite exploiter dans les autres traitements afin drsquoeacuteviter de

reacuteeacutecrire toutes les instructions de ce groupement

Il existe deux types de fonctions Celles qui permettent de retourner une valeur scalaire puis celles

permettant de retourner une table ou une variable de type table

Syntaxe du laquocreate alterraquo drsquoune fonction retournant un scalaire

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS Type_scalaire AS BEGIN instructions_sql [ ] RETURN Val_scalaire END

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TABLE AS RETURN [(] instructions_select [)]

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 65 sur 81

Syntaxe du laquocreate alterraquo drsquoune fonction retournant une variable de type table

CREATE | ALTER FUNCTION nom_fonction ( [ Parami AS Typei [= Valeur_par_defaut ] [ READONLY ] ] [ ] ) RETURNS TAB TABLE ltDefinition_de_la_tablegt AS BEGIN instructions_sql [ ] RETURN END

Syntaxe du drop

DROP FUNCTION nom_fonction

Exemple 90 Creacuteation drsquoune fonction retournant un scalaire

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_scal_ca_par_client_produit ( IdClient AS INT DesignationProduit AS NVARCHAR(30) ) RETURNS FLOAT AS BEGIN DECLARE CAP AS FLOAT SELECT CAP = SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient AND DesignationProduit = DesignationProduit RETURN CAP END GO Possibiliteacutes drsquoappel SELECT REP = dbofct_scal_ca_par_client_produit (1 PA) DECLARE RES AS FLOAT SET RES = dbofct_scal_ca_par_client_produit (1 PA) SELECT REP = RES

Exemple 91 Creacuteation drsquoune fonction retournant une table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v1 ( IdClient AS INT ) RETURNS TABLE AS RETURN

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 66 sur 81

( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY IdClient DesignationProduit ) GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v1 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v1 (2) SELECT FROM RES

Exemple 92 Creacuteation drsquoune fonction retournant une variable de type table

Creacuteation drsquoune fonction retournant le chiffre drsquoaffaire par client et par produit CREATE FUNCTION fct_tab_ca_par_client_produit_v2 ( IdClient AS INT ) RETURNS RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) AS BEGIN INSERT INTO RES ( SELECT IdClient DesignationProduit SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAP FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit WHERE IdClient = IdClient GROUP BY DesignationProduit ) RETURN END GO Possibiliteacutes drsquoappel SELECT FROM dbofct_tab_ca_par_client_produit_v2 (1) DECLARE RES AS TABLE (IdClient INT DesignationProduit NVARCHAR(30) CAP FLOAT) INSERT INTO RES SELECT FROM dbofct_tab_ca_par_client_produit_v2 (2) SELECT FROM RES

Exemple 93 Suppression drsquoune fonction

DROP FUNCTION fct_scal_ca_par_client_produit

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 67 sur 81

G6 Manipulations usuelles des triggers

G6a) Le laquoCREATE TRIGGERraquo laquoALTER TRIGGER raquo laquoDROP TRIGGERraquo

Un laquoTriggerraquo permet de regrouper des traitements devant ecirctre exeacutecuteacutes automatiquement suite agrave un

eacuteveacutenement sur un objet de la base de donneacutees Il existe trois cateacutegories de laquotriggersraquo

Les laquotriggersraquo DML lieacutes aux actions laquoinsert update deleteraquo sur des tables ou des vues

Les laquotriggersraquo DDL lieacutes aux actions laquocreate alter drop grant deny revokeraquo sur des bases de donneacutees

ou sur le serveur Il est important de noter que certaines proceacutedures systegravemes lance agrave travers leurs

traitements des triggers DDL deacutefinis par lrsquoutilisateur

Les laquotriggersraquo de connexion lieacutes agrave lrsquoaction laquologonraquo des utilisateurs sur la base de donneacutees

Syntaxe usuelle drsquoun trigger DML action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON nom_table | nom_view FOR | AFTER | INSTEAD OF [ INSERT ] [ ] [ UPDATE ] [ ] [ DELETE ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DML action laquodropraquo

DROP TRIGGER nom_trigger

Syntaxe usuelle drsquoun trigger DDL action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER | DATABASE FOR | AFTER [ TYPE_EVENNEMENT ] | [ GROUPE_EVENNEMENTS ] [ hellip ] AS instructions_sql

Syntaxe usuelle drsquoun trigger DDL action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER | DATABASE

Syntaxe usuelle drsquoun trigger LOGON action laquocreate alterraquo

CREATE | ALTER TRIGGER nom_trigger ON ALL SERVER FOR | AFTER LOGON AS instructions_sql

Syntaxe usuelle drsquoun trigger LOGON action laquodropraquo

DROP TRIGGER nom_trigger ON ALL SERVER

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 68 sur 81

G6b) Le laquoENABLE TRIGGERraquo laquoDISABLE TRIGGER raquo

Syntaxe usuelle drsquoun trigger LOGON action laquoanable disableraquo

ENABLE | DISABLE TRIGGER nom_trigger1 [ hellip ] | ALL ON nom_table_ou_vue | DATABASE | ALL SERVER

Exemple 94 Creacuteation drsquoun trigger DML

CREATE TRIGGER tr_commandes_insert ON TCOMMANDES AFTER INSERT AS BEGIN SET NOCOUNT ON UPDATE TCLIENTS SET CAC += ( SELECT PrixUnitaireProduitQt_Cmd(1+TvaProduit) FROM INSERTED JOIN TPRODUITS ON INSERTEDIdProduit = TPRODUITSIdProduit) WHERE IdClient = ( SELECT IdClient FROM INSERTED JOIN TFACTURES ON INSERTEDIdFacture = TFACTURESIdFacture) END

H Les curseurs

Un laquocurseurraquo est une variable un peu speacuteciale Son contenu est constitueacute par le flux de donneacutees renvoyeacute par

une requecircte de seacutelection La diffeacuterence majeur entre une variable de type laquotableraquo et un laquocurseurraquo est que

ce dernier dispose drsquoun meacutecanisme lui permettant de parcourir ce flux - entre autre ligne par ligne - tout en

ayant la possibiliteacute drsquoextraire les valeurs des colonnes pour chacune de ces lignes Le parcours des curseurs

se fait via lrsquoinstruction laquoFETCHraquo Cette derniegravere offre plusieurs possibiliteacutes de positionnement

Contrairement aux variables de type laquotableraquo il est tout agrave fait possible de modifier les donneacutees drsquoune table

agrave travers un laquocurseurraquo Toutefois il nrsquoest pas conseilleacute drsquouser de cette possibiliteacute car en geacuteneacuteral lrsquoutilisation

des curseurs neacutecessite des ressources consideacuterables

Les laquocurseursraquo disposent de plusieurs options certaines sont mecircme incompatibles entre elles En effet

toutes les valeurs deacutefinies entre les crochets ouvrants et fermants sont optionnelles Cependant les options

deacutefinies dans un mecircme ensemble et seacutepareacutees par des barres obliques srsquoexcluent entre elles A titre

drsquoexemple une variable de type laquocurseurraquo ne peut pas ecirctre agrave la fois locale et globale ou alors

laquoforward_onlyraquo et laquoscrollraquo ou encore laquostaticraquo et laquodynamiqueraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 69 sur 81

Syntaxe usuelle pour deacuteclarer et manipuler une variable de type curseur

DECLARE nom_curseur CURSOR deacuteclare le curseur [ LOCAL | GLOBAL ] deacuteclare le curseur [ FORWARD_ONLY | SCROLL ] deacutefini le type de parcours [ STATIC | DYNAMIC | KEYSET | FAST_FORWARD ] deacutefini la classe meacutemoire [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] deacutefini le type de verrouillage FOR instruction_select extraction des donneacutees pour remplir le curseur [ FOR UPDATE [ OF colonne1 [ hellip ] ] ] pour autoriser la modification via le

curseur OPEN nom_curseur ouvre le curseur CLOSE nom_curseur ferme le curseur DEALLOCATE nom_curseur libegravere les ressources occupeacutees par le curseur

Syntaxe usuelle pour parcourir une variable de type curseur

FETCH [ [ FIRST | NEXT | PRIOR | LAST | ABSOLUTE p | var | RELATIVE p | var ] FROM ] [ GLOBAL ] nom_curseur | nom_curseur [ INTO var1 [ hellip ] ]

FETCH FIRST FROM nom_ curseur se positionner sur la premiegravere ligne du curseur

FETCH NEXT FROM nom_ curseur se positionner sur la ligne suivante

FETCH PRIOR FROM nom_ curseur se positionner sur la ligne preacuteceacutedente

FETCH LAST FROM nom_ curseur se positionner sur la derniegravere ligne

FETCH ABSOLUTE N FROM nom_ curseur se positionner sur la Niegraveme ligne FETCH RELATIVE N FROM nom_ curseur se positionner sur la Niegraveme ligne plus loin que la ligne actuelle

LOCAL

Permet de deacuteclarer un curseur comme eacutetant une variable locale agrave un traitement de type proceacutedure de

type deacuteclencheur ou encore comme eacutetant un paramegravetre OUTPUT drsquoune proceacutedure stockeacutee Les

ressources occupeacutees sont deacutesalloueacute automatiquement agrave la fin du traitement de la proceacutedure stockeacutee ou

du deacuteclencheur Dans le cas drsquoun paramegravetre OUTPUT le curseur est deacutesalloueacute automatiquement agrave la fin

du dernier traitement lui faisant reacutefeacuterence

GLOBAL

Permet de deacuteclarer un curseur comme eacutetant une variable globale agrave une connexion Tous les traitements

SQL peuvent utiliser ce curseur Il ne peut ecirctre deacutesalloueacute que de faccedilon explicite durant la connexion ou

alors de faccedilon implicite agrave la deacuteconnexion

FORWARD_ONLY

Avec cette option le parcours du curseur ne peut se faire que du deacutebut vers la fin ligne par ligne via

lrsquoinstruction laquoFECTH NEXTraquo (aller agrave la ligne suivante)

laquoFORWARD_ONLYraquo est en opposition avec laquoSCROLLraquo En effet ce dernier permet de parcourir le curseur

avec toutes options possibles de lrsquoinstruction laquoFECTHraquo

En lrsquoabsence des options laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo - qui sont par deacutefaut de type laquoSCROLLraquo -

le curseur sera par deacutefaut deacutefini comme eacutetant laquoDYNAMICraquo Durant la phase des traitements effectueacutes

par le curseur dans ce cas de figure toutes les modifications survenues sur les tables adjacentes seront

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 70 sur 81

reporteacutees sur ce curseur Toutefois vu que le parcours ne peut se faire que vers lrsquoavant seules les lignes

non encore traiteacutees permettront de se rendre compte de cet aspect

En lrsquoabsence agrave la fois des termes laquoFORWARD_ONLYraquo laquoSCROLLraquo laquoSTATICraquo laquoDYNAMICraquo et laquoKEYSETraquo le

curseur sera par deacutefaut deacutefini comme eacutetant laquoFORWARD_ONLYraquo et laquoDYNAMICraquo

SCROLL

Avec cette option le parcours du curseur peut se faire avec toutes les options possibles de lrsquoinstruction

laquoFECTHraquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Elle est donc en opposition avec lrsquooption

laquoFORWARD_ONLYraquo

En lrsquoabsence de cette option le curseur sera consideacutereacute - par deacutefaut - comme eacutetant laquoFORWARD_ONLYraquo

agrave moins que lrsquoune des options laquoSTATICraquo laquoDYNAMICraquo ou laquoKEYSETraquo ne soit utiliseacutees

STATIC

Un curseur laquoSTATICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les options

de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE ABSOLUTE) Cependant si des

modifications ont eu lieu sur les tables adjacentes celles-ci ne seront pas retranscrites sur le curseur

DYNAMIC

Un curseur laquoDYNAMICraquo est par deacutefaut de type laquoSCROLLraquo ce qui signifie qursquoon peut utiliser toutes les

options de lrsquoinstruction laquoFECTHraquo raquo (FIRST LAST PRIOR NEXT RELATIVE) sauf (ABSOLUTE) A lrsquoopposeacute du

curseur laquoSTATICraquo si des modification ont eu lieu sur les tables adjacentes celles-ci seront retranscrites

sur le curseur

KEYSET

Cette option - introduite agrave titre informatif - regroupe certains aspects lieacutes agrave lrsquooption laquoSTATICraquo et drsquoautres

lieacutes agrave lrsquooption laquoDYNAMICraquo Elle est tregraves difficile agrave mettre en œuvre car la modification de la table

adjacente deacutepend de plusieurs circonstances

FAST_FORWARD

Cette option regroupe agrave la fois les options laquoFORWARD_ONLYraquo et laquoREAD_ONLYraquo Ce qui signifie que le

parcours ne peut se faire que ligne par ligne du deacutebut vers la fin et qursquoen plus la modification agrave travers

le curseur nrsquoest pas autoriseacutee Par conseacutequent cette option est incompatible avec les options laquoSCROLLraquo

et laquoFOR_UPDATEraquo

READ_ONLY Cette option interdit les mises agrave jour des donneacutees des tables adjacentes agrave travers le curseur

SCROLL_LOCKS

Cette option permet de garantir les mises agrave jour agrave travers le curseur en verrouillant les lignes des tables

adjacentes au moment de son ouverture Elle est incompatible avec les options laquoFAST_FORWARDraquo et

laquoSCROLLraquo

OPTIMISTIC

Cette option permet drsquoeffectuer des mises agrave jour conditionneacutees agrave travers le curseur et ce sans verrouiller

les lignes correspondantes dans la table adjacente En effet au moment de la demande de modification

positionneacutee (clause WHERE CURRENT OF) SQL Server veacuterifie si la ligne dans la table adjacente a eacuteteacute

modifieacutee depuis lrsquoouverture du curseur Si tel est le cas cette demande est rejeteacutee sinon la modification

est accepteacutee Cette option est incompatible avec lrsquooption laquoFAST_FORWARDraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 71 sur 81

Exemple 95 Creacuteation drsquoun curseur dans une proceacutedure stockeacutee

CREATE PROCEDURE ps_cac_update AS BEGIN DECLARE IdClient AS INT CAC AS FLOAT DECLARE CursCAC CURSOR LOCAL FAST_FORWARD FOR SELECT IdClient SUM(PrixUnitaireProduitQt_Cmd(1 + TvaProduit)) AS CAC FROM TFACTURES JOIN TCOMMANDES ON TFACTURESIdFacture = TCOMMANDESIdFacture JOIN TPRODUITS ON TCOMMANDESIdProduit = TPRODUITSIdProduit GROUP BY IdClient OPEN CursCAC FETCH NEXT FROM CursCAC INTO IdClient CAC WHILE(FETCH_STATUS = 0) BEGIN UPDATE TCLIENTS SET CAC = CAC WHERE IdClient = IdClient FETCH NEXT FROM CursCAC INTO IdClient CAC END CLOSE CursCAC DEALLOCATE CursCAC END

Exemple 96 modifier le type par deacutefaut des curseurs (LocalGlobal) pour la base laquoboutiqueraquo

SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT LOCAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL ALTER DATABASE BOUTIQUE SET CURSOR_DEFAULT GLOBAL SELECT DATABASEPROPERTYEX(BOUTIQUE IsLocalCursorsDefault) AS ISLOCAL

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 72 sur 81

I Conception des Bases de Donneacutees avec Merise

Dans cette section nous allons nous inteacuteresser agrave la modeacutelisation conceptuelle des bases de donneacutees

relationnelles avec laquoMeriseraquo Cette meacutethode srsquoappuie sur le scheacutema entiteacute-association agrave travers lrsquoeacutetude des

deacutependances fonctionnelles Nous allons nous focaliser sur le modegravele conceptuel des donneacutees

laquoMCDraquo le modegravele logique des donneacutees laquoMLDraquo et le modegravele physique des donneacutees laquoMPDraquo

I1 Le modegravele conceptuel des donneacutees laquoMCDraquo

I1a) Les entiteacutes et les identifiants

Une entiteacute est un regroupement drsquoinformations (attributs) homogegravenes caracteacuterisant un objet A titre drsquoexemple le nom drsquoun client son preacutenom son adresse son code postal ou encore sa ville sont des attributs qui caracteacuterisent le client De mecircme la deacutesignation du produit le prix du produit ou encore la tva du produit sont des attributs qui caracteacuterisent le produit Grouper par exemple la tva drsquoun produit dans le mecircme lot que le nom du client nrsquoaura aucun sens Par ailleurs chaque ligne de lrsquoentiteacute doit ecirctre identifiable de faccedilon unique Si aucun attribut ne possegravede cette caracteacuteristique un identifiant numeacuterique doit ecirctre rajouteacute pour jouer ce rocircle En effet une entiteacute doit contenir au moins un attribut (son identifiant) Car si ce nrsquoest pas est le cas cet attribut ne doit pas posseacuteder des doublons au risque drsquoinstaurer une ambiguiumlteacute (imaginons le cas ou plusieurs clients portent le mecircme nom dans lrsquoentiteacute client et que le nom du client est le seul attribut de cette entiteacute ou encore dans lrsquoentiteacute produit avec la deacutesignation produit comme seul attribut ) On scheacutematise les entiteacutes par des rectangles agrave coins carreacutes

CLIENTS PRODUITS

IdClient IdProduit

NomClient DesignationProduit

PrenomClient PrixUnitaireProduit

AdresseClient TvaProduit

CodePostalClient QuantiteStock

VilleClient QuantiteSeuil

I1b) Les associations et les cardinaliteacutes

Une association repreacutesente le lien seacutemantique qui existe entre deux ou plusieurs entiteacutes A titre drsquoexemple le

lien naturel qui relie un client agrave un produit est lrsquoaction de commander En effet un client peut commander des

produits et un produit peut ecirctre commandeacute par des clients

Le nombre minimum et maximum de fois que lrsquoaction est autoriseacutee sont appeleacutes respectivement cardinaliteacute

minimale et cardinaliteacute maximale Dans notre exemple on peut les deacuteduire en se posant les questions

suivantes

Pour connaitre la cardinaliteacute minimale des clients combien de produits au minimum un client peut-il

commander La reacuteponse est 1 si on considegravere qursquoun client ne peut ecirctre inseacutereacute dans la table des clients que srsquoil

est lieacutee agrave un produit ou alors 0 si on considegravere qursquoun client est tout drsquoabord inseacutereacute dans la table des clients

avant drsquoecirctre associeacute agrave un produit Cette derniegravere option est la plus naturelle et la plus facile agrave mettre en œuvre

Pour connaitre la cardinaliteacute maximale des clients combien de produits au maximum un client peut-il

commander La reacuteponse est plusieurs

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 73 sur 81

Dans ce cas de figure on parle de cardinaliteacutes laquo1 nraquo ou laquo0 nraquo cocircteacute clients On peut proceacuteder de la mecircme

maniegravere cocircteacute produit pour deacuteduire que les cardinaliteacutes sont laquo0 nraquo En effet un produit peut ecirctre commandeacute

par plusieurs clients mais drsquoautres produits en revanche - moins populaires - risquent de ne faire lrsquoobjet

drsquoaucune action drsquoachat Par ailleurs au moment de lrsquointroduction des produits dans lrsquoentiteacute produits ces

derniers ne sont pas encore lieacutes agrave des clients

Une association peut ecirctre porteuse ou deacutepourvue drsquoinformations Dans notre exemple pour un client donneacute

on a besoin de connaitre agrave quelle date la commande a eacuteteacute passeacutee ainsi que la quantiteacute commandeacutee de chaque

produit Dans drsquoautres cas elle est deacutefinie uniquement pour symboliser le lien seacutemantique entre les entiteacutes

On scheacutematise les associations par des rectangles agrave coins arrondis Notons au passage que la modeacutelisation

proposeacutee ci-dessous nrsquoest pas finaliseacutee Elle preacutesente encore un certain nombre drsquoinconveacutenients qursquoon

corrigera dans les sections suivantes

CLIENTS PRODUITS

IdClient IdProduit

NomClient (0n) ou (1n) Action Commander (0n) DesignationProduit

PrenomClient DateCmd PrixUnitaireProduit

AdresseClient QuantiteCmd TvaProduit

CodePostalClient QuantiteStockProduit

VilleClient QuantiteSeuilProduit

(1) Les associations binaires

Une association est dite binaire si elle lie deux entiteacutes distinctes comme crsquoest le cas pour lrsquoassociation laquoAction

Commanderraquo qui lie les entiteacutes clients et produits

(2) Les associations reacuteflexives

Une association reacuteflexive est en quelque sorte une association binaire repreacutesentant le lien seacutemantique existant

entre les eacuteleacutements drsquoune mecircme entiteacute A titre drsquoexemple dans une entreprise on trouve geacuteneacuteralement un

preacutesident directeurs geacuteneacuteral plusieurs directeurs plusieurs chefs drsquoeacutequipes puis drsquoautres employeacutes Tous ces

gens-lagrave sont - en geacuteneacuteral - des employeacutes de lrsquoentreprise et possegravedent les mecircmes attributs Pour deacutefinir le lien

hieacuterarchique qui existe entre eux on peut deacutefinir une association laquodirigeraquo ou laquoecirctre dirigeacuteraquo Dans ce scheacutema

tous les employeacutes - en dehors du pdg - ont un seul supeacuterieur hieacuterarchique (le pdg nrsquoa aucun supeacuterieur

hieacuterarchique) et toute personne avec des responsabiliteacutes peut avoir - ou pas - plusieurs subordonneacutes

EMPLOYES

IdEmploye

NomEmploye Action Diriger

PrenomEmploye DateCmd

AdresseEmploye QuantiteCmd

CodePostalEmploye

VilleEmploye

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 74 sur 81

(3) Les associations n-aires

Une association non binaire est une association qui lie au minimum trois entiteacutes entre elles Lrsquoexemple classique

est celui ougrave lrsquoaction enseigner lie les entiteacutes professeurs matiegraveres classes et creacuteneaux

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur 0n 0n DesignationMatiere

PrenomProfesseur Action Enseigner VolumeHoraireMatiere

DateSeance

SALLES 0n EffectifSeance 0n CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

Il peut arriver des fois de consideacuterer - agrave tort - une association comme eacutetant une entiteacute mais lorsqursquoon eacutetablit

les cardinaliteacutes on srsquoaperccediloit que les cardinaliteacutes maximales du cocircteacute de cette entiteacute sont toutes agrave 1 alors que

les cardinaliteacutes maximales du cocircteacute des autres entiteacutes sont agrave n Dans ce cas de figure lrsquoentiteacute mise en cause ainsi

que toutes les associations lrsquoentourant et veacuterifiant cette regravegle vont fusionner pour former une seule association

liant les autres entiteacutes intervenantes dans cette configuration

Dans notre situation cela revient agrave remplacer le sceacutenario ci-dessous par celui eacutetablit juste avant

PROFESSEURS MATIERES

IdProfesseur IdMatiere

NomProfesseur DesignationMatiere

PrenomProfesseur ENSEIGNEMENT VolumeHoraireMatiere

DateSeance

SALLES EffectifSeance CRENEAUX

IdSalle IdCreneau

DesignationSalle HeureDebutCreneau

CapaciteSalle HeureFinCreneau

(4) Les associations plurielles

Il peut arriver que deux entiteacutes soient lieacutees agrave travers plusieurs associations on parle alors drsquoassociations

plurielles Crsquoest le cas par exemple entre une entiteacute personne et une entiteacute maison En effet une ou plusieurs

personnes peuvent acheterposseacutedervendreconstruire une ou plusieurs maisons Et inversement une maison

peut ecirctre acheteacuteeposseacutedeacuteevendueconstruite par une ou plusieurs personnes Les actions acheter posseacuteder

vendre et construire symbolisent chacune une association Les cardinaliteacutes cocircteacute personne sont de (0 n) pour

lrsquoensemble des actions alors que cocircteacute maison elles sont de (0 n) pour lrsquoaction acheteacutee et (1 n) pour les actions

posseacutedeacuteevendueconstruite

Assurer Ecirctre lieacutee

Reacuteserver Attribuer 0n

0n 0n

0n

11 11

11 11

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 75 sur 81

PERSONNES 0 n 0 n MAISONS

IdPersonne IdMaison

NomPersonne 0 n 1 n AdressesMaison

PrenomPersonne CodePostalMaison

GsmPersonne 0 n 1 n VilleMaison

EmailPersonne SuperficieMaison

SexePersonne 0 n 1 n NbrPiecesMaison

hellip hellip

I1c) Les regravegles de normalisation

La conception drsquoune base de donneacutees neacutecessite la prise en compte drsquoun certain nombre de bonnes pratiques

permettant - entre autres - drsquoeacuteviter la redondance et drsquoeacutetablir la coheacuterence entre les donneacutees Voici donc la

liste des regravegles usuelles

La normalisation des noms

La normalisation des attributs

La normalisation des identifiants

La normalisation des entiteacutes

La normalisation des cardinaliteacutes

La normalisation des associations

La normalisation des noms

Les noms utiliseacutes pour identifier les entiteacutes les associations ou encore les attributs de ces deux derniegraveres

doivent ecirctre uniques et compreacutehensibles Pour les entiteacutes il faut choisir un nom commun au pluriel et en

majuscule (PERSONNES MAISONS CLIENTS PRODUITS) Pour les associations il faut choisir un verbe agrave

lrsquoinfinitif (construire vendre posseacuteder acheter) ou agrave la forme passive (ecirctre construit ecirctre vendu ecirctre

posseacutedeacute ecirctre acheteacute) ou encore accompagneacute drsquoun adverbe (avoir lieu durant avoir lieu pendant avoir lieu

dans avoir lieu agrave) Pour les attributs des entiteacutes et des associations il faut choisir un nom commun au

singulier (NomClient PrenomClient CodePostalClient)

La normalisation des attributs

Les attributs des entiteacutes et des associations ne doivent pas ecirctre calculables agrave partir drsquoautres attributs et ne

doivent pas ecirctre redondants A titre drsquoexemple si un client possegravede plusieurs adresses plusieurs teacuteleacutephones

ou encore plusieurs contacts il faut creacuteer une association suppleacutementaire de cardinaliteacute maximale n pour

chacun de ces attributs Cette redondance ne se limite pas uniquement agrave une entiteacute ou agrave une association

mais concernes tout le modegravele Pour illustrer cette situation consideacuterons le cas ougrave les clients possegravedent deux

adresses une dans lrsquoentiteacute clients et lrsquoautre dans lrsquoassociation commander ces deux adresses ne doivent pas

avoir le mecircme rocircle sinon cela risque de conduire agrave des confusions Dans ce cas de figure il est preacutefeacuterable de

placer ces adresses (adresse de facturation et adresse de livraison) en fonction de leurs deacutependances de la

livraison ou de la facturation En drsquoautres termes si pour chaque client les deux adresses sont les mecircmes

cela srsquoappelle de la redondance Maintenant si ces deux adresses sont geacuteneacuteralement diffeacuterentes et ne

changent pas pour lrsquoensemble des livraisons elles doivent ecirctre deacutefinies dans lrsquoentiteacute laquoclientsraquo Mais si au

Acheter

Posseacuteder

Vendre

Construire

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 76 sur 81

contraire lrsquoune de ces adresses varie en fonction des livraisons cela va de soi il faut la deacutefinir dans

lrsquoassociation laquocommanderraquo

La normalisation des identifiants

Chaque entiteacute doit posseacuteder un identifiant Il faut eacuteviter les identifiants composeacutes de plusieurs attributs ou

sous forme de chaicircnes de caractegraveres car cela nuit aux performances et risque de poser des problegravemes dans

le futur En effet une cleacute composeacutee du nom du preacutenom et de la date de naissance est loin drsquoecirctre efficace

car lors des jointures (comparaison de la cleacute primaire avec la cleacute eacutetrangegravere) comparer des chaicircnes de

caractegraveres est plus gourment en termes de temps drsquoautant plus qursquoil y a trois comparaisons agrave faire Par

ailleurs rien nrsquoempecircche que deux personnes qui naissent agrave la mecircme date ne puissent pas avoir le mecircme nom

et le mecircme preacutenom Il faut garder agrave lrsquoesprit qursquoil est extrecircmement rare de gagner au loto mais ceci

nrsquoempecircche pas qursquoil est souvent des gagnants Par ailleurs il faut eacuteviter les cleacutes primaires susceptibles

drsquoeacutevoluer dans le temps comme les numeacuteros de teacuteleacutephone ou les numeacuteros drsquoimmatriculations Pour faire

simple et efficace il faut choisir un entier - de preacutefeacuterence - auto-increacutementeacute

La normalisation des entiteacutes

Toute entiteacute entoureacutee par des associations avec des cardinaliteacutes maximales agrave 1 du cocircteacute de lrsquoentiteacute et n de

lrsquoautre cocircteacute de chaque association doit ecirctre remplaceacutee par une association regroupant lrsquoentiteacute ainsi que

lrsquoensemble des associations participantes agrave cette configuration (voir exemple des association plurielles)

La normalisation des cardinaliteacutes

Une cardinaliteacute minimale ne peut prendre que la valeur 0 ou 1 En effet les seules valeurs significatives pour

la cardinaliteacute minimale sont 0 et 1 (0 un client peut exister sans qursquoil soit lieacutee agrave un produit) (1 un client ne

peut exister que srsquoil est lieacute agrave un produit) Dans la mesure ougrave cette cardinaliteacute deacutepasse la valeur 1 (exemple de

lrsquoassociation entre lrsquoentiteacute joueurs et lrsquoentiteacute matchs pour jouer un match de football il faut au minimum

11 joueurs) il suffit de rajouter une entiteacute eacutequipe pour ramener cette cardinaliteacute agrave la norme

Une cardinaliteacute maximale ne peut prendre que la valeur 1 ou n Le terme n deacutesigne toute valeur possible

supeacuterieure strictement agrave 1 Une cardinaliteacute maximale valant 0 nrsquoa aucun sens Elle est synonyme drsquoune

mauvaise conception Les seules valeurs significatives pour la cardinaliteacute maximale sont 1 ou n (1 un enfant

ne peux avoir au maximum qursquoune megravere geacuteneacutetique) (n un produit peut ecirctre acheteacute par plusieurs clients)

Lors du passage agrave un scheacutema relationnel pour les cardinaliteacutes (0 n) et (1 n) on ne fera pas de diffeacuterence

entre les cardinaliteacutes minimales 0 et 1 La cardinaliteacute minimale valant 1 peut ecirctre veacuterifieacutee dans le modegravele

physique agrave travers un deacuteclencheur

La normalisation des associations

Les attributs drsquoune association doivent deacutependre directement des identifiants de toutes les entiteacutes qui

lrsquoentoure En drsquoautres termes les identifiants des entiteacutes en association doivent deacutefinir de faccedilon unique

chaque attribut de lrsquoassociation A titre drsquoexemple dans lrsquoassociation commander entre les entiteacutes clients et

produits les attributs laquoDateCmdraquo et laquoQuantiteCmdraquo ne respectent pas justement cette regravegle En effet le

couple de valeurs (laquoIdClientraquo laquoIdProduitraquo) ne permet pas drsquoidentifier de faccedilon unique chacun de ces

attributs Il est de mecircme pour lrsquoassociation enseigner puisque la connaissance de (IdEnseignant IdMatiere

IdSalle IdCreneau) ne permet pas drsquoidentifier de faccedilon unique laquoDateSeanceraquo ou laquoEffectifSeanceraquo

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 77 sur 81

Lorsque les cardinaliteacutes maximales drsquoune association valent toutes n et que les identifiants des entiteacutes qui

lrsquoentoure permettent drsquoidentifier de faccedilon unique chacun de ses attributs lrsquoassociation doit ecirctre transformeacutee

en entiteacute avec un identifiant composeacute de lrsquoensemble des identifiants des entiteacutes en association

Lorsque lrsquoune des cardinaliteacutes maximales drsquoune association vaut 1 ses attributs doivent migrer vers lrsquoentiteacute

preacutesentant cette cardinaliteacute

Lorsque toutes les cardinaliteacutes maximales drsquoune association valent 1 lrsquoassociation et les entiteacutes qui lrsquoentoure

doivent fusionner pour former une seule entiteacute

I1d) Les formes normales

Pour avoir un bon scheacutema relationnel il est important drsquoadopter drsquoautres regravegles normalisation aussi importantes que les six regravegles eacutetudieacutees dans la section preacuteceacutedente Cela permettra en effet de consolider la robustesse de la conception du modegravele en eacutevitant la redondance des donneacutees ainsi que les problegravemes de mise agrave jour et de coheacuterence qui en deacutecoulent

La premiegravere forme normale

Cette forme concerne les attributs multivalueacutes Tout attribut doit ecirctre en effet atomique Le terme atomique

sous-entend qui si on arrive agrave deacutecomposer lrsquoattribut en plusieurs informations ce dernier nrsquoaura plus de sens

ou alors ces informations ne pourront pas ecirctre exploitables individuellement

AdresseClient EmailClient

20 Rue des roses 20000 Casablanca Maroc rcens-supcom rchotmailfr rcgmailcom

Nous constatons ici que lrsquoattribut laquoAdresseClientraquo est composeacutee du numeacutero dans la rue du nom de la rue

du code postal de la ville et du pays et que lrsquoattribut laquoEmailClientraquo est composeacute de plusieurs emails seacutepareacutes

par des virgules Si dans nos traitements actuels et futurs on nrsquoa nullement besoin de faire par exemple des

recherches par nom de rue par code postal par ville par pays ou par email alors les attributs

laquoAdresseClientraquo et laquoEmailClientraquo peuvent garder leurs formes pour des raisons drsquooptimisation Mais si en

revanche cette deacutecomposition permet ou permettra dans le futur de faire des traitements speacutecifiques agrave ces

eacuteleacutements ces attributs doivent ecirctre deacutecomposeacutes en plusieurs entiteacutes distinctes pour laquoAdresseClientraquo et en

une entiteacute appart pour laquoEmailClientraquo

La deuxiegraveme forme normale

Cette forme ne concerne que les identifiants composeacutes Un identifiant peut en effet ecirctre composeacute de

plusieurs attributs mais les autres attributs de lrsquoentiteacute doivent deacutependre de la totaliteacute de cet identifiant et

non drsquoune partie uniquement

TitreFilm DateProjection HeureProjection SalleProjection DureeFilm

Le roi lion 14062016 20 3 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (TitreFilm DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film ne deacutepond que du titre du film et non de la totaliteacute de

lrsquoidentifiant Cependant pour des raisons de performances on avait expliqueacute auparavant qursquoil fallait eacuteviter

les identifiants composeacutes et qursquoil fallait les remplacer par des identifiants entiers auto-increacutementeacutes Par

conseacutequent la deuxiegraveme forme normale doit ecirctre respecteacutee si elle nrsquoimpacte pas neacutegativement sur le temps

des traitements Le risque majeur du non-respect de cette forme est la possibiliteacute de creacuteer des incoheacuterences

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 78 sur 81

En effet si on projette le mecircme film agrave une autre date par exemple on risque de saisir une dureacutee

compleacutetement diffeacuterente

La troisiegraveme forme normale

Si on divise les attributs drsquoune entiteacute en deux blocs un bloc regroupant les attributs de lrsquoidentifiant et un

autre bloc regroupant le reste des attributs aucune deacutependance ne doit exister entre les attributs de ce

dernier bloc Autrement dit tout attribut nrsquoappartenant pas au bloc identifiant ne doit deacutependre que du bloc

lrsquoidentifiant

DateProjection HeureProjection SalleProjection TitreFilm DureeFilm

14062016 20 3 Le roi lion 75

Dans cet exemple on a consideacutereacute un identifiant composeacute de (DateProjection Heureprojection

SalleProjection) On constate que la dureacutee du film deacutepond du titre du film

En reacutesumeacute

Une relation est normaliseacutee en premiegravere forme normale si

1) elle possegravede un identifiant unique et stable

2) chaque attribut est monovalueacute (ne peut avoir qursquoune seule valeur)

3) aucun attribut nrsquoest deacutecomposable en plusieurs attributs significatifs

Une relation est normaliseacutee en deuxiegraveme forme normale si et seulement si

1) elle est en premiegravere forme normale

2) tout attribut non identifiant est totalement deacutependant de lrsquoidentifiant (aucun des attributs ne deacutepend

que drsquoune partie de lrsquoidentifiant)

3) La deuxiegraveme forme normale ne concerne que les relations ayant un identifiant composeacute Une relation

en premiegravere forme normale nayant que lrsquoidentifiant comme attribut est consideacutereacutee comme une

relation en deuxiegraveme forme normale

Une relation est normaliseacutee en troisiegraveme forme normale si

1) elle est en deuxiegraveme forme normale

2) tout attribut doit deacutependre directement de lrsquoidentifiant et uniquement de celui-ci (aucun attribut ne

doit deacutependre de lrsquoidentifiant par transitiviteacute ou deacutependre drsquoun autre attribut non identifiant)

Remarque

Il existe des regravegles de normalisation suppleacutementaires mais on considegravere que le respect des celles

preacutesenteacutees dans ce document est largement suffisant pour concevoir des modegraveles de bases de donneacutees

relationnelles fiables Par ailleurs pour des raisons drsquooptimisation on sera souvent ameneacutes agrave faire des

deacuterogations justifieacutees agrave certaines regravegles Crsquoest ce qursquoon appelle la deacutenormalisation

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 79 sur 81

I2 Les regravegles de passage du model conceptuel au modegravele logique des donneacutees laquoMLDraquo

Pour passer du modegravele conceptuel au modegravele logique des donneacutees on doit appliquer un certain nombre de regravegles

Regravegle 1

Les entiteacutes deviennent des relations (tables) et les attributs des colonnes

Regravegle 2

Les identifiants des entiteacutes deviennent des cleacutes primaires des relations (tables)

Regravegle 3

Les associations doivent soit disparaitre soit ecirctre transformeacutees en relations (tables) Nous allons illustrer ci-

dessous les diffeacuterents cas de figures

a) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave 1 doit geacuteneacuteralement

fusionner avec les entiteacutes en association pour former une seule table Cependant certaines exigences

fonctionnelles peuvent nous obliger agrave consideacuterer drsquoautres possibiliteacutes Nous allons eacutenumeacuterer ci-dessous

les diffeacuterentes possibiliteacutes

Le cas classique faire migrer les attributs de lrsquoassociation ainsi que ceux des entiteacutes vers lrsquoune des

entiteacutes la plus significative fonctionnellement Lrsquoassociation et les entiteacutes qui ont eacuteteacute videacutees de leurs

attributs doivent ecirctre supprimeacutees

EX 11 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons obtenir agrave ce moment lrsquoune des relations suivantes

EX(IdX AttX AttY AttA1 AttA2) si lrsquoentiteacute EX est plus significative que lrsquoentiteacute EY

EY(IdY AttY AttX AttA1 AttA2) si lrsquoentiteacute EY est plus significative que lrsquoentiteacute EX

Le cas ougrave fonctionnellement on souhaite distinguer entre les entiteacutes en association et ne pas

proceacuteder agrave une fusion On doit alors faire migrer les attributs de lrsquoassociation ainsi que les

identifiants des entiteacutes de cardinaliteacutes 10 vers lrsquoune des entiteacutes de cardinaliteacute 11 la plus

significative

EX 01 Association 11 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 80 sur 81

Le cas ougrave fonctionnellement les cardinaliteacutes peuvent ecirctre ameneacutees agrave eacutevoluer dans le temps et que

lrsquoon souhaite anticiper ce changement Lrsquoassociation devient alors une entiteacute dont lrsquoidentifiant sera

composeacute des identifiants des entiteacutes en association

EX 01 Association 01 EY

IdX AttA1 IdY

AttX AttA2 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

b) Une association binaire ou n-aire dont les cardinaliteacutes maximales sont toutes agrave n doit ecirctre transformeacutee

en une relation (table) dont la cleacute sera composeacutee des identifiants des entiteacutes en association

EX 0n Association 0n EY

IdX AttA1 IdY

AttX 1n AttA2 1n AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY AttY)

EXY(IdX IdY AttA1 AttA2)

c) Une association binaire dont les cardinaliteacutes maximales sont respectivement 1 et n doit ecirctre eacutelimineacutee en

faisant migrer ses attributs vers lrsquoentiteacute preacutesentant la cardinaliteacute maximale 1 Une reacutefeacuterence de la cleacute

primaire de lrsquoentiteacute de cardinaliteacute maximale n doit ecirctre ajouteacutee dans lrsquoentiteacute de cardinaliteacute maximale 1

Cette reacutefeacuterence agrave la cleacute primaire est nommeacutee cleacute eacutetrangegravere

EX 0n Association 01 EY

IdX AttA1 IdY

AttX 1n AttA2 11 AttY

Nous devons agrave ce moment obtenir les relations suivantes

EX(IdX AttX)

EY(IdY IdX AttY AttA1 AttA2)

I3 Le modegravele physique des donneacutees laquoMPDraquo

Le passage au modegravele physique de donneacutees est mateacuterialiseacute par la traduction du modegravele logique des donneacutees agrave

travers un systegraveme de gestion de bases de donneacutees Pour faire lrsquoanalogie avec lrsquoalgorithmique cela correspond

agrave la traduction de lrsquoalgorithme avec un langage de programmation compreacutehensible par lrsquoordinateur

Cette traduction passe par la creacuteation physique de la base de donneacutees la creacuteation des tables et la creacuteation des

colonnes Pour les colonnes on doit preacuteciser leurs natures (types de donneacutees) et eacuteventuellement les

contraintes qui leurs sont lieacutees

Pr N Laachfoubi FSTS Deacutepartement des Matheacutematiques et Informatique Page 81 sur 81

Etant donneacute qursquoon est censeacute traiter des quantiteacutes importantes drsquoinformations stockeacutees dans une base de

donneacutees cette eacutetape est eacutegalement lrsquooccasion pour penser agrave lrsquooptimisation des performances en termes de

temps de calcul En effet en faisant de la deacutenormalisation - malgreacute les risques drsquoincoheacuterence des donneacutees et

les problegravemes de gestion que cela implique - on pourra reacuteduire consideacuterablement le temps de reacuteponse de

certaines requecirctes Cette optimisation se fait souvent aussi au deacutetriment de lrsquoespace meacutemoire A titre

drsquoexemple lrsquoindexation de certaines colonnes consomme de lrsquoespace meacutemoire suppleacutementaire mais permet

drsquoacceacuteleacuterer les recherches tout en gardant la base de donneacutees normaliseacutee De la mecircme maniegravere lrsquoajout de

champs calculables permet drsquoeacuteviter drsquoeffectuer des jointures et des calculs sur une quantiteacute importantes de

donneacutees Dans ce cas de figure la base de donneacutees se retrouve deacutenormaliseacutee mais la coheacuterence pourra ecirctre

assureacutee agrave travers des deacuteclencheurs

Page 15: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 16: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 17: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 18: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 19: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 20: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 21: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 22: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 23: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 24: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 25: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 26: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 27: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 28: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 29: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 30: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 31: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 32: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 33: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 34: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 35: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 36: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 37: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 38: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 39: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 40: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 41: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 42: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 43: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 44: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 45: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 46: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 47: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 48: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 49: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 50: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 51: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 52: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 53: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 54: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 55: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 56: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 57: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 58: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 59: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 60: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 61: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 62: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 63: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 64: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 65: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 66: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 67: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 68: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 69: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 70: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 71: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 72: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 73: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 74: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 75: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 76: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 77: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 78: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 79: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 80: Université Hassan 1 Faculté des Sciences et Techniques de ...
Page 81: Université Hassan 1 Faculté des Sciences et Techniques de ...