Les Objectifs
1. Comprendre des notions de SQL SERVER.
2. Maitriser les Aspects du langage SQL sous SQL SERVEUR
3. Ecrire et lire des Requêtes SQL simples et complexes.
4. Interroger efficacement une Base des données Relationnelle conçue dans SQL Server
5. De Programmer en SQL SERVER
BIBLIOGRAPHIE
1. Livres
Cristian Soutou, SQL pour Oracle : Application avec Java, Php et XML, Eyrolles
, Paris, 2006.
• Cristian Soutou, Apprendre SQL avec MySQL Eyrolles,3ieme Edition, Paris,2008.
• Jérôme GABILLAUD, SQL Server 2008 Express:Administrez et développez vos bases
de données, Eyrolles, Paris,octobre 2009
• Rudi Bruchez, OPTIMISER SQL, Dimensionnement, supervision,performances du
moteur et du code SQL, Dunod, Paris, 2008 ,ISBN 978-2-10-053750-1
2. Cours
• Cyril Gruau, Notes de Cour:SQL Server 2000: Analysis Services et DTS,2014
• Tony Archambeau,Cours SQL :Base du langage SQL et des bases de données,2014
3. Autres Sources
• Articles en ligne sur Developpez.com. (2005a). LE SQL de A à Z : Le simple ( ?) SELECT
et les fonctions SQL. (http :// sql.developpez.com/ sqlaz/ select).
• Articles en ligne sur Developpez.com. (2005b). LE SQL de A à Z : Les jointures, ou
comment interroger plusieurs tables. (http :// sql.developpez.com/ sqlaz/ jointures).
• Articles en ligne sur Developpez.com. Les fonctions dans
SQL(http://sqlpro.developpez.com/cours/sqlaz/fonctions/).
• http://blog.dbi-services.com/il-tait-une-fois-sql-server/
On utilise la base de données comme service. SQL server 2008 R2 propose un ensemble
d’améliorations connu sous le nom d’AMM (Application and Multi-server Management) visant
à réduire le coût et la complexité de la gestion des serveurs de bases de données et applications.
SQL 2008 R2 a également un ensemble de nouveaux outils comme PowerPivot pour Excel et
SharePoint, Master Data Services, StreamInsight, ReportBuilder 3.0 ou encore Reporting
Services Add-in pour SharePoint.
La version 2008 de SQL Server (nom de code Katmaï) est sortie en août 2008. La version mineure
2008 R2 est sortie en 2010.
La version 2012 de SQL Server est sortie en avril 2012.
La version 2014 de SQL Server est sortie le 1er avril 2014 avec un moteur « in memory »
complémentaire au moteur relationnel.
La version 2016 de SQL Server est actuellement disponible sous forme de bêta test (RC 2.1)
Lors du développement de la version 2005, le projet était à l'époque l'un des plus grands projets
informatiques du monde. Plus de 1 600 développeurs ont participé au codage du noyau
et l'on estime que plus de 10 000 autres personnes y ont travaillé de près ou de loin (Interactions
homme-machine, documentation, traduction...)
1.0.2 Brève Historique du langage SQL
En 1970, Edgar Frank Codd(E.F. CODD), Directeur de recherche du centre IBM de San José,
invente le modèle relationnel qui repose sur une algèbre relationnelle. Ce modèle provoque une
révolution dans l’approche des bases des données.
En 1977, création du langage SEQUEL (Structured English Query Language) et mise en place
du Système R, prototype de base de données reposant sur la théorie de CODD.
SEQUEL continue de s’enrichir pour devenir SQL (Structured Query Language).
C’est IBM, à tout seigneur tout honneur, qui, avec System-R, a implanté le modèle relationnel au
travers du langage SEQUEL (Stuctured English as QUEry Language), rebaptisé par la suite SQL
(Structured Query Language).
La première norme (SQL1) date de 1987. Elle était le résultat de compromis entre constructeurs,
mais elle était fortement influencée par le dialecte d’IBM.
SQL2 a été normalisée en1992. Elle comporte de nombreuses parties (concepts objets, entrepôts
de données, séries temporelles, accès à des sources non SQL, réplication des données, etc.).
NB. : SQL est désormais un langage incontournable pour tout SGBD moderne.
Par contre, bien qu’une norme existe, on assiste à une prolifération de dialectes propres à chaque
produit : soit des sous-ensembles de la norme (certaines fonctionnalités n’étant pas implantées),
soit des sur-ensembles (ajout de certaines fonctionnalités, propres à chaque produit).
L’édition développeur est la même que l’édition Entreprise mais ne peut pas être mise sur un
environnement de production.
Il existe une version d’évaluation de 180 jours pour pouvoir effectuer des tests et voir toute la
panoplie de fonctionnalités de +SQL Server.
Les différentes éditions ont également des caractéristiques (limites) matériels et logiciels dont
voici un petit tableau non exhaustif des 5 principales caractéristiques. Ces différences sont
également dans chaque composant serveur.
Les tables système sont utilisées directement par le moteur de SQL Server. Les applications qui
utilisent SQL Server ne doivent en aucun cas accéder directement à ces tables, même en lecture.
En effet, comme la structure de ces tables évolue avec les versions de SQL Server, si certaines
applications accèdent de façon directe aux tables système, on peut se trouver dans l’impossibilité
de migrer vers une nouvelle version de SQL Server tant que l’application n’a pas été réécrite.
1.6 Installer SQL Server
L’installation de SQL Server permet de présenter les différentes éditions de SQL Server ainsi que
de détailler les options d’installation possibles. Un point tout particulier sera mis en place pour
détailler l’exécution des services associés à SQL Server (logiciels serveur). Une fois le serveur
installé, il faut s’assurer que l’installation s’est déroulée correctement puis il faut configurer le
serveur et certains outils clients pour réaliser les différentes étapes d’administration. Bien que
facile à réaliser, l’installation de SQL Server doit être une opération réfléchie. En effet, de
nombreuses options d’installation existent et leur choix doit correspondre à un réel besoin, ou
permettre de couvrir une évolution future du système.
Le processus d’installation de SQL Server 2008 commence par exécuter un certain nombre de
règles afin de valider la configuration de la plateforme.
On commence par lancer l’installation :
Le système va effectuer des tests pour chercher les éventuels problèmes qui pourraient compromettre
l’installation. : à noter qu’on peut également utiliser l’outil d’identification des problèmes avant
d’effectuer l’installation. Celui-ci se trouvant dans l’onglet Outils du programme d’installation qu’on
peut voir si dessus.
On choisit la version à installer : ici la version est Express with Advanced Services :
Le système nous résume l’espace disque nécessaire ainsi que les répertoires où vont être installé
les composants :
On configure les services SQL de la manière suivante : On utilise le compte de « service réseau
» pour démarrer le service SQL Server Database Engine (ne nécessite pas de mot de passe) et on
automatise le démarrage du service SQL Server Browser.
C’est Le mot de passe de l’utilisateur sa qui est fourni ici. Il convient de ne pas l’oublier puisque
c’est avec ce mot de passe qu’on pourra accéder aux bases de données.
L’installation continue :
Il suffit de cliquer sur suivant pour passer les différents écrans qui se finaliseront par le bouton «
Installer ». Le programme d’installation exécutera un dernier test pour déterminer s’il sera bloqué
ou non lors de l’installation.
L’installation est réussite. Il ne reste plus qu’à cliquer sur Suivant et Fermer.
Pour établir la première connexion au serveur, plusieurs outils sont disponibles. En mode
graphique, il convient de lancer SQL Server Management Studio. Au lancement de l’outil, la
fenêtre suivante de connexion est présentée.
CREATE – ALTER – DROP - RENAME – TRUNCATE Définition des données Langage de définition
(LDD ) des Données
INSERT – UPDATE – DELETE - LOCK TABLE Manipulation des Langage de
données (LMD) Manipulation de
Données
SELECT Interrogation des Langage
données (LID) d'Interrogation
des données
GRANT – REVOKE – COMMIT – ROLLBACK – Contrôle des données Langage de contrôle des
SAVEPOINT - SET TRANSACTION
(LCD) données
1.8. DATABASE
a) CREATE DATABASE
La création d’une base de données en SQL est possible en ligne de commande. Même si les
systèmes de gestion de base de données (SGBD) sont souvent utilisés pour créer une base, il
convient de connaitre la commande à utiliser, qui est très simple.
Syntaxe
CREATE DATABASE nomBaseDeDonnées
Exemple :
CREATE DATABASE papeterie -- le nom de la base
b) Modification de la base des données
Pour modifier une base de données existante, on utilise l’instruction ALTER DATABASE.
Modification du Nom de la Base des données
. Par exemple :
• SQL Server 2000:
ALTER DATABASE papeterie
MODIFY NAME cartoleria
• SQL SERVER 2008
Syntaxe
La syntaxe générale pour créer une table est la suivante :
CREATE TABLE nom_de_la_table
(
colonne1 type_donnees, colonne2
type_donnees, colonne3
type_donnees,
colonne4 type_donnees
)
Imaginons que l'ont souhaite créer une table utilisateur, dans laquelle chaque ligne correspond a
un utilisateur inscrit sur un site web. La requête pour créer cette table peut ressembler a ceci
:
CREATE TABLE utilisateur
(id INT PRIMARY KEY,nom VARCHAR(100), prenom VARCHAR(100),email
VARCHAR(255),date_naissance DATE,pays VARCHAR(255),ville
VARCHAR(255),code_postal VARCHAR(5),nombre_achat INT)
b) ALTER TABLE
La commande ALTER TABLE en SQL permet de modifier une table existante. Il est ainsi possible
d’ajouter une colonne, d’en supprimer une ou de modifier une colonne existante, par exemple pour
changer le type.
Syntaxe de base
D'une manière générale, la commande s’utilise de la manière suivante :
ALTER TABLE nom_table
instruction
Le mot-clé " instruction " ici sert à designer une commande supplémentaire, qui sera détaillée ci-
dessous selon l’action que l’on souhaite effectuer : ajouter, supprimer ou modifier une colonne.
Exemple
Pour ajouter une colonne qui correspond a une rue sur une table utilisateur, il est possible d’utiliser
la requête suivante :
ALTER TABLE utilisateur
ADD adresse_rue VARCHAR(255)
b.2) Supprimer une colonne
Une syntaxe permet également de supprimer une colonne pour une table. Il y a 2 manières
totalement équivalente pour supprimer une colonne :
ALTER TABLE nom_table
DROP nom_colonne
Ou (le résultat sera le même)
ALTER TABLE nom_table
DROP COLUMN nom_colonne
b.3) Modifier une colonne
SQL server
ALTER TABLE nom_table
ALTER COLUMN nom_colonne Type_donne
Ici, le mot-clé " type données " est a remplacer par un type de données tel que INT,
VARCHAR, TEXT, DATE …
c) Renommer une colonne
Pour renommer une colonne, il convient d’indiquer l’ancien nom de la colonne et le nouveau nom
de celle-ci.
SQL Server
Pour SQL server, il existe une procédure Stockée qui permet de renommer le nom d'une
colonne.
En d’autres mots, cela permet de purger la table. Cette instruction diffère de la commande DROP
qui a pour but de supprimer les données ainsi que la table qui les contient.
A noter : l’instruction TRUNCATE est semblable a l’instruction DELETE sans utilisation de
WHERE.
Parmi les petite différences TRUNCATE est toutefois plus rapide et utilise moins de ressource.
Ces gains en performance se justifie notamment parce que la requête n’indiquera pas le nombre
d’enregistrement supprimes et qu’il n’y aura pas d’enregistrement des modifications dans le
journal.
Syntaxe
Cette instruction s’utilise dans une requête SQL semblable à celle-ci :
TRUNCATE TABLE `table`
Dans cet exemple, les données de la table " table " seront perdues une fois cette requête exécutée.
2.2.3 Contraintes
Les contraintes ont pour but de programmer des règles de gestion au niveau des colonnes des
tables. Elles peuvent alléger un développement côté client (si on déclare qu’une note doit être
comprise entre 0 et 20, les programmes de saisie n’ont plus à tester les valeurs en entrée mais
seulement le code retour après connexion à la base ; on déporte les contraintes côté serveur).
Quatre types de contraintes sont possibles :
CONSTRAINT nomContrainte
• UNIQUE (colonne1 [,colonne2]…)
• PRIMARY KEY (colonne1 [,colonne2]…)
• FOREIGN KEY (colonne1 [,colonne2]…)
REFERENCES [schéma.]nomTablePere (colonne1 [,colonne2]…)
[ON DELETE { CASCADE | SET NULL }]
• CHECK (condition)
NB: Les contraintes peuvent être déclarées de deux manières :
● En même temps que la colonne (valable pour les contraintes monocolonnes), ces
contraintes sont dites « en ligne » (inline constraints).
● Une fois la colonne déclarée, ces contraintes ne sont pas limitées à une colonne et peuvent
être personnalisées par un nom (out-of-line constraints).
● La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs
nulles font exception à moins que NOT NULL soit aussi appliquée sur les colonnes).
Exemples
CREATE TABLE personne
(
id int not null identity primary key, nom varchar(20) not
null , prenom varchar(20) null, date_naissance
smalldatetime null, lieu_naissance varchar(255),
nombre_enfant int not null default 0,Constraint UniqueNomPrenocombine unique (nom, prenom)
)
● La contrainte PRIMARY KEY déclare la clé primaire de la table. Un index est généré
automatiquement sur la ou les colonnes concernées. Les colonnes clés primaires ne peuvent être
ni nulles ni identiques (en totalité si elles sont composées de plusieurs colonnes).
Exemple 1;
CREATE TABLE personne
(
id int not null primary key, nom varchar(20) not null ,
prenom varchar(20) null, date_naissance datetime null,
lieu_naissance varchar(255), nombre_enfant int not null
default 0
)
Exemple 2
CREATE TABLE telephone
(
id int not null, id_personne int not null, numero varchar(20) not null,constraint
Pk_Personne primary key (id, id_personne)
)
● La contrainte FOREIGN KEY déclare une clé étrangère entre une table enfant (child) et une
table père (parent). Ces contraintes définissent l’intégrité référentielle que nous aborderons plus
tard. La directive ON DELETE dispose de deux options : CASCADE propagera la suppression
de tous les enregistrements fils rattachés à l’enregistrement père supprimé, SET NULL
positionnera seulement leur clé étrangère à NULL .
CREATE TABLE telephone
(
id int not null, id_personne int not null,
numero varchar(20) not null,
primary key (id),Constraint Fktelephone personne foreign key (id_personne)
references personne (id) )
La commande foreign key (id_personne) references personne (id) indique que id_personne de la
table telephone référence la clé primaire id de la table personne.Le SGBD vérifiera alors, pour
toute modification pouvant affecter le lien entre les deux tables, que la valeur de id_personne
correspond bien à une ligne de personne.
● La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe
entre colonnes (exemple : CHECK (note BETWEEN 0 AND 20), CHECK (grade='Copilote' OR
grade='Commandant')).
2.2.4 Vues
Une vue est une vision partielle ou particulière des données d'une ou plusieurs tables de la base.
La définition d'une vue est donnée par un SELECT qui indique les données de la base qui seront
vues. Les utilisateurs pourront consulter la base, ou modifier la base (avec certaines restrictions)
à travers la vue, c'est-à-dire manipuler les données renvoyées par la vue comme si c'était des
données d'une table réelle.
Seule la définition de la vue est enregistrée dans la base, et pas les données de la
vue. On peut parler de table virtuelle.
a) CREATE VIEW
La commande CREATE VIEW permet de créer une vue en spécifiant le SELECT
constituant la définition de la vue :
CREATE VIEW nom_vue (col1, col2...) AS SELECT ...
ou
CREATE VIEW nom_vue AS SELECT ...
CREATE VIEW nom
AS requête
nom
Nom d’objet, doit être unique dans la base.
requête Instruction SELECT ne comportant pas de clause ORDER BY, UNION,
COMPUTE ou INTO.
b) DROP VIEW
DROP VIEW vue_Name
Supprime la vue.
c) Utilisation des vues
Une vue peut être référencée dans un SELECT de la même façon qu'une table. Ainsi, il est possible de
consulter la vue EMP10. Tout se passe comme s'il existait une table EMP10 des employés du
département 10 :
SELECT * FROM EMP10
d) Utilité des vues
De façon générale, les vues permettent de dissocier la façon dont les utilisateurs voient les données,
du découpage en tables. On sépare l'aspect externe (ce que voit un utilisateur particulier de la base)
de l'aspect conceptuel (comment a été conçu l'ensemble de la base). Ceci favorise l'indépendance
entre les programmes et les données. Si la structure des données est modifiée, les programmes ne
seront pas à modifier si l'on a pris la précaution d'utiliser des vues (ou si on peut se ramener à travailler
sur des vues).
NB : il est possible de ne pas renseigner toutes les colonnes. De plus, l’ordre des colonnes n’est
pas important.
Insertion de plusieurs lignes à la fois
Il est possible d’ajouter plusieurs lignes a un tableau avec une seule requête. Pour ce faire, il
convient d’utiliser la syntaxe suivante :
INSERT INTO NomTable(colonne1,colonne2,...)
SELECT colonne1,colonne2,... FROM NomTable2
WHERE CONDITION
OU
INSERT INTO client (prenom, nom, ville, age)
VALUES
('Rebecca', 'Armand', 'Saint-Didier-des-Bois', 24),
('Aimee', 'Hebert', 'Marigny-le-Chatel', 36), ('Marielle', 'Ribeiro', 'Mailleres', 27),
('Hilaire', 'Savary', 'Conie-Molitard', 58)
A noter : lorsque le champ a remplir est de type VARCHAR ou TEXT il faut indiquer le texte
entre guillemet simple. En revanche, lorsque la colonne est un numérique tel que INT ou BIGINT
il n’y a pas besoin d’utiliser de guillemet, il suffit juste d’indiquer le nombre.
3.2 SQL UPDATE
La commande UPDATE permet d’effectuer des modifications sur des lignes existantes. Très
souvent cette commande est utilisée avec WHERE pour spécifier sur quelles lignes doivent porter
la ou les modifications.
Syntaxe
La syntaxe basique d’une requête utilisant UPDATE est la suivante :
UPDATE table SET nom_colonne_1 = 'nouvelle valeur' WHERE condition
Cette syntaxe permet d’attribuer une nouvelle valeur a la colonne nom_colonne_1 pour les lignes
qui respectent la condition stipule avec WHERE. Il est aussi possible d’attribuer la même valeur
a la colonne nom_colonne_1 pour toutes les lignes d’une table si la condition WHERE n’était pas
utilisée. A noter, pour spécifier en une seule fois plusieurs modification, il faut séparer les
attributions de valeur par des virgules. Ainsi la syntaxe deviendrait la suivante :
UPDATE table SET colonne_1 = 'valeur 1', colonne_2 = 'valeur 2', colonne_3 = 'valeur 3' WHERE
condition
Cette syntaxe permet d’attribuer une nouvelle valeur a la colonne nom_colonne_1 pour les lignes
qui respectent la condition stipule avec WHERE.
Il est aussi possible d’attribuer la même valeur a la colonne nom_colonne_1 pour toutes les lignes
d’une table si la condition WHERE n’était pas utilisée. A noter, pour spécifier en une seule fois
plusieurs modification, il faut séparer les attributions de valeur par des virgules. Ainsi la syntaxe
deviendrait la suivante :
UPDATE table SET colonne_1 = 'valeur 1', colonne_2 = 'valeur 2', colonne_3 = 'valeur 3' WHERE
condition
3.3 DELETE
La commande DELETE en SQL permet de supprimer des lignes dans une table. En utilisant cette
commande associe à WHERE il est possible de sélectionner les lignes concernées qui seront
supprimées.
Attention : Avant d’essayer de supprimer des lignes, il est recommandé d’effectuer une
sauvegarde de la base de données, ou tout du moins de la table concernée par la suppression.
Ainsi, s’il y a une mauvaise manipulation il est toujours possible de restaurer les données.
Syntaxe
La syntaxe pour supprimer des lignes est la suivante :
DELETE FROM table WHERE condition
Attention : s’il n’y a pas de condition WHERE alors toutes les lignes seront supprimées et la
table sera alors vide.
Exemple
Si l’on souhaite supprimer les utilisateurs qui se sont inscrit avant le " 10/04/2012″, il va falloir
effectuer la requête suivante :
DELETE FROM utilisateur WHERE date_inscription < '2012-04-10'
Si l’on veut avoir la liste de toutes les villes des clients, il suffit d’effectuer la requête suivante :
SELECT ville FROM client
Avec la même table client il est possible de lire plusieurs colonnes à la fois. Il suffit tout
simplement de séparer les noms des champs souhaites par une virgule. Pour obtenir les prénoms
et les noms des clients il faut alors faire la requête suivante :
SELECT prenom, nom FROM client
Il est possible de retourner automatiquement toutes les colonnes d’un tableau sans avoir à
connaitre le nom de toutes les colonnes. Au lieu de lister toutes les colonnes, il faut simplement
utiliser le caractère " * " (étoile). C’est un joker qui permet de sélectionner toutes les colonnes. Il
s’utilise de la manière suivante :
SELECT * FROM client
Pour obtenir seulement la liste des clients qui habitent a Paris, il faut effectuer la requête suivante
:
SELECT * FROM client WHERE ville = 'paris'
• Opérateurs de comparaisons
Il existe plusieurs opérateurs de comparaisons. La liste ci-jointe présente quelques-uns des
opérateurs les plus couramment utilises.
4.1.6 BETWEEN
L’opérateur BETWEEN est utilisé dans une requête SQL pour sélectionner un intervalle de
données dans une requête utilisant WHERE. L’intervalle peut être constitue de chaines de
caractères, de nombres ou de dates. L’exemple le plus concret consiste par exemple a récupérer
uniquement les enregistrements entre 2 dates définies.
Syntaxe
L’utilisation de la commande BETWEEN s’effectue de la manière suivante :
SELECT * FROM table WHERE nom_colonne BETWEEN 'valeur1' AND 'valeur2'
La requête suivante retournera toutes les lignes dont la valeur de la colonne " nom_colonne " sera
comprise entre valeur1 et valeur2.
Exemple1:
Si l’on souhaite obtenir les membres qui se sont inscrit entre le 1 avril 2020 et le 20 avril 2020 il
est possible d’effectuer la requête suivante :
SELECT * FROM utilisateur WHERE date_inscription BETWEEN ’2020-04-01′ AND ’2020-04-
20′
Exemple2:
Si l’on souhaite obtenir tous les résultats dont l’identifiant n’est pas situé entre 4 et 10, il faudra
alors utiliser la requête suivante :
SELECT * FROM utilisateur WHERE id NOT BETWEEN 4 AND 10
4.1.7 LIKE
L’opérateur LIKE est utilisé dans la clause WHERE des requêtes SQL. Ce mot-clé permet
d’effectuer une recherche sur un modèle particulier. Il est par exemple possible de rechercher
les enregistrements dont la valeur d’une colonne commence par telle ou telle lettre. Les modèles
de recherches sont multiple.
Syntaxe
La syntaxe a utiliser pour utiliser l’opérateur LIKE est la suivante :
SELECT * FROM table WHERE colonne LIKE modele
Exemples:
• LIKE ‘%a’ : le caractère " % " est un caractère joker qui remplace tous les autres
caractères.
Ainsi, ce modèle permet de rechercher toutes les chaines de caractère qui se termine par un " a ".
• LIKE ‘a%’ : ce modèle permet de rechercher toutes les lignes de " colonne " qui
commence par un " a ".
• LIKE ‘%a%’ : ce modèle est utilisé pour rechercher tous les enregistrements qui utilisent
le caractère " a ".
• LIKE ‘pa%on’ : ce modèle permet de rechercher les chaines qui commence par " pa " et
qui se terminent par " on ", comme " pantalon " ou " pardon ".
4.1.8 SQL IS NULL / IS NOT NULL
Dans le langage SQL, l’opérateur IS permet de filtrer les colonnes qui contiennent la valeur
NULL. Cet opérateur est indispensable car la valeur NULL est une valeur inconnue et ne peut
par conséquent pas être filtrée par les opérateurs de comparaison (cf. égal, inferieur, supérieur ou
différent).
Syntaxe
Pour filtrer les résultats ou les champs d’une colonne sont a NULL il convient d’utiliser la syntaxe
suivante :
SELECT * FROM `table` WHERE nom_colonne IS NULL
A l’inverse, pour filtrer les résultats et obtenir uniquement les enregistrements qui ne sont pas
null, il convient d’utiliser la syntaxe suivante :
SELECT * FROM `table` WHERE nom_colonne IS NOT NULL
NB :
L’opérateur IS retourne en réalité un booléen, c’est à dire une valeur TRUE si la condition est
vrai ou FALSE si la condition n’est pas respectée. Cet opérateur est souvent utilisé avec la
condition WHERE mais peut aussi trouve son utilité lorsqu’une sous-requête est utilisée.
4.1.9. Utilisation d’autres fonctions de statistiques
Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs enregistrements,
il s’agit des fonctions d’agrégations statistiques, les principales sont les suivantes :
• AVG () pour calculer la moyenne d’un set de valeur. Permet de connaitre le prix du panier
moyen pour de chaque client
• COUNT () pour compter le nombre de lignes concernées. Permet de savoir combien
d’achats a été effectué par chaque client
• MAX () pour récupérer la plus haute valeur. Pratique pour savoir l’achat le plus cher •
MIN () pour récupérer la plus petite valeur. Utile par exemple pour connaitre la date du premier
achat d’un client
• SUM () pour calculer la somme de plusieurs lignes. Permet par exemple de connaitre le
total de tous les achats d’un client Ces petites fonctions se révèlent rapidement indispensable pour
travailler sur des données.
4.1.10 GROUP BY
La commande GROUP BY est utilisée en SQL pour grouper plusieurs résultats et utiliser une
fonction de totaux sur un groupe de résultat. Sur une table qui contient toutes les ventes d’un
magasin, il est par exemple possible de liste regrouper les ventes par clients identiques et d’obtenir
le cout total des achats pour chaque client.
Syntaxe d’utilisation de GROUP BY
De façon générale, la commande GROUP BY s’utilise de la façon suivante :
SELECT colonne1, fonction(colonne2) FROM table GROUP BY colonne1
Exemple :
Pour obtenir le cout total de chaque client en regroupant les commandes des mêmes clients, il faut
utiliser la requête suivante :
SELECT client, SUM(tarif) FROM achat GROUP BY client
4.1.11 SQL HAVING
La condition HAVING en SQL est presque similaire a WHERE a la seule différence que
HAVING permet de filtrer en utilisant des fonctions telles que SUM (), COUNT(), AVG(), MIN()
ou MAX().
Syntaxe
L’utilisation de HAVING s’utilise de la manière suivante :
SELECT colonne1, SUM(colonne2) FROM nom_table GROUP BY colonne1 HAVING
fonction(colonne2) operateur valeur
Exemple
Pour utiliser un exemple concret, imaginons une table " achat " qui contient les achats de différents
clients avec le cout du panier pour chaque achat.
Si dans cette table on souhaite récupérer la liste des clients qui ont commandé plus de 40€, toute
commandes confondu alors il est possible d’utiliser la requête suivante :
SELECT client, SUM(tarif) FROM achat GROUP BY client HAVING SUM(tarif) > 40
Résultat :
En utilisant deux méthodes de tri, il est possible de retourner les utilisateurs par ordre alphabétique
ET pour ceux qui ont le même nom de famille, les trier par ordre décroissant d’inscription. La
requête serait alors la suivante :
SELECT * FROM utilisateur ORDER BY nom, date_inscription DESC
Cette requête permet de récupérer seulement les 10 premiers résultats d’une table. Bien entendu,
si la table contient moins de 10 résultats, alors la requête retournera toutes les lignes. Bon à savoir
: la bonne pratique lorsque l’on utilise LIMIT consiste à utiliser également la clause ORDER BY
pour s’assurer que quoi qu’il en soit-ce sont toujours les bonnes données qui sont présentées. En
effet, si le système de tri est non spécifié, alors il est en principe inconnu et les résultats peuvent
être imprévisible
4.1.13 SQL UNION
La commande UNION de SQL permet de mettre bout-a-bout les résultats de plusieurs requêtes
utilisant elles-mêmes la commande SELECT. C’est donc une commande qui permet de
concaténer les résultats de 2 requêtes ou plus. Pour l’utiliser il est nécessaire que chacune des
requêtes à concaténer retournes le même nombre de colonnes, avec les mêmes types de
données et dans le même ordre.
A savoir : par défaut, les enregistrements exactement identiques ne seront pas répétés dans les
résultats. Pour effectuer une union dans laquelle même les lignes dupliquées sont affichées il faut
plutôt utiliser la commande UNION ALL.
Syntaxe La syntaxe pour unir les résultats de 2 tableaux sans afficher les doublons est la suivante
:
SELECT * FROM table1
UNION
SELECT * FROM table2
Syntaxe La syntaxe pour unir les résultats de 2 tableaux en affichant les doublons est la suivante
:
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
Table commande :
Pour afficher toutes les commandes associées aux utilisateurs, il est possible d’utiliser la requête
suivante :
SELECT id, prenom, nom, date_achat, num_facture, prix_total
FROM utilisateur
INNER JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :
b)
CROSS JOIN
Dans le langage SQL, la commande CROSS JOIN est un type de jointure sur 2 tables SQL qui
permet de retourner le produit cartésien. Autrement dit, cela permet de retourner chaque ligne
d’une table avec chaque ligne d’une autre table. Ainsi effectuer le produit cartésien d’une table
A qui contient 30 résultats avec une table B de 40 résultats va produire 1200 résultats (30 x 40 =
1200). En général la commande CROSS JOIN est combinée avec la commande WHERE pour
filtrer les résultats qui respectent certaines conditions.
Attention, le nombre de résultat peut facilement être très élevé. S’il est effectué sur des tables
avec beaucoup d’enregistrements, cela peut ralentir sensiblement le serveur.
Syntaxe
Pour effectuer une jointure avec CROSS JOIN, il convient d’effectuer une requête SQL respectant
la syntaxe suivante :
SELECT *
FROM table1
CROSS JOIN table2
Méthode alternative pour retourner les mêmes résultats :
SELECT *
FROM table1, table2
L’une ou l’autre de ces syntaxes permettent d’associer tous les résultats de table1 avec chacun
des résultats de table2.
Exemple
Imaginons une application de recettes de cuisines qui contient 2 tables d’ingrédients, la table
légume et la table fruit.
Pour une raison quelconque l’application doit associer tous les légumes avec tous les fruits.
Toutes les combinaisons doivent être affichées. Pour cela il convient d’effectuer l’une ou l’autre
des requêtes suivantes :
SELECT l_id, l_nom_fr_fr, f_id, f_nom_fr_fr FROM legume CROSS JOIN fruit
ou :
SELECT l_id, l_nom_fr_fr, f_id, f_nom_fr_fr FROM legume, fruit
SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.fk_id
La requête peux aussi s’écrire de la façon suivante :
SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id = table2.fk_id
Cette requête est particulièrement intéressante pour récupérer les informations de table1 tout en
récupérant les données associées, même s’il n’y a pas de correspondance avec table2. A savoir,
s’il n’y a pas de correspondance les colonnes de table2 vaudront toutes NULL.
Exemple
Imaginons une application contenant des utilisateurs et des commandes pour chacun de ces
utilisateurs. La base de données de cette application contient une table pour les utilisateurs et
sauvegarde leurs achats dans une seconde table. Les 2 tables sont reliées grâce à la colonne
utilisateur_id de la table des commandes. Cela permet d’associer une commande a un utilisateur.
Table utilisateur :
Table commande :
Pour lister tous les utilisateurs avec leurs commandes et afficher également les utilisateurs qui
n’ont pas effectuées d’achats, il est possible d’utiliser la requête suivante :
SELECT * FROM utilisateur LEFT JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats
Table commande :
Pour afficher toutes les commandes avec le nom de l’utilisateur correspondant il est normalement
d’habitude d’utiliser INNER JOIN en SQL. Malheureusement, si l’utilisateur a été supprimé de
la table, alors ça ne retourne pas l’achat. L’utilisation de RIGHT JOIN permet de retourner tous
les achats et d’afficher le nom de l’utilisateur s’il existe. Pour cela il convient d’utiliser cette
requête :
SELECT id, prenom, nom, utilisateur_id, date_achat, num_facture FROM utilisateur
RIGHT JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :
Il est possible d’utiliser FULL JOIN pour lister tous les utilisateurs ayant effectué ou non une
vente, et de lister toutes les ventes qui sont associées ou non à un utilisateur. La requête SQL est
la suivante :
SELECT id, prenom, nom, utilisateur_id, date_achat, num_facture
FROM utilisateur
FULL JOIN commande ON utilisateur.id = commande.utilisateur_id
SELECT *
FROM `table`
WHERE `nom_colonne` = (
SELECT `valeur`
FROM `table2`
)
Cet exemple montre une requête interne (celle sur " table2″) qui renvoi une seule valeur. La
requête externe quant à elle, va chercher le résultat de " table " et filtre les résultats à partir de la
valeur retournée par la requête interne.
4.1.14.2 Requêtes imbriquées renvoyant plusieurs lignes
ANY : la condition est vraie si elle est vérifiée Pour au moins une des valeurs renvoyées par la
sous-requête
ALL : la condition est vraie si elle est vérifiée
Pour chacune des valeurs renvoyées par la
Sous-requête
IN : la condition est vraie si elle est vérifiée Pour une
des valeurs renvoyées par la sous-requête La
condition de sélection emploie alors :
• L’opérateur IN (équivalent à = ANY)
• L’opérateur NOT IN (équivalent à != ALL)
• Un opérateur simple ( =, !=, <>, <, >, <=,
>=) suivi de ALL ou ANY
• L’opérateur EXISTS
Exemple de requête imbriquée renvoyant plusieurs lignes
Ex1 : Donner les numéros des voyages Passant pour une ville où passe aussi le Voyage numéro
4
Exemple
Numéros des voyages qui font au moins 6 étapes
SELECT numVoyage FROM Voyage V
WHERE EXISTS (SELECT * FROM Etape E
WHERE numOrdre = 6
AND E.numVoyage = V.numVoyage)
4.2 SQL COMME LANGAGE DE CONTROLE DES DONNES
4.2.0 APPROCHE
Les types d’utilisateurs, leurs fonctions et leur nombre peuvent varier d’une base à une autre.
Néanmoins, pour chaque base de données en activité, on peut classifier les utilisateurs de la
manière suivante :
● Le DBA (DataBase Administrator). Il en existe au moins un. Une petite base peut n’avoir qu’un
seul administrateur. Une base importante peut en regrouper plusieurs qui se partagent les tâches
suivantes :
– Installation et mises à jour de la base et des outils éventuels ;
– Gestion de l’espace disque et des espaces pour les données (tablespaces) ;
– Gestion des utilisateurs et de leurs objets ;
– Optimisation des performances ; – sauvegardes, restaurations et archivages ; – contact avec le
support technique.
● L’administrateur réseaux (qui peut être le DBA) se charge de la configuration de
l’intergiciel(middleware) au niveau des postes clients.
● Les développeurs qui conçoivent et mettent à jour la base. Ils peuvent aussi agir sur leurs
objets (création et modification des tables, index, séquences, etc.). Ils transmettent au DBA leurs
demandes spécifiques (stockage, optimisation, sécurité).
● Les administrateurs d’applications qui gèrent les données manipulées par l’application
ou les applications. Pour les petites et les moyennes bases, le DBA joue ce rôle.
● Les utilisateurs qui se connectent et interagissent avec la base à travers les applications
ou à l’aide d’outils (interrogations pour la génération de rapports, ajouts, modifications ou
suppressions d’enregistrements).
Il arrive que plusieurs personnes travaillent simultanément sur une base de données.
Cependant, en fonction de leurs besoins, elles n'auront pas toutes la même utilisation de la
base au même moment et les mêmes privilèges sur les objets de la base des données
(tables,vues ,etc) .
Certaines peuvent par exemple avoir besoin de modifier ou supprimer des données dans la
table, pendant que d'autres ont seulement un besoin de consultation de données, etc.
Ainsi, il est possible de définir des permissions pour chaque personne sur les objets bien identifiés
de la base des données. Cette tâche incombe à l'administrateur de la base de données (en anglais
DBA, DataBase Administrator). Il doit dans un premier temps définir les besoins de chacun, puis
les appliquer à la base de données sous forme de permissions.
Le langage SQL permet d'effectuer ces opérations grâce à deux clauses :
GRANT permet d'accorder des droits à un utilisateur (parfois plusieurs sur certains SGBD) .
REVOKE permet de retirer des droits à un utilisateur
(ou plusieurs sur certains SGBD). Les permissions (appelées aussi droits ou privilèges) peuvent
être définies pour chaque clause. D'autre part, il est aussi possible de définir des rôles, c'est-à-dire
de permettre à d'autres utilisateurs d'accorder des permissions.
Les privilèges sont les clauses qui peuvent être autorisées ou retirées à un utilisateur. Les
principales sont :
- DELETE : pour supprimer les données d'une table ;
- INSERT : pour ajouter des données à une table ; - SELECT : pour
accéder aux données d'une table ; - UPDATE : pour mettre à jour les
données d'une table.
Seule la personne qui a créé un élément (table, vue ou index) a le pouvoir d'accorder ou
de retirer des droits.
4.2.1 Connexions
L’objectif de ce point est d’apprendre à gérer ces utilisateurs, leurs droits et de protéger les développeurs.
4.2.1.1 Création
IL existe deux façons d’ajouter un nouveau compte de connexion :
– Syntaxe 1
sp_addlogin
’Paul’, -- le login
’luaP’, -- le mot de passe
’Northwind’ -- la base par defaut
– Syntaxe 2 : hériter d’une connexion Windows
sp_grantlogin ’STID/Henri’ -- STID étant le nom du domaine
sp_defaultdb ’STID/Henri’, ’Northwind’
Il reste ensuite à lui donner accès au serveur :
sp_grantdbaccess ’Paul’
NB:
On dispose ´évidemment des procédures :
sp_revokedbaccess ’Paul’
sp_droplogin "Paul"
4.2.1.2 Création Rôles de serveur
Ce sont des rôles prédéfinis qui donnent aux connexions un certain nombre de fonctionnalités. Il
n’est pas possible de définir des rôles de serveur, par contre leur utilisation facilite la gestion en
cas de nombreux utilisateurs. Les rôles de serveur sont au nombre de huit :
• Sysadmin
Exécute n’importe quelle opération sur le serveur, c’est l’administrateur du serveur.
• Serveradmin
Permet de configurer les paramètres au niveau du serveur.
• Setupadmin
Permet d’ajouter/supprimer des serveurs liés et d’exécuter certaines procédures stockées
système telles que sp_serveroptions.
• Securityadmin
Permet de gérer les connexions d’accès au serveur.
• Processadmin
Permet de gérer les traitements s’exécutant sur SQL Server.
• dbcreator
Permet de créer et modifier les bases de données.
• diskadmin
Permet de gérer les fichiers sur le disque.
• bulkadmin
Peut exécuter l’instruction BULK INSERT pour une insertion des données par blocs. L’intérêt de
ce type d’insertion réside dans le fait que l’opération n’est pas journalisée et donc les temps
d’insertion sont beaucoup plus rapides.
4.2.2 Création, Modification et Suppression des Utilisateurs
a) Création Utilisateur
C’est par l’intermédiaire de l’instruction CREATE USER qu’il est possible de définir des
comptes utilisateurs au niveau de la base de données.
Syntaxe
CREATE USER nomUtilisateur
Attention : Il y a d'autres options à ajouter à cette requête SQL selon qu'on utilise un ou un autre
SGBD.
• Pour SQL SERVER Syntaxe1
CREATE USER nom_User
FOR LOGIN nom_login
WITH DEFAULT_SCHEMA=schemaParDefaut
b) Modification d'un Utilisateur
• SQL server
Syntaxe pour changer le nom d'un utilisateur en SQL Server :
ALTER USER nomUtilisateur
WITH NAME=nouveauNomUtilisateur,
DEFAULT_SCHEMA = nomNouveauSchema
c) Suppressions
La syntaxe SQL est la suivante pour supprimer un utilisateur est :
DROP USER utilisateur
NB : Lors de l’installation, vous avez dû noter la présence de l’utilisateur SA (mot de passe saisi
à l’installation). Cet utilisateur est le DBA que SQL SERVER vous offre. Il vous permettra
d’effectuer vos tâches administratives en ligne de commande ou par une console graphique (créer
des utilisateurs par exemple).
d) Rôles de base de données
Les rôles de bases de données permettent toujours de regrouper les différentes autorisations ou
refus d’instructions ou d’objets et ainsi de faciliter la gestion des droits. Il existe des rôles
prédéfinis et il est possible de définir ses propres rôles. Les modifications sur les rôles sont
dynamiques et les utilisateurs n’ont pas besoin de se déconnecter/reconnecter de la base pour
bénéficier des changements.
db_owner
Ensemble de droits équivalents au propriétaire de la base. Ce rôle contient toutes les activités
possibles dans les autres rôles de la base de données, ainsi que la possibilité d’exécuter certaines
tâches de maintenance et de configuration de la base. Tous les membres de ce groupe vont créer
des objets dont le propriétaire est dbo. Il s’agit du propriétaire par défaut de tous les objets et il
n’est pas nécessaire de le préciser pour manipuler ses objets.
db_accessadmin
Permet d’ajouter ou de supprimer des utilisateurs dans la base de données. Ces utilisateurs
correspondent à des connexions SQL Server ou bien à des groupes ou utilisateurs Windows.
db_datareader
Permet de consulter (SELECT) le contenu de toutes les tables de la base de données.
db_datawriter
Permet d’ajouter (INSERT), modifier (UPDATE) ou supprimer (DELETE) des données dans
toutes les tables utilisateur de la base de données.
db_ddladmin
Permet d’ajouter (CREATE), modifier (ALTER) ou supprimer (DELETE) des objets de la base
de données.
db_securityadmin
Permet de gérer les rôles, les membres des rôles, et les autorisations sur les instructions et les
objets de la base de données.
db_backupoperator
Permet d’effectuer une sauvegarde de la base de données.
db_denydatareader
Interdit la visualisation des données de la base.
db_denydatawriter
Interdit la modification des données contenues dans la base.
Pour attribuer rôle de base de données à un user on exécute la requête SQL suivante :
exec sp_addrolemember 'db_accessadmin','REALM'
4.2.3 GRANT
4.2.3.1. Droits d’utilisation d’instructions
Les droits d’utilisation des instructions SQL pour créer de nouveaux objets au sein de la base sont
des autorisations pour réaliser l’exécution de certains ordres SQL. Un utilisateur qui dispose de
tels droits est capable par exemple de créer ses propres tables, ses procédures... L’accord de ces
droits peut être dangereux et comme pour tous les droits, doivent être accordés uniquement
lorsque cela est nécessaire.
Les droits principaux d’instructions disponibles sont :
• CREATE DATABASE
• CREATE PROCEDURE
• CREATE FUNCTION
• CREATE TABLE
• BACKUP DATABASE
• CREATE VIEW
• BACKUP LOG
L’accord de privilèges s’effectue en utilisant l’instruction GRANT dont la syntaxe est détaillée
ci-dessous.
GRANT permission [,...]
TO utilisateur[,...]
[ WITH GRANT OPTION ] permission
Permission
Nom de la ou des permissions concernées par cette autorisation. Il est également possible
d’utiliser le mot clé ALL à la place de citer explicitement la ou les permissions accordées.
Toutefois ce terme ALL ne permet pas d’accorder des privilèges d’exécution de toutes les
instructions mais simplement sur les instructions pour créer des bases de données, des tables, des
procédures, des fonctions, des tables vues ainsi que d’effectuer des sauvegardes de la base et du
journal.
Utilisateur
Nom de l’utilisateur ou des utilisateurs de base de données qui reçoivent les permissions.
WITH GRANT OPTION
Si la permission est reçue avec ce privilège, alors l’utilisateur peut accorder la permission à
d’autres utilisateurs de base de données.
Exemple1
GRANT CREATE TABLE, CREATE TRIGGER TO Paul, Henri
Remarque : Paul et Henri doivent déjà posséder un compte utilisateur sur SQL Server.
4.2.3.2. Droits d’utilisation des objets
Ces droits permettent de fixer quelles opérations (lecture, modification, ajout ou suppression)
l’utilisateur peut réaliser sur des données contenues dans une table, ou bien donner le droit
d’exécution d’une procédure stockée. Ces droits sont en général gérés par le propriétaire de
l’objet. En ce qui concerne le droit de lecture des données contenues dans une table (Utilisation
de l’instruction SELECT), il est possible de préciser quelles colonnes l’utilisateur peut visualiser.
Par défaut, il s’agit de toutes les colonnes. Les principaux droits d’utilisation des objets
concernant les tables, vues, procédures stockées correspondent aux ordres :
• INSERT
• UPDATE
• DELETE
• SELECT
• EXECUTE : qui ne s’utilise que pour les procédures stockées.
Les droits sont accordés par la commande GRANT dont voici la syntaxe :
TO utilisateur [,...]
NB : Les instructions SELECT et UPDATE peuvent être limitées à certaines colonnes de la table ou
de la vue. Il est cependant préférable de ne pas trop explorer cette possibilité car il en résulte un plus
grand travail administratif au niveau de la gestion des droits. Il est préférable de passer par une vue ou
bien une procédure stockée pour limiter l’usage de la table.
Exemple :
GRANT INSERT, SELECT, DELETE, UPDATE(ISBN) ON LivreTO Paul ;
Privilège objet table level :
Paul peut insérer, extraire, supprimer et modifier la colonne ISBN de la table Livre
4.2.4 Revoke
Permet de retirer des droits à un utilisateur (ou plusieurs sur certains SGBD)
4.2.4.1 Revoke sur les Instructions
Exemple1 : pour lever les autorisations et les empêchements de Paul
REVOKE CREATE VIEW, CREATE TABLE TO Paul
Exemple 2 pour empêcher Paul de créer des vues
DENY CREATE VIEW TO Paul
4.2.4.2 Revoke sur les Objets
Syntaxe avec SQL SERVER
REVOKE [GRANT OPTION FOR ]
{ALL [PRIVILEGES]|permission[(colonne,[,...])] [,...]}
ON object [(colonne [,...])]
{FROM | TO} utilisateur [,...]
[CASCADE ]
GRANT OPTION FOR
Exemple
Backup database TestDB to disk='D:\TestDB_diff.bak' with differential
Log Type
Backup log <Your database name> to disk=' <Backup file location + file name>'
Backup log TestDB to disk= 'D:\TestDB_log.trn'
4.3.2 Syntaxe pour faire la restauration de la BD en T-SQL
Restore database <Your database name> from disk=' <Backup file location + file name>
Restore database BD1 from disk='D:\BD1.bak' with replace
WITH ENCRYPTION
La définition du déclencheur est enregistrée de façon cryptée. Il n’est donc pas possible de
connaître le code du déclencheur a posteriori. Cette option évite également que le déclencheur
soit publié dans le cadre d’une réplication.
FOR
Permet de préciser à quel ordre SQL DML le déclencheur est associé (soit update, delete ou
insert). Par défaut, le déclencheur est de type AFTER.
AFTER
C’est le mode par défaut des déclencheurs. Le code est exécuté après vérification des
contraintes d’intégrité et après modification des données.
INSTEAD OF
Le corps du déclencheur est exécuté à la place de l’ordre SQL envoyé sur la table ou la vue.
Ce type de déclencheur est particulièrement bien adapté pour les vues.
INSERT, UPDATE, DELETE
Un déclencheur peut agir par rapport à une ou plusieurs actions. Dans ce cas, on séparera les
actions par des virgules.
WITH APPEND
Cette clause n’est nécessaire que si le niveau de compatibilité de la base est inférieur ou égal à
65. Elle permet alors d’ajouter plusieurs déclencheurs sur un même ordre SQL et un même objet.
Ce comportement est celui par défaut depuis la version (70).
NOT FOR REPLICATION
Indique que le déclencheur ne doit pas être exécuté lorsque la modification des données est
issue d’un processus de réplication.
IF UPDATE (colonne)
Ne peut être utilisé que pour les déclencheurs UPDATE ou INSERT et ne s’exécutera que si la
ou les colonnes sont concernées.
IF (COLUMNS_UPDATED ( ) opérateur_comparaison_bits)
Cette fonction permet de connaître les indices de la ou des colonnes qui ont été mises à jour.
Pour chaque colonne affectée par la mise à jour, un bit est levé. Pour savoir quelles ont été les
colonnes mises à jour, une simple comparaison binaire suffit.
Exemple:
ALTER TRIGGER [dbo].[trigger2] ON
[dbo].[T1] with encryption
for update
AS BEGIN
declare @x as int
set @x=COLUMNS_UPDATED( )
print 'Nbr ligne'+ cast( @x as varchar)
INSERT T2 SELECT * FROM inserted
END
Troisième exemple, sur mise-à-jour cette fois-ci : pour être tout à fait complet, il faut également un
déclencheur qui réagisse si la colonne cmd_qte est touchée par une mise à jour.
CREATE TRIGGER commandes_update
ON commandes AFTER UPDATE
AS
IF UPDATE(cmd_qte) -- si la colonne cmd_qte est touchée par la modification BEGIN
UPDATE articles SET nb_commande = nb_commande - b.cmd_qte + c.cmd_qte FROM articles AS
a
JOIN deleted AS b ON (a.art_num = b.cmd_art)
JOIN inserted AS c ON (a.art_num = c.cmd_art) END
Dernier exemple : on veut empêcher la modification du numéro ISBN d’un ouvrage.
CREATE TRIGGER ouvrages_update
ON ouvrages AFTER UPDATE
AS
IF UPDATE(isbn)
BEGIN
RAISERROR (’Le numéro ISBN ne peut pas être modifie’, 0, 1)
-- 0 indique la gravite de l’erreur et 1 l’état (a oublier)
ROLLBACK TRANSACTION
-- on annulle la transaction qui a déclenche l’événement END
Numéro
Numéro d’ordre pour des procédures ayant le même nom.
param1,... [ OUTPUT ], pouvant être passé à la procédure. OUTPUT permet de spécifier un paramètre
retourné par la procédure. FOR REPLICATION
Permet de préciser que la procédure sera utilisée lors de la réplication.
WITH RECOMPILE
La procédure sera recompilée à chaque exécution.
WITH ENCRYPTION
Permet de crypter le code dans les tables système.
Autres syntaxes.
CREATE PROC ... le nom de la procédure
(...) les paramètres d’entrée et de sortie séparés par des virgules
AS
DECLARE ... les variables locales
BEGIN
... les instructions, les transactions
END
Remarques :
– On peut utiliser jusqu’`a 1024 paramètres ;
– La syntaxe d’une procédure stockée est limitée `a 128 Mo.
b) Exemples
b.1) Une requête paramétrée
CREATE PROC InfoDuClient
(@numero INT) -- ne pas oublier de préciser le type
AS
SELECT *
FROM clients
WHERE clt_num = @numero
PROC´EDURES STOCK´EES 45
b.2) Autre exemple avec un paramètre de sortie :
CREATE PROC NbClients
(@resultat INT OUTPUT) AS
SET @resultat = (SELECT COUNT(*) FROM clients)
Utilisation de la Procédure avec paramètre en sortie.
AS
SELECT *
FROM clients
WHERE clt_nom LIKE @filtre
-- en l’absence de paramètre tous les clients seront affiches
c Modification d'une procédure stockée
Pour modifier une procédure stockée :
1 ALTER PROC InfoDuClient
2 (...) -- les paramètres
3 AS
4 ... -- nouveau corps
d Suppression d'une procédure stockée
Pour supprimer une procédure stockée :
1 DROP PROCEDURE InfoDuClient
e Utilisation
On peut ensuite utiliser ces procédures stockées dans du code SQL avec l’instruction EXEC.
Exemple : pour avoir les informations relatives au client 12
EXEC InfoDuClient 12
-- 12 est la valeur du paramètre
Remarques :
– On peut aussi utiliser des variables comme valeurs de paramètre (et pas seulement des
constantes comme dans l’exemple) ;
– Si la procédure a besoin d’une liste de paramètres, il faut les séparer par des virgules ;
– S’il y a un paramètre de sortie, il faut en stocker la valeur de retour dans une variable.
Explications :
CREATE FUNCTION ... (son nom)
(...) (ses paramètres)
RETURNS ... (le type de la valeur de retour)
AS
BEGIN
...
RETURN ... (la valeur de retour)
END
CREATE FUNCTION EcartEnHeure
(
@date1 DATETIME,
@date2 DATETIME
)
RETURNS INT
AS
BEGIN
RETURN ABS(DATEDIFF(hour, @date1, @date2))
END
b) Utilisation de la fonction
declare @i int
set @i=dbo.EcartEnHeure('01 jan 2016 13:15:25','01 jan 2016 12:19:25') print
@i
Remarques :
– On peut mettre jusqu’`a 1024 paramètres ;
Bibliothèques disponibles :
Canaux nommés
Les canaux nommés sont désactivés pour toutes les éditions de SQL Server. Leur utilisation se
limite au dialogue entre les outils graphiques et le service SQL Server sur le poste serveur.
EXERCICES D'APPLICATION
1. On considère la base de données
BD AIRBASE suivante :
PILOT (NumP, NameP, Address, Salary)
AIRPLANE (NumAP, NameAP, Capacity, Localisation)
FLIGHT(NumF,#NumP,#NumAP, Dep_T, Arr_T, Dep_H,Arr_H)
Convention :
Les clés primaires sont soulignées et les clés étrangères sont précédés du caractères "#"
Q0. Créer les 3 tables en respectant les différentes contraintes
Q1 : Donnez la liste des avions dont la capacité est supérieure à 350 passagers.
Q2 : Quels sont les numéros et noms des avions localisés à Nice ?
Q3 : Quels sont les numéros des pilotes en service et les villes de départ de leurs vols ?
Q4 : Donnez toutes les informations sur les pilotes de la compagnie.
Q5 : Quel est le nom des pilotes domiciliés à Paris dont le salaire est supérieur à 15000 ? Q6 :
Quels sont les avions (numéro et nom) localisés à Nice ou dont la capacité est inférieure à 350
passagers ?
Q7 : Liste des vols au départ de Nice allant à Paris après 18 heures ?
Q8 : Quels sont les numéros des pilotes qui ne sont pas en service ?
Q9 : Quels sont les vols (numéro, ville de départ) effectués par les pilotes de numéro 100 et 204
?
EXERCICE 2
Soit le modèle Logique des données suivant.
• Clients(NumCli, Nom, Prénom, Adresse, Cp, Ville, Téléphone)
• Achats(numAchat,#NumCli, #NumArt, Date, Qté)
• Articles (NumArt, Désignation, Catégorie, Prix)
En utilisant le langage SQL
1. Créer les 3 tables Clients, Articles et Achats
Sachant que les champs soulignés dans le modèle Logique des données sont des clés
Primaires et les champs précédés par ”#” sont des clés étrangères.
NB: La désignation des articles ne doit pas accepter des valeurs nulles
2. Créer la requête SQL qui permet de supprimer la table “client”
3.Ajouter la colonne “dateNaiss” dans la table client
4.Modifié la taille du champs “nom” de 50 à 100 de la table client
EXERCICE 4
–Syntaxe des types de données
Quelles sont les spécifications de valeurs syntaxiquement incorrectes ?
a) DATE '18/11/2004'
b) DATE '2002-11-18'
c)TIME '11 :16'
d) DATE '2004-11-18 20:20:30 000'
e)123,55
f)1E-10
g)3.145 E-1
h)'456,78'
EXERCICE 5
Schéma de la base Chantiers
Une société désire informatiser les visites des chantiers de ses employés. Pour définir cette base
de données, une première étude fait apparaître les informations suivantes :
• Chaque employé est modélisé par un numéro, un nom et une qualification.
• Un chantier est caractérisé par un numéro, un nom et une adresse.
• L’entreprise dispose de véhicules pour lesquels est important de stocker pour le numéro
d’immatriculation, le type (un code valant par exemple 0 pour une camionnette, 1 pour une moto
et 2 pour une voiture) ainsi que le kilométrage en fin d’année.
• Le gestionnaire a besoin de connaître les distances parcourues par un véhicule pour chaque
visite d’un chantier.
• Chaque jour, un seul employé sera désigné conducteur des visites d’un véhicule.
• Pour chaque visite, il est important de pouvoir connaître les employés transportés.
Exercice 6 :
Soit le modèle relationnel suivant relatif à la gestion simplifiée des étapes du Tour de France 97,
dont une des étapes de type "contre la montre individuel" se déroula à Saint-Etienne :
EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif)
COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*)
PAYS(CodePays, NomPays) TYPE_ETAPE(CodeType, LibelléType)
ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*)
PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé)
ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes,
NuméroCoureur*)
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *
Questions :
1 - Quelle est la composition de l'équipe Festina (Numéro, nom et pays des coureurs) ?
2 - Quel est le nombre de kilomètres total du Tour de France 97 ?
3 - Quel est le nombre de kilomètres total des étapes de type "Haute Montagne"?
4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?
5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps des
coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été intégrées dans
les temps réalisés à chaque étape ?
7 - Quel est le classement par équipe à l'issue des 13 premières étapes (nom et temps des équipes)
?
EXERCICE 7
Soit le modèle relationnel suivant relatif à la gestion des notes annuelles d'une promotion
d'étudiants :
ETUDIANT(N°Etudiant, Nom, Prénom)
MATIERE(CodeMat, LibelléMat, CoeffMat)
EVALUER(N°Etudiant*, CodeMat*, Date, Note)
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par * Questions
:
Requête 1 - Quel est le nombre total d'étudiants ?
Requête 2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus basse
?
Requête 3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?
Requête 4 - Quelles sont les moyennes par matière ? On utilisera la requête de la question 3
comme table source
Requête 5 - Quelle est la moyenne générale de chaque étudiant ?
On utilisera la requête de la question 3 comme table source
Requête 6 - Quelle est la moyenne générale de la promotion ?
On utilisera la requête de la question 5 comme table source
Requête 7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la
moyenne générale de la promotion ?
On utilisera la requête de la question 5 comme table source
EXERCICE 8
Soit le modèle relationnel suivant relatif à la gestion simplifiée des étapes du Tour de France 97,
dont une des étapes de type "contre la montre individuel" se déroula à Saint-Etienne :
EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif)
COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*)
PAYS(CodePays, NomPays)
TYPE_ETAPE(CodeType, LibelléType)
ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*)
PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé)
ATTRIBUER_BONIFICATION(NuméroEtape*,km, Rang, NbSecondes, NuméroCoureur*)
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *
Questions :
Requête 1 - Quelle est la composition de l'équipe Festina (Numéro, nom et pays des coureurs) ?
Requête 2 - Quel est le nombre de kilomètres total du Tour de France 97 ?
Requête 3 - Quel est le nombre de kilomètres total des étapes de type "Haute Montagne"?
Requête 4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?
Requête 5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
Requête 6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps
des coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été intégrées dans
les temps réalisés à chaque étape ?
Requête 7 - Quel est le classement par équipe à l'issue des 13 premières étapes (nom et temps
des équipes) ?
EXERCICE 9
Soit la base de donnée suivante :
BIBLIOGRAPHIE ............................................................................................................................................... 2
a) Commentaires ........................................................................................................................................ 20
b) Noms d'objets......................................................................................................................................... 20
c) Opérateurs .............................................................................................................................................. 20
d) Variables................................................................................................................................................ 20
CHAP III. LANGAGE SQL COMME LANGAGE DE MANIPULATION DES DONNEES ....................... 28
3.3 DELETE........................................................................................................................................... 30
CHAP. IV. SQL COMME LANGAGE D'INTERROGATION ET CONTROLE DES DONNEES ................ 31
4.1.2. DISTINCT........................................................................................................................................ 32
4.1.4. WHERE............................................................................................................................................ 33
4.1.5 IN ..................................................................................................................................................... 34
4.1.6 BETWEEN........................................................................................................................................ 35
4.1.7 LIKE.................................................................................................................................................. 35
4.2.1 Connexions........................................................................................................................................ 52
4.2.4 Revoke............................................................................................................................................... 57
EXERCICES D'APPLICATION................................................................................................................................. 71