Université Hassan 1 Faculté des Sciences et Techniques de ...
Transcript of 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
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
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
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
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
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
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
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
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
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
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
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
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
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