Académique Documents
Professionnel Documents
Culture Documents
Requêtes
Hamid Mask
Formateur en TDI
1/57
https://sql.sh/fonctions/agregation/max
Implémentation
d’une base de données
2/57
https://sql.sh/fonctions/agregation/max
Remarque :
n SGBDR offre :
U
UnLDD=La
● ngage deDescription desDonnées ouDDLen anglais.
Exemples de commandes LDD :
CREATE DATABASE - ALTER DATABASE - CREATE TABLE -
ALTER TABLE - DROP TABLE - CREATE INDEX - DROP INDEX.
Schema de la BD
3/57
REATEDATABASEVente
C 🡪le nom de la base
ONPRIMARY 🡪le fichier de données principal
(
NAME= Vente_data , 🡪nom logique
FILENAME= ‘C:\Data\vente.mdf’ , 🡪chemin etnom du fichier (nom physique)
SIZE= 60MB , 🡪 taille de départ
MAXSIZE= 70MB , 🡪taille maximale
FILEGROWTH= 1MB 🡪increment
)
LOGON 🡪le journal
(
NAME= Vente_log ,
FILENAME= ’D:\Log\vente.ldf’,
SIZE= 15MB ,
MAXSIZE= 20MB ,
FILEGROWTH= 1MB
)
ALTERDATABASEVenteMODIFYNAME= Commerce
DROPDATABASEVente
reateTableClient
C
(
CodeClintPrimaryKey,
NomVarchar(40)Not Null, 🡪Obligatoire
VilleVarchar(30) 🡪Non oblgatoire
)
4/57
Creation de la table Article
reateTableArticle
C
(
CodeArtintPrimaryKey,
DesiVarchar(40),
PUMoney,
Qdispint
)
5/57
II – 3 Les différents types de données.
C
● har, nchar, varchar, nvarchar
● int, bigint, smallint, tinyint, decimal / numeric, float, real, money,
smallmoney
● ate, datetime, datetime2, smalldatetime, datetimeoffset, time
D
● Geometry, geography
● Uniqueidentifier, rowversion
● binary, varbinary, bit
● xml
6/57
Exemple:
🡪
7/57
Insert into Customer (Nom,Ville) values('xxx','Safi')
🡪
🡪
🡪
🡪
● @
@IDENTITY Enregistrela dernière valeur IDENTITYinsérée.
Select @@IDENTITY As [@@IDENTITY]
🡪
● Exemple1 :
8/57
🡪
● Exemple2 :
● Where :
9/57
Where Age BETWEEN 20 AND 40 🡪Age entre 20 et40
OT IN
N
NOT LIKE
NOT BETWEEN
● Les Alias: On peut utiliser des noms d’alias pourles colonnes :
Identique à :
Select Distinct Nom, Ville From Client 🡪 Nom unefois par ville
● TOP:
A tout moment dans une requête SELECT on peut utiliser de nombreuses fonctions.
OUNT
C 🡪 le nombre
SUM
MIN
MAX
AVG 🡪 moyenne
Exemple :
10/57
Select Count (CodeCl) From Client Where Ville = ‘Fès’
elect
S Count(
CodeCl
)
As
NbClients From
Client
Select
AVG
(
PU
)
As
PUmoyFrom Article
Select
Min
(
PU
)
As
PUmin,
Max
(
PU
)
As
PUmax
From
Article
Exemple
SelectDay(GetDate())AsJour,Month(G
etDate())AsMois,Year(GetDate())AsAnnée
Exemple 1 :
Select DateDiff(Year, ‘06/10/2012’, ‘06/02/2014’) 🡪 Résultat : 2
Exemple 2 :
Select DateDiff(Month, ‘06/10/2013’, ‘06/02/2014’) 🡪 Résultat : 4
Exemple :
DateAdd(Year, 4, ‘06/10/2014’) 🡪 06/10/2018
Exemple :
DATEPART(Month, 06/10/2014) 🡪 10
11/57
Exercice 1 :
Eleve(CodeE, Nom, Prenom, Date-Naiss)
On veut calculer et afficher l’âge pour chaque élève.
1- O
n veut calculer et afficher le retard au-dela de 15 jours pour chaque emprunt non
encore retourné.
2- O
n veut calculer et afficher pour chaque adhérent le cumul (la somme) des retards de
tous ses emprunts non encore retourné.
● Insertion
● Suppression
12/57
a différence notable entre les commandes Delete et Truncate est que la
L
commandeTRUNCATEva ré-initialiserlavaleurdel’auto-incrément,s’ilyen
a un.
● Modification
Update Article Set PU = PU * 0.9 Where Qdisp >= 100 (PU = PU – PU*0.1)
🡪 reduire le PUde10%pourtouslesarticlesdontlaquantitéenstock
est supérieure à 100.
eleteTable1
D
FromTable1 a
JoinTable2 b On ……
JoinTable3 c On …….
WhereCh2 = …. And Ch3 = ….
13/57
Primary Key (NumCom,CodeArt)
)
Set
DateFormat
dmy
14/57
Exercices
Requêtes SQL – Série N° 1
15/57
Exercices
Requêtes SQL – Série N° 2
Travail demandé :
. Lister l’ensemble des livres triés par ordre croissant selon le titre.
1
2. Lister les livres par thème.
3. Calculer le nombre de livres par thème trié par ordre croissant selon ce
nombre.
4. Calculer le nombre d’emprunts par adhérent.
5. Calculer le nombre de livres emprunté par adhérent.
6. Calculer le nombre d’emprunts par livre.
7. Calculer le nombre d’emprunts par thème.
8. Calculer le nombre d’emprunts mensuel.
9. Calculer le nombre d’emprunts annuel.
10. Sélectionner le livre le plus emprunté.
11. Sélectionner le thème le plus emprunté.
12. Sélectionner l’adhérent ayant effectué le maximum d’emprunts.
13. Sélectionner les emprunts après une date donnée.
14. Sélectionner les emprunts concernant le thème «Maths».
16/57
5. Supprimer les emprunts après une date donnée.
1
16. Supprimer les emprunts concernant le thème «Maths».
17. Mettre à jour la date de retour des emprunts d’un adhérent à la date
système.
18. Supprimer tous les emprunts du mois 5/2018.
19. Doubler le nombre d’exemplaires des livres du thème «Economie».
20. On veut calculer et afficher le retard au-delà de 15 jours pour chaque
emprunt non encore retourné.
21. On veut calculer et afficher pour chaque adhérent le cumul (la somme)
des retards de tous ses emprunts non encore retourné.
22. On veut calculer et afficher le retard au-delà de 15 jours pour chaque
emprunt retourné.
23. On veut calculer et afficher pour chaque adhérent le cumul (la somme)
des retards de tous ses emprunts retourné.
17/57
V - Les Contraintes
Ce sont des conditions sur les données. On en connait déjà : les clés primaires et
trangères, les valeurs par défaut. L’objet de cette section est d’apprendre à créer ces
é
contraintes.
V - 1 Syntaxe
Pour définir une contrainte sur une colonne d’une table, on dispose de deux syntaxes :
CreateTableClient
(
CodeClVarchar(6 ),
NomVarchar(40)NotNull,
VilleVarchar(40)
ONSTRAINTcst_Ville
C
CHECK(V
illeIn('Fès','Casa','Rabat'))
ONSTRAINTPk_Client
C
PrimaryKey(CodeCl)
ONSTRAINTdef_Ville
C
Default'Fès'ForVille
)
emarques :
R
✔ pour pouvoir ajouter une contrainte, les données existantes doivent vérifier cette
contrainte ;
✔ sur insertion ou mise-à-jour, les nouvelles données sont contrôlées (si une donnée
ne vérifie pas une contrainte alors toute la transaction est annulée) ;
✔ on peut manipuler plusieurs contraintes dans un seul ALTER TABLE, il suffit de les
séparer par des virgules ;
LTERTABLETable1
A
ADDCONSTRAINTX
CHECK(...),
ADDCONSTRAINTY
CHECK(...),
ADDCONSTRAINTZ
CHECK(...)
18/57
Poursupprimerunecontrainte:
Syntaxe :
LTERTABLENom de la table
A
DROPCONSTRAINTNom de lacontrainte
Exemple :
LTERTABLEClient
A
DROPCONSTRAINTcst_Nom
Renommerune contrainte :
XEC
E sp_rename
N'cst_Ville'
,
N'cst_City'
,
N'Object'
EXEC
sp_rename
N'cst_Nom'
,
N'cst_Name'
,
N'Object'
EXEC
sp_rename
'def_Ville'
,
'def_City'
,
'Object'
V - 2 CHECK
- Syntaxe
1
La syntaxe d’une contrainte de typevérificationest: CHECK (clause WHERE sans le
WHERE).
LTERTABLEPersonne
A
ADDCONSTRAINTcst_age
CHECK(a
ge>=0ANDage<150)
LTERTABLEClient
A
ADDCONSTRAINTcst_Ville
CHECK(V
illeIn('Fès','Casa','Rabat'))
LTERTABLEEmprunt
A
ADDCONSTRAINTcst_DateEmp_DateRet
CHECK(D
ateEmp<DateRetour)
⮚
la clause CHECK ne peut pas contenir de sous-requête (Requête Select).
⮚ la clause CHECK ne peut pas porter sur une colonne utilisant IDENTITY.
Exemple :
LTERTABLEClient
A
ADDCONSTRAINTdef_Ville
Default'Fès'ForVille
reateTableCommande
C
(
NumComVarchar(6) PrimaryKey,
DateComDateDefaultGetDate(),
CodeClVarchar(6
)ForeignkeyreferencesClient(CodeCl)
)
LTERTABLECommande
A
ADDCONSTRAINTdef_DateCom
DEFAULTGETDATE()FORDateCom
V - 4 Clé primaire
Les clés primaires sont aussi des contraintes et pour les ajouter lors de la création de la
table, on peut utiliser la syntaxe :
ONSTRAINTnomdelacontrainte
C
PRIMARYKEY(c olonne1,colonne2,...)
Cette syntaxe est là indispensable pour déclarer une clé primaire composite
(c’est-à-dire portant sur plusieurs colonnes).
Exemple 1 :
CreateTableClient
(
CodeClVarchar(6 )NotNull,
NomVarchar(40)NotNull,
VilleVarchar(40)
ONSTRAINTPk_Client
C
PRIMARYKEY(C
odeCl)
)
Exemple 2 :
20/57
REATETABLEDetail
C
(
NumComINTNOTNULLForeignKeyReferencesCommande(NumCom),
CodeArtVARCHAR(6)NOTNULLForeignKeyReferencesArticle(CodeArt),
QteINT
ONSTRAINTPk_Detail
C
PRIMARYKEY(N
umCom,C
odeArt)
)
Exemple 3 :
CREATE TABLEEmprunt
(
CodeAVARCHAR(6) Foreign Key References Adherent(CodeA),
CodeLVARCHAR(6) Foreign Key References Livre(CodeL),
DateEmpDateTime,
DateRetour DateTime
CONSTRAINT Pk_Emprunt
PRIMARY KEY (CodeA, CodeL, DateEmp)
)
V - 5 UNIQUE
On peut imposer à une colonne (ou plusieurs colonnes) de prendre des valeurs uniques
(c’est-à-dire sans doublons) même si ce n’est pas une clé primaire.
Exemples :
Remarque: la valeur NULL n’est autorisée qu’une seulefois dans une colonne UNIQUE.
V – 6 Clé étrangère
es clés étrangères sont aussi des contraintes, et à nouveau, si on a oublié de les préciser
L
dès la création de la table, on peut les ajouter après. Attention : on ne peut faire de clé
étrangère que vers une clé primaire ou vers une colonne UNIQUE.
Exemple1 :
21/57
reateTableCommande
C
(
NumComVarchar(6) PrimaryKey,
DateComDateDefaultGetDate(),
CodeClVarchar(6
)
)
xemple 2: dans une base bibliothèque un empruntconcerne un exemplaire d’un livre, les
E
numéros ISBN et de copie doivent donc être les mêmes.
LTERTABLEClient
A
ADDCONSTRAINTcst_Nom
CHECK(N
omLIKE'A%')
elect*FromClient
S
InsertintoClientvalues('Cl08','alami','Fès')
AlterTableClientNOCHECKCONSTRAINTcst_Nom
AlterTableClientCHECKCONSTRAINTcst_Nom🡪 Marche
On peut désactiver toutes les contraintes à la fois dans une table.
AlterTableClientNOCHECKCONSTRAINTALL
AlterTableClientCHECKCONSTRAINTALL
22/57
VI - Sous-requêtes ( Subqueries)
Les conditions de sélection de la clauseWHEREpeuventutiliser le résultat d’une autre
requête.
ELECT
S NumCom, DateCom
FROM
Commande
WHERE
CodeCl
IN
(
SELECT
CodeCl
FROM
Client
WHERE
Nom
LIKE
'A%' )
ELECT
S *
FROM
Client
WHERE
CodeCl
NOT
IN(
SELECTCodeCl
FROM
Commande)
1.
les articles dont le prix est superieur à tous les articles
dont Qdip = 100 :
ELECT
S CodeArt, Desi
FROM
Article
WHERE
PU
>
ALL
(
SELECT
PU
FROM
Article
WHERE
Qdisp = 100 )
SELECT
CodeArt, Desi
FROM
Article
WHERE
PU
>
(
SELECT Max(
PU
)
FROM
Article
WHERE
Qdisp = 100 )
2.
Les articles dont le prix est superieur à l'un des articles
dont Qdip = 100 :
23/57
SELECT
CodeArt, Desi
FROM
Article
WHERE
PU
> ANY
(
SELECT
PU
FROM
Article
WHERE
Qdisp = 100 )
ELECT
S CodeArt, Desi
FROM
Article
WHERE
PU
>
(
SELECT
Min(
PU
)
FROM
Article
WHERE
Qdisp = 100 )
3.
Tous les articles mais seulement s’il existe un dont Qdip =
100 :
SELECT
CodeArt, Desi
FROM
Article
WHERE
EXISTS
(
SELECTCodeArt
FROM
Article
WHERE
Qdisp = 100 )
4.
Tous les articles mais seulement s’il n'existe pas d'article
dont Qdip = 100 :
ELECT
S CodeArt, Desi
FROM
Article
WHERE
NOT EXISTS
(
SELECTCodeArt
FROM
Article
WHERE
Qdisp = 100 )
ELECT
S *
FROM
Client a
WHERE
NOTExists
(
SELECTCodeCl
FROM
Commande
WHERE
CodeCl = a.CodeCl)
Exercices:
17- Selectionner les livres qui ne sont jamais empruntés
elect *
S
From Livre
Where CodeLNotIn(SelectDistinctCodeLFromEmprunt)
24/57
En utilisant la fonction EXISTS :
elect *
S
From Livre a
Where NotExists(SelectDistinctCodeLFromEmpruntWhere CodeL = a.CodeL)
elect*
S
FromThèmea
WhereCodeThNotIn(SelectCodeTh
FromEmpruntb
JoinLivrecOnb.C
odeL=c.CodeL
WhereCodeTh=a.C odeTh)
InsertIntoLivreValues('L05','Intro SQL','Alami',5
0,'Th04')
Etude de cas 1
Relation reflexive
25/57
I - Relation réflexive ( 0,1 à 0,n)
1. MCD
PersonneP PersonneE
odeP
C odeP
C
Nom Nom
Prenom Prenom
Personne
odeP
C
Père Nom
0,n Prenom
nfant
E
0,1
2. MLD
MLD 1
PersonneP PersonneE
odeP
C odeP
C
Nom Nom
Prenom Prenom
#CodeP
Personne
odeE
C
Nom
Prenom
CodeP
26/57
On veut tester ce modèle choisi pour s’assurer qu’il répondra à toutes nos réquêtes :
odeE
C odeP
C
1
X
A 2
2 X B 4
3 X C 2
4 X D Null
5 Y E Null
CreateDatabasePersonne
UsePersonne
CreateTablePersonne
(
CodeEintPrimaryKey,
NomVarChar(3 0),
PrenomVarChar(3 0),
CodePintReferencesPersonne
)
InsertIntoPersonneValues(1 ,'X','A',2
)
InsertIntoPersonneValues(2 ,'X','B',4
)
InsertIntoPersonneValues(3 ,'X','C',2
)
InsertIntoPersonneValues(4 ,'X','D',Null)
InsertIntoPersonneValues(5
,'Y','E',Null)
Select*FromPersonne
Select
*
rom
F Personne
Where
CodeP
IsNot
NullAnd
CodeE
NotIn
(
SelectCodeP
From
Personne
Where
CodeP
Is
Not
Null)
Select
*
From
Personne
Where
1
Is
Not
Null (1 <> Null
ne marche pas)
27/57
4. Selection des personnes ayant des petits fils :
electDistincta.C
S odeE,a.N
om,a.Prenom
FromPersonnea
JoinPersonnebOna.C odeE=b.C odeP
JoinPersonnecOnb.C
odeE=c.C odeP
electc.CodeE,c.N
S om,c.Prenom
FromPersonnea
JoinPersonnebOna.C odeE=b.C odeP
JoinPersonnecOnb.C odeE=c.C odeP
0,n Prenom
nfant
E
0,n
2. MLD
28/57
Personne PersonneE
odeE
C CodeE
#
Nom #CodeP
Prenom
- -----------------------------------------------
--- Cas Relation reflexive plusieurs à plusieurs
-------------------------------------------------
CreateDatabaseParenté
UseParenté
CreateTablePersonne
(
CodeEintPrimaryKey,
NomVarChar(3
0),
PrenomVarChar(3 0)
)
InsertIntoPersonneValues(1 ,'X','A')
InsertIntoPersonneValues(2 ,'X','B')
InsertIntoPersonneValues(3 ,'X','C')
InsertIntoPersonneValues(4 ,'X','D')
InsertIntoPersonneValues(5
,'Y','E')
Select*FromPersonne
CreateTableParent
(
CodeEintReferencesPersonne,
CodePintReferencesPersonne
onstraintPk_Parent
C
PrimaryKey(CodeE,CodeP)
)
InsertIntoParentValues(1 ,2
)
InsertIntoParentValues(2 ,4
)
InsertIntoParentValues(3
,2
)
DeleteParent
- - 1-
Select*FromPersonne
WhereCodeEIn(SelectCodePFromParent)
AndCodeENotIn(SelectCodeEFromParent)
- - 2-
Select*FromPersonne
WhereCodeENotIn(SelectCodePFromParent)
AndCodeEIn(SelectCodeEFromParent)
29/57
- - 3-
Select*FromPersonne
WhereCodeEIn(SelectCodePFromParent)
AndCodeEIn(SelectCodeEFromParent)
- - 4-
Select*FromPersonne
WhereCodeEIn(SelectCodePFromParent
WhereCodeEIn(SelectCodePFrom
Parent))
- - 5-
Select*FromPersonne
WhereCodeEIn(SelectCodeEFromParent
WhereCodeEIn(SelectCodePFrom
Parent))
30/57
Etude de cas 2
Heritage (Merise 2)
Héritage (Merise2) :
MCD :
MLD :
alarié(M
S atricule, Nom, Prenom)
Commercial(#Matricule, ZoneGéo)
Technicien((#Matricule, Spécialité)
Create
Database
Heritage
Use
Heritage
reate
C Table
Salarié
(
Matricule
intPrimary
Key
,
Nom
Varchar
(
30
),
Prenom
Varchar(
30
)
)
reate
C Table
Commercial
(
Matricule
int
Primary
Key
References
Salarié
,
ZoneGéo
Varchar
(
40
)
)
reate
C Table
Technicien
(
Matricule
int
Primary Key
References
Salarié
,
Spécialité
Varchar
(
40
),
31/57
)
---
-
Insert
Into
Salarié
Values
(
1
,
'A'
,
'X'
)
Insert
Into
Salarié
Values
(
2
,
'B'
,
'Y'
)
Insert
Into
Salarié
Values
(
3
,
'C'
,
'Z'
)
Insert
Into
Salarié
Values
(
4
,
'D'
,
'W'
)
Insert
Into
Salarié
Values
(
5
,
'E'
,
'T'
)
Select
*
From
Salarié
nsert
I Into
Commercial
Values
(1
,
'Fès Ouest'
)
Insert
Into
Commercial
Values
(2
,
'Fès Est'
)
Insert
Into
Commercial
Values
(5
,
'Fès Milieu'
)
nsert
I Into
Technicien
Values
(3
,
'Developpeur'
)
Insert
Into
Technicien
Values
(4
,
'Reseaux'
)
Insert
Into
Technicien
Values
(5
,
'Gestion'
)
1-
Afficher toutes les infos des commerciaux
elect
S a
.
Matricule
,
Nom ,
Prenom
,
ZoneGéo
From
Salariéa
Join
Commercialb
Ona
.
Matricule
=
b
.
Matricule
2-
Afficher toutes les infos des techniciens
elect
S a
.
Matricule
,
Nom ,
Prenom
,
Spécialité
From
Salariéa
Join
Technicienb
Ona
.
Matricule
=
b
.
Matricule
3-
Afficher les commerciaux et les techniciens avec toutes les infos.
elect
S 'Commercial'As TypeS
,
a
.
Matricule
,
Nom,
Prenom
,
ZoneGéo
As
InfoSpéciales
From
Salarié
a
Join
Commercial
b
On a
.
Matricule
=
b
.
Matricule
UNION
Select
'Technicien',
a
.
Matricule ,
Nom
,
Prenom
,
Spécialité
From
Salarié
a
Join
Technicien
b
On a
.
Matricule
=
b
.
Matricule
4-
Afficher les salariés ayant le même nom.
elect
S a
.
Matricule
,
a
.
Prenom
,
b
.
Matricule ,
b
.
Prenom
From
Salariéa
Join
Salariéb
On
a.
Nom
=
b.
NomAnd
a.
M
atricule >
b.
Matricule
5-
Afficher les salariés commerciaux et techniciens en même temps.
32/57
electa.M
S atricule,Nom,Prenom
FromSalariéa
JoinCommercialbOna.M atricule=b.Matricule
JoinTechniciencOna.Matricule=c.M
atricule
1. A U B
SELECT
CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'A%'
UNION
SELECT
CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'%D'
Remarque :
NION donne le résultat sans doublon.
U
UNION ALL donne le résultat avec doublon.
3. A ∩ B
SELECT
CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'A%'
INTERSECT
SELECT
CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'%D'
4. A \ B
ELECT
S CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'A%'
EXCEPT
SELECT
CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'%D'
5. B \ A
ELECT
S CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'%D'
EXCEPT
SELECT
CodeCl
,
Nom
FROM
Client
Where
Nom
Like
'A%'
33/57
VIII - Indexes :
Cette instruction SQL crée un index unique dans la tableClient. C.à.d. sans doublons.
Select
*
From
Client
Where
Nom
=
'Alami'
And
Ville
=
'Fès'
Make a Backup Copy- Now we want to make an exactcopy of the data in our
"Client" table.
ELECT *
S
INTO Client_Backup
FROM Client
We can also use the IN clause to copy the table into another database:
ELECT
S *
INTO
DB1
.
dbo
.
Client
FROM
Client
We can also copy only a few fields into the new table:
34/57
ELECT Nom, Ville
S
INTO Client_Backup
FROM Client
Exemple 1 :
SERV1
ase de données
B Tables
BD1 🡪 Client
BD2 🡪 Commande
BD3 🡪 Detail
BD4 🡪 Article
P (Code SQL) :
T
-- Création des BDs : BD1, BD2, BD3 et BD4
reate
C Database
BD1
Create
Database
BD2
Create
Database
BD3
Create
Database
BD4
Insert
into
Client
values
. . .
Create
TableCommande (
. . .
,
CodeCl
Varchar
(
6
) -- Sans Foreign key
)
et
s dateFormat
dmy
Insert
into
Commande
values
. . .
Create
TableDetail(
NumCom
Varchar(
6
),
-- Sans Foreign key references,
CodeArt
Varchar
(
6
),
-- Sans Foreign key references,
. . .
)
Insert
into
Detail
. . .
Create
Table
Article
(
.
. .
)
Insert
into
Article
values
. . .
elect
S *
From
Client
Select
*
From
BD2
.
dbo
.
Commande
Select
*
From
BD3
.
dbo
.
Detail
Select
*
From
BD4
.
dbo
.
Article
elect
S a
.
CodeCl
,
Sum
(
c
.
PU
*
b
.
Qte)
As
CA
From
BD2.
dbo
.
Commande
a
Join
BD3.
dbo
.
Detail
bOna
.
NumCom
=
b.
NumCom
Join
BD4.
dbo
.
Article
c
Onb.
CodeArt
=c.
CodeArt
Group
By a
.
CodeCl
36/57
elect
S a
.
NumCom
,
Sum
(
c
.
PU
*
b
.
Qte)
As
Total
From
BD2.
dbo
.
Commande
a
Join
BD3.
dbo
.
Detail
bOna
.
NumCom
=
b.
NumCom
Join
BD4.
dbo
.
Article
c
Onb.
CodeArt
=c.
CodeArt
Group
By a
.
NumCom
Exemple 1 :
Exemple 2 :
CreateViewVue_ClientDeFes
As
Select * From Client Where Ville = 'Fes'
o
G
Alter
View
Vue_ClientDeFes
(
C
,
N
,
V
)
37/57
s
A
Select
*
From
Client
Where
Ville
=
'Fes'
Go
Select
*
From
Vue_ClientDeFes
✔
Modifier une vue :
Alter
ViewVue_ClientDeFes
(
col1
,
col2
,
col3
)
As
Nouvelle requête
Select
. . .
✔
Renommer une vue :
Exec
sp_rename
'Vue_ClientsDeFès'
,
'
Vue1'
Exemple 2 : Une vue contenant les noms des clients et le nombre de leurs
commandes.
CreateViewVue_NbCmdClient
As
Select Nom, COUNT(NumCom) As NbCommandes
From Client a
Join Commande b On a.CodeCl = b.CodeCl
Group By Nom
Exemple 3 : Cas Biblio – Une vue contenant chaque livre emprunté avec sa date
d’emprunt et sa date de retour.
use Biblio
reateViewVue_EmpruntRetour
C
As
Select Titre, DateEmp, DateRetour
From Livre a
Join Emprunt b On a.CodeL = b.CodeL
Exemple 4 :Même exemple avec cette fois-ci calculdu retard par rapport à 15 jours.
CreateViewVue_EmpRetard
As
Select Titre, DateEmp, DateRetour, DATEDIFF(day,DateEmp,DateRetour) - 15
As Retard
From Livre a
Join Emprunt b On a.CodeL = b.CodeL
Where Retard > 0
38/57
elect * From Vue_EmpRetard Order By Retard Desc
S
Select * From Emprunt
Select DATEDIFF(day,'10/9/2014','20/9/2014')
Toute modification dans la table client sera faite aussi au niveau de la vue.
use Vente
AlterViewVue_ClientDeFes
As
Select * From Client Where Ville = 'Fes' And Nom Like 'A%'
DropView Vue_ClientDeFes
39/57
XIII - Les Transactions
efinition:
D
Une Transaction est une suite d’instructions SQL qui réussissent ou échouent en totalité
(pas de réussite partielle).
Si elle réussit, la base de données est modifiée, et la transaction est inscrite au journal.
Si une instruction échoue, toute la transaction est annulée et la base de données n’est pas
modifiée.
Exemple:
Si, maintenant, Delete ne réussit pas les deux Update sont annulés.
Super Marché
🡨 arte
C 🡨 Montant achats
🡨Lecteur
pdate CompteClient
U pdate CompteSP
U
Set Solde = Solde – Montant Set Solde = Solde + Montant
Where NumCompteClient = ‘XXXX’ Where NumCompteSP = ‘YYYY’
40/57
ommentaire:
C
Si l’instruction Update déduisant le montant des achats du solde du compte client
réussit, alors que l’instruction Update ajoutant le montant des achats au solde du compte du
Super Marché échoue, l’argent est perdu. De là, la nécessité de mettre les deux Update dans
une transaction. Dans ce cas, le Update réussissant sera annulé et l’argent sera remis au
compte client.
Exemple pratique :
UseVente
Select*FromClient
- - Pas de transaction
InsertintoClientValues(2 0,'yyy','Fès')
InsertintoClientValues(2 1,'zzz','Fès')
InsertintoClientValues(2
2,'www','Fès')
eginTran
B
InsertintoClientValues('Cl21','zzz','Fès')
InsertintoClientValues('Cl22','www','Fès')
InsertintoClientValues('Cl20','yyy','Fès')
CommitTran
eleteClientWhereCodeClIn('Cl21','Cl22')
D
Select*From Client
eginTry;
B
BeginTran
InsertintoClientValues('Cl21','zzz','Fès')
InsertintoClientValues('Cl22','www','Fès')
InsertintoClientValues('Cl20','yyy','Fès')
CommitTran
EndTry
BeginCatch;
RollBackTransaction;
Raiserror('Transaction annulée !!',1 6,1 );
Return;
EndCatch;
41/57
XII - LES JOINTURES EXTERNES :
LEFT JOIN – RIGHT JOIN – FULL JOIN.
Soient les deux tables Client et Commande de la base de donnéesVente:
elect
S Nom
,
NumCom
,
DateCom
From
Client
a
Join
Commande
b
Ona
.
CodeCl
=
b.
CodeCl
Resultat :
euls les clients ayant à des commandes sont affichés, et seules les commandes ayant
S
des clients sont affichées. On dit quela jointureest obligatoire à gauche et à droite.
ne jointure externe consiste à rendre la jointure non obligatoire à gauche, ou bien à droite ou
U
bien les deux.
Resultat :
42/57
Tous les clients sont affichés, même ceux n’ont pas de commandes. Alors que, seules
les commandes ayant des clients sont affichées. La jointure est devenue facultative à gauche.
On dit qu’il s’agit d’une jointure externe gauche.
Resultat :
Seuls les clients ayant des commandes sont affichés. Alors que, toutes les commandes
s ont affichées, même celles n’ayant pas de client. La jointure est devenue facultative à droite.
On dit qu’il s’agit d’une jointure externe droite.
43/57
Tous les clients sont affichés, même ceux n’ayant pas à des commandes. Et toutes les
c ommandes sont affichées, même celles n’ayant pas de clients. Les jointures de gauche et de
droite sont devenues facultatives. On dit qu’il s’agit d’une jointure externe pleine(ou totale).
Serie D’exercices
xercice I :
E
Soit le modèle relationnel suivant relatif à la gestion des notes annuelles d'une promotion
d'étudiants :
Question :
Exercice II :
Question :
44/57
) Ajouter un attribut Commission dans Employée.
1
2) Ajouter un attribut JourPrévu dans Projet (Nombre de jour prévu dans ce projet)
3) Ajouter un attribut JourRéalisé dans Participation (Nombre de jour réalisé par l’employée
dans le projet)
4) Ajouter des contraintes d’intégrité de domaine sur les deux champs JourPrévu et
JourRéalisé strictement positif.
5) Effectué une augmentation de 10% des salaires des employées du département « finance
».
6) Créer un index sur l’attribut NomE pour optimiser la recherche par nom.
7) Créer une vues sur la table Employée pour afficher Matr, NomE, Poste, NomDept et un
champ calculé salaire avec commission.
8) Créer une vues Projet pour afficher NomP, JourPrévu et le pourcentage des JourRéalisé par
rapport au JourPrévu
45/57
Gestion des utilisateurs, des groupes
et des rôles dans SQL Server 2017
46/57
Les utilisateurs sont authentifiés par Windows et reçoivent l'accès à SQL Server par
l'intermédiaire d'une connexion mappée à leur compte Windows (ou à un groupe Windows
dont ils sont membres).
reate
C Login
[NomDuDomaine\Khalid]
From
Windows
With
Default_Database
= Vente
Pour que cette modification soit effective,il faut redemarrer le serveur SQL.
47/57
● Creation d'une connection SQL
reate
C Login
Con1
With
PassWord= '123',
Default_Database
= Vente
reate
C Login
Con2
With
PassWord= '123',
Default_Database
= Vente
reate
C User
Ali
For
Login
Con1
With
Default_Schema
= dbo
Go
reate
C User
Ahmed
For
Login
Con2
With
Default_Schema
= monschema
Go
Remarques
:
✔
M aintenant, il est possible de se connecter au serveur avec Con1 et Con2.
✔ Un login (Compte de connexion) ne peut être lié qu’à un seul compte utilisateur dans la
même base données.
✔ Un login peut être lié à plusieurs comptes utilisateurs, mais dans des bases données
différentes..
EVOKE
R SELECT
ON
Client
FROM
Ali CASCADE
REVOKE
SELECT
ON
Article
FROMAhmed
ENY
D SELECT
ON
ClientTO
Ali
CASCADE
DENY
SELECT
ON
Article
TOAhmed
CASCADE
● E
mprunter l'identité d'un utilisateur pour tester les
autorisations
XECUTE AS USER
E = 'Ali'
EXECUTE AS USER
= 'Ahmed'
●
Revenir au contexte de sécurité par défaut (l’Admin)
REVERT
GRANT : autoriser
rant
G Select
On
Client
To
Ali
Grant
Select,Update,DeleteOn
Client
To
Ali
evoke
R SelectOn
Client FromAli
Annuler l’autorisation à Ali de faire un Select sur la table Client.
Revoke
Select,Update,Delete On
Client FromAli
Annuler l’autorisation à Ali de faire un Select, Update et Delete sur la table
Client.
50/57
5 – Création de rôles
Syntaxe
:
Alter Role [RoleName] add member [MemberName];
- Ou bien
-
EXEC
sp_addrolemember
Commercial
,
Ali
EXEC
sp_addrolemember
Commercial
,
Ahmed
EXEC
sp_droprolemember
Commercial
,
Ali
RANT
G SELECT(Nom,Ville),Update(Ville),Insert
ON
Client
TO
commercial
GRANT
SELECT(Desi,PU),Update(Qdisp)
ON
Article
TO
commercial
Exemple 2:
51/57
1, U2 sont deux secrétaires.
U
U3, U4, U5, U6 sont quatre commerciaux.
U7 est un magasinier.
ROLESecrétaire
REATE
C
ROLECommercial
CREATE
ROLEMagasinier
CREATE
10.
Ajout des utilisateurs aux rôles :
lter RoleSecrétaire
A Add Member
U1
Alter RoleSecrétaire
Add Member
U2
lter
A RoleCommercial
Add Member
U3
Alter
RoleCommercial
Add Member
U4
Alter
RoleCommercial
Add Member
U5
Alter
RoleCommercial
Add Member
U6
Alter RoleMagasinier
Add Member
U7
11.
Ajout d’autorisations aux roles
GRANT
SELECT ON
Client,Article
TO
Secrétaire
RANT
G SELECT ON
Client, Article
TO
Commercial
GRANT
INSERT ON
Client
TO
Commercial
GRANT
INSERT ON
Commande, Detail
TO
Commercial
GRANT
ALL ON
Article
TO
Magasinier
52/57
Syntaxe
:
REATE
C SCHEMA
schema1
AUTHORIZATION
nomproprietaire
Options
Exemple:
o
G
Create
Schema
schema1
Go
reate
C Tableschema1
.
T1
(IdT1
int
)
Go
Create
View
schema1.
V
ue1 As
Select
*
From
Client
Go
elect
S *
From
schema1
.
T1
Select
*
From
schema1
.
Vue1
lter
A Schemaschema1
Transfer
dbo
.
T2
Select
*
From
schema1
.
T2
53/57
9 – Suppression d’un schéma
Syntaxe
:
DROPSCHEMAnomschema
Exemple :
lter
A Schema
dbo
Transfer
schema1
.
T2
lter
A Schema
dbo
Transfer
schema1
.
Vue1
GRANT
SELECT,INSERT,UPDATE ON
DATABASE :: Vente To
Ali
54/57
● Création de deux utilisateurs
reate User U1
C
For Login Con1
Default_Schema = dbo
Octroi d’autorisations à U1 :
●
Grant Insert,Update On Schema :: schma1 To U1
● C
réation d’un rôle.
Create Role role1
55/57
Exercice I :
Soit une base de données DB_Prod contenant 5 tables (T1, T2, T3, T4, T5),
● e schéma TABLES_PROD contient les tables T1, T2, T3,
L
● Le Rôle Admin_PROD contient les utilisateurs U1, U2
● Le Rôle USER_PROD contient les utilisateurs U3, U4
● Le rôle ADMIN_PROD aura les droits : Insert, Update, Delete, Select …,sur le schéma
TABLES_PROD.
Seuls les utilisateurs membres d'USER_PROD pourront effectuer des requêtes sur les
●
tables.
● Faire des tests avec U1 et U3 pour voir.
Solution :
Fin du Cours
56/57
57/57