Les ordres du SQL
Les bases du langage SQL
1. Les expressions
Dans la plupart des syntaxes Transact-SQL, il est possible d’utiliser des expressions ou des combinaisons d’expressions pour gérer des valeurs ou pour tirer parti de la programmabilité du langage. Les expressions peuvent prendre différentes formes :
Les valeurs constantes
Exemple
Caractère 'AZERTY', 'Ecole Nantaise d''Informatique'
Les chaînes de caractères sont entourées d’apostrophes. S’il doit y avoir une apostrophe dans la chaîne de caractères, il est nécessaire d’en mettre deux pour ne pas le confondre avec la fin de la chaîne de caractères.
Numérique 10, -15.26, 1.235e-5
Date
constante date heure
'201205' 5 Décembre 2020 00:00:00:000
'05/12/2020' idem idem
'5-12-20 8:30' idem 8:30:00:000
'8:30:2' 1er Janvier 1900 08:30:02:000
'5.12.2020 8:30pm' 15 Décembre 2020 20:30:00:000
Le format français jj/mm/aaaa est l’un des formats possibles pour les dates.
Binaire 0x05, 0xFF, 0x5aef1b
Nulle NULL
Les noms de colonne
Un nom de colonne pourra être employé comme expression, la valeur de l’expression étant la valeur "stockée" de la colonne.
Les fonctions
On peut utiliser comme expression n’importe quelle fonction, la valeur de l’expression est le résultat retourné par la fonction.
Exemple
expression valeur
SQRT(9) 3
substring('ABCDEF',2,3) 'BCD'
Les variables
Les variables peuvent être employées en tant qu’expression...
Les instructions du Data Manipulation Language
Le langage de manipulation de données ou DML (Data Manipulation Language) est composé des instructions permettant la gestion, la visualisation et l’extraction des lignes des tables et des vues.
1. L’insertion de lignes
L’insertion de lignes dans une table, ou au travers d’une vue selon certaines conditions, se fait par la commande INSERT.
Les contraintes sont contrôlées et les triggers sont déclenchés lors de l’exécution de la commande. La forme "INSERT ..... VALUES ....." crée une seule ligne, alors que "INSERT ..... SELECT ....." permet de créer éventuellement plusieurs lignes.
Syntaxe
INSERT [INTO] nom_objet [(col,...)]{DEFAULT VALUES|VALUES
(val,...)|requête| EXECUTE procedure}
nom_objet
Nom valide de table ou de vue.
(col,...)
Liste des colonnes à valoriser. Les colonnes non citées prendront la valeur par défaut ou NULL si la colonne n’a pas de valeur par défaut. Si la liste est omise, toutes les colonnes devront être associées à une valeur.
Il est préférable de nommer la liste des colonnes valorisées afin d’éviter de se tromper dans l’ordre des colonnes.
DEFAULT VALUES
Toutes les colonnes citées prendront leur valeur par défaut ou NULL si elles n’en ont pas.
(val,...)
Liste de valeurs composée d’expressions constantes, des mots-clés NULL ou DEFAULT, ou de variables. Il doit y avoir autant de valeurs que de colonnes à valoriser, du même type, et dans le même ordre.
requête
Instruction SELECT renvoyant autant de valeurs, dans le même ordre et du même type que les colonnes à valoriser. Cette forme de syntaxe permet d’insérer plusieurs lignes en une seule opération.
procedure
Nom d’une procédure stockée locale ou distante. Seules les valeurs des colonnes renvoyées par un ordre SELECT contenu dans la procédure valoriseront les colonnes concernées par l’INSERT.
Exemples
NULL et valeurs par défaut
INSERT INTO Clients VALUES(138, 'Dubois', 'Zoé', '12/07/1998', 'Tours', '0777666555', '0413223140');
INSERT INTO Clients VALUES(142, 'Duchemin'...
Les vues
SQL Server permet la gestion d’objets associés aux tables : les vues (VIEWS). Une vue est une table virtuelle, c’est-à-dire un objet ayant la même utilisation qu’une table par rapport au langage de manipulation de données, à quelques restrictions près, mais n’occupant pas d’espace disque pour les données. Une vue ne "stocke" que la requête correspondant à l’extraction.
Les intérêts d’utilisation d’une vue sont multiples :
-
Simplification des structures des tables. Certaines tables peuvent comporter de nombreuses colonnes avec des noms et des types peu pratiques à manipuler. Une vue fournira à l’utilisateur les mêmes données dans une forme simplifiée.
-
Réutilisation de requêtes. Lorsque les requêtes sont souvent exécutées (jointures, calculs), une vue permettra de stocker l’instruction et de l’utiliser plus simplement.
-
Sécurité d’accès. Il est possible de cacher des lignes et des colonnes aux utilisateurs en ne mettant à leur disposition que des vues de projection ou de restriction à la place des tables initiales.
La modification des données au travers d’une vue n’est autorisée que si une seule table correspondant à la vue est modifiée et si la requête de la vue n’utilise pas de calculs.
Une vue est définie à partir d’une requête de type SELECT. Cette requête est enregistrée dans la base sous un nom (le nom de la vue). Dès que la vue est définie, elle est utilisée de la même façon...
Exercices
1. La suppression des données
Supprimez toutes les données présentes dans la base de données et réinitialisez la valeur auto-incrémentée de la table Fiches afin de pouvoir réexécuter ce script à chaque fois que vous aurez besoin de réinitialiser votre jeu d’essai.
Le ON DELETE CASCADE positionné sur une contrainte d’intégrité référentielle vous permet de limiter le nombre de requêtes à effectuer.
2. L’insertion du jeu d’essai
Insérez le jeu d’essai présenté dans l’exercice L’identification des clés primaires et des clés secondaires du chapitre Le modèle relationnel.
3. Le test des contraintes d’intégrité
Essayez d’insérer un enregistrement qui viole l’une des contraintes (clé primaire, intégrité référentielle, unicité et vérification). Testez l’ensemble des contraintes présentées dans l’exercice La création des tables du chapitre Implémentation des bases de données.
4. La traduction de l’algèbre relationnelle en requêtes SQL
Transformez les requêtes écrites en algèbre relationnel dans l’exercice L’algèbre relationnelle du chapitre Le modèle relationnel, en requêtes SQL.
5. L’écriture de requêtes SQL
Pour effectuer les requêtes suivantes, il est conseillé de compléter votre jeu d’essai en exécutant le script jeuEssaiAdditionnel.sql présent dans les fichiers en téléchargement...
Correction des exercices
1. La suppression des données
USE Location;
-- supprime également les données présentes dans Fiches et dans
LignesFic en raison du ON DELETE CASCADE
DELETE FROM clients;
DELETE FROM articles;
DELETE FROM grilleTarifs;
DELETE FROM tarifs;
DELETE FROM gammes;
DELETE FROM categories;
DBCC CHECKIDENT('Fiches', RESEED, 1000) WITH NO_INFOMSGS;
2. L’insertion du jeu d’essai
-- clients
INSERT INTO clients VALUES(1, 'Albert', 'Anatole', 'Rue des acacias', '61000',
'Amiens');
INSERT INTO clients VALUES(2, 'Bernard', 'Barnabé', 'Rue du bar',
'01000', 'Bourg en Bresse');
INSERT INTO clients VALUES(3, 'Dupond', 'Camille', 'Rue Crébillon',
'44000', DEFAULT);
INSERT INTO clients VALUES(4, 'Desmoulins', 'Daniel', 'Rue descendante', '21000',
'Dijon');
INSERT INTO clients VALUES(5, 'Ernest', 'Etienne', 'Rue de l''échafaud', '42000',
'Saint Étienne');
INSERT INTO clients VALUES(6, 'Ferdinand', 'François','Rue de la convention',
'44100', DEFAULT);
INSERT INTO clients VALUES(9, 'Dupond', 'Jean', 'Rue des mimosas',
'75018', 'Paris');
INSERT INTO clients VALUES(14, 'Boutaud', 'Sabine', 'Rue des platanes', '75002',
'Paris');
-- fiches
INSERT INTO fiches VALUES(14, GETDATE()-15, GETDATE()-13, 'SO');
INSERT INTO fiches VALUES(4, GETDATE()-13, NULL, DEFAULT);
INSERT INTO fiches VALUES(1, GETDATE()-12, GETDATE()-10, 'SO');
INSERT INTO fiches VALUES(6, GETDATE()-11, NULL, DEFAULT);
INSERT INTO fiches VALUES(3, GETDATE()-10, NULL, DEFAULT);
INSERT INTO fiches VALUES(9, GETDATE()-10, NULL, 'RE');
INSERT INTO fiches VALUES(1, GETDATE()-3, NULL, DEFAULT);
INSERT INTO fiches VALUES(2, DEFAULT, NULL, DEFAULT);
-- gammes
INSERT INTO gammes VALUES('PR', 'Matériel...