Module SGBD I
Module SGBD I
ACTIVITES D’APPRENTISSAGE
MATERIEL ET EQUIPEMENT
Matériel :
Un système d'exploitation supportant le SGBD utilisé.
Un système de gestion de bases de données relationnel.
La documentation et l’aide en ligne du SGBD choisi.
Notes de cours.
Équipement :
Un poste informatique.
• Opérations ensemblistes :
projection ;
restriction ;
différence ;
intersection ;
union.
• Opérations spécifiques :
produit cartésien ;
division ;
7. Expliquer le rôle des transactions dans les applications client/serveur et dans un contexte
multiutilisateur.
Le modèle Client/Serveur.
Principe des systèmes transactionnels.
E. Gérer les transactions.
Formalisme d'une requête de création de transaction.
Verrouillage des données lors de l’exécution des commandes INSERT UPDATE DELETE.
Fin des transactions : Commit, RollBack.
8. Définir le rôle d’autres objets de la base de données.
Rôle des accélérateurs.
Rôle des vues utilisateurs pour la sécurité et la simplification de l’écriture des requêtes.
Avantage des séquences dans la génération des clés primaires.
F. Utiliser les différents types d’objets sur une base de données.
Création de séquences pour générer des valeurs de clés primaires.
Création de vues, et expliquer leur rôle dans la sécurité et la simplification de manipulation de
données.
Optimisation des accès aux données en créant des indexes.
9. Connaître les fonctionnalités offertes par le SGBD pour la sécurité des données.
Fonctionnalités de sécurité offertes par le SGBD utilisé.
1) PRINCIPES DE FONCTIONNEMENT
serveur
clients
Une variante de ce modèle est le modèle ASP (Application Service Provider). Dans ce
modèle, le client s’adresse à un mandataire (broker) qui le met en relation avec un SGBD
capable de résoudre la requête. La requête est ensuite directement envoyée au SGBD
sélectionné qui résout et retourne le résultat directement au client.
A. Objectifs
a) Indépendance physique :
La façon dont les données sont définies doit être indépendante des structures de stockage
utilisées.
b) Indépendance logique :
Un même ensemble de données peut être vu différemment par des utilisateurs différents.
Toutes ces visions personnelles des données doivent être intégrées dans une vision globale.
Il existe de nombreux systèmes de gestion de bases de données, en voici une liste non
exhaustive :
Sybase : [Link]
Dans Microsoft SQL Server 2008, les composants suivants proposent des fonctionnalités
nouvelles ou améliorées. De plus, d'autres technologies offre des fonctionnalités qui s'intègrent
étroitement à SQL Server 2008.
Le Moteur de base de données est le service central qui permet de stocker, traiter et sécuriser les
données. Grâce au moteur de base de données, il est possible de contrôler les accès et de traiter
rapidement les transactions pour répondre aux besoins des applications consommatrices de données
les plus exigeantes de votre entreprise.
Utilisez le Moteur de base de données pour créer des bases de données relationnelles pour le
traitement de transactions en ligne ou des données de traitement analytique en ligne (OLAP). Ces
opérations comprennent la création de tables pour le stockage des données, ainsi que les objets de
base de données tels que les index, les vues et les procédures stockées pour l'affichage, la gestion et
la sécurisation des données. Vous pouvez utiliser SQL Server Management Studio pour gérer les
objets de base de données et Générateur de profils SQL Server pour capturer des événements
serveur.
Analysis Services Les données multidimensionnelles permettent une analyse rapide, intuitive et
verticale de grandes quantités de données construites sur ce modèle de données unifié, disponible
aux utilisateurs dans plusieurs langages et devises.
Microsoft SQL Server Analysis Services contient les fonctionnalités et les outils dont vous avez
besoin pour créer des solutions d'exploration de données complexes.
Réalisé par :A BENDAOUD 14
Un jeu d'algorithmes d'exploration de données standard.
Le langage DMX (Data Mining Extensions) que vous pouvez utiliser pour gérer des modèles
d'exploration de données et créer des requêtes de prédiction complexes.
Vous pouvez utiliser une combinaison de ces fonctionnalités et de ces outils pour dégager les
tendances et les motifs présents dans vos données, et vous appuyer sur ces informations pour
prendre des décisions réfléchies à propos de problèmes professionnels complexes.
Integration Services
Microsoft Intégration Services est une plateforme qui permet de créer des solutions de
transformation de données et d'intégration de données au niveau de l'entreprise. Intégration
Services vous permet de résoudre des problèmes professionnels complexes en copiant ou en
téléchargeant des fichiers, en envoyant des messages électroniques en réponse à des événements,
en mettant à jour des entrepôts de données, en nettoyant et en explorant des données et en gérant
des données et des objets SQL Server.
Les packages peuvent fonctionner en mode autonome ou de concert avec d'autres packages en
réponse à des besoins professionnels complexes. Intégration Services peut extraire et transformer
des données à partir d'un éventail de sources, tels que des fichiers de données XML, des fichiers plats
et des sources de données relationnelles, puis charger les données dans une ou plusieurs
destinations.
Intégration Services inclut un ensemble riche de tâches et de transformations intégrées, des outils
pour construire des packages et le service Intégration Services permettant d'exécuter et de gérer des
packages. Vous pouvez faire appel aux outils graphiques Intégration Services pour créer des
Réplication
Outre la réplication, dans SQL Server 2008, vous pouvez synchroniser des bases de
données à l'aide de Microsoft Sync Framework et de Sync Services for [Link]. Sync
Services for [Link] fournit une API intuitive et flexible que vous pouvez utiliser pour
générer des applications qui ciblent des scénarios de collaboration et hors connexion.
Pour obtenir une vue d'ensemble de Sync Services for [Link], consultez Microsoft Sync
Framework. Pour obtenir une documentation complète, consultez le site Web MSDN.
Reporting Services
SQL Server 2008 Reporting Services (SSRS) est une plateforme serveur qui fournit des
fonctionnalités complètes de création de rapports pour différentes sources de données. Reporting
Services inclut un jeu complet d'outils que vous pouvez utiliser pour créer, gérer et remettre des
rapports, et des interfaces de programmation d'application (API) qui permettent aux développeurs
d'intégrer ou d'étendre le traitement des rapports et des données dans les applications
personnalisées. Les outils Reporting Services fonctionnent au sein de l'environnement Microsoft
Visual Studio et sont totalement intégrés aux outils et composants de SQL Server.
Avec Reporting Services, vous pouvez créer des rapports de type interactif, tabulaire, graphique
ou libre à partir de sources de données XML, relationnelles et multidimensionnelles.
Vous pouvez publier des rapports, planifier le traitement de rapports ou accéder à des rapports
à la demande. Reporting Services vous permet également de créer des rapports ad hoc basés sur des
modèles prédéfinis, et d'explorer des données de manière interactive dans le modèle. Vous pouvez
sélectionner divers formats d’affichage, exporter des rapports vers d'autres applications et vous
abonner à des rapports publiés.
Les rapports que vous créez peuvent être consultés par le biais d'une connexion Internet ou en
tant qu'application Microsoft Windows ou site SharePoint. Reporting Services fournit la clé de vos
données de gestion.
Pour plus d'informations sur les autres composants, outils et ressources de SQL Server, consultez
la Documentation en ligne de SQL Server
Service Broker
SQL Server Service Broker fournit la prise en charge native du Moteur de base de données SQL
Server pour les applications de messagerie et de mise en file d'attente.
Cette opération permet aux développeurs de créer des applications perfectionnées qui utilisent
des composants du Moteur de base de données pour communiquer entre des bases de données
disparates. Les développeurs peuvent utiliser Service Broker pour créer facilement des applications
fiables et distribuées.
Par exemple, les sites Web qui prennent en charge des bases de données frontales peuvent
enregistrer des informations et mettre les tâches intensives en file d'attente dans des bases de
données dorsales. Service Broker veille à ce que toutes les tâches soient gérées dans le contexte des
transactions pour garantir la fiabilité et la cohérence technique.
Résumé de la leçon
SGBD fonctionnent selon un mode client/serveur
Un SGBDR reçoit des requêtes de plusieurs clients et ceci de
manière concurrente
SQL server est constitué de plusieurs composants
Moteur de base de données
Analyse service, service repport,
intégration service
Révision de la leçon
Travaux Dirigés
1. Faite une recherche sur l’internet pour faire un rapport sur les avantages de SQL server
Les réseaux informatiques sont de plus en plus souvent la cible d'attaques. Si, malgré les protections
mises en place, un individu arrive à s'introduire dans votre base de données (en volant un mot de
passe ou en se faisant passer pour une autre personne), il faut que son rayon d'action soit le plus
limité possible.
L'erreur est humaine, c'est un fait, et il peut arriver que des utilisateurs parfaitement habile à
utiliser la base de données modifient par erreur certaines données qui devraient normalement être
protégées. Une gestion correcte des droits permet de se prémunir contre ce genre de désagrément
en empêchant l'exécution de certaines tâches
Il est inconcevable que l'ensemble des salariés d'une entreprise aient accès aux données concernant,
En fait, gérer les droits est finalement très simple si on s'y prend suffisamment tôt.
A chaque création d'un nouvel objet dans la base de données (ex: une table), il suffit de suivre les
étapes suivantes :
Dans la section suivante, nous expliquerons plus en détails ces différentes notions (rôles,
utilisateurs...)
A. Notions de base
Pour accéder à une base de données, un utilisateur utilise une connexion. Un utilisateur
peut être soit une personne physique, soit une application (script, batch).
Une base contient de nombreux objets (tables, vues, procédures stockées, fonctions…). Pour
entreprendre certaines actions sur ces objets (consulter, exécuter, modifier…) l'utilisateur doit avoir
les privilèges (aussi appelés droits) nécessaires. L'utilisateur peut obtenir ces droits de manière
directe ou indirecte.
Le principe de base est donc finalement très simple. La mise en place peut être un peu plus
complexe, comme nous allons le voir.
pour chaque objet (table, vue, procédure stockée) on affecte les droits de manière
individuelle à chaque utilisateur.
à chaque fois que l'on ajoute un objet dans la base, il faut affecter les droits pour chacun des
10 utilisateurs
à chaque ajout d'un utilisateur, il faudra affecter les droits sur chacun des 60 objets de la
base de données
En résumé, avec une implémentation aussi naïve, la gestion des droits est loin d'être aisée.
SQL Server 2008 propose deux modes pour l’authentification des accès aux ressources de base de
données : l’authentification Windows et l’authentification en mode mixte
Authentification Windows :
Seuls les utilisateurs Windows authentifié peuvent obtenir l’accès à l’instance SQL server. Vous
devez ajouter un identifiant Windows a chaque utilisateur ou groupe Windows qui doit accéder a une
instance SQL server c’est le mode d’authentification préconisé et c’est le mode par défaut, il est
recommander car il permet de tirer profit de toutes les stratégies de sécurité centralisées de votre
domaine active directory.
Authentification mixte :
dans ce mode, tant les identifiants de Windows que les identifiants SQL server (dont aucun n’est
associé à un utilisateur du système d’exploitation) peuvent accéder a l’instance SQL server.
à chaque fois que l'on ajoute un objet dans la base, il suffit d'affecter les droits à
1 rôle pour que tous les utilisateurs du rôle bénéficient des droits d'accès
lorsqu'on crée un nouvel utilisateur, il suffit de l'ajouter à 1 groupe d'utilisateurs
(rôle) pour qu'il bénéficie de tous les droits du rôle
pour changer les droits d'un utilisateur, il suffit de changer son appartenance aux
différents rôles
Dans une entreprise, les employés ont diverses responsabilités. Chacune de ces responsabilités
s'accompagne d'un certain nombre de tâches et l'entreprise doit fournir à ses employés les moyens
nécessaires pour accomplir leur mission. Par ailleurs les employés peuvent avoir plusieurs
responsabilités et donc cumuler les tâches.
syntaxe :
EXEC master..sp_addsrvrolemember @loginame = N'cn1',
@rolename = N'setupadmin'
GO
L’administrateur de serveur peut définir ses propres rôles par Exemple (crée un rôle vendeurs qui
contient tous les vendeurs)
Le rôle d’application est un rôle qui limite l'accès utilisateur à la base de données via des applications
spécifiques. Les rôles d'application ne possèdent pas d'utilisateurs, si bien que la liste Membres du
rôle n'est pas affichée lorsque l'option Rôle d'application est sélectionnée.
Transact SQL :
syntaxe :
CREATE APPLICATION ROLE application_role_name
WITH PASSWORD = 'password' [ ,
DEFAULT_SCHEMA = schema_name ]
Exemple :
USE [vente] GOCREATE APPLICATION ROLE [roleApp2] WITH
DEFAULT_SCHEMA = [dbo], PASSWORD = N'azerty'
GO
Pour active les autorisations associées à un rôle d'application dans la base de données
active, il faut exécuter la procédure sp_setapprole
Exemple :
exec sp_setapprole roleapp1,'azerty'
Il faut identifier les différents rôles selon les différents utilisateurs de l’application
Pour chaque rôle, on ne doit fournir que les droits nécessaires et suffisants à l'exécution des
différentes tâches.
Les tables sont le support de données et leur contenu ne devrait pas être accessible directement. Par
exemple, une table "salarié" peut contenir des informations personnelles qui ne doivent être
accessibles qu'à un petit groupe d'individus. C'est pourquoi on accède au contenu d'une table au
moyen de vues, procédures stockées, fonctions, etc. Ceci permet également de spécifier si l'accès
aux données se fait en lecture seule ou si elle autorise les modifications.
En résumé, pour accéder au contenu d'une table on crée une vue (ou une procédure stockée, ou une
fonction) pour laquelle on affecte les droits aux différents rôles contenant plusieurs utilisateurs. Ceci
permet un meilleur contrôle des accès.
Plus on gère les droits de manière précoce, plus cette gestion est aisée car l'ajout de droits se fait au
fur et à mesure du développement, et non de manière hâtive à la fin.
Au début du développement, quelques rôles sont clairement identifiés et d'autres seront ajoutés
par la suite. Idem pour les utilisateurs. A chaque ajout de fonctionnalité dans le programme, on
assigne les droits nécessaires pour son exécution (si les droits ne sont pas suffisants, on s'en rend très
vite compte : une exception est levée). De cette façon, on gère les droits très facilement et avec un
effort réduit.
Dans la suite de cet article, nous allons découvrir comment, dans le cas d'une application .Net au
développement bien avancé, identifier les appels aux objets de la base de données (vues, procédures
stockées…) en vue d'assigner les droits.
En SQL Server, on distingue d'un part la notion de login et d'autre part la notion de user.
Cependant un même serveur peut accueillir plusieurs bases de données et dans chacune de ces
bases on définit différents users pour la gestion des droits. Il est ensuite nécessaire de faire le lien
entre les logins et les users (ce que nous verrons par la suite)
CREATE LOGIN log11 with password ='azerty' Créer une connexion log11 avec
mot de passe ‘azerty’
create login [PC-BENDAOUD\Administrateur] Créer une connexion a partir
from windows d’un compte utilisateur
create user alisalem for login log11 Créer l’utilisateur alisalem a partir
de la connexion log11
D. Les Schémas
L’objectif des schémas est de dissocier les utilisateurs de base de données des objets qu’ils vont
être amenés à crée, toutefois, les objets ne sont pas laissés tels, ils sont regroupés logiquement en
[Link] est ainsi possible de définir un schéma comme un ensemble logique d’objets à l’intérieur
d’une base de données.
Les schémas facilitent le partage d’information entre plusieurs utilisateurs sans pour autant
perdre au niveau de la securité.par exemple si plusieurs utilisateurs travaillent ensemble sur un
même [Link] vont tous se connecter en utilisant leur propre connexion et utilisateur de base de
données, ce qui ne les empêche pas de travailler sur le même schéma et de partager ainsi les tables,
vues, procédures, fonctions qui sont définies sur la base dans le cadre du projet.
Pour créer un schéma de base de données, il faut se positionner sur la base de données
concernée puis développer le nœud sécurité et se positionner sur le nœud schéma , sélectionner
Nouveau schéma.
Révision de la leçon
1. Lesquelles des affirmations suivantes relatives aux schemas de base de données sont elles
vraies ?
A. Les schémas de base de données définissent le catalogue de base de données
B. Les schémas regroupent les objets de base de données
C. Les schémas regroupent des bases de données
D. Les schémas définissent le catalogue des tables
2. Lesquelles des instructions suivante permettent-elles de créer un utilisateur de base de
données nommé Ali associer a l’identifiant Ali
a. Create user Ali from ali
b. Create user Ali for login Ali
c. Create user Ali for sql_login Ali
d. Create user Ali
3. Lesquelles des affirmations suivantes relatives aux rôles de base de données, sont elle
vraies ? choisissez tous les réponses pertinentes
a. Il est possible d’imbriquer des rôles de base de données
b. Les rôles de base de données sont prédéfinis
Travaux pratiques
Réalisez les travaux pratiques se trouvant dans le dossier document
TP1
TP2
Les droits qui vont être détaillés ci-dessous peuvent bien sûr être accordés directement à public
Les droits sont organisés de façon hiérarchique par rapport aux éléments sécurisables du serveur
SQL Server gère les privilèges avec trois types de mots clés :
GRANT
REVOKE
DENY
C’est –à-dire d’un privilège peut être accordé(GRANT), ou bien retiré (REVOKE) s’il a été accordé.
L’instruction DENY permet d’interdire l’utilisation d’un privilège particulier même si le privilège en
question a été accordé soit directement soit par l’intermédiaire d’un rôle
Create database
Create table
Create procedure
create function
create table
backup database
create view
B. Autorisations
Ces droits sont administrés au niveau de la base de données par l’intermédiaire de la
fenêtre propriétés
Exemple :
Le privilège create table est accordé à l’utilisateur de base de données Brahim par
l’intermédiaire de la boite de propriétés de la base :
L’accord de privilège s’effectué en utilisant l’instruction GRANT dont la syntaxe est détaillée ci-
dessous
Syntaxe :
GRANT permission[,……] TO utilisateur[,……..] [WITH GRANT OPTION]
Nom de la ou les 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 vues ainsi que d’effectuer des sauvegardes de la base et du journal.
Nom d’utilisateur ou des utilisateurs de base de données qui reçoivent les permissions
A. Retirer privilèges
Il est possible de retirer un privilège qui a été accordé à une entité de sécurité.si le privilège n’a
pas été accordé à l’entité de sécurité, l’instruction est sans effet.
Exemple :
use [AdventureWorksDW2008]
GO
REVOKE CREATE TABLE TO [Brahim]
GO
Syntaxe :
REVOKE [GRANT OPTION FOR] permission[,….]
FROM utilisateur[,…….]
[CASCADE]
L’instruction DENY permet d’interdire à un utilisateur l’utilisation d’un privilège, même s’il en
reçoit la permission soit directement, soit par son appartenance à un groupe.
Exemple :
use [AdventureWorksDW2008]
GO
DENY CREATE TABLE TO [Brahim]
GO
Syntaxe :
GRANT <droits> ON <objet>
TO <usagers>
[WITH GRANT OPTION]
Les privilèges sont les clauses qui peuvent être autorisées/retirées à un utilisateur. Les principales
sont:
Important :
L'unique personne pouvant accorder ou retirer des droits sur un élément (table,
vue ou index) est la personne qui l'a créée. Toutefois, il lui est possible de
transmettre ce droit d'accorder/retirer des droits, auquel cas la personne recevant
cet "honneur" aura le droit de transmettre ce "pouvoir" sur ces éléments
L'option WITH GRANT OPTION permet de définir si l'utilisateur peut lui-même accorder à un autre
utilisateur les permissions qu'on lui accorde sur les éléments
Afin d'éviter à avoir à saisir l'ensemble des utilisateurs dans le cas d'une autorisation collective ou
bien de citer l'ensemble des permissions il est possible d'utiliser des mots clés:
Le mot clé PUBLIC en lieu et place de la liste d'utilisateurs permet d'accorder les privilèges
sur le ou les objets à l'ensemble des utilisateurs
Le mot clé ALL en lieu et place de la liste de permissions permet d'accorder tous les
privilèges aux utilisateurs présents dans la liste
En précisant entre parenthèses un nom de colonne pour un privilège, il est possible de limiter le
privilège à la colonne (ou la liste de colonnes) entre parenthèses, par exemple:
GRANT UPDATE(Nom,Prenom)
ON Etudiants
TO ALI,FATIMA,AHMED
WITH GRANT OPTION;
L'option WITH GRANT OPTION autorise donc plusieurs utilisateurs à accorder des permissions à
un même utilisateur, il y a donc des règles à respecter lors du retraits des permissions à un
utilisateur...
La révocation de permissions
Syntaxe :
REVOKE
[GRANT OPTION FOR] Liste_de_permissions
ON Liste_d_objets
FROM Liste_d_utilisateurs;
Afin d'éviter à avoir à saisir l'ensemble des utilisateurs dans le cas d'une autorisation collective ou
bien de citer l'ensemble des permissions il est possible d'utiliser des mots clés:
Le mot clé PUBLIC en lieu et place de la liste d'utilisateurs permet de retirer les privilèges
sur le ou les objets à l'ensemble des utilisateurs
Le mot clé ALL en lieu et place de la liste de permissions permet de retirer tous les
privilèges aux utilisateurs présents dans la liste
En précisant entre parenthèses un nom de colonne pour un privilège, il est possible de limiter la
restriction de privilège à la colonne (ou la liste de colonnes) entre parenthèses, par exemple:
REVOKE
[GRANT OPTION FOR] UPDATE(Nom,Prenom)
ON Etudiants
FROM PUBLIC
Il s'agit donc de retirer les droits des utilisateurs l'ayant obtenu de quelqu'un qui ne l'a plus en
prenant en compte le fait qu'il peut l'avoir de plusieurs personnes simultanément...
La clause REVOKE étant implé:mentée différemment selon les SGBDR, il s'agit de consulter la
documentation de celui-ci...
Syntaxe :
Simplified syntax for DENY
DENY { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [
,...n ]
[ ON [ class :: ] securable ] TO
principal [ ,...n ]
[ CASCADE] [ AS principal ]
définition de rôles
ajout des droits, création des rôles au fur et à mesure du développement
vérification que pour un rôle donné, on a bien les droits nécessaires et
suffisants à l'exécution des différentes tâches
Résumé de la leçon
SQL server gère les privilèges avec les trois instruction GRANT,REVOKE et DENY
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 [Link] utilisateur qui
dispose de tels droits est capable par exemple de créer ses propres tables, ses procédures
Travaux Dirigés
Question cours :
1. Pourquoi utilise t- on les rôles en SQL server et données un exemple ?
2. Quel est la différence entre rôle de base de données et rôle définit par utilisateur ?
3. Quelles sont les caractéristiques du rôle public ?
4. Quel est la différence entre connexion et utilisateur (user)
Sécurité :
Une société de vente en ligne, possède une application en ligne, et serveur local sur lequel
se trouve un SGBDR (SQL server 2008)
Les utilisateurs de cette application sont les clients qui peuvent visualiser les prix des produits
et ajouter et modifier sur la table client
Les vendeurs qui peuvent ajouter des commendes, lignes commande et visualiser la table
produit et client
Créer un script de transat SQL qui permet de gérer ces permissions
Un SGBD est caractérisé par le modèle de description des données qu’il supporte
(hiérarchique, réseau, relationnel, objet). Les données sont décrites sous la forme de ce
modèle, grâce à un Langage de Description des Données (LDD). Cette description est
appelée schéma.
Une fois la base de données spécifiée, on peut y insérer des données, les récupérer,
les modifier et les détruire. C’est ce qu’on appelle manipuler les données. Les données
peuvent être manipulées non seulement par un Langage spécifique de Manipulation des
Données (LMD) mais aussi par des langages de programmation classiques.
Plusieurs étapes sont nécessaires à la mise en place d'une base de données, dès lors
que l'on a précisément défini ses besoins (ce qui n'est déjà pas chose facile !) : la
création de la structure de la base sous forme de tables (tableaux de données) reliées
entre elles par des données clés, la conception des requêtes qui permettront d'extraire
ou de mettre à jour les informations qu'elle contient , la conception de l'interface
homme-machine (écrans et états) qui rendra plus conviviale la saisie et la restitution des
informations.
Bon nombre d'utilisateurs qui voient les matériels informatiques et les logiciels
changer tous les trois mois, seraient surpris d'apprendre que l'algèbre relationnelle a été
définie par Codd en 1970.
Elle est à l'origine du langage SQL (Structured Query Language) d'IBM, langage
d'interrogation et de manipulation de tous les SGBDR actuels (Oracle, PostgreSQL,
MySQL, MS SQLServer, MS Access et tous les autres).
Tous les opérateurs sont présentés à l'aide d'exemples clairs. Pris séparément, ils sont
faciles à appréhender. La rédaction de requêtes (combinaison d'opérateurs) est illustrée
par des exercices concrets.
Le langage SQL n'est abordé que dans le cadre des opérations évoquées ci-dessus.
Seule l'instruction SELECT et ses multiples aspects sont donc présentés.
L'exemple suivant, relatif à la gestion simplifiée des étapes du Tour de France 97, va nous servir à
introduire le vocabulaire lié au modèle relationnel.
C'est ainsi que dans l'exemple présenté, figurent l'ensemble des Equipes, des
Coureurs, des Etapes, des Temps réalisés par les coureurs à chacune des étapes, et enfin
l'ensemble des pays.
Les colonnes des tables s'appellent des attributs et les lignes des n-uplets (où n
est le degré de la relation, c'est à dire le nombre d'attributs de la relation).
Un attribut ne prend qu'une seule valeur pour chaque n-uplet.
L'ordre des lignes et des colonnes n'a pas d'importance.
Chaque table doit avoir une clé primaire constituée par un ensemble
minimum d'attributs permettant de distinguer chaque n-uplet de la Relation
par rapport à tous les autres. Chaque ensemble de valeurs formant la clé
primaire d'un n-uplet est donc unique au sein d'une table.
Dans certains cas, plusieurs clés primaires sont possibles pour une seule table. On
parle alors de clés candidates. Il faut alors en choisir une comme clé primaire.
Les liens sémantiques (ou règles de gestion sur les données) existants entre les
ensembles sont réalisés par l'intermédiaire de clés étrangères faisant elles-mêmes
référence à des clés primaires d'autres tables.
C'est ainsi que dans la table COUREURS, la clé étrangère CodeEquipe (faisant
référence à la clé primaire de même nom dans la table EQUIPES) traduit les deux règles
de gestion suivantes :
C'est ainsi que la table des TEMPS réalisés à chaque étape par chacun des coureurs exprime les
deux règles de gestion suivantes :
Le modèle relationnel est le plus souvent décrit sous la forme suivante, les clés
primaires étant soulignées et les clés étrangères marquées par un signe distinctif (ici
par * ou bien #).
conclusion
Dans le cadre d'un projet d'informatisation, la conception d'une base de
données relationnelle passe d'abord par l'identification des objets de gestion
(Coureurs, Etapes, …) et des règles de gestion du domaine modélisé
(interviews des utilisateurs, étude des documents manipulés, des fichiers
existants, …). Une fois énoncées et validées, ces règles nous conduisent
automatiquement à la structure du modèle relationnel correspondant.
Syntaxe :
Formalisme : R = PROJECTION (R1, liste des attributs)
ALL
FRA
B-G
ITA
Syntaxe :
SELECT DISTINCT liste d'attributs FROM table ;
Exemple :
SELECT DISTINCT codePays FROM Coureurs ;
C. Opération RESTRICTION
Syntaxe :
Formalisme : R = SELECTION (R1, condition)
Il permet de ne retenir que les n-uplets répondant à une condition exprimée à l'aide des
opérateurs arithmétiques ( =, >, <, >=, <=, <>) ou logiques de base (ET, OU, NON).
Un attribut peut ne pas avoir été renseigné pour certains n-uplets. Si une condition de sélection
doit en tenir compte, on indiquera simplement : nomattribut "non renseigné
Exemple :
SELECT * FROM Coureurs WHERE CodePays=’FRA’;
Autres exemples :
SELECT *
FROM ETUDIANT
WHERE Age IN (19, 20, 21, 22, 23) ;
SELECT *
FROM ETUDIANT
WHERE Age BETWEEN 19 AND 23 ;
SELECT *
FROM ETUDIANT
WHERE CodePostal LIKE '42%' ; // sous Access : LIKE "42*"
Affiche la liste des étudiants qui ont un codePoste qui commence par 42
SELECT *
FROM ETUDIANT
WHERE CodePostal LIKE '42___' ; // sous Access : LIKE "42???"
Affiche la liste des étudiants qui ont un codePoste qui commence par 42 suivis par 3 caractéres
SELECT *
FROM ETUDIANT
WHERE Ville IS NULL ;
SELECT *
FROM ETUDIANT
WHERE Ville IS NOT NULL ;
SELECT *
FROM ETUDIANT
WHERE Age >= ALL (SELECT Age FROM ETUDIANT) ;
Exemple :
PRODUIT DETAIL_COMMANDE
Syntaxe :
R = JOINTURE (PRODUIT,
DETAIL_COMMANDE,[Link]=Détail_Commande.CodePrd)
Cet opérateur porte sur 2 relations qui doivent avoir au moins un attribut défini dans le
même domaine (ensemble des valeurs permises pour un attribut).
La condition de jointure peut porter sur l'égalité d'un ou de plusieurs attributs définis dans le
même domaine (mais n'ayant pas forcément le même nom).
Les n-uplets de la relation résultat sont formés par la concaténation des n-uplets des
relations d'origine qui vérifient la condition de jointure.
Remarque :
En SQL de base :
Syntaxe :
SELECT * FROM table1, table2, table3, ...
WHERE table1.attribut1=table2.attribut1 AND table2.attribut2=table3.attribut2
AND ...;
Exemple :
SELECT * FROM Produit, Détail_Commande
WHERE [Link]=Détail_Commande.CodePrd ;
Exemple :
SELECT * FROM Produit A, Détail_Commande B
WHERE [Link]=[Link] ;
Avec la clause INNER JOIN (jointure dite interne) à partir du SQL2, supportée aujourd'hui par
tous les SGBDR :
Syntaxe :
SELECT * FROM table1 INNER JOIN table2 ON table1.attribut1=table2.attribut1
INNER JOIN table3 ON table2.attribut2=table3.attribut3... ;
Le mot clé INNER est facultatif sur la plupart des SGBDR (sauf MS Access).
Cette notation rend plus lisible la requête en distinguant clairement les conditions de jointures,
derrière ON, et les éventuelles conditions de sélection ou restriction, derrière WHERE.
De plus, l'oubli d'un ON (et donc de la condition de jointure) empêchera l'exécution de la requête,
Exemple :
SELECT *
FROM Produit A INNER JOIN Détail_Commande B ON
[Link]=[Link] ;
Dans le cas d'une jointure externe gauche A->B, toute les lignes de la table A sont
incluses même s'il ne leur correspond pas de ligne dans la table B.
Exemple :
SELECT *
FROM Produit A LEFT OUTER JOIN Détail_Commande B ON
[Link]=[Link] ;
Tous les produits apparaissent même si certains n'ont pas fait l'objet de commande (exemple :
588J). Les colonnes manquantes sont alors complétées par des valeurs NULL.
Chapitre 3 :
Leçon2 : les opérations ensemblistes
A B
B 2 =1
X A
A. Opération UNION
E1 : Enseignants
1 élus au CA
DUPONT E2 : Enseignants
1 représentants
DUPONT syndicaux
3 DURAND 4 MARTIN
4 MARTIN 6 MICHEL
5 BERTRAND
n°enseignant nom_enseignant
1 DUPONT
3 DURAND
4 MARTIN
6 MICHEL
Cet opérateur porte sur deux relations qui doivent avoir le même (schema) nombre
d'attributs définis dans le même domaine (ensemble des valeurs permises pour un
attribut). On parle de relations ayant le même schéma.
La relation résultat possède les attributs des relations d'origine et les n-uplets de
chacune, avec élimination des doublons éventuels
Syntaxe :
SELECT liste d'attributs FROM table1
UNION
SELECT liste d'attributs FROM table 2 ;
Exemple :
SELECT n°enseignant, NomEnseignant FROM E1
UNION
SELECT n°enseignant, NomEnseignant FROM E2 ;
C. Opération INTERSECTION
Exemple :
1 DUPONT 1 DUPONT
3 DURAND 4 MARTIN
4 MARTIN 6 MICHEL
n°enseignant nom_enseignant
1 DUPONT
4 MARTIN
Syntaxe :
SELECT attribut1, attribut2, ... FROM table1
INTERSECT
SELECT attribut1, attribut2, ... FROM table2 ;
Syntaxe :
SELECT attribut1, attribut2, ... FROM table1 INNER JOIN table2 ON
table1.attribut1 = table2.attribut1 ;
Exemple :
SELECT n°enseignant, NomEnseignant FROM E1
WHERE n°enseignant IN (SELECT n°enseignant FROM E2) ;
ou
E. Opération DIFFERENCE
Exemple :
1 DUPONT 1 DUPONT
3 DURAND 4 MARTIN
4 MARTIN 6 MICHEL
5 BERTRAND
On désire obtenir la liste des enseignants du CA qui ne sont pas des représentants
syndicaux.
n°enseignant nom_enseignant
3 DURAND
5 BERTRAND
Syntaxe :
SELECT attribut1, attribut2, ... FROM table1
WHERE attribut1 NOT IN (SELECT attribut1 FROM table2) ;
Syntaxe :
SELECT attribut1, attribut2, ... FROM table1
WHERE NOT EXISTS (SELECT * FROM table2 WHERE
table1.attribut1=table2.attribut1) ;
Syntaxe :
SELECT attribut1, attribut2, ... FROM table1
WHERE attribut1 <> ALL (SELECT attribut1 FROM table2) ;
Syntaxe :
SELECT attribut1, attribut2, ... FROM table1
EXCEPT
SELECT attribut1, attribut2, ... FROM table2 ;
si par exemple vous utilisez une version de MySQL qui ne dispose ni du EXCEPT, ni de la possiblité
de SELECT imbriqués :
Exemple :
SELECT n°enseignant, NomEnseignant FROM E1
WHERE n°enseignant NOT IN (SELECT n°enseignant FROM E2) ;
Ou
Exemple :
SELECT n°enseignant, NomEnseignant FROM E1
EXCEPT
SELECT n°enseignant, NomEnseignant FROM E2 ;
ou encore
Exemple :
SELECT E1.n°enseignant, [Link]
FROM E1 LEFT JOIN E2 ON E1.n°enseignant = E2.n°enseignant
WHERE E2.n°enseignant IS NULL ;
Pour mieux comprendre cette dernière version, voici le résultat renvoyé par la
jointure externe gauche entre E1 et E2 :
[Link]
E1.n°enseignant [Link] E2.n°enseignant
ant
1 DUPONT 1 DUPONT
4 MARTIN 4 MARTIN
Exemple :
Etudiants Epreuves
coefficien
n°étudiant nom libellé épreuve
t
Gestion financière 5
coefficien
n°étudiant nom libellé épreuve
t
Syntaxe :
SELECT * FROM table1, table2 ;
Exemple :
SELECT * FROM Etudiants, Epreuves ;
Syntaxe :
H. Opération Division
La division s’effectue sur deux tables (Dividende, Diviseur) possédant des colonnes à champ
commun. Elle permet de répondre à la question suivante : quels sont tous les éléments d’une table
qui sont associés à tous les éléments d’une autres table. (Exprime « Pour tous les » )
Exemple :
Quelles sont les commandes concernant tous les articles ?
1070 CS20
1021 CS10
1050 CS30
1021 CS20
1070 CS30
Numcmd
1050
1070
Réponse :
Select Numcmd from LC as LC1 Where
Not exists (Select Codart from article Where
Not exists ( Select * from LC LC2 Where
[Link]= [Link]
And [Link]= [Link] ) )
I. Opération TRI
Cette opération permet de faire le tri du jeu d’enregistrement qui est retourné par select
Syntaxe :
SELECT attribut1, attribut2, attribut3, ...
FROM table
ORDER BY attribut1 ASC, attribut2 DESC, ... ;
Exemple :
SELECT * FROM EMPLOYE ORDER BY NON DESC
Remarque : par défaut le tri se fait par ordre croissant si l'on ne précise pas ASC ou
DESC.
1. Exercice d'application
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées
par *
Questions :
2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.
3 - Donner la liste des noms des musiciens et des titres des représentations
4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la
journée du 14/09/96.
Decimal A fixed precision and fixed scale numeric value between -1038 -1 and +1038
-1.
Int A 32-bit signed integer.
numérique
exect Numeric A fixed precision and fixed scale numeric value between -1038 -1 and +1038
-1.
SmallInt A 16-bit signed integer.
numériq Float An 8-byte floating point number within the range of -1.79E +308 through
ue 1.79E +308.
Real A 4-bit floating point number within the range of -3.40E +38 through 3.40E
approximati +38.
fs
Money A Decimal system object value that specifies a currency value ranging from -
263 (or -922,337,203,685,477.5808) to 2 63 -1 (or
+922,337,203,685,477.5807) with an accuracy of 1 in 10,000 of a currency
monétaires unit.
SmallMoney A Decimal system object value that specifies a currency value ranging from -
214,748.3648 to +214,748.3647 with an accuracy of 1 in 10,000 of a currency
unit.
DateTime A DateTime system object value that specifies a date and time between
January 1, 1753 and December 31, 9999 to an accuracy of 3.33 milliseconds.
SmallDateTim A DataTime system object value that specifies a date and time between
e January 1, 1900 and June 6, 2079 to an accuracy of one minute.
Date Date object represents any valid Gregorian calendar date between '0001-01-
01' CE and '9999-12-31' CE.
DateTime2 DateTime2 is considered an extension of the existing DATETIME object with
date/heure
a large date range and large default fractional precision. Values that represent
any valid Gregorian calendar date between ‘0001-01-01’ CE and ‘9999-12-31’
CE combined with any valid time of day based on a 24-hour clock.
DateTimeOffs DateTimeOffset returns valid Gregorian calendar date between `0001-01-01’
et and ‘9999-12-31’ with any valid time of day based on a 24 hour format between
’[Link]’ and max ’[Link].9999999’. Included in the DateTimeOffset is a
time zone offset that must be between ‘-14:00’ and ‘+14:00’.
NChar A fixed-length byte array of Unicode characters ranging between 1 and 4,000
characters.
Binary A fixed-length byte array ranging between 1 and 8,000 bytes.
Image A variable-length byte array ranging from 0 to 231 -1 (or 2,147,483,647) bytes.
binaire VarBinary A variable-length byte array ranging between 1 and 2^64 bytes.
Geography Geography spatial type represents data in a round-earth coordinate system. The SQL
Server geography data type stores ellipsoidal (round-earth) data, such as GPS latitude
spécialis and longitude coordinates..
Geometry Geography spatial type represents data in a Euclidean (flat) coordinate system.
és
Variant A special data type that can contain numeric, string, binary, date data, and the SQL
Server values Empty and Null. This data type is assumed if no other type is declared.
Xml An XML data type.
Syntaxe :
CREATE TABLE nom_table
(colonne1 type1,
Colonne2 type2,
………………………………….
…………………………………
……………………..)
On peut ajouter après la description d’une colonne l’option NOT NULL qui interdira que cette
colonne contienne une valeur [Link] peut aussi ajouter des contraintes d’intégrités.
Une table temporaire n’est visible que pour l’utilisateur qui l’a créée et seulement a l’intérieur de
la connexion qui a été employé pour la création de la table. En revanche les tables temporaires sont
détruites automatiquement lorsque la connexion à laquelle elles sont associées est fermée .
Pour créer une table temporaire locale il faut précéder le nom de la table par un #
Syntaxe :
Create table #ligne_comme
(code int, datecom datetime,codeCl int)
Alors que , les tables temporaires globales sont visible pour tous les utilisateurs de l’instance SQL
elles sont détruites lorsque la dernière connexion est fermée.
Syntaxe :
Create table ##ligne_comme
(code int, datecom datetime, codeCl int)
Résumé de la leçon
Les tables, l’élément de construction fondamental de toutes base de données
Pour procurer à une table la structure nécessaire, vous devez choisir pour les colonnes
entre les types de données numeriques,texte, date/heure et binaires afin de stocker
correctement les données
Une fois une table est définie, vous devez accorder des permissions sur cette table pour
permettre aux utilisateurs de récupérer et de manipuler des données
VOIR VIDEO
NULL / NOT NULL : précise si une valeur doit obligatoirement être saisie dans la colonne ou
non
DEFAULT : valeur par défaut qui est placée dans la colonne lors des insertions et de certaines
opérations particulières, lorsque l'on a pas donné de valeur explicite à la colonne
COLLATE : précise la séquence de collation, c'est à dire l'ordre des caractères pour le tri et les
éventuelles confusions possible (minuscules/majuscules, caractères diacritiques distinct ou
non).
PRIMARY KEY : précise si la colonne est la clef de la table. ATTENTION : nécessite que la
colonne soit NOT NULL
UNIQUE : les valeurs de la colonne doivent être unique ou NULL, c'est à dire qu'à l'exception
du marqueur NULL, il ne doit jamais y avoir plus d'une fois la même valeur (pas de doublon)
CHECK : permet de préciser un prédicat qui acceptera la valeur s'il est évalué à vrai
FOREIGN KEY : permet, pour les valeurs de la colonne, de faire référence à des valeurs
préexistantes dans une colonne d'une autre table. Ce mécanisme s'appelle intégrité
référentielle
dans un tableau ces contraintes peuvent être placées plusieurs fois, à l'exception
de la contrainte de clef PRIMARY KEY qui ne peut être créée qu’ une seule fois .
Lorsqu'au cours d'un ordre SQL d'insertion, de modification ou de suppression, une contrainte
n'est pas vérifiée on dit qu'il y a "violation" de la contrainte et les effets de l'ordre SQL sont
totalement annulé (ROLLBACK).
On peut rendre la saisie d'une colonne obligatoire en apposant le mot clef NOT NULL. Dans ce cas,
il ne sera jamais possible de faire en sorte que la colonne soit vide. Autrement dit, la colonne devra
toujours être renseignée lors des ordres d'insertion INSERT et de modification UPDATE.
Si l'on désire que la colonne puisse ne pas être renseignée (donc accepter les marqueurs NULL), il
n'est pas nécessaire de préciser le mot clef NULL, mais il est courant qu'on le fasse par facilité de
lecture.
Exemple :
CREATE TABLE T_PERSONNE1
(PRS_ID INTEGER NOT NULL
PRS_NOM VARCHAR(32) NOT NULL,
PRS_PRENOM VARCHAR(32) NULL,
PRS_DATE_NAISSANCE DATE)
Crée une table dont les colonnes PRS_ID et PRS_NOM doivent obligatoirement être renseignés.
Important :
les colonnes concourantes à la définition d'une clef de table doivent
impérativement posséder une contrainte NOT NULL.
La contrainte DEFAULT permet de préciser une valeur qui sera automatiquement insérée en
l'absence de précision d'une valeur explicite dans un ordre d'insertion. Certains autres ordres SQL,
comme la gestion de l'intégrité référentielle peuvent faire référence à cette valeur par défaut. Seule
une valeur explicite, un marqueur NULL ou la valeur retournée par les fonctions suivantes sont
acceptées : CURRENT_DATE, CURRENT_TIME[(p)], CURRENT_TIMESTAMP[(p)], LOCALTIME[(p)],
LOCALTIMESTAMP[(p)], USER, CURRENT_USER, SESSION_USER, SYSTEM_USER.
Exemple :
CREATE TABLE T_PERSONNE2
(PRS_ID INTEGER,
PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32),
PRS_SEXE CHAR(1) DEFAULT 'M',
PRS_DATE_NAISSANCE DATE DEFAULT getDATE())
Go
insert into T_PERSONNE2 (PRS_ID,PRS_NOM,PRS_PRENOM ) values
(11,'BRAHIM','SALEM')
select * from T_PERSONNE2
Toute table doit être munie d'une clef (souvent appelé à tort clef primaire en opposition à clef
étrangère...). Et toujours selon la théorie des bases de données, une clef doit impérativement
toujours être pourvue d'une valeur ! (sinon à quoi servirait une clef en l'absence de serrure ?).
Lorsque la clef porte sur une seule colonne il est possible de donner à cette colonne la contrainte
PRIMARY KEY.
Nous avons vu que la contrainte PRIMARY KEY peut être posée sur une colonne (contrainte
verticale) ou sur plusieurs colonnes en contrainte de ligne (horizontale). Si nous choisissons de la
poser en contrainte de colonne, alors une seule colonne de la table peut en bénéficier.
Exemple :
CREATE TABLE T_PERSONNE5
(PRS_ID INTEGER NOT NULL PRIMARY KEY,
PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32))
La contrainte PRIMARY KEY assure qu'il n'y aura aucune valeur redondante (doublon) dans la
colonne. La contrainte complémentaire NOT NULL assure qu'il y aura toujours une valeur. Toute
tentative d'insérer une valeur préexistante de la colonne se soldera par une violation de contrainte
de clef. Voici par exemple le message généré par SQL Server dans ce cas :
(1 ligne(s) affectée(s))
Msg 2627, Niveau 14, État 1, Ligne 2
Violation de la contrainte PRIMARY KEY
'PK__T_PERSON__218D9B381B0907CE'. Impossible d'insérer une clé
en double dans l'objet 'dbo.T_PERSONNE5'.
L'instruction a été arrêtée.
C. Unicité (UNIQUE)
La contrainte d'unicité exige que toutes les valeurs explicites contenues dans la colonne soient
uniques au sein de la table. En revanche, la colonne peut ne pas être renseignée. En effet, souvenez
vous que les marqueurs NULL se propagent dans les calculs et donc comparaison d'un marqueur
NULL à un ensemble de valeurs est impossible et se solde par le renvoi d'un marqueur UNKNOW à la
place des valeurs TRUE ou FALSE attendue.
Exemple :
CREATE TABLE T_PERSONNE7
(PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32),
PRS_TELEPHONE CHAR(14) UNIQUE)
SELECT *
FROM T_PERSONNE7
Message d’erreur :
D. CREATION D’INDEXS
À l'instar de l'index d'un livre, l'index d'une base de données vous permet de retrouver
rapidement des informations dans une table ou une vue indexée. Un index se compose de clés
créées à partir d'une ou plusieurs colonnes dans la table ou la vue et de pointeurs qui mappent sur
l'emplacement de stockage des données spécifiées. Un index bien conçu améliore de manière
significative les performances des requêtes et des applications de base de données. Un index peut
réduire la quantité de données qui doivent être lues par une requête pour retourner un ensemble de
résultats. Les index peuvent aussi imposer l'unicité des lignes d'une table, garantissant ainsi
l'intégrité des données de la table.
Les rubriques de cette section fournissent des informations qui vous aident à comprendre, à
concevoir, à mettre en œuvre et à optimiser des index.
1. CONCEPTION D’INDEXS
L'engorgement des applications de base de données est souvent imputable à des index mal
conçus ou en nombre insuffisant. La conception d'index efficaces est primordiale pour le bon
fonctionnement des bases de données et des applications. Le choix d'index adaptés à une base de
données et à sa charge de travail est une opération complexe qui vise à trouver un compromis entre
vitesse des requêtes et coûts de mise à jour. Les index étroits, c'est-à-dire les index ne comportant
que quelques colonnes dans la clé d'index, requièrent moins d'espace disque et de besoins de
maintenance. En revanche, les index larges couvrent plus de requêtes. Vous devrez éventuellement
essayer plusieurs conceptions différentes avant de trouver l'index le plus performant. Il est possible
d'ajouter, de modifier et de supprimer des index sans affecter le schéma de la base de données ou la
conception des applications. Par conséquent, n'hésitez à faire des essais avec différents index.
Dans la majorité des cas, l'optimiseur de requête de SQL Server choisit de manière fiable l'index le
plus efficace. La stratégie globale de création d'index consiste à fournir à l'optimiseur de requête une
sélection variée d'index et à se fier à lui pour faire le bon choix. Ce procédé permet de réduire le
temps d'analyse et produit de bons résultats dans bon nombre de cas. Pour déterminer quels sont les
index qu'utilise l'optimiseur de requête dans le cas d'une requête donnée, sélectionnez Inclure le
plan d'exécution réel dans le menu Requête de SQL Server Management Studio. Pour plus
d'informations, consultez Procédure : afficher un plan d'exécution réel.
Syntaxe :
CREATE UNIQUE NONCLUSTERED INDEX Idx1
ON [Link](NomDep);
La définition de nombreux index sur une table affecte les performances des instructions
INSERT, UPDATE, DELETE et MERGE , car à mesure que les données de la table changent,
tous les index doivent être mis à jour en conséquence.
Évitez que les tables mises à jour ne soient trop abondamment indexées et faites en sorte
que les index soient étroits, c'est-à-dire qu'ils comprennent le moins de colonnes possible
E. Validation (CHECK)
La contrainte CHECK de validation est celle qui offre le plus de possibilité. En contre partie son
exécution est très coûteuse. Elle permet de définir un prédicat complexe, basé sur une comparaison
pouvant contenir une requête de type SELECT. Pour valider la contrainte, le prédicat doit être évalué
à TRUE ou UNKNOWN (présence de NULL).
syntaxe :
CHECK ( prédicat )
Où prédicat peut contenir le mot clef VALUE pour faire référence à la colonne pour laquelle la
contrainte est définie
Exemple :
CREATE TABLE T_PERSONNE9
(PRS_ID INTEGER CHECK (PRS_ID > 0),
PRS_NOM VARCHAR(32) ,
PRS_PRENOM VARCHAR(32) ,
PRS_SEXE CHAR(1) CHECK (PRS_SEXE IN ('M', 'F')),
PRS_TELEPHONE CHAR(14) )
ATTENTION : la longueur du prédicat d'une contrainte CHECK (en nombre de caractères) peut être
limitée. Il faut en effet pouvoir stocker cette contrainte dans le dictionnaire des informations de la
base et ce dernier n'est pas illimité.
La contrainte de type FOREIGN KEY permet de mettre en place une intégrité référentielle entre
une (ou plusieurs) colonnes d'une table et la (ou les) colonne composant la clef d'une autre table afin
d'assurer les relations existantes et joindre les tables dans le requête selon le modèle relationnel que
l'on a défini.
Le but de l'intégrité référentielle est de maintenir les liens entre les tables quelque soit les
modifications engendrées sur les données dans l'une ou l'autre table.
Cette contrainte dans sa syntaxe complète est assez complexe et c'est pourquoi nous allons dans
ce paragraphe donner une syntaxe très simplifié à des fins didactiques :
syntaxe :
FOREIGN KEY REFERENCES table (colonne)
Attention :
la colonne spécifiée comme référence doit être une colonne clef
Exemple :
CREATE TABLE T_FACTURE1
(FTC_ID INTEGER,
PRS_ID INTEGER FOREIGN KEY REFERENCES
T_PERSONNE5 (PRS_ID) ,
FCT_DATE DATE,
FCT_MONTANT DECIMAL(16,2))
La table T_FACTURE1 est liée à la table T_PERSONNE5 et ce lien se fait entre la clef étrangère
PRS_ID de la table T_FACTURE1 et la clef de la table T_PERSONNE5 qui s'intitule aussi PRS_ID.
il est très important que les noms des colonnes de jointure soit les mêmes dans les
différentes tables (notamment à cause du NATURAL JOIN), mais cela n'est pas
obligatoire.
Dès lors toute tentative d'insertion d'une facture dont la référence de client est inexistante se
soldera par un échec. De même toute tentative de supprimer un client pour lequel les données d'une
ou de plusieurs factures sont présente se soldera par un arrêt sans effet de l'ordre SQL.
Examinons maintenant comment le SGBDR réagit pour assurer la cohérence de la base lors
d'opérations tenant de briser les liens d'intégrité référentielle :
Exemple :
PRIMARY KEY : précise que la ou les colonnes composent la clef de la table. ATTENTION :
nécessite que chaque colonne concourrant à la clef soit NOT NULL.
UNIQUE : les valeurs de la ou les colonnes doivent être unique ou NULL, c'est à dire qu'à
l'exception du marqueur NULL, il ne doit jamais y avoir plus d'une fois la même valeur (pas de
doublon) au sein de l'ensemble de données formé par les valeurs des différentes colonnes
composant la contrainte.
CHECK : permet de préciser un prédicat validant différentes colonnes de la table et qui
accepterons les valeurs s'il est évalué à vrai.
FOREIGN KEY : permet, pour les valeurs de la ou les colonnes, de faire référence à des
valeurs préexitantes dans une ou plusieurs colonnes d'une autre table. Ce mécanisme
s'apelle intégrité référentielle.
Comme dans le cas des contraintes de colonne, lorsqu'au cours d'un ordre SQL d'insertion, de
modification ou de suppression, une contrainte n'est pas vérifiée on dit qu'il y a "violation" de la
contrainte et les effets de l'ordre SQL sont totalement annulé (ROLLBACK).
La clef d'une table peut être composée de plusieurs colonnes. Dans ce cas la syntaxe est :
Syntaxe :
CONSTRAINT nom_contrainte PRIMARY KEY (liste_colonne)
Exemple :
clef primaire sur PRS_NOM / PRS_PRENOM
CREATE TABLE T_PERSONNE9
(PRS_NOM VARCHAR(32) NOT NULL,
PRS_PRENOM VARCHAR(32) NOT NULL,
PRS_TELEPHONE CHAR(14),
CONSTRAINT PK_PRS PRIMARY KEY (PRS_NOM, PRS_PRENOM))
Un contrainte d'unicité peut être portée sur plusieurs colonnes. Dans ce cas chaque n-uplets de
valeurs explicite doit être différents.
Syntaxe :
CONSTRAINT nom_contrainte UNIQUE (liste_colonne)
Exemple :
Remarque :
certains SGBDR comme MS SQL Server refuse de voir la présence de plusieurs
marqueurs NULL dans la cas d'une contrainte d'unicité. D'autres comme InterBase
refusent une contrainte d'unicité dépourvue d'une contrainte NOT NULL...
Sa syntaxe est :
Syntaxe :
CONSTRAINT nom_contrainte CHECK ( prédicat )
Exemple :
vérification de présence d'information dans au moins une colonne crédit ou débit de la
table compte :
CREATE TABLE T_COMPTE
(CPT_ID INTEGER,
CPT_DATE DATE,
CPT_CREDIT DECIMAL (16,2),
CPT_DEBIT DECIMAL (16,2),
CLI_ID INTEGER,
CONSTRAINT CHK_OPERATION CHECK((CPT_CREDIT >= 0 AND CPT_DEBIT IS
NULL) OR (CPT_DEBIT >= 0 AND CPT_CREDITIS NULL)))
Toute tentative d'insérer une ligne avec des valeurs non renseignées pour les colonnes débit et
crédit, ou bien avec des valeurs négative se soldera par un refus.
Comme dans la cas d'une contrainte référentielle de colonne, il est possible de placer une
contrainte d'intégrité portant sur plusieurs colonne. Ceci est d'autant plus important qu'il n'est pas
rare de trouver des tables dont la clef est composée de plusieurs colonnes. La syntaxe est la suivante
:
Syntaxe :
CONSTRAINT nom_contrainte FOREIGN KEY (liste_colonne) REFERENCES
nom_table_ref (liste_colonne_ref)
La table T_FACTURE2 est liée à la table T_PERSONNE9 et ce lien se fait entre la clef étrangère
composite PRS_NOM / PRS_PRENOM de la table T_FACTURE2 et la clef de la table T_PERSONNE9 elle
même composée des colonnes PRS_NOM / PRS_PRENOM.
Examinons maintenant comment le SGBDR réagit pour assurer la cohérence de la base lors
d'opérations tenant de briser les liens d'intégrité référentielle :
Exemple :
CREATE TABLE MATABLE1(column_a INT) ;
GO
DROP TABLE MATABLE1;
Modifie la définition d'une table en changeant, en ajoutant ou en supprimant des colonnes et des
contraintes, en réaffectant des partitions, en désactivant ou en activant des contraintes et des
déclencheurs.
Exemple :
Exemple :
CREATE TABLE maTable2 (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE maTable2 DROP COLUMN column_b ;
GO
/*pour afficher le schema de la lable maTable2 après modification */
EXEC sp_help maTable2 GO ;
Exemple :
Exemple :
CREATE TABLE maTable4 (column_a INT) ;
GO
ALTER TABLE maTable4 ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
GO
--pour afficher le schema de la table maTable4
EXEC sp_help maTable4 ;
GO
--pour supprimer la table d'exemple
DROP TABLE maTable4 ;
GO
L'exemple suivant ajoute une contrainte à une colonne existante de la table. La colonne comporte
une valeur qui ne respecte pas la contrainte. Par conséquent, WITH NOCHECK empêche la
validation de la contrainte sur les lignes existantes, et permet l'ajout de la contrainte
Exemple :
CREATE TABLE maTable5 ( column_a INT) ;
GO
INSERT INTO maTable5 VALUES (-1) ;
GO
ALTER TABLE maTable5 WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
--pour afficher le schema de la table maTable5
EXEC sp_help maTable5 ;
GO
--pour supprimer la table d'exemple
DROP TABLE maTable5 ;
GO
Exemple :
CREATE TABLE maTable6 ( column_a INT, column_b INT) ;
GO
INSERT INTO maTable6 (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE maTable6
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO maTable6 (column_a) VALUES ( 10 ) ;
select * from maTable6
Exemple :
CREATE TABLE maTable7 ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE maTable7 ADD
Appartement
codeAp Immeuble
type
surface codeIm
Adresse
#codeIm
ville
Ces trois commandes travaillent sur la base telle qu'elle était au début de l'exécution
de la commande. Les modifications effectuées par les autres utilisateurs entre le début et la
fin de l'exécution ne sont pas prises en compte (même pour les transactions validées).
A. Insertion
Syntaxe :
INSERT INTO table (col1,..., coln )
VALUES (val1,...,valn )
OU
Syntaxe :
INSERT INTO table (col1,..., coln )
SELECT ...
Exemple :
a) INSERT INTO dept VALUES (10, 'FINANCES', 'PARIS')
La deuxième forme avec la clause SELECT permet d'insérer dans une table des lignes provenant
d'une table de la base. Le SELECT a la même syntaxe qu'un SELECT normal.
Exemple :
Enregistrer la participation de MARTIN au groupe de projet numéro10 :
INSERT INTO PARTICIPATION (MATR, CODEP)
SELECT MATR, 10 FROM EMP
WHERE NOME= ‘MARTIN’ ;
B. Modification
Syntaxe :
UPDATE table
SET col1 = exp1, col2 = exp2, ...
WHERE prédicat
OU
Syntaxe :
UPDATE table
SET (col1, col2,...) = (SELECT ...)
WHERE prédicat
Exemple :
Faire passer MARTIN dans le département 10 :
UPDATE EMP SET DEPT = 10
WHERE NOME = 'MARTIN'
Exemple :
Donner à CLEMENT un salaire 10 % au dessus de la moyenne des salaires
des secrétaires
UPDATE EMP SET SAL = (SELECT AVG(SAL) * 1.10
FROM EMP WHERE POSTE = 'SECRETAIRE')
WHERE NOME = 'CLEMENT'
On remarquera que la moyenne des salaires sera calculée pour les valeurs qu'avaient
les salaires au début de l'exécution de la commande UPDATE et que les modifications
effectuées sur la base pendant l'exécution de cette commande ne seront pas prises en
compte
Exemple :
Enlever (plus exactement, mettre à la valeur ‘NULL’) la commission de
MARTIN :
UPDATE EMP
SET COMM = NULL
WHERE NOME = 'MARTIN'
Syntaxe :
DELETE FROM table
WHERE prédicat
Attention :
cette clause est facultative ; si elle n'est pas précisée, TOUTES
LES LIGNES DE LA TABLE SONT SUPPRIMEES (heureusement qu'il existe
ROLLBACK!). Le prédicat peut contenir des sous-interrogations
Exemple :
DELETE FROM dept WHERE dept = 10
Travaux Dirigés
Syntaxe :
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
B. Clause SELECT
Cette clause permet d'indiquer quelles colonnes, ou quelles expressions doivent être
retournées par l'interrogation.
Syntaxe :
SELECT [DISTINCT] *
Ou
SELECT [DISTINCT] exp1 [[AS] nom1 ], exp2 [[AS] nom2 ], .....
exp1, exp2, ... sont des expressions, nom1, nom2, ... sont des noms facultatifs de 30
caractères maximum, donnés aux expressions. Chacun de ces noms est inséré derrière l'expression,
séparé de cette dernière par un blanc ou par le mot clé AS (optionnel) ; il constituera le titre de la
colonne dans l'affichage du résultat de la sélection. Ces noms ne peuvent être utilisés dans les autres
clauses (where par exemple).
Le mot clé facultatif DISTINCT ajouté derrière l'ordre SELECT permet d'éliminer les duplications :
si, dans le résultat, plusieurs lignes sont identiques, Une seule sera conservée.
Exemple :
SELECT * FROM DEPT
SELECT DISTINCT POSTE FROM EMP
SELECT NOME, SAL + NVL(COMM,0) AS ‘Salaire ‘ FROM
EMP
La requête suivante va provoquer une erreur car on utilise le nom Salaire dans la clause where :
Identique à un mot réservé SQL (exemple : DATE), il doit être mis entre crochet.
Exemple :
SELECT NOME, SAL + NVL(COMM,0) as ‘Salaire Total’ FROM EMP
Le nom complet d'une colonne d'une table est le nom de la table suivi d'un
Point et du nom de la colonne. Par exemple : [Link], [Link], [Link]
Le nom de la table peut être omis quand il n'y a pas d'ambiguïté. Il doit être précisé s'il y a une
ambiguïté, ce qui peut arriver quand on fait une sélection sur plusieurs tables à la fois et que celles-ci
contiennent des colonnes qui ont le même nom
C. Clause FROM
La clause FROM donne la liste des tables participant à l'interrogation. Il est possible de lancer des
interrogations utilisant plusieurs tables à la fois.
Syntaxe :
FROM table1 as [synonyme1 ] , table2 as [synonyme2 ] , ……
synonyme1, synonyme2,... sont des synonymes attribués facultativement aux tables pour le
temps de la sélection. On utilise cette possibilité pour lever certaines ambiguïtés, quand la même
table est utilisée de plusieurs façons différentes dans une même interrogation (voir les exemples)
Quand on a donné un synonyme à une table dans une requête, elle n'est plus reconnue sous son
nom d'origine dans cette requête. Le nom complet d'une table est celui de son créateur (celui du
nom du schéma suivi d'un point et du nom de la table. Par défaut, le nom du créateur est celui de
l'utilisateur en cours. Ainsi, on peut se dispenser de préciser ce nom quand on travaille sur ses
propres tables. Mais il faut le préciser dès que l'on se sert de la table d'un autre utilisateur.
Pour obtenir la liste des employés avec le pourcentage de leur salaire par rapport au total
des salaires, il fallait auparavant utiliser une vue. Il est maintenant possible d'avoir cette liste avec
une seule instruction SELECT :
Exemple :
select nome, sal, sal/total*100
from emp, (select sum(sal) as total from emp)
La clause WHERE permet de spécifier quelles sont les lignes à sélectionner dans une table ou
dans le produit cartésien de plusieurs tables. Elle est suivie d'un prédicat (expression logique ayant la
valeur vrai ou faux) qui sera évalué pour chaque ligne. Les lignes pour lesquelles le prédicat est vrai
seront sélectionnées. La clause where est étudiée ici pour la commande SELECT. Elle peut se
rencontrer aussi dans les commandes UPDATE et DELETE avec la même
Syntaxe :
WHERE prédicat
Opérateur logique :
WHERE exp1 = exp2
WHERE exp1 != exp2
WHERE exp1 < exp2
WHERE exp1 > exp2
WHERE exp1 <= exp2
WHERE exp1 >= exp2
WHERE exp1 BETWEEN exp2 AND exp3
WHERE exp1 LIKE exp2
WHERE exp1 NOT LIKE exp2
WHERE exp1 IN (exp2, exp3,...)
WHERE exp1 NOT IN (exp2, exp3,...)
WHERE exp IS NULL
WHERE exp IS NOT NULL
Les trois types d'expressions (arithmétiques, caractères, ou dates) peuvent être comparées au
moyen des opérateurs d'égalité ou d'ordre (=, !=, <, >, <=,>=) : pour les types date, la relation
d'ordre est l'ordre chronologique ; pour les types caractères, la relation d'ordre est l'ordre
lexicographique. Il faut ajouter à ces opérateurs classiques les opérateurs suivants BETWEEN, IN,
LIKE, IS NULL :
exp1 BETWEEN exp2 AND exp3 est vrai si exp1 est compris entre exp2 et exp3, bornes
incluses.
exp1 IN (exp2 , exp3...) est vrai si exp1 est égale à l'une des expressions de la liste entre
parenthèses.
Exp1 LIKE exp2 teste l'égalité de deux chaînes en tenant compte des caractères jokers dans
La 2ème chaîne : ‘‘_‘’ remplace 1 caractère exactement ‘’%’’ remplace une chaîne de caractères
de longueur quelconque, y compris de longueur nulle
Le fonctionnement est le même que celui des caractères joker ? et * pour le shell sous Unix. Ainsi
l'expression 'MARTIN' LIKE '_AR%' sera vraie.
Les opérateurs logiques AND et OR peuvent être utilisés pour combiner plusieurs prédicats
(l'opérateur AND est prioritaire par rapport à l'opérateur OR). Des parenthèses peuvent être utilisées
pour imposer une priorité dans l'évaluation du prédicat, ou simplement pour rendre plus claire
l'expression logique. L’opérateur NOT placé devant un prédicat en inverse le sens.
Une caractéristique puissante de SQL est la possibilité qu'un prédicat employé dans une clause
WHERE (expression à droite d'un opérateur de comparaison) comporte un SELECT emboîté.
Par exemple, la sélection des employés ayant même poste que MARTIN peut s'écrire en joignant
la table EMP avec elle-même :
Exemple :
SELECT [Link]
FROM EMP JOIN EMP MARTIN ON [Link] = [Link]
WHERE [Link] = 'MARTIN'
Exemple :
SELECT NOME FROM EMP
WHERE POSTE = (SELECT POSTE
FROM EMP
WHERE NOME = 'MARTIN')
où op est un des opérateurs = != < > <= >= exp est toute expression légale.
Exemple :
Liste des employés travaillant dans le même département que MERCIER
Syntaxe :
WHERE exp op (SELECT ...)
Exemple :
SELECT NOME FROM EMP
Exemple :
WHERE NOME = 'MERCIER')
Exemple : Liste des employés ayant même poste que MERCIER ou un salaire
supérieur à CHATEL :
Exemple :
SELECT NOME, POSTE
FROM EMP JOIN DEPT ON [Link] = [Link]
WHERE LIEU = 'LYON'
AND POSTE = (SELECT POSTE FROM EMP
WHERE NOME = 'FREMONT')
Exemple : Liste des employés travaillant à LYON et ayant même poste que
FREMONT.
Attention :
une sous-interrogation à une seule ligne doit ramener une
Seule ligne ; dans le cas où plusieurs lignes, ou pas de ligne du tout seraient
ramenées, un message d'erreur sera affiché et l'interrogation sera abandonnée.
l'opérateur IN les opérateurs obtenus en ajoutant ANY ou ALL à la suite des opérateurs
de comparaison classique =, !=, <, >, <=, >=.ANY : la comparaison sera vraie si elle est vraie pour
au moins un élément de l'ensemble (elle est donc fausse si l'ensemble est vide).
ALL : la comparaison sera vraie si elle est vraie pour tous les éléments de l'ensemble (elle est vraie
si l'ensemble est vide).
Exemple :
WHERE exp op ANY (SELECT ...)
WHERE exp op ALL (SELECT ...)
WHERE exp IN (SELECT ...)
WHERE exp NOT IN (SELECT ...)
Exemple :
Liste des employés gagnant plus que tous les employés du département 30 :
Remarque :
L'opérateur IN est équivalent à = ANY, et l'opérateur NOT IN est équivalent
à != ALL.
1. Le prédicat ALL
Si vous n'incluez aucun prédicat, le moteur de base de données Microsoft Jet sélectionne tous les
enregistrements qui remplissent les conditions de l'instruction SQL. Les deux exemples suivants sont
équivalents et renvoient tous les enregistrements de la table Employés :
Omet tous les enregistrements pour lesquels les champs sélectionnés contiennent des données
en double. Ainsi, pour être incluses dans les résultats de la requête, les valeurs de chaque champ
répertorié dans l'instruction SELECT doivent être uniques. Par exemple, plusieurs employés
répertoriés dans une table Employés peuvent avoir le même nom. Si deux enregistrements
contiennent Durand dans le champ "Nom", l'instruction SQL suivante ne renvoie alors qu'un seul de
ces enregistrements :
Omet les données sur la base des enregistrements complets en double, et pas seulement de
champs en double. Par exemple, vous pouvez créer une requête qui joint les tables Clients et
Commandes à l'aide du champ "Code client". La table Clients
ne contient aucun doublon dans le champ "Code client", mais la table Commandes en contient car
chaque client passe plusieurs commandes. L'instruction SQL suivante montre comment utiliser
DISTINCTROW pour produire une liste de sociétés qui ont passé au moins une commande, sans
afficher le détail de ces commandes :
Exemple :
SELECT DISTINCTROW Société
FROM Clients INNER JOIN Commandes
ON Clients.[Code client]= Commandes.[Code client]
ORDER BY Société;
Si vous omettez DISTINCTROW, cette requête produit plusieurs lignes pour chaque société ayant
passé plusieurs commandes. DISTINCTROW n'a d'effet que si vous sélectionnez des champs dans
seulement certaines des tables utilisées dans la requête. DISTINCTROW est ignoré si votre requête
n'inclut qu'une seule table ou si vous sélectionnez les champs de toutes les tables.
Renvoie un certain nombre d'enregistrements situés au début ou à la fin d'une plage spécifiée par
une clause ORDER BY. Supposons que vous souhaitiez obtenir les noms des 25 premiers étudiants de
la promotion 1996 :
Exemple :
SELECT TOP 25 Nom, Prénom
FROM Etudiants
WHERE Promotion = 1996
ORDER BY Moyenne DESC;
Si vous n'incluez pas la clause ORDER BY, la requête renverra une série de 25 enregistrements
choisis arbitrairement parmi ceux de la table Students qui remplissent les conditions de la clause
WHERE. Le prédicat TOP n'effectue pas de choix entre des valeurs égales. Dans l'exemple précédent,
si, parmi les meilleurs résultats obtenus, le vingt-cinquième et le vingt-sixième ont obtenu la même
moyenne, la requête renvoie 26 enregistrements. Vous pouvez également utiliser le mot réservé
PERCENT pour renvoyer un certain pourcentage des premiers ou derniers enregistrements d'une
plage spécifiée par la clause ORDER BY. Supposons qu'au lieu des 25 meilleurs étudiants, vous
souhaitiez sélectionner 10 pour cent de la promotion :
Exemple :
SELECT TOP 10 PERCENT
Nom, Prénom
FROM Etudiants
WHERE Promotion = 1994
ORDER BY Moyenne ASC;
Le prédicat ASC donne des valeurs croissantes. La valeur qui suit TOP doit être un entier non
signé. TOP n'affecte pas les possibilités de mise à jour de la requête
Dans les exemples précédents, la sous-interrogation pouvait être évaluée d'abord, puis le résultat
utilisé pour exécuter l'interrogation principale. SQL sait également traiter une sous-interrogation
faisant référence à une colonne de la table de l'interrogation principale.
Le traitement dans ce cas est plus complexe car il faut évaluer la sous interrogation pour chaque
ligne de l'interrogation principale.
Exemple :
Il a fallu renommer la table EMP de l'interrogation principale pour pouvoir la référencer dans la
sous-interrogation.
Il est possible de comparer le résultat d'un SELECT ramenant plusieurs colonnes à une liste des
colonnes. La liste de colonnes figurera entre parenthèses à gauche de l'opérateur de comparaison.
Syntaxe :
WHERE (exp, exp,...) op (SELECT ...)
Avec plusieurs lignes sélectionnées :
où op est un des opérateurs = ou <> Les expressions _gurant dans la liste entre parenthèses
seront comparées à celles qui sont ramenées par le SELECT.
Exemple :
Employés ayant même poste et même salaire que MERCIER :
On peut utiliser ce type de sous-interrogation pour retrouver les lignes qui correspondent à des
optima sur certains critères pour des regroupements de lignes (voir dernier exemple des exemples
La clause EXISTS est suivie d'une sous-interrogation entre parenthèses, et prend la valeur vrai
s'il existe au moins une ligne satisfaisant les conditions de la sous-interrogation.
Exemple :
SELECT NOMD FROM DEPT
WHERE EXISTS (SELECT NULL FROM EMP
WHERE DEPT = [Link] AND SAL > 10000);
Cette interrogation liste le nom des départements qui ont au moins un employé ayant plus
de 10.000 comme salaire ; pour chaque ligne de DEPT la sous-interrogation synchronisée
est exécutée et si au moins
une ligne est trouvée dans la table EMP, EXISTS prend la valeur vrai et la ligne de DEPT
satisfait les critères de l'interrogation.
Remarque :
Il faut se méfier lorsque l'on utilise EXISTS en présence de valeurs NULL. Si
on veut par exemple les employés qui ont la plus grande commission par la
requête suivante,
NOT EXISTS permet de spécifier des prédicats où le mot « tous » intervient dans un
sens comparable à celui de l'exemple. Elle permet d'obtenir la division de deux relations.
Exemple : 1
select A from R R1
where not exists
(select C from S
where not exists
(select A, B from R
where A = R1.A and B = S.C))
En fait, on peut remplacer les colonnes des selects placés derrière des « not Exists » par ce que
l'on veut, puisque seule l'existence ou non d'une ligne compte. On peut écrire par exemple :
Exemple : 2
select A from R R1
where not exists
(select null from S
where not exists
(select null from R
where A = R1.A and B = S.C))
On arrive souvent à optimiser ce type de select en utilisant les spécificités du cas, le plus
souvent en simplifiant le select externe en remplaçant une jointure de tables par une seule
table.
Exemple : 3
SELECT DEPT
FROM PARTICIPATION NATURAL JOIN EMP E1
WHERE NOT EXISTS
(SELECT CODEP FROM PROJET
WHERE NOT EXISTS
(SELECT DEPT, CODEP
FROM PARTICIPATION NATURAL JOIN EMP
WHERE DEPT = [Link]
AND CODEP = [Link]))
Remarque 4.10
Remarque : 1
Il faudrait ajouter DISTINCT dans le premier select pour éviter les doublons.
Sur ce cas particulier on voit qu'il est inutile de travailler sur la jointure
de PARTICIPATION et de EMP pour le SELECT externe. On
peut travailler sur la table DEPT. Il en est de même sur tous les cas
où la table « R» est une jointure. D'après cette remarque, le SELECT
précédent devient :
SELECT DEPT FROM DEPT
WHERE NOT EXISTS
(SELECT CODEP FROM PROJET
WHERE NOT EXISTS
(SELECT DEPT, CODEP
FROM PARTICIPATION NATURAL JOIN EMP
WHERE DEPT = [Link]
AND CODEP = [Link]))
Remarque : 2
Dans le cas où il est certain que la table dividende (celle qui est divisée
ne contient dans la colonne qui sert pour la division que des valeurs qui
existent dans la table diviseur, on peut exprimer la division en utilisant
les regroupements (étudiés dans la prochaine section) et en comptant
les lignes regroupées. Pour l'exemple des départements qui participent
à tous les projets, on obtient :
select dept
from emp natural join participation
group by dept
Traduction : si le nombre des codeP associés à un département donné est égal au nombre des
tous les codeP possibles, ça signifie que ce département est associé à tous les départements. Ici on a
bien le résultat cherché car les codeP du select sont nécessairement des codeP de la table des
projets (clé étrangère de PARTICIPATION qui référence la clé primaire de la table PROJET). Si un
ensemble A est inclus dans un ensemble B et si A a le même nombre d'éléments que B,
c'est que A =B.
Mais il ne faut pas oublier que dans des requêtes complexes les données qui interviennent dans
les divisions peuvent provenir de requêtes emboîtées. Il n'y a alors pas nécessairement de
contraintes de référence comme dans l'exemple traité ici (contrainte qui impose que codeP doit
nécessairement correspondre à un codeP dans la table Projet). Si on n'a pas A _ B, le fait que A et B
aient le même nombre d'éléments ne signifie pas que A = B.
S'il peut y avoir dans la colonne qui sert pour la division des valeur qui n'existent pas dans la table
diviseur, la requête est légèrement plus complexe :
select dept
from emp natural join participation
where codeP in
(select codeP from projet)
group by dept
having count(distinct codeP) =
(select count(distinct codeP) from projet)
Les fonctions de groupes peuvent apparaître dans le Select ou le Having ; ce sont les fonctions
suivantes :
AVG moyenne
SUM somme
MIN plus petite des valeurs
MAX plus grande des valeurs
VARIANCE variance
STDDEV écart type (déviation standard)
COUNT(*) nombre de lignes
Exemple :
(a) SELECT COUNT(*) FROM EMP
(b) SELECT SUM(COMM) FROM EMP WHERE DEPT = 10
Les valeurs NULL sont ignorées par les fonctions de groupe. Ainsi, SUM(col) est la somme des
valeurs qui ne sont pas égales à NULL de la colonne 'col'.
De même, AVG est la somme des valeurs non NULL divisée par le nombre de valeurs non NULL.
Il faut remarquer qu'à un niveau de profondeur (relativement aux sous interrogations), d'un
SELECT, les fonctions de groupe et les colonnes doivent être toutes du même niveau de
regroupement. Par exemple, si on veut le nom et le salaire des employés qui gagnent le plus dans
l'entreprise, la requête suivante provoquera une erreur :
Attention :
SELECT NOME, SAL FROM EMP
WHERE SAL = MAX(SAL)
Il faut une sous-interrogation car MAX(SAL) n'est pas au même niveau de regroupement que le
simple SAL :
Clause GROUP BY
Il est possible de subdiviser la table en groupes, chaque groupe étant l'ensemble des lignes ayant
une valeur commune.
Syntaxe :
GROUP BY exp1, exp2,...
même valeur. Cette clause se place juste après la clause WHERE, ou après
Des lignes peuvent être éliminées avant que le groupe ne soit formé grâce
à la clause WHERE.
Exemple :
(a) SELECT DEPT, COUNT(*) FROM EMP
GROUP BY DEPT
RESTRICTION :
Une expression d'un SELECT avec clause GROUP BY ne peut évidemment que
correspondre à une caractéristique de groupe. SQL n'est pas très « intelligent » pour
comprendre ce qu'est une caractéristique de groupe ; une expression du SELECT ne peut
être que :
L'ordre suivant est invalide car NOMD n'est pas une expression du GROUP BY :
Clause HAVING
Exemple :
SELECT DEPT, COUNT (*)
FROM EMP
WHERE POSTE = 'SECRETAIRE'
GROUP BY DEPT HAVING COUNT(*) > 1
On peut évidemment combiner toutes les clauses, des jointures et des Sous-
interrogations. La requête suivante donne le nom du département (et son nombre de
secrétaires) qui a le plus de secrétaires :
1. Exercice d’application
1- La requête qui affiche le salaire moyen par département
2- La requête qui affiche les employés qui ont un salaire supérieur au salaire moyen de leur
département
3- La requête qui affiche les départements qui ont pour salaire moyen supérieur au salaire
moyen de tous les employés
2. Reponses
IV. Fonctions
Nous allons décrire ci-dessous les principales fonctions disponibles dansOracle. Il faut remarquer
que ces fonctions ne sont pas standardisées et ne Sont pas toutes disponibles dans les autres SGBD;
elles peuvent aussi avoir Une syntaxe différente, ou même un autre nom.
A. Fonctions arithmétiques
Exemple :
select '4 a la puissance 2 est :' + convert(nvarchar(10),POWER(2,4))
LENGTH (chaîne) :
SUBSTRING :
UPPER :
LOWER :
LTRIM :
LTRIM (chaîne)
Renvoie une chaîne de caractères après avoir supprimé les espaces de début.
RTRIM (chaîne)
Retourne la partie de gauche d'une chaîne de caractères avec le nombre spécifié de caractères.
Renvoie la partie d'une expression de caractères qui commence et se situe à droite d'une position
de caractère spécifiée à partir de la droite.
REPLACE :
Renvoie une expression de caractères après le remplacement d'une chaîne de caractères située
dans l'expression par une autre chaîne de caractères ou une chaîne vide
DATEADD :
Renvoie une nouvelle valeur DT_DBTIMESTAMP après l'ajout d'un nombre qui représente un
intervalle de date ou d'heure à la partie de date spécifiée d'une date. Le paramètre numérique doit
DATEADD("Month", 1,GETDATE())
DATEDIFF :
Renvoie le nombre de limites de date et d'heure traversées entre deux dates données. Le paramètre
datepart identifie quelles limites de date et d'heure il faut comparer.
Le tableau suivant décrit les parties de date et les abréviations reconnues par l'évaluateur
d'expression.
Jour dd, d
Semaine wk, ww
Heure Hh
Minute mi, n
Seconde ss, s
Milliseconde Ms
Exemple :
La difference entre la date ‘8/1/2003’ ET LA DATE actuelle
07/12/2009
select GETDATE()
SELECT DATEDIFF(mm, '8/1/2003',GETDATE())
Les transactions sont le mécanisme primaire par lequel vous pouvez par programmation veiller à
la cohérence des données. Lorsque vous débutez une transaction, toute modification de données
effectuée n’est, par défaut, visible que par votre [Link] autres connexions ne peuvent pas
voir votre modification. Elles doivent attendre que la transaction soit validée (la modification est
inscrite dans la base de données) ou annulée
, auquel cas les données retrouvent leur aspect antérieur au début de la transaction
Le processus fondamental à employer lors du travail avec les transactions est le suivant :
Vous validez une transaction et enregistrer les modifications à l’aide de la commande COMMIT
TRANSACTION ou l’annulez à l’aide de la commande ROLLBACK [Link] a tout moment
après le début de la transaction, vous détectez un problème, ROLLBACK transaction permet de
revenir aux données originales.
Exemple :
USE AdventureWorksDW2008;
GO
IF OBJECT_ID(N'TestTran',N'U') IS NOT NULL
DROP TABLE TestTran;
GO
CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb
CHAR(3));
GO
-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION transact1;
GO
PRINT N'nombre de transaction apés BEGIN transact1 = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
DECLARE @errors INT --On déclare une variable qui sera destiné à
accueillir nos erreurs
DECLARE @ID_INSERTION NUMERIC(19,0) -- On déclare une variable
numérique destinée à contenir l'id inséré
Bon, c'est bien beau, vous me direz, on voit les erreurs, mais en cas d'erreurs notre
base est toujours incohérente. Bien, ca prouve que vous suivez. Une astuce pour cela est
de déclarer notre variable @errors à 1, comme ça, si à la fin de l'exécution des requêtes,
elle n'est plus à un, on sait qu'il y a eu une erreur et on peut faire quelque chose.
--Vos requêtes
Travaux pratiques
Client Compte
CodeCl numCompte
nom #codeCl
prenom sole
date Ouverture
[Link]
[Link]
[Link]/tutoriel/ms-
sql/securiser