Vous êtes sur la page 1sur 43

Les bases fondamentales

du langage Transact SQL


Version 1.0

Grgory CASANOVA

James RAVAILLE
http://blogs.dotnet-france.com/jamesr

Les bases fondamentales du langage Transact SQL

Sommaire

Introduction ..................................................................................................................................... 4

Pr-requis ........................................................................................................................................ 5

2.1

Prsentation ............................................................................................................................ 5

2.2

Les expressions ........................................................................................................................ 5

2.3

Les oprateurs ......................................................................................................................... 6

2.4

Les fonctions ............................................................................................................................ 7

Les instructions DML ..................................................................................................................... 12


3.1

Prsentation .......................................................................................................................... 12

3.2

Cration, modification et suppression de donnes .............................................................. 12

3.2.1

Linstruction INSERT ...................................................................................................... 12

3.2.2

Linstruction UPDATE..................................................................................................... 14

3.2.3

Linstruction DELETE ...................................................................................................... 15

3.3

Lire et trier des donnes ....................................................................................................... 16

3.3.1

Linstruction SELECT ...................................................................................................... 16

3.3.2

Changer le nom des colonnes (ALIAS) ........................................................................... 16

3.3.3

La condition WHERE ...................................................................................................... 17

3.3.4

Les projections de donnes ........................................................................................... 18

3.3.5

Les calculs simples ......................................................................................................... 20

3.3.6

Le produit cartsien....................................................................................................... 20

3.3.7

Les jointures .................................................................................................................. 21

3.3.8

La close ORDER BY ......................................................................................................... 23

3.3.9

Loprateur UNION ........................................................................................................ 24

3.3.10

Loprateur EXCEPT ....................................................................................................... 25

3.3.11

Loprateur INTERSECT.................................................................................................. 25

3.3.12

La clause TOP ................................................................................................................. 26

3.3.13

Crer une table grce SELECT INTO ............................................................................ 26

3.3.14

La clause COMPUTE et COMPUTE BY ............................................................................ 27

3.3.15

Les oprateurs ROLLUP et CUBE ................................................................................... 28

3.3.16

Loprateur OVER .......................................................................................................... 29

3.3.17

Loprateur NTILE .......................................................................................................... 30

3.3.18

Les sous-requtes .......................................................................................................... 30


Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL

3.3.19

Les instructions PIVOT et UNPIVOT ............................................................................... 30

3.3.20

Linstruction MERGE ...................................................................................................... 32

Le SQL Procdural.......................................................................................................................... 33
4.1

Les variables .......................................................................................................................... 33

4.1.1

Les variables utilisateur ................................................................................................. 33

4.1.2

Les variables systme .................................................................................................... 33

4.2

Les transactions ..................................................................................................................... 33

4.3

Les lots et les scripts .............................................................................................................. 34

4.4

Le contrle de flux ................................................................................................................. 35

4.4.1

Linstruction RETURN..................................................................................................... 35

4.4.2

Linstruction PRINT ........................................................................................................ 35

4.4.3

Linstruction CASE.......................................................................................................... 36

4.4.4

Les blocs BEGIN END .................................................................................................. 36

4.5

La gestion des curseurs ......................................................................................................... 38

4.6

Les exceptions ....................................................................................................................... 41

4.6.1

Lever une exception ...................................................................................................... 41

4.6.2

Gestion des erreurs dans le code .................................................................................. 42

Conclusion ..................................................................................................................................... 43

Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL

1 Introduction
Dans ce cours, nous allons tudier les bases du langage Transact SQL. La version du langage
Transact SQL utilise est celle de SQL Server 2008. Pour ce faire, nous allons dfinir les diffrentes
parties du langage (DML, DDL, DCL), puis dtailler la partie DML, qui est celle qui sert manipuler les
donnes de faon gnrale.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL

2 Pr-requis
Avant de lire ce cours, nous vous conseillons :
-

Davoir dj utilis linterface dadministration de SQL Server 2008 : SQL Server Management
Studio (Chapitre 1).
Davoir les bases dans la construction dun modle relationnel de donnes (Chapitre 2).
Les bases fondamentales du langage T-SQL

2.1 Prsentation
Le T-SQL (Transact Structured Query Langage) est un langage de communication avec une
base de donnes relationnelle SQL Server. Il dfinit une batterie simple mais complte de toutes
les oprations excutables sur une base de donnes (lecture de donnes, oprations
dadministration du serveur, ajout, suppression et mises jour dobjets SQL - tables, vues,
procdures stockes, dclencheurs, types de donnes personnaliss -). Ce langage est compos
dinstructions, rparties dans de 3 catgories distinctes :

DML : Data Modification Language, soit langage de manipulation de donnes. Dans cette
catgorie, sinscrivent les instructions telles que linstruction SELECT ou encore les
instructions qui nous permettent la cration, la mise jour et la suppression de donnes
stockes dans les tables de la base de donnes. Il est important de retenir que le DML sert
simplement pour les donnes, et en aucun cas pour la cration, mise jour ou suppression
dobjets dans la base de donnes SQL Server.
DDL : Data Definition Language, soit langage de dfinition de donnes. Les instructions de
cette catgorie, permettent dadministrer la base de donnes, ainsi que les objets quelle
contient. Elles ne permettent pas de travailler sur les donnes. Aussi, elles ne seront pas
traites dans ce chapitre.
DCL : Data Control Language, soit langage de contrle daccs. Cette catgorie dinstructions
nous permet de grer les accs (autorisations) aux donnes, aux objets SQL, aux transactions
et aux configurations gnrales de la base.

Ces trois catgories combines permettent que le langage T-SQL prenne en compte des
fonctionnalits algorithmiques, et admette la programmabilit. Le T-SQL est non seulement un
langage de requtage, mais aussi un vrai langage de programmation part entire. Sa capacit
crire des procdures stockes et des dclencheurs (Triggers), lui permet dtre utilis dans un
environnement client de type .NET, au travers dune application en C# ou en VB.NET. Dans ce
chapitre, nous allons dtailler la partie DML du T-SQL exclusivement. Auparavant, nous tudierons
diffrents lments syntaxiques qui composeront la syntaxe de ce langage, savoir les expressions,
les oprateurs et les fonctions. Par la suite, nous traiterons laspect procdural (algorithmique) de ce
langage.

2.2 Les expressions


Dans le T-SQL, nous pouvons utiliser des expressions, permettant de mettre en uvre
laspect algorithmique du langage. Les expressions peuvent prendre plusieurs formes.
-

Les constantes : une constante est une variable, dont la valeur ne peut tre change lors de
lexcution dinstructions T-SQL.
Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL


-

Les noms de colonnes : ils pourront tre utiliss comme expressions. La valeur de
lexpression tant la valeur stocke dans une colonne pour une ligne donne.
Les variables : il sagit dentits qui peuvent tre employes en tant quexpressions ou dans
des expressions. Les variables sont prfixes par le caractre @. Les variables systmes sont
prfixes par les caractres @@. La valeur de lexpression variable est la valeur de la variable
elle-mme.
Les fonctions : il est possible dutiliser comme expression nimporte quelle fonction. Elles
permettent dexcuter des blocs dinstructions T-SQL, et de retourner une valeur.
Les expressions boolennes : elles sont destines tester des conditions. Elles sont utilises
dans des structures algorithmiques de type WHILE, IF ou encore dans la clause WHERE dune
requte SQL, affiner de permettre dafficher une recherche, ou bien poser une condition
dexcution.
Les sous-requtes : une sous requte SELECT peu tre place en tant quexpression. La
valeur de lexpression est la valeur renvoye par la requte.

2.3 Les oprateurs


Les oprateurs nous permettent de combiner des expressions, des expressions calcules ou
des expressions boolennes. Il existe plusieurs types doprateurs, que nous allons dtailler :
-

Les oprateurs arithmtiques :

+
*
/
%

Addition
Soustraction
Multiplication
Division
Modulo (reste de division)

Les oprateurs de bits :

&
|
^
~

ET
OU
OU exclusif
NON

Les oprateurs de comparaison :

=
>
>=
<
<=
<>
Exp1 IN (exp2, exp3, )
IS NULL
Exp1 BETWEEN minimum AND maximum

gale
Suprieur
Suprieur ou gal
Infrieur
Infrieur ou gal
Diffrent
Compare lexpression seule toutes les
expressions de la liste
Renvoie True si lexpression est NULL. False le
cas chant
Recherche si la valeur de Exp1 est comprise
entre la valeur minimum et maximum .

Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL

EXISTS (Sous Requte)


Exp1 LIKE

Les bornes minimum et maximum sont incluses


Renvoie True, si et seulement si la sous requte
renvoie au moins une ligne
Permet de filtrer des donnes suivant un
modle

Pour loprateur de comparaison LIKE, les expressions permettent de dfinir un modle de


recherche pour la correspondance des donnes :
_
%
*ab+
[a-z]
*^ab+

Un caractre quelconque
N caractres quelconques
Un caractre dans la liste ab
Un caractre dans lintervalle a-z
Un caractre en dehors de la liste ou de
lintervalle spcifi
Le ou les caractres eux-mmes

ab

Les oprateurs logiques :

OR

Retourne True si une expression des deux


expressions (oprandes) est vraie
Retourne True si les deux expressions
(oprandes) sont vraies.
True si lexpression est fausse.

AND
NOT

2.4 Les fonctions


Les fonctions se distinguent en deux catgories : celles cres par lutilisateur, ou les
fonctions systme. Nous allons dtailler ci-dessous les fonctions systme, les fonctions utilisateur
seront traites dans un autre cours. Les fonctions systme se divisent en diffrentes catgories :
-

Les fonctions dagrgation :

COUNT (*)
COUNT ([ALL|DISTINCT] exp1)
COUNT_BIG

SUM ([ALL|DISTINCT] exp1)


AVG ([ALL|DISTINCT] exp1)
MIN (exp1) OU MAX (exp1)
STDEV ([ALL|DISTINCT] exp1)
STDEVP ([ALL|DISTINCT] exp1)
VAR ([ALL|DISTINCT] exp1)

Dnombre les lignes slectionnes


Dnombre toutes les expressions non nulles
ou les expressions non nulles distinctes
Possde le mme fonctionnement que la
fonction COUNT, simplement, le type de
donnes de sortie est de type bigint au lieu de
int
Somme de toutes les expressions non nulles
ou des expressions non nulles distinctes
Moyenne de toutes les expressions non nulles
ou des expressions non nulles distinctes
Valeur MIN ou valeur MAX dexp1
Ecart type de toutes les valeurs de lexpression
donne
Ecart type de la population pour toutes les
valeurs de lexpression donne
Variance de toutes les valeurs de lexpression
donne

Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL


VARP ([ALL|DISTINCT] exp1)

Variance de la population pour toutes les


valeurs donne
Sutilise avec ROLLUP ou CUBE. Indique 1
quand la ligne est gnre par un ROLLUP ou
un CUBE et 0 dans un autre cas
Permet de calculer un code de contrle par
rapport une ligne de la table ou par rapport
une liste dexpression. Cette fonction permet
la production dun code de hachage
Permet le calcul dune valeur de hachage par
rapport un groupe de donnes. Ce code de
contrle permet de savoir rapidement si des
modifications ont eu lieu sur un groupe de
donnes, car cette valeur de contrle nest
plus la mme aprs modification des donnes

GROUPING

CHECKSUM (* | *exp1+)

CHECKSUM_AGG ([ALL|DISTINCT] exp1)

Les fonctions mathmatiques :

ABS (exp1)
CEILING (exp1)
FLOOR (exp1)
SIGN (exp1)

Valeur absolue dexp1.


Plus petit entier suprieur ou gal exp1.
Plus grand entier suprieur ou gal exp1.
Renvoie 1 si exp1 est positive, -1 si elle est
ngative, et 0 si elle est gale 0.
Racine carre dexp1.
Exp1 la puissance n.
Calcul du carr dexp1.

SQRT (exp1)
POWER (exp1, n)
SQUARE (exp1)

Les fonctions trigonomtriques :

PI ()
DEGREES (exp1)
RADIANS (exp1)
SIN (exp1), COS (exp1), TAN (exp1), COT (exp1)
ACOS (exp1), ASIN (exp1), ATAN (exp1)
ATN2 (exp1, exp2)

Les fonctions logarithmiques :

EXP (exp1)
LOG (exp1)
LOG10 (exp1)

Valeur de PI.
Conversion dexp1 de radian vers degrs.
Conversion dexp1 de degrs vers radians.
Sin, cos ou tangente dexp1.
Arc cos, arc sin ou arc tan dexp1.
Angle dont la tangente se trouve dans
lintervalle exp1 et exp2.

Exponentielle dexp1.
Logarithme dexp1.
Logarithme base 10 dexp1.

Les fonctions de dates :


Format

Year
quarter
Month
Day of year

Abrviation
Yy, yyyy
Qq, q
Mm, m
Dy, y

signification
Anne (1753 9999)
Trimestre (1 4)
Mois (1 12)
Jour de lanne (1 366)

Dotnet France Association Grgory CASANOVA / James RAVAILLE

Les bases fondamentales du langage Transact SQL


Day
Weekday
Hour
Minute
Seconds
milliseconds

Dd, d
Dw, ww
Hh
Mi, n
Ss, s
Ms

GETDATE ()
DATENAME (format, exp1)
DATEPART (format, exp1)
DATEDIFF (format, exp1, exp2)
DATEADD (format, p, exp1)
DAY (exp1)
MONTH (exp1)
YEAR (exp1)
SWITCHOFFSET (datetimeoffset, zone_horaire)
SYSDATETIME
SYSDATETIMEOFFSET

Jour dans le mois (1 31)


Jour de la semaine (1 7)
Heure (0 23)
Minute (0 59)
Seconde (0 59)
Milliseconde (0 999)

Date et Heure systme.


Renvoie la partie date sous forme de texte.
Renvoie la valeur de la partie date selon le
format donn.
Diffrence entre les deux tables selon le
format donn.
Ajoute p format la date exp1.
Retourne le numro du jour dans le mois.
Retourne le numro du mois.
Retourne lanne.
Convertis le type datetimeoffset en le type
pass en second paramtre.
Retourne la date et lheure usuelle du serveur
dans le format datetime2.
Fonctionne de la mme manire que
SYSDATETIME, mais il prend en compte le
dcalage GMT.

Les fonctions de chane de caractres :

ASCII (exp1)
UNICODE (exp1)
CHAR (exp1)
NCHAR (exp1)
LTRIM (exp1), RTRIM (exp1)
STR (exp1, n, p)

SPACE (n)
REPLICATE (exp1, n)
CHARINDEX (masque, exp1)
PATINDEX (%masque%, exp1)

LOWER (exp1), UPPER (exp1)

REVERSE (exp1)

Valeur du code ASCII du premier caractre


dexp1.
Valeur numrique correspondant au code
UNICODE dexp1.
Caractre correspondant au code ASCII dexp1.
Caractre UNICODE correspondant au code
numrique dexp1.
Supprime les espaces droit pour RTRIM et
gauche pour LTRIM dexp1.
Convertit le nombre exp1, en chaine de
longueur maximale n dont p caractres seront
droite de la marque dcimale.
Renvoie n espaces.
Renvoie n fois exp1.
Renvoie la position de dpart de la premire
expression masque dans exp1. PATINDEX
permet dutiliser des caractres gnriques et
de travailler avec certains type comme TEXT,
CHAR ou encore VARCHAR.
Change la casse. LOWER va convertir exp1 en
minuscules et UPPER va convertir exp1 en
majuscules.
Retourne les caractres dexp1 dans le sens
inverse.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

10

Les bases fondamentales du langage Transact SQL


RIGHT (exp1, n)
LEFT (exp1, n)
SUBSTRING (exp1, n, p)
STUFF (exp1, n, p, exp2)
SOUNDEX (exp1)
DIFFERENCE (exp1, exp2)

LEN (exp1)
QUOTENAME (exp1)
REPLACE (exp1, exp2, exp3)

Renvoie les n caractres les plus droite


dexp1.
Renvoie les n caractres les plus gauche
dexp1.
Renvoie p caractres dexp1 partir de n.
Supprime p caractres dexp1, partir de n,
puis insre exp2 la position n.
Renvoie le code phontique dexp1.
Compare les SOUDEX des deux expressions. La
valeur,qui peut tre renvoye va de 1 4,4,
valeur pour laquelle, les deux expressions
possdent la plus grande similitude.
Retourne le nombre de caractres dexp1.
Permet de transformer exp1 en identifiant
valide pour SQL Server.
Permet de remplacer dans exp1 toutes les
occurrences dexp2 par exp3.

Les Fonctions systmes :

COALESCE (exp1, exp2)


COL_LENGTH (nom_table, nom_colonne)
COL_NAME (id_table, id_colonne)
DATALENGTH (exp1)
DB_ID (Nom_base)
DB_NAME (id_base)
GETANSINULL (nom_base)
HOST_ID ()
HOST_NAME ()
IDENT_INCR (nom_table)
IDENT_SEED (nom_table)
IDENT_CURRENT (nom_table)
INDEX_COL (nom_table, id_index, id_cle)
ISDATE (exp1)
ISNULL (exp1, valeur)
ISNUMERIC (exp1)
NULLIF (exp1, exp2)
OBJECT_ID (objet)
OBJECT_ID (name)
STATS_DATE (id_table, id_index)
SUSER_SID (nom_acces)
SUSER_SNAME (id)
USER_NAME (id)

Renvoie la premire expression non NULL.


Longueur de la colonne.
Nom de la colonne.
Longueur en octet de lexpression.
Numro didentification de la base de
donnes.
Nom de la base.
Renvoie 1 si loption ANSI NULL DEFAULT est
positionn pour la base.
Numro didentification du poste.
Nom du poste.
Valeur de lincrmentation dfinit pour la
colonne identit de la table spcifie.
Valeur initiale dfinie pour la colonne identit
de la table indique.
Retourne la dernire valeur de type identit
utilis par cette table.
Nom de la colonne index correspondant
lindex.
Renvoie 1 si lexpression de type varchar
possde un format date valide.
Renvoie valeur si exp1 est NULL.
Renvoie 1 si lexpression de type varchar a un
format numrique valide.
Renvoie NULL si exp1 = exp2.
Numro didentification de lobjet.
Nom de lobjet dont lid est plac en argument.
Date de la dernire mise jour de lindex.
Numro didentification correspondant au
nom_acces.
Nom daccs identifi par lid.
Nom de lutilisateur dont lid est plac en

Dotnet France Association Grgory CASANOVA / James RAVAILLE

11

Les bases fondamentales du langage Transact SQL

CURRENT_TIMESTAMP
SYSTEM_USER
CURRENT_USER, USER, SESSION_USER
OBJECT_PROPERTY (id, proprit)
ROW_NUMBER

RANK
DENSE_RANK
HAS_DBACCESS (nom_base)

HAS_PERMS_BY_NAME
KILL
NEWID ()
NEWSEQUENTIALID ()
PARSENAME (nom_objet, partie__extraire)

PUBLISHINGSERVERNAME
STUFF (chaine1, n, p, chaine2)

Les fonctions conversion de types :

CAST (exp1 AS types_donnes)


CONVERT (types_donnes, exp1, style)

argument.
Date et heure systme, quivalent GETDATE
().
Nom daccs.
Nom de lutilisateur de la session.
Permet de retrouver les proprits de la base.
Permet de connaitre le numro dune ligne
issue dune partition depuis un jeu de
rsultats.
Permet de connaitre le rang dune ligne issue
dune partition dans une srie de rsultats.
Fonctionne comme RANK, mais ne sapplique
quaux lignes de la srie de rsultat.
Permet de savoir si, avec le contexte de
scurit actuel, il est possible daccder la
base. (retourne 1 dans ce cas, dans le cas
contraire, 0)
Permet de savoir par programmation, si lon
dispose dun privilge ou non.
Cette fonction permet de mettre fin une
session utilisateur.
Permet de grer une valeur de type
UniqueIdentifier.
Permet de grer la prochaine valeur de type
UniqueIdentifier.
Permet dextraire partir du nom complet de
lobjet, le nom de lobjet. La partie
partie__extraire peut prendre la valeur 1, 2,
3, 4 selon si lon veut extraire le nom de
lobjet, le schma, la base, ou encore le nom
du serveur.
Permet de savoir qui est lorigine dune
publication.
Permet de supprimer p caractres de la chaine
chaine1, partir des positions n, puis dy
insrer chaine2

Permet de convertir une valeur dans le type


spcifi en argument
Conversion de lexpression dans le type de
donnes spcifi. Un style peut tre spcifi
dans le cas dune conversion date ou heure

Les fonctions diverses :

RAND (exp1)
ROUND (exp1, n)

Nombre alatoire compris en 0 et 1. Exp1 est la


valeur de dpart
Arrondis exp1 n chiffres aprs la virgule

Dotnet France Association Grgory CASANOVA / James RAVAILLE

12

Les bases fondamentales du langage Transact SQL

3 Les instructions DML


3.1 Prsentation
Pour toutes les instructions du DML, il existe dans SQL Server un outil simple pour retrouver
la syntaxe voulue rapidement (Pour des instructions simples, telle le SELECT, UPDATE). La dmarche
est simple. Via le menu contextuel dune table, slectionnez Gnrer un script de la table en tant
que . Il nous est alors propos de slectionner laction que nous voulons accomplir : SELECT,
INSERT, UPDATE ou DELETE. Cette action peut aussi tre ralise sur dautres objets SQL de la base
de donnes.

3.2 Cration, modification et suppression de donnes


3.2.1

Linstruction INSERT
Linstruction INSERT, comme son nom lindique, va nous permettre dajouter une ligne de
donnes dans une table de la base de donnes. Le code gnrique, dajout dune ligne de donnes
est la suivante :
INSERT INTO [Entreprise].[dbo].[Client]
([Nom_Client]
,[Prenom_Client]
,[Numero_Client]
,[Adresse_Client]
,[Mail_Client])
VALUES
(<Nom_Client, varchar(50),>
,<Prenom_Client, varchar(50),>
,<Numero_Client, varchar(20),>
,<Adresse_Client, varchar(50),>
,<Mail_Client, varchar(50),>)
GO

Dans ce code gnrique, nous demandons SQL Server dajouter un enregistrement la


table Client, appartenant au schma dbo dans la base de donnes Entreprise. Pour prciser les
colonnes pour lesquelles nous allons ajouter des donnes, il est ncessaire de prciser le nom des
colonnes, aprs linstruction INSERT INTO. Le mot cl VALUES nous permet de fournir des valeurs
aux champs. Il est impratif que les valeurs soient dans le mme ordre que celui des colonnes, tout
dabord pour la cohrence des donnes, mais aussi pour respecter la compatibilit des donnes avec
le type que vous avez assign votre table au moment de sa cration. Dans le cas o certaines de vos
colonnes acceptent des valeurs NULL, il existe deux mthodes pour obtenir cette valeur. La premire,
est domettre le nom de la colonne et la valeur correspondante dans linstruction. La seconde vise
laisser la colonne dans la description, mais prciser le mot cl NULL dans la clause VALUES. Pour
des chaines de caractres, il faut placer celles-ci entre simples cotes. Dans le cas dun champ de type
identit (possdant une incrmentation automatique grce la contrainte IDENTITY), il nest pas
ncessaire de spcifier ni le nom du champ, ni sa valeur.
Procdons un exemple pour mieux comprendre :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

13

Les bases fondamentales du langage Transact SQL

INSERT INTO [Client]


(Nom_Client,
Prenom_Client,
Numero_Client,
Adresse_Client,
Mail_Client)
VALUES
('CASANOVA',
'Grgory',
+33563456764,
'31 place de la chance',
'75554@supinfo.com')
GO

Aprs avoir excut le code ci-dessus, le message suivant apparait, confirmant de sa bonne
excution :

Dans le cas dune insertion multiple denregistrements, la syntaxe sera la mme,


lexception prs quau lieu dune seule srie de donnes aprs le mot cl VALUES, vous en spcifier le
nombre voulu. Si nous voulons ajouter deux enregistrements dans une mme instruction Insert, alors
la syntaxe est la suivante :
INSERT INTO [Client]
(Nom_Client,
Prenom_Client,
Numero_Client,
Adresse_Client,
Mail_Client)
VALUES
('CASANOVA',
'Grgory',
+33563456764,
'31 place de la chance',
'75554@supinfo.com'),
('RAVAILLE',
'James',
+33567876435,
'34 Avenue de le paix',
'James.Ravaille@Domaine.fr')
GO

Le message suivant saffiche, aprs lexcution de cette instruction, ce qui confirme bien que
lenregistrement multiple a t excut sans erreur :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

14

Les bases fondamentales du langage Transact SQL

Enfin, il est possible dajouter des enregistrements laide de linstruction SELECT, qui va
copier les enregistrements dune table (source) vers une autre table (destination). Voici un exemple :
INSERT Commande
SELECT Id_Client, GETDATE(), Id_Stock, 1
FROM Client, Stock
WHERE Id_Client = 3
AND Id_Stock = 5

Dans ce cas, nous allons ajouter dans la table commande, les informations slectionnes. Ici,
Id_Client, la date du jour grce la fonction GETDATE(), Id_Stock, et le chiffre 1 qui correspond
la quantit que nous voulons ajouter la commande de notre client. Les informations concernant
Id_Client et Id_Stock seront slectionnes en fonction des conditions prcises aprs la clause
WHERE. Grce ce lot, nous allons ajouter la troisime ligne prsente dans le rsultat prsent cidessous.

3.2.2

Linstruction UPDATE
Linstruction UPDATE, permet de mettre jour un ou plusieurs enregistrements. La syntaxe
gnrique de cette instruction est la suivante :
UPDATE [Entreprise].[dbo].[Client]
SET [Nom_Client] = <Nom_Client, varchar(50),>
,[Prenom_Client] = <Prenom_Client, varchar(50),>
,[Numero_Client] = <Numero_Client, varchar(20),>
,[Adresse_Client] = <Adresse_Client, varchar(50),>
,[Mail_Client] = <Mail_Client, varchar(50),>
WHERE <Conditions de recherche,,>
GO

Linstruction ci-dessus permet de mettre jour la table Client de la base de donnes


Entreprise. La clause SET permet dindiquer les champs mettre jour. La clause WHERE, sert cibler
les enregistrements mettre jour. Voici lenregistrement de la table Client dont le champ Id-Client
vaut 3 :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

15

Les bases fondamentales du langage Transact SQL


Voici une instruction SQL permettant de modifier le nom de ce client :
UPDATE [Entreprise].[dbo].[Client]
SET [Adresse_Client] = 18 Rue du cotton
WHERE Id_Client = 3
GO

Aprs lexcution de linstruction ci-dessus, voici les donnes de lenregistrement modifi :

Il est aussi possible deffectuer des oprations grce un UPDATE. Par exemple, on peut
augmenter les prix des articles dun magasin de 10%, en multipliant le prix de tous les articles par 1,1.

3.2.3

Linstruction DELETE
Linstruction DELETE permet de supprimer des enregistrements. La syntaxe gnrique est la
suivante :
DELETE FROM [Entreprise].[dbo].[Client]
WHERE <Conditions de recherche,,>
GO

Linstruction DELETE FROM va permettre la suppression de donnes dans la table Client de


la base de donnes Entreprise, dans la seule condition que les contraintes dans WHERE soient
respectes. Voici une instruction permettant de supprimer lenregistrement de la table Client dont
lidentifiant est 4 :
DELETE FROM [Entreprise].[dbo].[Client]
WHERE Id_Client = 4
GO

Aprs avoir excut le code, on remarque que le client dont lidentifiant est 4, nexiste plus :

La suppression multiple de donnes est possible, par exemple si dans notre cas, nous avions
prcis une plage didentifiants dans notre clause WHERE.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

16

Les bases fondamentales du langage Transact SQL

3.3 Lire et trier des donnes


3.3.1

Linstruction SELECT
Linstruction SELECT permet de slectionner des donnes (tout ou partie
denregistrements), dune ou plusieurs tables. Elle offre aussi la possibilit de les trier, et de les
regrouper. La syntaxe gnrale de cette instruction est la suivante :
SELECT [Id_Client]
,[Nom_Client]
,[Prenom_Client]
,[Numero_Client]
,[Adresse_Client]
,[Mail_Client]
FROM [Entreprise].[dbo].[Client]
GO

Voici une instruction SELECT permettant de lire le nom et ladresse Email de tous les clients
(si notre but avait t de slectionner toutes les colonnes, au lieu de lister toutes celles-ci, il est
possible dindiquer que nous les slectionnons toutes avec le simple caractre * ) :
SELECT [Nom_Client]
,[Mail_Client]
FROM [Entreprise].[dbo].[Client]
GO

Le rsultat sera le suivant :

3.3.2

Changer le nom des colonnes (ALIAS)


Par dfaut, le nom de la colonne est celui du nom de la colonne dans la table. Il est possible
den changer en utilisant des alias. Voici un exemple dutilisation dalias :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

17

Les bases fondamentales du langage Transact SQL

------Il existe deux manires de renommer les colonnes.


--Celle-ci :
----SELECT 'Nom Client' = [Nom_Client]
,'Mail Client' = [Mail_Client]
FROM [Entreprise].[dbo].[Client]
GO
------Ou encore celle l :
----SELECT [Nom_Client] AS 'Nom Client'
,[Mail_Client] AS 'Mail Client'
FROM [Entreprise].[dbo].[Client]
GO

Le nom des colonnes est chang par un nom plus explicite :

3.3.3

La condition WHERE
Il est alors possible dajouter des conditions notre recherche pour laffiner, au travers de la
clause WHERE. Les restrictions servent limiter le nombre denregistrements slectionner. Les
conditions contenues dans le WHERE sont des expressions boolennes qui peuvent tre composes
de noms de colonnes, de constantes, de fonctions, doprateurs de comparaison et doprateurs
logiques. Prenons un exemple concret :
SELECT [Nom_Client] AS 'Nom Client'
,[Mail_Client] AS 'Mail Client'
FROM [Entreprise].[dbo].[Client]
WHERE Id_Client IN (1,2,3,6)
GO

Cette instruction SELECT slectionne tous les champs de tous les enregistrements pour
lesquels la colonne Id_Client est gale soit 1, 2, 3 et 6. On remarque alors que dans notre code,
nous avons utilis la condition WHERE, une colonne, un oprateur de comparaison et un oprateur
logique. Le rsultat est le suivant :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

18

Les bases fondamentales du langage Transact SQL

SELECT [Nom_Client] AS 'Nom Client'


,[Mail_Client] AS 'Mail Client'
FROM [Entreprise].[dbo].[Client]
WHERE Id_Client BETWEEN 1 AND 10
GO

Linstruction ci-dessus prsente lutilisation des clauses WHERE et BETWEEN, qui permet de
lire tous les enregistrements dont lidentifiant est compris entre 1 et 10 (bornes incluses). Le rsultat
est le suivant :

3.3.4

Les projections de donnes


Les projections de donnes sont utiles dans certains cas, par exemple lorsque vous voulez
lister les villes dans lesquelles sont prsents vos clients. Une projection va grouper les
enregistrements identiques dans un seul et mme enregistrement. Voici les deux cas possibles de
projection :
------ Deux faons de grouper les colonnes identiques :
-- Celle-ci :
----SELECT Mesure, COUNT(Mesure) AS 'Nombre article avec cette mesure'
FROM Stock
GROUP BY Mesure
GO
------ Ou celle l :
----SELECT DISTINCT Mesure
FROM Stock
GO

Dans le premier morceau de code, nous allons afficher une seule ligne de chaque rsultat,
mme si plusieurs rsultats existent pour la colonne Mesure, et nous comptons le nombre
doccurrence qui interviens pour chaque Mesure, grce la fonction COUNT(), associe la clause
Dotnet France Association Grgory CASANOVA / James RAVAILLE

19

Les bases fondamentales du langage Transact SQL


GROUP BY. Ce genre dinstruction peu tre pratique dans le cas ou lon veut calculer le pourcentage

de vente en fonction de la localisation dun magasin par exemple. On naffichera quune seule fois la
localisation du magasin grce la clause GROUP BY, et on affichera pour chaque localisation, le
nombre de vente effectue. On peut alors facilement en dduire lequel des magasins est le plus
productif. Pour revenir notre exemple, nous pouvons dduire du rsultat que nous vendons plus
darticles lunit, que tout le reste des articles.

Pour le second morceau de code, on pourra seulement afficher les rsultats de faon
distincte, c'est--dire en vitant les doublons comme dans le premier exemple. En revanche, il ne
sera pas possible dutiliser une fonction dagrgation, type COUNT(), car elle doit tre contenue
dans une clause GROUP BY. On obtiendra alors le rsultat identique au premier exemple, hors mis le
fait que nous ne pouvons pas compter le nombre doccurrence de chaque mesure dans la colonne
Mesure.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

20

Les bases fondamentales du langage Transact SQL


3.3.5

Les calculs simples


Les calculs, comme nous les appelons, regrouperont les calculs numriques mais aussi les
manipulations sur les chaines de caractres, par exemple la concatnation. Les modles sont les
suivants :
SELECT Id_Stock,
'Quantit Produit' = Quantite * 3
FROM Stock

Ici, la quantit de chaque Stock sera multiplie par trois dans le rsultat de la recherche par
linstruction SELECT. Mais la valeur de la quantit de produit ne sera en aucun cas changer dans la
base de donnes.
SELECT Nom_Client + ' ' + Prenom_Client AS 'NOM COMPLET'
FROM Client

Dans linstruction ci-dessus, nous concatnons les champs Nom_Client et Prenom_Client en


une seule colonne que nous appellerons NOM COMPLET. Le rsultat est le suivant :

3.3.6

Le produit cartsien
Le but du produit cartsien est de croiser des donnes de plusieurs tables, de manire
obtenir toutes les combinaisons possibles. Il y aura autant denregistrements de retour que le produit
du nombre de lignes de chaque table. Donnons un exemple :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

21

Les bases fondamentales du langage Transact SQL

------ Il existe deux manires de faire un produit cartsien :


-- La syntaxe classique :
----SELECT Id_Client, Nom_Client, Date_Commande
FROM Client, Commande
------ La syntaxe en SQL ANSI :
----SELECT Id_Client, Nom_Client, Date_Commande
FROM Client CROSS JOIN Commande

Le rsultat est le suivant :

Nous obtenons 20 enregistrements, ce qui est concluent puisque les deux tables contiennent
respectivement 10 et 2 enregistrements. Les deux syntaxes, ANSI ou classique, retournent bien
videmment le mme rsultat.

3.3.7

Les jointures
Une jointure est un produit cartsien avec une restriction. Une jointure permet dassocier
logiquement des lignes de tables diffrentes. Les jointures sont gnralement (pour des raisons de
performances) utilises pour mettre en relation les donnes de lignes comportant une cl trangre
avec les donnes de lignes comportant une cl primaire. Voyons-le en dtail avec un exemple
concret :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

22

Les bases fondamentales du langage Transact SQL

------ Il existe deux manires de faire une jointure :


-- La syntaxe classique :
----SELECT Client.Id_Client, Date_Commande
FROM Client, Commande
WHERE Client.Id_Client = Commande.Id_Client
------ La syntaxe SQL ANSI :
----SELECT Client.Id_Client, Date_Commande
FROM Client INNER JOIN Commande
ON Client.Id_Client = Commande.Id_Client

Le rsultat est le suivant et il est le mme pour les deux instructions SQL :

3.3.7.1 Les jointures externes


Les jointures externes sont des jointures dans lesquelles la condition est fausse. Dans ce cas,
le rsultat retourn sera celui dune des deux tables. Le rsultat sera celui de la premire table cite
si on utilise loption LEFT, et celui de la seconde table cite si lon utilise loption RIGHT. La syntaxe
est la suivante :
SELECT Client.Id_Client, Date_Commande
FROM Client LEFT OUTER JOIN Commande
ON Client.Id_Client = Commande.Id_Client
SELECT Client.Id_Client, Date_Commande
FROM Client RIGHT OUTER JOIN Commande
ON Client.Id_Client = Commande.Id_Client

Et le rsultat est le suivant :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

23

Les bases fondamentales du langage Transact SQL

On remarque alors clairement que suivant quon utilise loption RIGHT ou LEFT, le rsultat
est diffrent, et quil respecte le comportement dcrit auparavant. Les valeurs NULL prsentes dans
le premier rsultat sont dues au fait que les clients dont lId est 5 et 6 nont pas de commandes. Ces
valeurs NULL disparaissent dans le second rsultat, tout simplement parce quil nexiste pas de
commande qui na pas de client, alors que linverse existe. En revanche, Il est obligatoire dutiliser les
jointures externes avec la syntaxe ANSI, cest pourquoi je vous recommande dapprendre les
jointures selon le modle ANSI et non le modle classique, bien que le modle classique soit plus
logique. Dans les versions antrieures, le modle classique tait support grce aux signes *= et =*,
mais ceci ne sont plus supports sous SQL Server 2008.

3.3.8

La close ORDER BY
La clause ORDER BY est utilise dans une instruction SELECT pour trier les donnes dune
table (ou plusieurs tables) en fonction dune ou plusieurs colonnes. Par dfaut, le rangement se fera
par ordre croissant ou par ordre alphabtique. Avec le mot cl ASC, le rangement se fera dans lordre
ascendant. Avec le mot cl DESC, le rangement se fera dans lordre descendant. Prenons un
exemple :
--Rangement dans l'ordre ascendant :
SELECT Client.Id_Client,Client.Nom_Client, Date_Commande
FROM Client LEFT OUTER JOIN Commande
ON Client.Id_Client = Commande.Id_Client
ORDER BY Nom_Client ASC
GO
--Rangement dans l'ordre descendant :
SELECT Client.Id_Client,Client.Nom_Client, Date_Commande
FROM Client LEFT OUTER JOIN Commande
ON Client.Id_Client = Commande.Id_Client
ORDER BY Nom_Client DESC
GO

Avec la close ORDER BY, nous obtiendrons le mme rsultat que prcdemment, tri dans
un ordre diffrent : les enregistrements sont tris selon le champ Nom_Client de faon croissante
pour le premier lot, de faon dcroissante pour le second lot. Le rsultat est le suivant :
Dotnet France Association Grgory CASANOVA / James RAVAILLE

24

Les bases fondamentales du langage Transact SQL

Les enregistrements sont bien rangs dans lordre inverse, suivant la colonne Nom_Client.

3.3.9

Loprateur UNION
Loprateur UNION va nous permettre dobtenir un ensemble de ligne provenant de plusieurs
requtes diffrentes. Toutes les requtes doivent fournir le mme nombre de colonnes avec les
mmes types de donnes pour chaque colonne (correspondance deux deux).
SELECT Id_Stock, Quantite
FROM Stock
UNION
SELECT Id_Stock, Quantite
FROM Commande

Le rsultat est le suivant :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

25

Les bases fondamentales du langage Transact SQL


Les rsultats des tables sont associs, et les enregistrements sajoutent. La premire table cite dans
la premire instruction SELECT sera associe la premire table cite dans la seconde instruction
SELECT, de mme pour les secondes tables. Dans le rsultat, on obtient alors 2 colonnes au lieu de
4. Une option est possible avec loprateur UNION, UNION ALL qui va permettre de retourner toutes
les lignes rsultats, mme celles qui seront en double. Il est bon de savoir que lorsque cet oprateur
nest pas prcis, les lignes dupliques ne sont retournes quune seule fois.

3.3.10 Loprateur EXCEPT


Loprateur EXCEPT permet dextraire dune solution les lments que lon ne veut pas y
retrouver, c'est--dire, enlever une valeur prcise ou un domaine que lon ne veut pas retrouver dans
notre solution finale. Il est donc vident que si on exclut des valeurs, les deux expressions SELECT
spares par le mot cl EXCEPT doivent avoir le mme nombre de colonnes en argument. Prenons
un exemple :
SELECT Id_Stock, Quantite
FROM Stock
EXCEPT
SELECT Id_Stock, Quantite
FROM Stock
WHERE Id_Stock = 3

Ici, on slectionnera les colonnes Id_Stock et Quantite de la table Stock, except celle pour
lesquelles lId_Stock est gal 3.

3.3.11 Loprateur INTERSECT


Grace cet oprateur, il va tre possible didentifier en une seule requte, des lignes
dinformations simultanment prsentes dans deux jeux de rsultats distincts, mais de mmes
structures.
SELECT * FROM Client
WHERE Id_Client BETWEEN 1 AND 3
SELECT * FROM Client
WHERE Prenom_Client = 'Julien'
SELECT * FROM Client
WHERE Id_Client BETWEEN 1 AND 3
INTERSECT
SELECT * FROM Client
WHERE Prenom_Client = 'Julien'

Le rsultat est le suivant :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

26

Les bases fondamentales du langage Transact SQL

Le jeu de donnes obtenu donne tous les clients dont lId est compris entre 1 et 3, et dont le nom est
Julien. Loprateur INTERSECT, fait lintersection des deux jeux de rsultats, et ne donne en sortie,
que les valeurs communes aux deux jeux. Dans lexemple donn, les deux jeux de rsultats nont en
rsultat le client dont lId est 3. Le rsultat final ne donnera donc que le client dont lId est 3, comme
montr sur lexemple ci-dessus.
3.3.12 La clause TOP
La close TOP permet dextraire grce linstruction SELECT, que les premiers
enregistrements de la slection. Elle est utilisable avec les instructions INSERT, UPDATE, DELETE.
Prenons un exemple avec linstruction SELECT :
SELECT TOP 5 *
FROM dbo.Client

Cette instruction permet de slectionner les 5 premiers enregistrements de la table Client,


dans lordre de lecture des enregistrements dans la table. Si nous spcifions la clause ORDER BY,
alors les enregistrements slectionns respectent cet ordre de tri.
SELECT TOP 50 PERCENT WITH TIES *
FROM dbo.Client
ORDER BY Nom_Client

Cette instruction permet de slectionner 50% des enregistrements dans lordre de lecture
des enregistrements. Dans le cas ou nous avons utilis un pourcentage, la close WITH TIES ne
sutilise que si une close ORDER BY est applique au SELECT. Elle a pour effet de ne slectionner les
enregistrements quaprs la mise en leur tri.

3.3.13 Crer une table grce SELECT INTO


Il est possible de crer une table laide de colonnes de tables dj existantes. Grce un
simple SELECT INTO, nous aurons choisir les colonnes qui constitueront les champs de la nouvelle
table. Toutes les closes et conditions disponibles pour linstruction SELECT sont applicables pour
linstruction SELECT INTO. Voici un exemple :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

27

Les bases fondamentales du langage Transact SQL

SELECT Id_Client, Nom_Client, Id_Commande


INTO dbo.Exemple
FROM dbo.Client, dbo.Commande
WHERE Client.Id_Client = Commande.Id_Client

Dans linstruction prcdente, la clause INTO permet de prciser que nous allons crer une
table, ici, dbo.Exemple, et que nous allons ajouter les lignes trouves dans linstruction SELECT,
lintrieur de cette nouvelle table. Il est utile de prciser que la table nest pas dfinie en tant que tel
par la clause INTO, mais plus par le SELECT, car cest cette instruction qui va donner la table ses
caractristiques (nombre de colonnes, type de donnes des colonnes). Dans le cas o des colonnes
sont calcules, il est impratif de donner un nom ces colonnes. Si lon fait prcder le nom de la
table cre par un #, la table sera temporaire locale, si elle est prcde dun ##, elle sera temporaire
globale. On rappelle que ces deux types de tables temporaires sont stocks dans la base de donnes
Tempdb qui est une table prdfinie en tant que table systme dans SQL Server 2008. Les tables
temporaires locales sont accessibles que par la session qui la cre et disparait la dconnexion
alors que les tables globales, elles sont ensuite accessibles par toutes les sessions, et enfin elles sont
dtruites lors de la dconnexion de la dernire session lavoir utilise. Ce genre de table est
pratique, pour des travaux de transferts de donnes, ou encore si nous avons besoin de garder les
donnes contenues dans une table, tout en voulant supprimer la structure de la table en question.

3.3.14 La clause COMPUTE et COMPUTE BY


La clause COMPUTE est utilise la suite de la clause ORDER BY, afin de retourner un sous
rsultat, en rapport avec le rsultat principal. Le sous rsultat est obligatoirement gnr par une
fonction dagrgation telle que COUNT, SUM Il est bon de noter que ces clauses sont maintenues
pour des raisons de compatibilits, mais sont voues disparaitre dans les versions futures.
Lexemple suivant retourne un rsultat principal, et un sous rsultat. Le rsultat principal slectionne
toutes les colonnes de la table Client, ordonnes par le nom des clients, tandis que le sous rsultat va
compter le nombre de client. Lintrt de la clause COMPUTE est de pouvoir gnrer un sous rsultat,
grce une mme requte.
SELECT *
FROM Entreprise.dbo.Client
ORDER BY Nom_Client
COMPUTE COUNT(Id_Client)

Le mot cl BY de la clause COMPUTE, nous permet de retourner les sous rsultats en fonction
des diffrentes valeurs dune colonne spcifique. Dans lexemple, la suite, on peu remarquer que
lon donne la quantit du stock, pour chaque Id_Stock en sous rsultat. La colonne que lon prcise
donc aprs le mot cl BY, nous permet de dire, de quelle manire nous allons dcouper les sous
rsultats.
Dotnet France Association Grgory CASANOVA / James RAVAILLE

28

Les bases fondamentales du langage Transact SQL

SELECT *
FROM Entreprise.dbo.Stock
ORDER BY Id_Stock
COMPUTE SUM(Quantite) BY Id_Stock

3.3.15 Les oprateurs ROLLUP et CUBE


Les oprateurs ROLLUP et CUBE sont utiliss avec la clause GROUP BY, dans le but dobtenir
des lignes supplmentaires affichant les calculs de la fonction.

3.3.15.1 Loprateur ROLLUP


La clause WITH ROLLUP permet de crer des lignes comportant des rsultats pour le groupement
des colonnes contenues dans la clause GROUP BY, en les combinants de la gauche vers la droite.
USE Entreprise
GO
SELECT a.Id_Entrepos, b.Id_Stock
FROM dbo.Entrepos a
INNER JOIN dbo.Stock b
ON a.Id_Entrepos = b.Id_Entrepos
GROUP BY a.Id_Entrepos, b.Id_Stock
WITH ROLLUP

3.3.15.2 Loprateur CUBE


Loprateur CUBE permet de crer des rsultats pour toutes les combinaisons possibles des colonnes
contenues dans la clause GROUP BY.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

29

Les bases fondamentales du langage Transact SQL

USE Entreprise
GO
SELECT a.Id_Entrepos, b.Id_Stock
FROM dbo.Entrepos a
INNER JOIN dbo.Stock b
ON a.Id_Entrepos = b.Id_Entrepos
GROUP BY a.Id_Entrepos, b.Id_Stock
WITH CUBE

3.3.16 Loprateur OVER


Loprateur OVER permet de partitionner les donnes ou encore de les trier avant
dappliquer une fonction de calcul dagrgat par exemple (Voir les fonctions dans ce chapitre), ou
encore les fonctions de tri tel que ROW_NUMBER, NTILE, que nous verrons plus tard, ou encore
DENSE_RANK. Dans le cas dune fonction de tri, loprateur OVER va pouvoir contenir un
partitionnement ou une clause ORDER BY, ce qui va nous permettre de ranger les donnes avant
deffectuer une fonction. Il est important de noter que les fonctions dagrgation ne sont applicables
avec un OVER dans le seul cas dun partitionnement. Prenons un exemple :
SELECT a.Id_Entrepos, COUNT(b.Id_Stock)
OVER (PARTITION BY b.Id_Entrepos) AS 'Nombre lments'
FROM Entrepos a
INNER JOIN Stock b
ON a.Id_Entrepos = b.Id_Entrepos

Dotnet France Association Grgory CASANOVA / James RAVAILLE

30

Les bases fondamentales du langage Transact SQL


3.3.17 Loprateur NTILE
Cette fonction est utilise en addition OVER, et permet de diviser la partition en diffrents
groupes de donnes quilibres. NTILE sutilise avec une clause ORDER BY de la faon suivante :
SELECT a.Id_Client, Nom_Client, Prenom_Client, Adresse_Client,
Id_Commande, Date_Commande,
NTILE(5) OVER (PARTITION BY Nom_Client, Prenom_Client ORDER BY
Date_Commande) AS 'Ensemble'
FROM Entreprise.dbo.Client a
INNER JOIN Entreprise.dbo.Commande b
ON a.Id_Client = b.Id_Client

3.3.18 Les sous-requtes


Il est possible dimbriquer une requte SELECT dans une requte SELECT (UPDATE ou
DELETE). Les sous requtes peuvent utilises avec les clauses HAVING ou WHERE. Il existe trois types
de sous requtes diffrentes :
-

Les sous requtes qui ne renvoient quune seule valeur unique (sous-requte scalaire) :

SELECT Id_Client FROM Motors.dbo.Client


WHERE Id_Client = (SELECT Id_Client FROM Motors.dbo.Client WHERE
Id_Client = 10)

Les requtes renvoyant une liste denregistrements. Elles sont utilises avec IN, EXIST, ANY,
SOME ou encore ALL :

SELECT *
FROM Motors.dbo.Client
WHERE EXISTS(SELECT * FROM Motors.dbo.Client WHERE Id_Client = 4)

La sous requte externe utilise au travers de la clause WHERE, fait rfrence une table de
la requte interne. Dans ce cas l, la requte externe est excute pour chaque ligne extraite
de la requte interne.

SELECT Nom_Client
FROM Motors.dbo.Client
WHERE EXISTS (SELECT Id_Client_Commande, Id_Client
FROM Motors.dbo.Commande INNER JOIN Motors.dbo.Client
ON Id_Client = Id_Client_Commande)

3.3.19 Les instructions PIVOT et UNPIVOT


Ces instructions sont trs puissantes et sont faciles utiliser. Linstruction PIVOT aura la
capacit de transformer un rsultat prsent sous forme de ligne en colonne et UNPIVOT aura la
capacit inverse. La clause PIVOT fait partie de la clause FROM de linstruction SELECT. Lutilisation
de PIVOT va permettre la cration dun pseudo table interne la requte. On pourra donc lui
assigner un alias avec la clause AS si ncessaire. Le rsultat qui suit est la slection de toutes les
colonnes de notre table STOCKS. La requte SELECT suivante nous servira de comparaison.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

31

Les bases fondamentales du langage Transact SQL

USE Entreprise
GO
SELECT Id_Stock, Id_Entrepos, Quantite
FROM dbo.Stock

Voici son rsultat :

Avec le code qui va suivre, nous allons nous proposer damliorer la lisibilit de notre rsultat
en affichant, grce un PIVOT, la quantit en fonction des dpts (1, 2, 3 ou 4). Il suffit de faire un
SELECT des valeurs que nous voulons passer en colonne. Les alias prsents dans lexemple servent
videmment donner un nom aux colonnes cres, car par dfaut, elles nont pas de noms. Pour
linstruction PIVOT, comme pour linstruction UNPIVOT, nous allons dans un premier temps
appliquer une fonction dagrgation la colonne pass en paramtre de la colonne de pivot et la
colonne par laquelle nous allons effectuer le pivot aprs la clause FOR. La clause IN indiquera
simplement les valeurs pour lesquelles nous allons effectuer le pivot. Il est important de remarquer
que lalias que nous donnons au pivot nest pas optionnel. Si vous nen donnez pas, une erreur sera
leve.
USE Entreprise
GO
SELECT Id_Stock,
[1] AS "D1",[2] AS "D2",[3] AS "D3",[4] AS "D4"
FROM dbo.Stock
PIVOT (SUM(Quantite) FOR Id_Entrepos
IN ([1],[2],[3],[4])) AS PVT

Le rsultat est le suivant :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

32

Les bases fondamentales du langage Transact SQL

3.3.20 Linstruction MERGE


Linstruction MERGE permet en une action Transact SQL, de modifier, ajouter, ou mme
supprimer sur une mme table de destination, si la condition est respecte. On pourra alors grce
une instruction MERGE, modifier des tours tour, chaque ligne de notre table en fonction dune autre
table. Voici un exemple de structure de linstruction MERGE :
USE Entreprise
GO
MERGE INTO dbo.Stock
USING dbo.Commande
ON Stock.Id_Stock = Commande.Id_Stock
WHEN MATCHED THEN
UPDATE
SET Stock.Quantite = Stock.Quantite - Commande.Quantite;

Description de la requte prcdente : On se propose de modifier la table Stock avec la table


Commande, avec pour condition darrt, le fait que : Stock.Id_Stock = Commande.Id_Stock.
Les mots cls WHEN MATCHED THEN vont permettre de dire, si la condition darrt est respecte,
alors on fait linstruction qui suit le THEN. Ici, on soustraira la quantit du stock, la quantit de la
commande passe, pour chaque Id_Stock. Il est possible dutiliser les mots cls WHEN NOT MATCHED
THEN, qui vont nous permettre de modifier les lignes de la table cible pour lesquelles la condition
darrt nest pas vrai.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

33

Les bases fondamentales du langage Transact SQL

4 Le SQL Procdural
4.1 Les variables
4.1.1

Les variables utilisateur


Une variable est une zone mmoire caractrise par un type et un nom, et permettant de
stocker une valeur respectant le type. Dans SQL Server, les variables doivent tre obligatoirement
dclares avant dtre utilise.
Voici la dclaration dune variable nomme Id_Client de type Int :
DECLARE @IdClient int

Linstruction suivante permet de valoriser cette variable via lexcution dune requte
scalaire :
SELECT @IdClient = (SELECT Id_Client FROM Motors.dbo.Client WHERE
Nom_Client = 'SQL')

4.1.2

Les variables systme


Les variables systme sont dfinis par le systme et ne peuvent tre disponibles quen lecture.
Elles se diffrencient syntaxiquement des variables utilisateur par le double @. Lexemple le plus
courant est la variable @@ERROR, qui est 0 en temps normal, et 1 lorsquune erreur est leve.

4.2 Les transactions


Une transaction est caractrise par le mot lacronyme ACID (Atomic Consistency Isolation
Durability) :
-

Atomique car la transaction constitue une unit indivisible de travail pour le serveur.
Consistance car la fin dune transaction, les donnes montres sont soit celles davant
transaction (dans le cas dune annulation de la transaction) soit celle daprs transaction
(dans le cas dune validation).
Isolation, car il est possible de verrouiller (isoler) les donnes pendant lexcution de la
transaction (verrouillage en lecture, en criture, ).
Dure car les changements apports sur des donnes par une transaction sont durables (non
volatiles).
La syntaxe gnrique dune transaction est la suivante :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

34

Les bases fondamentales du langage Transact SQL

BEGIN TRAN nom_transaction


--Dmarrage de la transaction
COMMIT TRAN nom_transaction
--Validation de la transaction
SAVE TRAN nom_point_de_retour
--Dclaration d'un point de contrle de la transaction
ROLLBACK TRAN nom_transaction OR nom_point_de_controle
--Annulation de la transaction

Voici un exemple de transaction :


BEGIN TRAN Transaction1
UPDATE dbo.Client
SET Nom_Client = 'ANDREO'
WHERE Nom_Client = 'CASANOVA'
BEGIN TRAN Transaction2
UPDATE dbo.Client
SET Nom_Client = 'VASSELON'
WHERE Nom_Client = 'HOLLEBECQ'
COMMIT TRAN Transaction2
ROLLBACK TRAN Transaction1

Ici, dans notre exemple, nous avons deux transactions imbriques. Il est trs important de
comprendre quune transaction est une unit indissociable, et que par consquent, il est ncessaire
de terminer par un COMMIT ou ROLLBACK, la dernire transaction en date. La fermeture des
transactions se fait donc celons un modle LIFO (Last In First Out). La dernire transaction crite sera
la premire devoir tre ferme. Pour revenir notre exemple, on peu dsormais dire que le nom
client gal HOLLEBECQ sera chang par VASSELON, du fait du ROLLBACK TRAN qui termine la
transaction 2, alors que CASANOVA ne sera pas chang par ANDREO, dans transaction1, car celle-ci
se termine par un ROLLBACK TRAN.
Note Importante : Les instructions du DML doivent automatiquement comporter un ROLLBACK
TRAN pour tre prises en compte et tre appliques, alors que les instructions du DDL comportent un
ROLLBACK TRAN implicite qui est opr juste aprs que linstruction du DDL soit faite. Il faut donc
faire trs attention la suite dinstructions dans une transaction. Si jamais vous crivez une
transaction qui comporte deux instruction, une du DML puis une du DDL, mme si vous mettez un
ROLLBACK la suite, les deux instructions seront COMMIT , puisque les instructions du DDL
comporte ce ROLLBACK TRAN implicite dont nous avons parl prcdemment.

4.3 Les lots et les scripts


Un lot est une suite de transactions et dinstructions qui seront excutes en un seul et unique bloc.
Un lot se termine par linstruction GO. Lintrt des lots rside dans les performances. Il faut bien
entendu prendre en compte quune simple erreur de syntaxe fera que tout votre lot ne sexcutera
pas. En revanche, les lots possdent certaines restrictions :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

35

Les bases fondamentales du langage Transact SQL


-

Il est impossible dutiliser deux des instructions suivantes, ensembles dans un mme lot :
CREATE PROCEDURE, CREATE RULE, CREATE DEFAULT, CREATE TRIGGER, CREATE VIEW.
Il nest pas possible dagir sur des dfinitions de colonnes ou dagir sur une modification
opre dans un mme lot.
Il nest pas possible de supprimer et de recrer un mme objet dans un mme lot.

Un script est un ensemble de lots, qui peut tre enregistr dans un fichier dont lextension est
.sql. Comme exemple de script, vous avez le fichier CoursSqlServer.sql, disponible en annexe de ce
cours, qui contient la structure de la base, des tables, certaines entres de donnes et certains objets
de la base tels quune procdure stocke ou un dclencheur

4.4 Le contrle de flux


Il existe quatre faons de contrles les flux sur SQL Server 2008. Les instructions RETURN,
PRINT, CASE et les blocs BEGINEND, dans lesquels peuvent tre contenus les structures de test IF
et les boucles WHILE. Toutes ces instructions vont vous permettre de mettre en valeur vos donnes
en les rendant plus prsentables, ou bien, elles vous permettront de les manipuler avec plus de
facilit, par exemple pour des actions rptitives, ou des actions ncessitant une condition. Dans
cette partie, nous allons dtailler tous les contrles de flux possibles.

4.4.1

Linstruction RETURN
Linstruction RETURN vous permet de sortir dune instruction ou dune procdure sans
condition particulire, en renvoyant ou non une valeur entire.
CREATE PROC Procedure1
AS
DECLARE @Variable int = 4
IF (@Variable > 2)
RETURN 0;
ELSE
RETURN 1;
GO

4.4.2

Linstruction PRINT
Linstruction PRINT est linstruction daffichage de message. Prenons un exemple :

PRINT 'NOUS AVONS LE DROIT DE MARQUER'


PRINT 'CE QUE NOUS VOULONS !'
PRINT 'ON VEUT AFFICHER LE NOMBRE DE CLIENTS DANS LA TABLE CLIENT ?'
DECLARE @Variable int
SELECT @Variable = COUNT(*) FROM Motors.dbo.Client
PRINT 'LE NOMBRE DE CLIENTS EST :'
PRINT @Variable

Lors de lexcution, les traces suivantes sont affiches dans la fentre Messages :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

36

Les bases fondamentales du langage Transact SQL

4.4.3

Linstruction CASE
Linstruction CASE, permet dattribuer des valeurs en fonction dune condition. Voici un
exemple :
USE Entreprise
SELECT 'Anciennete' = CASE Id_Client
WHEN '3' THEN 'ANCIEN'
WHEN '2' THEN 'PAS SI VIEUX'
WHEN '1' THEN 'RECENT'
ELSE 'ON SAIT PAS TROP'
END,
Id_Client, Nom_Client
FROM dbo.Client
ORDER BY Anciennete

Avec un case, on peu crer simplement une colonne en donnant des conditions pour les
rsultats, en fonction dune autre colonne existante. Par exemple, ici, on dtermine suivant
lId_Client, si le client est Ancien, Pas si vieux, Rcent, ou si lon ne sait pas.
Son rsultat dexcution est le suivant :

4.4.4

Les blocs BEGIN END


Les blocs dlimitent une srie dinstructions, et ils peuvent tre utiliss avec les conditions IF
et les boucles WHILE. La structure gnrique est la suivante :
BEGIN
--Les blocs peuvent contenir
--Des instructions ou bien d'autres blocs
END

Dotnet France Association Grgory CASANOVA / James RAVAILLE

37

Les bases fondamentales du langage Transact SQL


4.4.4.1 La condition IF
La structure de condition IF permet de poser une condition une instruction. Si la condition
est vraie, linstruction sera excute. Dans le cas contraire, elle ne le sera pas. Voici un exemple
dutilisation de cette instruction :
SELECT * FROM Client
DECLARE @Variable int = 1
IF EXISTS (SELECT * FROM Client WHERE Id_Client = @Variable)
BEGIN
DELETE FROM Client WHERE Id_Client = @Variable
PRINT 'Le Client 11 a bien t supprim !'
END
ELSE
PRINT 'Pas de Client pour cet Id !'
SELECT * FROM Client

Dans ce script, on dclare dans un premier temps une variable @Variable de type int, et de valeur
1. On applique alors une condition IF, qui dfinit que sil existe un client avec un Id gal la valeur
de notre variable dclare pralablement, on le supprime et on crit que le client bien t
supprim. Linstruction ELSE dfinit en revanche que pour tous les autres cas, on crit que le client
nexiste pas.
Le rsultat est le suivant dans le cas ou le client lId 1 existe :

Dans longlet Messages du rsultat de la requte, le message suivant est alors apparu :

(14 ligne(s) affecte(s))


(1 ligne(s) affecte(s))
Le Client 11 a bien t supprim !
(13 ligne(s) affecte(s))

Le rsultat est le suivant lorsque le client lId 1 nexiste pas ou plus :

Dotnet France Association Grgory CASANOVA / James RAVAILLE

38

Les bases fondamentales du langage Transact SQL

Dans longlet message de la partie rsultat, on obtient le message suivant :

(13 ligne(s) affecte(s))


Pas de Client pour cet Id !
(13 ligne(s) affecte(s))

4.4.4.2 La boucle WHILE


Linstruction WHILE est une structure algorithmique permettant dexcuter un bloc
dinstructions de manire rptitive, en fonction dune condition. Tant que la condition est vraie, ce
bloc dinstructions sera excut. Dans la syntaxe de la structure WHILE, deux instructions sont
connaitre : linstruction BREAK et linstruction CONTINUE. La premire permet de sortir de la
structure en interrompant son excution. La seconde nous permet de relancer immdiatement
lexcution du bloc dinstruction. Voici un exemple :
WHILE (SELECT COUNT(*) FROM Client) < 6
BEGIN
INSERT INTO [Entreprise].[dbo].[Client]
([Nom_Client]
,[Prenom_Client]
,[Numero_Client]
,[Adresse_Client]
,[Mail_Client])
VALUES
('DORDOLO',
'Mathieu',
33678765342,
'9 Avenue des Peupliers',
'MD@domaine.com')
END

Cet exemple permet dajouter des clients afin que la table Client en contienne 6.

4.5 La gestion des curseurs


Dans SQL Server, un curseur est un objet qui nous permet dexcuter un traitement sur un
ensemble denregistrements. Les curseurs sont des outils trs puissants, mais aussi trs gourmands
en ce qui concerne les ressources. Il est donc conseill de modifier des lignes de rsultat de manire
traditionnelle, avec un simple UPDATE ou une autre instruction du DML, afin de consommer le moins
de ressources possibles.
Dotnet France Association Grgory CASANOVA / James RAVAILLE

39

Les bases fondamentales du langage Transact SQL

Voici la dclaration dun curseur :

DECLARE Curseur (arguments1) CURSOR


FOR SELECT
FOR (arguments2) OF liste_de_colonnes

Argument1 peut tre :


-

INTENSITIVE: seules les oprations sur la ligne suivante sont permises.


SCROLL: les dplacements dans les lignes du curseur peuvent se faire dans tous les sens.
LOCAL : la porte du curseur est locale au lot, c'est--dire quil peut tre utilis que dans le
lot dit.
GLOBAL : la port du curseur est globale, c'est--dire valable pour toute la connexion.
FORWARD_ONLY : les donnes sont extraites du curseur dans leur ordre dapparition.
STATIC : une copie des donnes est faite de faon temporaire dans la base tempdb afin que
le curseur ne soit pas affect par les modifications qui peuvent tre faites sur la base.
SCROLL_LOCKS: garantit le succs des instructions DELETE et UPDATE.
TYPE_WARNING: permet denvoyer un message WARNING si des conversions de types
implicites sont effectues.
KEYSET: les lignes et leur ordre dans le curseur sont fixs au moment de louverture du
curseur. Les rfrences de chacune de ces lignes sont conserves dans tempb.
DYNAMIC: le curseur reprsente exactement les donnes prsentes dans la base. Donc le
nombre de ligne, les valeurs quelles contiennent ou encore leur ordre peuvent changer de
faon dynamique.
FAST_FORWARD: permet de dfinir le curseur comme tant en avant et en lecture seule.
READ_ONLY: est en lecture seule.
Argument2 peut tre :

UPDATE: Prcise que des mises jour vont tre faites sur la table dorigine du curseur.
READ ONLY: Prcise quon se place en lecture seule.

OPEN

Cette instruction permet de rendre le curseur utilisable, et crer des tables temporaires
associes. La variable systme @@CURSOR_ROWS est valorise aprs cette instruction. Sa valeur
passe de 0 1 aprs linstruction OPEN.
Sa syntaxe est la suivante :
OPEN (arguments1) curseur_auteurs

Argument1 peut tre :


-

GLOBAL : la port du curseur est globale, c'est--dire valable pour toute la connexion.

FETCH

Dotnet France Association Grgory CASANOVA / James RAVAILLE

40

Les bases fondamentales du langage Transact SQL


Cest linstruction qui permet dextraire une ligne du curseur et de valoriser les variables et
leur contenu. Aprs cette instruction, la variable systme @@FETCH_STATUS est 0, si toutefois le
FETCH cest bien pass.
FETCH (arguments1) (FROM GLOBAL) Nom_Curseur INTO Liste_Variable

Argument1 peut tre :


-

NEXT: Lit la ligne suivante. Cest la seule option possible pour un INSENSITIVE CURSOR.
PRIOR: Lit la ligne prcdente.
FIRST: Lit la premire ligne.
LAST: Lit la dernire ligne.
ABSOLUTE p: Lit la Pime ligne de lensemble.
RELATIVE p: Lit la Pime ligne partir de la ligne courante.

CLOSE

Cette instruction permet la fermeture du curseur et la libration de la place mmoire o il


t contenu. Il est important de faire intervenir cette opration ds que possible dans le souci de
librer les ressources.
CLOSE Nom_Curseur

DEALLOCATE

Cette instruction permet de supprimer le curseur et les ressources associes.


DEALLOCATE Nom_Curseur

Maintenant que nous avons expliqu la structure et le fonctionnement dun curseur, nous
allons montrer un exemple concret afin de comprendre leur fonctionnement en pratique :
DECLARE @Id_Client INT
DECLARE curseur CURSOR FOR
SELECT Id_Client FROM Client
OPEN curseur
FETCH curseur INTO @Id_Client
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @Id_Client
FETCH curseur INTO @Id_Client
END
CLOSE curseur
DEALLOCATE curseur

Dotnet France Association Grgory CASANOVA / James RAVAILLE

41

Les bases fondamentales du langage Transact SQL

Dans ce cas l, le curseur va nous permettre grce une boucle WHILE, de parcourir tous les
Id_Client pour lesquels @@FETCH_STATUS sera gal 0. Cette variable peu prendre trois tats,
0, -1, -2, respectivement pour dire que soit linstruction FETCH cest droul normalement et a russi,
soit pour dire que linstruction a choue, sinon pour dire que la ligne recherche est manquante. En
temps normal, cette variable systme est initialise -1. Aprs avoir parcouru tous les
enregistrements de la table client, il est ncessaire de fermer le curseur et de le d allouer. Le
rsultat est le suivant pour notre base de donnes dexemple, Entreprise.

4.6 Les exceptions


4.6.1

Lever une exception


Pour chaque erreur qui survient dans SQL Server, SQL Server produit un message derreur. En
rgle gnrale, tous les messages possdent la mme structure : un numro derreur, un message
dexplication de lerreur, un indicateur de svrit, un tat, le nom de la procdure associe
lerreur et le numro de la ligne ayant provoque lerreur. La gravit est un indicateur, un chiffre de 0
24 (gravit croissante). Il est possible de lever des exceptions personnalises via linstruction
RAISERROR :
RAISERROR ('Le stock est ngatif !', 12, 1)

Lorsquon veut lever une erreur, on peu soit donner lidentifiant de lerreur en question, soit
lui donner un message particulier. Si on lui donne un message particulier comme nous lavons fait
dans lexemple ci-dessus, il faut automatiquement lui prciser une gravit et un tat. On peut ajouter
une clause WITH la suite de linstruction RAISERROR, pour appliquer une des trois options
possibles :
-

LOG : le message sera consign dans lobservateur dvnement Windows.


NOWAIT : le message sera dlivr sans attente lutilisateur.
SETERROR : permet de valoriser @@ERROR et ERROR_NUMBER avec le numro du message
derreur.

On peut aussi dfinir un message derreur par la procdure stocke sp_addmessage et le


supprimer par la procdure stocke sp_dropmessage. Voici la syntaxe de cration dun message
derreur :
exec sp_addmessage @msgnum, @severity,
@msgtext, @lang, @with_log, @replace

Dotnet France Association Grgory CASANOVA / James RAVAILLE

42

Les bases fondamentales du langage Transact SQL


Dans lordre, les paramtres correspondent aux donnes suivantes : identifiant, svrit,
message, langue, log et replace. Les paramtres Log et Replace ne sont pas obligatoires. Replace sert
remplacer le message derreur dune erreur existante. En revanche, pour connaitre le code de la
langue utiliser, utilisez la procdure stocke sp_helplanguage.

4.6.2

Gestion des erreurs dans le code


Il existe deux manires de grer les erreurs. La premire consiste tester la valeur de la
variable systme @@ERROR, la seconde consiste positionner dans un gestionnaire dexception TRY
le bloc dinstructions tester, et dans le CATCH, lerreur lever. Voyons la syntaxe :
BEGIN TRY
-- ...
END TRY
BEGIN CATCH
-- ...
END CATCH

Les instructions TRY CATCH ne peuvent tre dissocies.


Le bloc TRY permet de regrouper ensemble toutes les instructions susceptibles de lever une
erreur. SI le cas se prsente ou une instruction lve une erreur dans le bloc TRY, le contrle est
directement donn la premire instruction du bloc CATCH.
Le bloc CATCH suit toujours le bloc TRY. Celui-ci est excut si et seulement si, lexcution
dune instruction du bloc TRY lve une erreur. Dans le bloc CATCH, le code permet de grer lerreur
leve. Pour obtenir des informations sur cette dernire, il est possible dutiliser les fonctions SQL
suivantes :
-

ERROR_MESSAGE() : Retourne le texte du message communiquer lapplication. Ce texte


comprend tous les paramtres mis en argument lerreur en question.
ERROR_NUMBER() : Retourne le numro de lerreur.
ERROR_SEVERITY() : Retourne le niveau de gravit.
ERROR_STATE() : Retourne ltat.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

43

Les bases fondamentales du langage Transact SQL

5 Conclusion
Dans ce chapitre, nous avons donc vu la majorit des instructions possible en T-SQL DML,
avec chaque fois un exemple dexplication. Il est bon de rpter que ce chapitre ne dtaille pas les
deux autres facettes du Transact SQL qui sont le DDL et le DCL, tout simplement car on peu assimiler
le DCL ladministration de SQL Server, et parce que nous voyons le DDL au fur et mesure que nous
apprenons crer les diffrents objets de la base dans SQL Server. Dans le chapitre suivant nous
verrons de quelle manire il est possible de crer et grer deux nouveaux objets de la base de
donnes : les vues et les index.

Dotnet France Association Grgory CASANOVA / James RAVAILLE

Vous aimerez peut-être aussi