les bases fond amen tales du langage transact sql

Upload: iliasone

Post on 08-Apr-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    1/43

    Les bases fondamentalesdu langage Transact SQL

    Version 1.0

    Grgory CASANOVA

    James RAVAILLEhttp://blogs.dotnet-france.com/jamesr

    http://blogs.dotnet-france.com/jamesrhttp://blogs.dotnet-france.com/jamesrhttp://blogs.dotnet-france.com/jamesr
  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    2/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    2 Les bases fondamentales du langage Transact SQL

    Sommaire

    1 Introduction ..................................................................................................................................... 4

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

    2.1 Prsentation ............................................................................................................................ 5

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

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

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

    3 Les instructions DML ..................................................................................................................... 123.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 .......................................................................................................... 293.3.17 Loprateur NTILE .......................................................................................................... 30

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

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    3/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    3 Les bases fondamentales du langage Transact SQL

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

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

    4 Le SQL Procdural .......................................................................................................................... 33

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

    4.1.1 Les variables utilisateur ................................................................................................. 334.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 .......................................................................................................... 364.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

    5 Conclusion ..................................................................................................................................... 43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    4/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    4 Les bases fondamentales du langage Transact SQL

    1 IntroductionDans 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 diffrentesparties du langage (DML, DDL, DCL), puis dtailler la partie DML, qui est celle qui sert manipuler lesdonnes de faon gnrale.

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    5/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    5 Les bases fondamentales du langage Transact SQL

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

    - Davoir dj utilis linterface dadministration de SQL Server 2008 : SQL Server ManagementStudio (Chapitre 1).

    -

    Davoir les bases dans la construction dun modle relationnel de donnes (Chapitre 2). - Les bases fondamentales du langage T-SQL

    2.1 PrsentationLe 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 toutesles oprations excutables sur une base de donnes (lecture de donnes, oprationsdadministration du serveur, ajout, suppression et mises jour dobjets SQL - tables, vues,procdures stockes, dclencheurs, types de donnes personnaliss -). Ce langage est composdinstr uctions, rparties dans de 3 catgories distinctes :

    DML :Data Modification Language , soit langage de manipulation de donnes . Dans cettecatgorie, sinscri vent les instructions telles que l instruction SELECT ou encore lesinstructions qui nous permettent la cration, la mise jour et la suppression de donnesstockes dans les tables de la base de donnes. Il est important de retenir que le DML sertsimplement pour les donnes, et en aucun cas pour la cration, mise jour ou suppressiondobjets dans la base de donnes SQL Server.

    DDL :Data Definition Language , soit langage de dfinition de donnes . Les instructions decette catgorie, permettent dadministrer la base de donnes, ainsi que les objets quellecontient. Elles ne permettent pas de travailler sur les donnes. Aussi, elles ne seront pas

    traites dans ce chapitre. DCL :Data Control Language , soit l angage de contrle d accs . Cette catgorie dinstructions

    nous permet de grer les accs (autorisations) aux donnes, aux objets SQL, aux transactionset aux configurations gnrales de la base.

    Ces trois catgories combines permettent que le langage T-SQL prenne en compte desfonctionnalits algorithmiques, et admette la programmabilit. Le T-SQL est non seulement unlangage 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 unenvironnement client de type .NET, au travers dune app lication en C# ou en VB.NET. Dans ce

    chapitre, nous allons dtailler la partie DML du T-SQL exclusivement. Auparavant, nous tudieronsdiffrents lments syntaxiques qui composeront la syntaxe de ce langage, savoir les expressions,les oprateurs et les fonctions. Par la suite, nous traiterons l aspect procdural (algorithmique) de celangage.

    2.2 Les expressionsDans 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 delexcution dinstructions T -SQL.

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    6/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    6 Les bases fondamentales du langage Transact SQL

    - Les noms de colonnes : ils pourront tre utiliss comme expressions. La valeur delexpression tant l a valeur stocke dans une colonne pour une ligne donne.

    - Les variables : il sagit dentits qui peuvent tre employes en tant quexpressions ou dansdes expressions. Les variables sont prfixes par le caractre @. Les variables systmes sontprfixes 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 WHEREdunerequte SQL, affiner de permettre dafficher une recherche, ou bien poser une conditiondexcution .

    - Les sous-requtes : une sous requte SELECT peu tre place en tant quexpression . Lavaleur de lexpression est la valeur renvoye par la requte.

    2.3 Les oprateursLes 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 :

    = gale> Suprieur>= Suprieur ou gal< Infrieur

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    7/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    7 Les bases fondamentales du langage Transact SQL

    Les bornes minimum et maximum sont inclusesEXISTS (Sous Requte) Renvoie True, si et seulement si la sous requte

    renvoie au moins une ligneExp1 LIKE Permet de filtrer des donnes suivant un

    modle

    Pour loprateur de comparaison LIKE, les expressions permettent de dfinir un modle derecherche pour la correspondance des donnes :

    _ Un caractre quelconque% N caractres quelconques*ab+ Un caractre dans la liste ab [a-z] Un caractre dans lintervalle a -z*^ab+ Un caractre en dehors de la liste ou de

    lintervalle spcifiab Le ou les caractres eux-mmes

    - Les oprateurs logiques :

    OR Retourne True si une expression des deuxexpressions (oprandes) est vraie

    AND Retourne True si les deux expressions(oprandes) sont vraies.

    NOT Truesi lexpression est fausse.

    2.4 Les fonctionsLes fonctions se distinguent en deux catgories : celles cres par lutilisateu r, ou les

    fonctions systme. Nous allons dtailler ci-dessous les fonctions systme, les fonctions utilisateurseront traites dans un autre cours. Les fonctions systme se divisent en diffrentes catgories :

    - Les fonctions dagrgation :

    COUNT (*) Dnombre les lignes slectionnesCOUNT ([ALL|DISTINCT] exp1) Dnombre toutes les expressions non nulles

    ou les expressions non nulles distinctesCOUNT_BIG Possde le mme fonctionnement que la

    fonction COUNT, simplement, le type dedonnes de sortie est de type bigint au lieu deint

    SUM ([ALL|DISTINCT] exp1) Somme de toutes les expressions non nullesou des expressions non nulles distinctes

    AVG ([ALL|DISTINCT] exp1) Moyenne de toutes les expressions non nullesou des expressions non nulles distinctes

    MIN (exp1) OU MAX (exp1) Valeur MIN ou valeur MAX dexp1 STDEV ([ALL|DISTINCT] exp1) Ecart type de toutes les valeurs de lexpression

    donne

    STDEVP ([ALL|DISTINCT] exp1) Ecart type de la population pour toutes lesvaleurs de lexpression donne VAR ([ALL|DISTINCT] exp1) Variance de toutes les valeurs de lexpression

    donne

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    8/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    8 Les bases fondamentales du langage Transact SQL

    VARP ([ALL|DISTINCT] exp1) Variance de la population pour toutes lesvaleurs donne

    GROUPING Sutilise avec ROLLUP ou CUBE. Indique 1quand la ligne est gnre par un ROLLUP ouun CUBE et 0 dans un autre cas

    CHECKSUM ( | *exp1+) Permet de calculer un code de contrle parrapport une ligne de la table ou par rapport une liste dexpression. Cette fonction permetla production dun code de hachage

    CHECKSUM_AGG ([ALL|DISTINCT] exp1) Permet le calcul dune valeur de hachage parrapport un groupe de donnes. Ce code decontrle permet de savoir rapidement si desmodifications ont eu lieu sur un groupe dedonnes , car cette valeur de contrle nestplus la mme aprs modification des donnes

    - Les fonctions mathmatiques :

    ABS (exp1) Valeur absolue dexp1. CEILING (exp1) Plus petit entier suprieur ou gal exp1.FLOOR (exp1) Plus grand entier suprieur ou gal exp1.SIGN (exp1) Renvoie 1 si exp1 est positive, -1 si elle est

    ngative, et 0 si elle est gale 0.SQRT (exp1) Racine carre dexp1. POWER (exp1, n) Exp1 la puissance n.SQUARE (exp1) Calcul du carrdexp1 .

    - Les fonctions trigonomtriques :

    PI () Valeur de PI.DEGREES (exp1) Conversion dexp1 de radian vers degrs.RADIANS (exp1) Conversion dexp1 de degrs vers radians. SIN (exp1), COS (exp1), TAN (exp1), COT (exp1) Sin, cos ou tangentedexp1. ACOS (exp1), ASIN (exp1), ATAN (exp1) Arc cos, arc sin ou arc tan dexp1.ATN2 (exp1, exp2) Angle dont la tangente se trouve dans

    lintervalle exp1 et exp2.

    - Les fonctions logarithmiques :

    EXP (exp1) Exponentielle dexp1. LOG (exp1) Logarithme dexp1. LOG10 (exp1) Logarithme base 10 dexp1.

    - Les fonctions de dates :

    Format Abrviation signification

    Year Yy, yyyy Anne (1753 9999)quarter Qq, q Trimestre (1 4)Month Mm, m Mois (1 12)Day of year Dy, y Jour de lanne (1 366)

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    9/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    9 Les bases fondamentales du langage Transact SQL

    Day Dd, d Jour dans le mois (1 31)Weekday Dw, ww Jour de la semaine (1 7)Hour Hh Heure (0 23)Minute Mi, n Minute (0 59)Seconds Ss, s Seconde (0 59)milliseconds Ms Milliseconde (0 999)

    GETDATE () Date et Heure systme.DATENAME (format, exp1) Renvoie la partie date sous forme de texte.DATEPART (format, exp1) Renvoie la valeur de la partie date selon le

    format donn.DATEDIFF (format, exp1, exp2) Diffrence entre les deux tables selon le

    format donn.DATEADD (format, p, exp1) Ajoute p format la date exp1.DAY (exp1) Retourne le numro du jour dans le mois.MONTH (exp1) Retourne le numro du mois.YEAR (exp1) Retourne lanne. SWITCHOFFSET (datetimeoffset, zone_horaire) Convertis le type datetimeoffset en le type

    pass en second paramtre.SYSDATETIME Retourne la date et lheure usuelle du serveur

    dans le format datetime2.SYSDATETIMEOFFSET Fonctionne de la mme manire que

    SYSDATETIME, mais il prend en compte ledcalage GMT.

    - Les fonctions de chane de caractres :

    ASCII (exp1) Valeur du code ASCII du premier caractredexp1.

    UNICODE (exp1) Valeur numrique correspondant au codeUNICODE dexp1.

    CHAR (exp1) Caractre correspondant au code ASCII dexp1. NCHAR (exp1) Caractre UNICODE correspondant au code

    numrique dexp1. LTRIM (exp1), RTRIM (exp1) Supprime les espaces droit pour RTRIM et

    gauche pour LTRIM dexp1. STR (exp1, n, p) Convertit le nombre exp1, en chaine de

    longueur maximale n dont p caractres seront droite de la marque dcimale.

    SPACE (n) Renvoie n espaces.REPLICATE (exp1, n) Renvoie n fois exp1.CHARINDEX (masque, exp1)PATINDEX (%masque%, exp1)

    Renvoie la position de dpart de la premireexpression masque dans exp1. PATINDEXpermet dutiliser des caractres gnriques etde travailler avec certains type comme TEXT,CHAR ou encore VARCHAR.

    LOWER (exp1), UPPER (exp1) Change la casse. LOWER va convertir exp1 enminuscules et UPPER va convertir exp1 enmajuscules.

    REVERSE (exp1) Retourne les caractres dexp1 dans le sensinverse.

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    10/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    10 Les bases fondamentales du langage Transact SQL

    RIGHT (exp1, n) Renvoie les n caractres les plus droitedexp1.

    LEFT (exp1, n) Renvoie les n caractres les plus gauchedexp1.

    SUBSTRING (exp1, n, p) Renvoie p caractres dexp1 partir de n. STUFF (exp1, n, p, exp2) Supprime pcaractres dexp1, partir de n,

    puis insre exp2 la position n.SOUNDEX (exp1) Renvoie le code phontique dexp1. DIFFERENCE (exp1, exp2) Compare les SOUDEX des deux expressions. La

    valeur,qui peut tre renvoye va de 1 4,4,valeur pour laquelle, les deux expressionspossdent la plus grande similitude.

    LEN (exp1) Retourne le nombre de caractres dexp1. QUOTENAME (exp1) Permet de transformer exp1 en identifiant

    valide pour SQL Server.REPLACE (exp1, exp2, exp3) Permet de remplacer dans exp1 toutes les

    occurrences dexp2 par exp3.

    - Les Fonctions systmes :

    COALESCE (exp1, exp2) Renvoie la premire expression non NULL.COL_LENGTH (nom_table, nom_colonne) Longueur de la colonne.COL_NAME (id_table, id_colonne) Nom de la colonne.DATALENGTH (exp1) Longueur en octet de lexpression. DB_ID (Nom_base) Numro didentification de la base de

    donnes.DB_NAME (id_base) Nom de la base.GETANSINULL (nom_base) Renvoie 1 si loption ANSI NULL DEFAULT est

    positionn pour la base.HOST_ID () Numrodidentification du poste. HOST_NAME () Nom du poste.IDENT_INCR (nom_table) Valeur de lincrmentation dfinit pour la

    colonne identit de la table spcifie.IDENT_SEED (nom_table) Valeur initiale dfinie pour la colonne identit

    de la table indique.IDENT_CURRENT (nom_table) Retourne la dernire valeur de type identit

    utilis par cette table.INDEX_COL (nom_table, id_index, id_cle) Nom de la colonne index correspondant

    lindex. ISDATE (exp1) Renvoie 1 si lexpression de type varchar

    possde un format date valide.ISNULL (exp1, valeur) Renvoie valeur si exp1 est NULL.ISNUMERIC (exp1) Renvoie 1 si lexpression de type varchar a un

    format numrique valide.NULLIF (exp1, exp2) Renvoie NULL si exp1 = exp2.OBJECT_ID (objet) Numrodidentification de lobjet. OBJECT_ID (name) Nom de lobjet dont lid est plac en argument. STATS_DATE (id_table, id_index) Date de la dernire mise jour de lindex.

    SUSER_SID (nom_acces) Numro didentification correspondant aunom_acces.SUSER_SNAME (id) Nom daccs identifi par lid. USER_NAME (id) Nom de lutilisateur dont lid est plac en

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    11/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    11 Les bases fondamentales du langage Transact SQL

    argument.CURRENT_TIMESTAMP Date et heure systme, quivalent GETDATE

    ().SYSTEM_USER Nom daccs. CURRENT_USER, USER, SESSION_USER Nom delutilisateur de la session. OBJECT_PROPERTY (id, proprit) Permet de retrouver les proprits de la base.ROW_NUMBER Permet de connaitre le numro dune ligne

    issue dune partition depuis un jeu dersultats.

    RANK Permet de connaitre le rang dune ligne issuedune partition dans une srie de rsultats.

    DENSE_RANK Fonctionne comme RANK, mais ne sappliquequaux lignes de la srie de rsultat.

    HAS_DBACCESS (nom_base) Permet de savoir si, avec le contexte descurit actuel, il est possible daccder labase. (retourne 1 dans ce cas, dans le cascontraire, 0)

    HAS_PERMS_BY_NAME Permet de savoir par programmation, si londispose dun privilge ou non.

    KILL Cette fonction permet de mettre fin unesession utilisateur.

    NEWID () Permet de grer une valeur de typeUniqueIdentifier.

    NEWSEQUENTIALID () Permet de grer la prochaine valeur de typeUniqueIdentifier.

    PARSENAME (nom_objet, partie__extraire) Permet dextraire partir du nom complet delobjet, le nom de lobjet. La partiepartie__extraire peut prendre la valeur 1, 2,3, 4 selon si lon veut extraire le nom delobjet, le schma, la base, ou encore le nomdu serveur.

    PUBLISHINGSERVERNAME Permet de savoir qui est lorigine dunepublication.

    STUFF (chaine1, n, p, chaine2) Permet de supprimer p caractres de la chainechaine1, partir des positions n, puis dyinsrer chaine2

    - Les fonctions conversion de types :

    CAST (exp1 AS types_donnes) Permet de convertir une valeur dans le typespcifi en argument

    CONVERT (types_donnes, exp1, style) Conversion de lexpression dans le type dedonnes spcifi. Un style peut tre spcifidans le cas dune convers ion date ou heure

    - Les fonctions diverses :

    RAND (exp1) Nombre alatoire compris en 0 et 1. Exp1 est lavaleur de dpart

    ROUND (exp1, n) Arrondis exp1 n chiffres aprs la virgule

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    12/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    12 Les bases fondamentales du langage Transact SQL

    3 Les instructions DML

    3.1 PrsentationPour 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 tantque . Il nous est alors propos de slectionner lact ion que nous voulons accomplir : SELECT,INSERT, UPDATE ou DELETE. Cette action peut aussi tre ralise sur dautres objets SQL de la basede donnes.

    3.2 Cration, modification et suppression de donnes

    3.2.1 Linstruction INSERTLinstruction 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 donnesest la suivante :

    Dans ce code gnrique, nous demandons SQL Server dajouter un enregistrement latable Client, appartenant au schma dbo dans la base de donnes Entreprise. Pour prciser lescolonnes pour lesquelles nous allons ajouter des donnes, il est ncessaire de prciser le nom descolonnes, aprs linstruction INSERT INTO . Le mot cl VALUES nous permet de fournir des valeursaux 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 avecle type que vous avez assign votre table au moment de sa cration. Dans le cas o certaines de voscolonnes 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 clauseVALUES . Pourdes chaines de caractres, il faut placer celles-ci entre simples cotes. Dans le cas dun champ de typeidentit (possdant une incrmentation automatique grce la contrainte IDENTITY ), il nest pasncessaire de spcifier ni le nom du champ, ni sa valeur.

    Procdons un exemple pour mieux comprendre :

    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

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    13/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    13 Les bases fondamentales du langage Transact SQL

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

    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 lenombre voulu. Si nous voulons ajouter deux enregistrements dans une mme instruction Insert, alorsla syntaxe est la suivante :

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

    INSERT INTO [Client]( Nom_Client , Prenom_Client , Numero_Client , Adresse_Client , Mail_Client )

    VALUES( 'CASANOVA' , 'Grgory' , +33563456764 , '31 place de la chance' , '[email protected]' ),( 'RAVAILLE' , 'James' , +33567876435 , '34 Avenue de le paix' , '[email protected]' )

    GO

    INSERT INTO [ Client]( Nom_Client , Prenom_Client , Numero_Client , Adresse_Client , Mail_Client )

    VALUES( 'CASANOVA' , 'Grgory' , +33563456764 , '31 place de la chance' , '[email protected]' )

    GO

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    14/43

    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 vacopier les enregistrements dune table (source) vers une autre table (destination). Voici un exemple :

    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 concernantId_Client et Id_Stock seront slectionnes en fonction des conditions prcises aprs la clauseWHERE. Grce ce lot, nous allons ajouter la troisime ligne prsente dans le rsultat prsent ci-dessous.

    3.2.2 Linstruction UPDATELinstruction UPDATE , permet de mettre jour un ou plusieurs enregistrements. La syntaxe

    gnrique de cette instruction est la suivante :

    Linstruction ci-dessus permet de mettre jour la table Client de la base de donnesEntreprise. La clause SET permet dindiquer les champs mettre jour . La clauseWHERE, sert ciblerles enregistrements mettre jour. Voici lenregistrement de la table Client dont le champ Id -Clientvaut 3 :

    UPDATE [Entreprise] . [dbo] . [Client]SET [Nom_Client] =

    , [Prenom_Client] = , [Numero_Client] = , [Adresse_Client] = , [Mail_Client] =

    WHERE GO

    INSERT CommandeSELECT Id_Client , GETDATE (), Id_Stock , 1FROM Client , StockWHERE Id_Client = 3AND Id_Stock = 5

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    15/43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    16/43

    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 SELECTLinstruction SELECT permet de slectionner des donnes (tout ou partie

    denregistrements), dune ou plusieurs tables. Elle offre aussi la possibilit de les trier, et de lesregrouper. La syntaxe gnrale de cette instruction est la suivante :

    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 estpossible dindiquer qu e nous les slectionnons toutes avec le simple caractre * ) :

    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 :

    SELECT [Nom_Client], [Mail_Client]

    FROM [Entreprise] . [dbo] . [Client]GO

    SELECT [Id_Client], [Nom_Client], [Prenom_Client], [Numero_Client], [Adresse_Client], [Mail_Client]

    FROM [Entreprise] . [dbo] . [Client]GO

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    17/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    17 Les bases fondamentales du langage Transact SQL

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

    3.3.3 La condition WHEREIl est alors possible dajouter des conditions notre recherche pour laffiner, au travers de la

    clause WHERE. Les restrictions servent limiter le nombre denregistrement s slectionner. Lesconditions contenues dans le WHEREsont des expressions boolennes qui peuvent tre composesde noms de colonnes, de constantes, de fonctions, doprateurs de comparaison et doprateurslogiques. Prenons un exemple concret :

    Cette instruction SELECT slectionne tous les champs de tous les enregistrements pourlesquels 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 oprateurlogique. Le rsultat est le suivant :

    SELECT [Nom_Client] AS 'Nom Client', [Mail_Client] AS 'Mail Client'

    FROM [Entreprise] . [dbo] . [Client]WHERE Id_Client IN ( 1 , 2 , 3 , 6 )

    GO

    -------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

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    18/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    18 Les bases fondamentales du langage Transact SQL

    Linstruction ci -dessus prsente lutilisation des clauses WHEREet BETWEEN, qui permet delire tous les enregistrements dont lidentifiant est compris entre 1 et 10 (bornes incluses). Le rsultat

    est le suivant :

    3.3.4 Les projections de donnesLes 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 lesenregistrements identiques dans un seul et mme enregistrement. Voici les deux cas possibles deprojection :

    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 nombredoccurrence qui interviens pour chaque Mesure, grce la fonction COUNT(), associe la clause

    ------- Deux faons de grouper les colonnes identiques :-- Celle-ci :-----

    SELECT Mesure , COUNT( Mesure ) AS 'Nombre article avec cette mesure'FROM StockGROUP BY MesureGO------- Ou celle l :-----

    SELECT DISTINCT MesureFROM StockGO

    SELECT [Nom_Client] AS 'Nom Client', [Mail_Client] AS 'Mail Client'

    FROM [Entreprise] . [dbo] . [Client]WHERE Id_Client BETWEEN 1 AND 10

    GO

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    19/43

    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 pourcentagede vente en fonction de la localisation dun magasin par exemple. On naffichera quune seule fois lalocalisation du magasin grce la clause GROUP BY, et on affichera pour chaque localisation, lenombre de vente effectue. On peut alors facilement en dduire lequel des magasins est le plusproductif. 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 faondistincte, c'est--dire en vitant les doublons comme dans le premier exemple. En revanche, il nesera pas possible dutiliser une fonction dagrgation, type COUNT(), car elle doit tre contenuedans une clause GROUP BY. On obtiendra alors le rsultat identique au premier exemple, hors mis lefait que nous ne pouvons pas compter le nombre doccurrence de chaque mesure dans la colonneMesure.

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    20/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    20 Les bases fondamentales du langage Transact SQL

    3.3.5 Les calculs simplesLes 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 lessuivants :

    Ici, la quantit de chaque Stock sera multiplie par trois dans le rsultat de la recherche parlinstruction SELECT . Mais la valeur de la quantit de produit ne sera en aucun cas changer dans labase de donnes.

    Dans linstruction ci -dessus, nous concatnons les champs Nom_Client et Prenom_Client enune seule colonne que nous appellerons NOM COMPLET. Le rsultat est le suivant :

    3.3.6 Le produit cartsienLe but du produit cartsien est de croiser des donnes de plusieurs tables, de manire

    obtenir toutes les combinaisons possibles . Il y aura autant denregistrement s de retour que le produitdu nombre de lignes de chaque table. Donnons un exemple :

    SELECT Nom_Client + ' ' + Prenom_Client AS 'NOM COMPLET'FROM Client

    SELECT Id_Stock , 'Quantit Produit' = Quantite * 3FROM Stock

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    21/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    21 Les bases fondamentales du langage Transact SQL

    Le rsultat est le suivant :

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

    3.3.7 Les jointuresUne 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 deperformances) utilises pour mettre en relation les donnes de lignes comportant une cl trangreavec les donnes de lignes comportant une cl primaire. Voyons-le en dtail avec un exempleconcret :

    ------- Il existe deux manires de faire un produit cartsien :-- La syntaxe classique :-----

    SELECT Id_Client , Nom_Client , Date_CommandeFROM Client , Commande

    ------- La syntaxe en SQL ANSI :-----

    SELECT Id_Client , Nom_Client , Date_CommandeFROM Client CROSS JOIN Commande

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    22/43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    23/43

    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 dansle premier rsultat sont dues au fait que les clients dont lId est 5 et 6 nont pas de commandes. Cesvaleurs NULL disparaissent dans le second rsultat, tout simplement parce quil nexiste pas decommande 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 pluslogique. 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 ferapar ordre croissant ou par ordre alphabtique. Avec le mot cl ASC, le rangement se fera dans lordreascendant. Avec le mot cl DESC, le rangement se fera dans lordre descendant. Prenons unexemple :

    Avec la close ORDER BY, nous obtiendrons le mme rsultat que prcdemment, tri dansun ordre diffrent : les enregistrements sont tris selon le champ Nom_Client de faon croissantepour le premier lot, de faon dcroissante pour le second lot. Le rsultat est le suivant :

    --Rangement dans l'ordre ascendant :

    SELECT Client . Id_Client , Client . Nom_Client , Date_CommandeFROM Client LEFT OUTER JOIN CommandeON Client . Id_Client = Commande . Id_ClientORDER BY Nom_Client ASCGO

    --Rangement dans l'ordre descendant :

    SELECT Client . Id_Client , Client . Nom_Client , Date_CommandeFROM Client LEFT OUTER JOIN CommandeON Client . Id_Client = Commande . Id_ClientORDER BY Nom_Client DESCGO

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    24/43

    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 UNIONLoprateur 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 lesmmes types de donnes pour chaque colonne (correspondance deux deux).

    Le rsultat est le suivant :

    SELECT Id_Stock , Quantite

    FROM Stock

    UNION

    SELECT Id_Stock , QuantiteFROM Commande

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    25/43

    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 dansla premire instruction SELECT sera associe la premire table cite dans la seconde instructionSELECT , de mme pour les secondes tables. Dans le rsultat, on obtient alors 2 colonnes au lieu de4. Une option est possible avec loprateur UNION, UNION ALL qui va permettre de retourner toutesles 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 dansnotre 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. Prenonsun exemple :

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

    3.3.11 Loprateur INTERSECT Grace cet oprateur, il va tre possible didentifier en une seul e requte, des lignes

    dinformations simultanment prsentes dans deux jeux de rsultats distincts, mais de mme sstructures.

    Le rsultat est le suivant :

    SELECT * FROM ClientWHERE Id_Client BETWEEN 1 AND 3

    SELECT * FROM ClientWHERE Prenom_Client = 'Julien'

    SELECT * FROM ClientWHERE Id_Client BETWEEN 1 AND 3

    INTERSECT

    SELECT * FROM ClientWHERE Prenom_Client = 'Julien'

    SELECT Id_Stock , QuantiteFROM Stock

    EXCEPT

    SELECT Id_Stock , QuantiteFROM StockWHERE Id_Stock = 3

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    26/43

    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 estJulien. 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, commemontr sur lexemple ci -dessus.

    3.3.12 La clause TOPLa 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 :

    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.

    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 nesutilise que si une close ORDER BY est applique au SELECT . Elle a pour effet de ne slectionner lesenregistre ments quaprs la mise en leur tri.

    3.3.13 Crer une table grce SELECT INTOIl est possible de crer une table laide de colonne s de tables dj existantes. Grce un

    simple SELECT INTO , nous aurons choisir les colonnes qui constitueront les champs de la nouvelletable. Toutes les closes et conditions disponibles pour linstruction SELECT sont applicables pourlinstruction SELECT INTO . Voici un exemple :

    SELECT TOP 50 PERCENT WITH TIES *FROM dbo . ClientORDER BY Nom Client

    SELECT TOP 5 *FROM dbo . Client

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    27/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    27 Les bases fondamentales du langage Transact SQL

    Dans linstru ction prcdente, la clause INTO permet de prciser que nous allons crer unetable, 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 telpar la clause INTO , mais plus par le SELECT , car cest cette instruction qui va donner la table sescaractristiques (nombre de colonnes, type de donnes des colonnes). Dans le cas o des colonnessont calcules, il est impratif de donner un nom ces colonnes . Si lon fait prcder le nom de latable cre par un #, la table sera temporaire locale, si elle est prcde dun ##, elle sera temporaireglobale. On rappelle que ces deux types de tables temporaires sont stocks dans la base de donnesTempdb qui est une table prdfinie en tant que table systme dans SQL Server 2008. Les tablestemporaires locales sont accessibles que par la session qui la cre et disparait la dconnexionalors que les tables globales, elles sont ensuite accessibles par toutes les sessions, et enfin elles sontdtruites lors de la dconnexion de la derni re session lavoir utilise. Ce genre de table estpratique, pour des travaux de transferts de donnes, ou encore si nous avons besoin de garder lesdonnes 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 COMPUTEest 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 unefonction dagrgation telle que COUNT, SUM Il est bon de noter que ces clauses sont maintenuespour 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 slectionnetoutes les colonnes de la table Client, ordonnes par le nom des clients, tandis que le sous rsultat vacompter le nombre de client. Lintrt de la clause COMPUTEest de pouvoir gnrer un sous rsultat,grce une mme requte.

    Le mot cl BY de la clauseCOMPUTE, nous permet de retourner les sous rsultats en fonction

    des diffrentes valeurs dune colonne spcifique. Dans lexemple, la suite, on peu remarquer quelon donne la quantit du stock, pour chaque Id_Stock en sous rsultat. La colonne que lon prcisedonc aprs le mot cl BY, nous permet de dire, de quelle manire nous allons dcouper les sousrsultats.

    SELECT *FROM Entreprise . dbo . ClientORDER BY Nom_ClientCOMPUTE COUNT( Id_Client )

    SELECT Id_Client , Nom_Client , Id_Commande INTO dbo . ExempleFROM dbo . Client , dbo . CommandeWHERE Client.Id_Client = Commande.Id_Client

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    28/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    28 Les bases fondamentales du langage Transact SQL

    3.3.15 Les oprateurs ROLLUP et CUBELes 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 clauseWITH ROLLUP permet de crer des lignes comportant des rsultats pour le groupementdes colonnes contenues dans la clause GROUP BY, en les combinants de la gauche vers la droite.

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

    USE EntrepriseGO

    SELECT a . Id_Entrepos , b . Id_StockFROM dbo . Entrepos aINNER JOIN dbo . Stock bON a . Id_Entrepos = b . Id_EntreposGROUP BY a . Id_Entrepos , b . Id_StockWITH ROLLUP

    SELECT *FROM Entreprise . dbo . StockORDER BY Id_StockCOMPUTE SUM( Quantite ) BY Id_Stock

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    29/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    29 Les bases fondamentales du langage Transact SQL

    3.3.16 Loprateur OVERLoprateur 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 encoreDENSE_RANK.Dans le cas dune fonction de tri, loprateur OVER va pouvoir contenir unpartitionnement ou une clause ORDER BY, ce qui va nous permettre de ranger les donnes avantdeffectuer une fonction. Il est important de noter que les fonctions dagr gation ne sont applicablesavec 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 aINNER JOIN Stock bON a . Id_Entrepos = b . Id_Entrepos

    USE EntrepriseGO

    SELECT a . Id_Entrepos , b . Id_StockFROM dbo . Entrepos aINNER JOIN dbo . Stock bON a . Id_Entrepos = b . Id_EntreposGROUP BY a . Id_Entrepos , b . Id_StockWITH CUBE

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    30/43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    31/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    31 Les bases fondamentales du langage Transact SQL

    Voici son rsultat :

    Avec le code qui va suivre, nous allons nous proposer damliorer la lisibilit de notre rsultaten affichant, grce un PIVOT , la quantit en fonction des dpts (1, 2, 3 ou 4). Il suffit de faire unSELECT des valeurs que nous voulons passer en colonne. Les alias prsents dans lexemple serventvidemment donner un nom aux colonnes cres, car par dfaut, elles nont pas de n oms. Pour

    linstruction PIVOT , comme pour linstruction UNPIVOT , nous allons dans un premier tempsappliquer une fonction dagrgation la colonne pass en paramtre de la colonne de pivot et lacolonne par laquelle nous allons effectuer le pivot aprs la clause FOR. La clause IN indiquerasimplement les valeurs pour lesquelles nous allons effectuer le pivot. Il est important de remarquerque lalias que nous donnons au pivot nest pas optionnel. Si vous nen donnez pas, une erreur seraleve.

    Le rsultat est le suivant :

    USE EntrepriseGO

    SELECT Id_Stock ,[1] AS "D1" , [2] AS "D2" , [3] AS "D3" , [4] AS "D4"FROM dbo . StockPIVOT ( SUM( Quantite ) FOR Id_EntreposIN ( [1] , [2] , [3] , [4] )) AS PVT

    USE EntrepriseGO

    SELECT Id_Stock , Id_Entrepos , QuantiteFROM dbo . Stock

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    32/43

    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 autretable. Voici un exemple de structure de l instruction MERGE:

    Description de la requte prcdente : On se propose de modifier la table Stock avec la tableCommande, 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 lacommande 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 conditiondarrt nest pas vrai.

    USE EntrepriseGO

    MERGE INTO dbo . StockUSING dbo . CommandeON Stock . Id_Stock = Commande . Id_StockWHEN MATCHED THENUPDATESET Stock . Quantite = Stock . Quantite - Commande . Quantite ;

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    33/43

    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 utilisateurUne 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 obligatoirementdclares avant dtre utilise.

    Voici la dclaration dune variable nomme Id_Client de type Int :

    Linstruction suivante permet de valoriser cette variable via lexcution dune requtescalaire :

    4.1.2 Les variables systmeLes 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 pluscourant est la variable @@ERROR, qui est 0 en temps normal, et 1 lorsquune erreur est leve.

    4.2 Les transactionsUne 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 valid ation).

    - Isolation , car il est possible de verrouiller (isoler) les donnes pendant lexcution de latransaction (verrouillage en lecture, en criture, ).

    - Dure car les changements apports sur des donnes par une transaction sont durables (nonvolatiles).

    La syntaxe gnrique dun e transaction est la suivante :

    SELECT @IdClient = ( SELECT Id_Client FROM Motors . dbo . Client WHERE

    DECLARE @IdClient int

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    34/43

    Dotnet France Association Grgory CASANOVA / James RAVAILLE

    34 Les bases fondamentales du langage Transact SQL

    Voici un exemple de transaction :

    Ici, dans notre exemple, nous avons deux transactions imbriques. Il est trs important decomprendre 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 destransactions se fait donc celons un modle LIFO (Last In First Out). La dernire transaction crite serala premire devoir tre ferme. Pour revenir notre exemple, on peu dsormais dire que le nomclient gal HOLLEBECQ sera chang par VASSELON, du fait duROLLBACK TRAN qui termine latransaction 2, alors que CASANOVA ne sera pas chang par ANDREO, dans transaction1, car celle-cise 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 unROLLBACK TRAN implicite qui est opr juste aprs que linstruction du DDL soit faite. Il faut don c

    faire trs attention la suite dinstructions dans une transaction. Si jamais vous crivez unetransaction qui comporte deux instruction, une du DML puis une du DDL, mme si vous mettez unROLLBACK la suite, les deux instructions seront COMMIT , puisque les instructions du DDLcomporte ce ROLLBACK TRAN implicite dont nous avons parl prcdemment.

    4.3 Les lots et les scriptsUn 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 sexcuterapas. En revanche, les lots possdent certaines restrictions :

    BEGIN TRAN Transaction1UPDATE dbo . Client

    SET Nom_Client = 'ANDREO'WHERE Nom_Client = 'CASANOVA'

    BEGIN TRAN Transaction2UPDATE dbo . Client

    SET Nom_Client = 'VASSELON'WHERE Nom_Client = 'HOLLEBECQ'

    COMMIT TRAN Transaction2ROLLBACK TRAN Transaction1

    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

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    35/43

    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 modificationopre dans un mme lot.

    - Ilnest 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 cecours, qui contient la structure de la base, des tables, certaines entres de donnes et certains objetsde la base tels quune procdure stocke ou un dclencheur

    4.4 Le contrle de fluxIl existe quatre faons de contrles les flux sur SQL Server 2008. Les instructionsRETURN,

    PRINT , CASE et les blocs BEGIN END, 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 donnesen les rendant plus prsentables, ou bien, elles vous permettront de les manipuler avec plus defacilit, par exemple pour des actions rptitives, ou des actions ncessitant une condition. Danscette 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.

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

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

    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 intSELECT @Variable = COUNT(*) FROM Motors . dbo . ClientPRINT 'LE NOMBRE DE CLIENTS EST :'PRINT @Variable

    CREATE PROC Procedure1AS

    DECLARE @Variable int = 4IF ( @Variable > 2 )

    RETURN 0 ;ELSE

    RETURN 1 ;GO

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    36/43

    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 :

    Avec un case, on peu crer simplement une colonne en donnant des conditions pour lesrsultats, en fonction dune autre colonne existante. Par exemple, ici, on dtermine suivantlId_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

    USE EntrepriseSELECT '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_ClientFROM dbo . ClientORDER BY Anciennete

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    37/43

    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 exempledutilisation de cette instruction :

    Dans ce script, on dclare dans un premier temps une variable @Variable de type int, et de valeur1. On applique alors une condition IF , qui dfinit que sil existe un client avec un Id gal la valeurde notre variable dclare pralablement, on le supprime et on crit que le client bien tsupprim. Linstruction ELSE dfinit en revanche que pour tous les autres cas, on crit que le clientnexiste pas.

    Le rsultat est le suivant da ns le cas ou le client lId 1 existe :

    Dans longlet M essages 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 :

    SELECT * FROM ClientDECLARE @Variable int = 1IF EXISTS ( SELECT * FROM Client WHERE Id_Client = @Variable )

    BEGINDELETE FROM Client WHERE Id_Client = @VariablePRINT 'Le Client 11 a bien t supprim !'

    ENDELSE

    PRINT 'Pas de Client pour cet Id !'

    SELECT * FROM Client

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    38/43

    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. Tan t que la condition est vraie, cebloc 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 lastructure en interrompant son excution. La seconde nous permet de relancer immdiatementlexcution du bloc dinstruction . Voici un exemple :

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

    4.5 La gestion des curseursDans 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 maniretraditionnelle, avec un simple UPDATE ou une autre instruction du DML, afin de consommer le moinsde ressources possibles.

    WHILE ( SELECT COUNT(*) FROM Client ) < 6BEGIN

    INSERT INTO [Entreprise] . [dbo] . [Client]( [Nom_Client], [Prenom_Client], [Numero_Client], [Adresse_Client], [Mail_Client] )

    VALUES( 'DORDOLO' , 'Mathieu' ,33678765342 ,

    '9 Avenue des Peupliers' ,'[email protected]' )

    END

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    39/43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    40/43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    41/43

    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 lesId_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 . Entemps normal, cette variable systme est initialise -1. Aprs avoir parcouru tous lesenregistrements de la table client, il est ncessaire de fermer le curseur et de le d allouer. Lersultat est le suivant pour notre base de donnes dexemple, Entreprise.

    4.6 Les exceptions

    4.6.1 Lever une exceptionPour chaque erreur qui survient dans SQL Server, SQL Server produit un message der reur. En

    rgle gnrale, tous les messages possdent la mme structure : un numro derreur, un messagedexplication de l erreur, 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 linstructionRAISERROR :

    Lorsquon veut lever une erreur, on peu soit donner lidentifiant de lerreur en question, soitlui donner un message particulier. Si on lui donne un message particulier comme nous lavons faitdans lexemple ci -dessus, il faut automatiquement lui prciser une gravit et un tat. On peut ajouterune 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 lesupprimer par la procdure stocke sp_dropmessage . Voici la syntaxe de cration dun messagederreur :

    exec sp_addmessage @msgnum , @severity ,

    @msgtext , @lang , @with_log , @replace

    RAISERROR ( 'Le stock est ngatif !' , 12 , 1 )

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    42/43

  • 8/7/2019 Les Bases Fond Amen Tales Du Langage Transact SQL

    43/43

    43 Les bases fondamentales du langage Transact SQL

    5 ConclusionDans 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 lesdeux autres facettes du Transact SQL qui sont le DDL et le DCL, tout simplement car on peu assimilerle 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 nousverrons de quelle manire il est possible de crer et grer deux nouveaux objets de la base dedonnes : les vues et les index.