Académique Documents
Professionnel Documents
Culture Documents
LE LANGAGE SQL
Structured Query Language
Dialecte Oracle
Références :
<contrainte_type> ::=
UNIQUE <attribut>+
::=
FOREIGN KEY (<colonne référençante>+)]
REFERENCES <table référencée> [<colonne
référencée>][ON DELETE CASCADE]|[ON DELETE SET NULL]
::= CHECK <condition>
Les noms des tables, des colonnes et des contraintes doivent commencer par une lettre et faire de 1
à 30 caractères de long. Ils ne doivent contenir que les caractères A-Z, a-z, 0-9, _ (souligné), $,
et # (caractères autorisés mais leur utilisation est déconseillée).
Le nom ne doit pas déjà être utilisé par un autre objet appartenant au même utilisateur du serveur
Oracle. Le nom ne doit pas être un mot réservé de SQL.
Type Description
DATE Date et heure comprise entre le 1er janvier 4712 Av. J.-C. et le 31
décembre 9999 Ap. J.-C. le serveur Oracle stocke les dates dans des
champs de longueur fixe de sept octets. Une date Oracle contient
toujours l’heure.
ROWID Système numérique en base 64 représentant l’adresse unique d’une ligne dans
sa table.
▪ Un ROWID n’est pas enregistré explicitement sous la forme d’une valeur de colonne.
▪ Un ROWID est stocké dans un index définissant des lignes ayant des valeurs de clé
spécifiques.
▪ Un ROWID permet de localiser n’importe quelle ligne dans une base de données.
Pilote Pilote_PK
1 …. AAABQMAAA 1
5 …. AAABQMAAA 5
6 …. AAABQMAAA 6
….
Les tables sont par défaut créées dans le tablespace par défaut du propriétaire du schéma contenant
la table sinon dans le tablespace par défaut de la base.
Il est possible d’associer une table à un tablespace. Il est conseillé de placer les tables dans des
tablespaces distincts (…).
Exemple :
Les tablespaces sont créés par l’administrateur. Ce dernier accorde les quotas des tablespaces aux
différents utilisateurs.
Vous disposez de trois méthodes principales pour garantir l’intégrité des données :
• Le code application.
• Les déclencheurs de base de données ou triggers.
• Les contraintes d’intégrité déclaratives.
Les contraintes d’intégrité devraient être renforcées par le serveur de la base de données ou
l’application. On peut utiliser les contraintes pour :
- Contrôler les règles au niveau de la table dès qu’une ligne est insérée, mise à jour ou
supprimée. La contrainte doit être satisfaite pour que l’opération s’effectue.
- Empêcher la suppression d’une table s’il y a des dépendances avec d’autres tables.
- Les récupérer dans des outils Oracle, comme Developper/2000.
On dispose de cinq types de contraintes déclaratives dont nous rappelons la syntaxe de déclaration
Contrainte UNIQUE :
- Désigne la ou les colonnes pour lesquels il ne pourra pas y avoir 2 lignes ayant la même
valeur pour cette clé
- Autorise les valeurs NULL si la contrainte UNIQUE ne porte que sur une seule colonne.
- Définie au niveau table ou colonne.
- Crée automatiquement un index UNIQUE.
- Une contrainte UNIQUE n’équivaut pas à une contrainte PRIMARY KEY.
ON DELETE CASCADE indique que quand une ligne de la table parent est supprimée, les lignes
dépendantes dans la table enfant le sont aussi.
Sans l’option ON DELETE CASCADE, la ligne de la table parent ne peut pas être supprimée si
des lignes de la table enfant y font référence.
ON DELETE SET NULL affecte la valeur NULL aux clés étrangères lorsque la valeur parent est
supprimée.
Contrainte CHECK :
Définit une condition que chaque ligne doit respecter. Cette contrainte est définie soit au niveau
table soit au niveau colonne.
Expressions interdites :
- références aux pseudo-colonnes CURRVAL, NEXTVAL, LEVEL ou ROWNUM
- appels aux fonctions SYSDATE, UID, USER ou USERENV
- références à d’autres valeurs dans d’autres lignes
Toutes les contraintes sont stockées dans le dictionnaire des données. Les contraintes sont faciles à
référencer si vous leur donnez un nom significatif. Si vous ne nommez pas votre contrainte, Oracle
génère un nom avec le format SYS_Cn, où n est un nombre entier pour créer un nom de contrainte
unique.
Nous rappelons qu’il existe deux niveaux de contraintes : les contraintes colonnes et les contraintes
tables.
Les contraintes tables ne permettent pas de définir des contraintes NOT NULL. Par contre elles
permettent de définir des contraintes sur plusieurs colonnes.
Les contraintes sont habituellement créées en même temps que la table. Des contraintes peuvent
être ajoutées, ou désactivées temporairement après la création de la table par la commande ALTER
TABLE.
La seconde méthode pour créer une table consiste à utiliser la clause AS sous-requête, à la fois pour
créer une table et en même temps la charger à partir des lignes ramenées par la requête.
La table sera créée avec les noms de colonnes spécifiés, les lignes ramenées par le SELECT seront
automatiquement insérées dans la table.
Exemple :
La définition d’une colonne peut seulement contenir son nom, une valeur par défaut, et certaines
contraintes d’intégrité. Elle ne peut pas spécifier le type de données ou une contrainte d’intégrité
référentielle.
Enfin, le nombre de colonnes doit correspondre au nombre de colonnes ramenées en projection par
le SELECT.
Les colonnes de la nouvelle table auront pour nom celui des colonnes ramenées par la requête et
hériteront seulement de la contrainte NOT NULL des colonnes de la table interrogée.
Les tables peuvent être créées à n’importe quel moment. Sa structure peut être modifiée ‘on line’.
Conditions d’ajouts :
- Si la table contient déjà des lignes, à l’ajout d’une nouvelle colonne, toutes les valeurs de
cette nouvelle colonne prendront la valeur NULL.
- Il n’est pas possible de spécifier l’emplacement de la nouvelle colonne. Celle-ci apparaît
automatiquement en dernière position de la structure de la table.
On ne peut pas modifier ou supprimer une colonne si elle est présente dans une vue, si elle sert dans
un index ou si une contrainte y fait référence.
La suppression d’une colonne dans une table volumineuse prend énormément de temps.
L’option CASCADE CONSTRAINTS est requise s’il s’agit d’une colonne parent d’une relation de clé
étrangère.
L’option SET UNUSED permet d’identifier une ou plusieurs colonnes comme non utilisées.
Ces colonnes sont supprimées logiquement pour être éventuellement supprimés physiquement plus
tard quand l’activité du système est faible.
Si vous marquez deux ou plusieurs colonnes comme non utilisées avant de les supprimer, les lignes
de la table ne seront mis à jour qu’une seule fois.
Les données des colonnes non utilisées ne sont plus accessibles par les interrogations SELECT et
notamment par la commande SELECT *.
La commande DESCRIBE ne permettra pas d’afficher le nom et le type des colonnes identifiées
comme non utilisées. Et vous pouvez ajouter à la table une colonne portant le même non qu’une
colonne non utilisée.
L’utilisateur peut ajouter une colonne portant le nom d’une colonne non utilisée.
Les informations relatives à l’option SET UNUSED sont stockées dans la vue du dictionnaire
USER_UNUSED_COL_TABS.
Il est possible d’ajouter ou de supprimer des contraintes sur des tables existantes. Il n’est par contre
pas possible de modifier une contrainte existante.
Dans la syntaxe, le nom de la contrainte est optionnel mais recommandé. Si la contrainte n’est pas
nommée, le système lui affectera systématiquement un nom.
Quand vous supprimez une contrainte d’intégrité, cette contrainte n’est plus vérifiée par le serveur
Oracle et n’existe plus dans le dictionnaire de données.
Pour pouvoir supprimer une contrainte il faut d’abord retrouver son nom. Ceci est possible en
utilisant les vues USER_CONSTRAINTS et USER_CONS_COLUMNS du dictionnaire de données. Puis
supprimer la contrainte par la commande ALTER TABLE avec la clause DROP.
Règles :
- A l’activation d’une contrainte, les données concernées dans la table sont validées.
- L’activation d’une contrainte UNIQUE ou PRIMARY KEY, crée automatiquement un index
UNIQUE ou PRIMARY KEY.
- Les clauses ENABLE et DISABLE sont aussi utilisables dans la commande CREATE TABLE.
- L’option CASCADE CONSTRAINTS inhibe les contraintes dépendantes.
Une contrainte d’intégrité peut être activée ( ENABLE) ou désactivée (DISABLE). Si elle est activée,
les données sont contrôlées à leur entrée ou à leur mise à jour dans la base. Les données qui ne
répondent pas à la règle de la contrainte sont refoulées. Si la contrainte est désactivée il est possible
d’entrer des données non conformes dans la base.
Règles :
- La table est supprimée et l’espace de stockage qu’elle utilise est libéré.
- Les vues, synonymes, procédures, fonctions ou packages stockés restent, mais sont
invalides.
- La transaction courante est validée.
- Seul le propriétaire ou l’utilisateur ayant le privilège DROP ANY TABLE peut supprimer
une table.
- CASCADE CONSTRAINT permet de supprimer en même temps les contraintes d’intégrité
référentielles dépendantes.
La commande TRUNCATE TABLE est utilisée pour supprimer toutes les lignes d’une table et libérer
l’espace de stockage utilisé par cette table. Elle vide également les indexes correspondants. Lors de
la prochaine insertion de nouvelles lignes dans la table, le serveur Oracle reprend les conditions de
stockage adoptées lors de la création de la table.
Seul le propriétaire de la table ou l’utilisateur ayant le privilège système DELETE TABLE peut
tronquer une table.
Si la table est le parent d’une contrainte d’intégrité référentielle, vous ne pouvez pas la vider. Il faut
tout d’abord désactiver la contrainte.
La commande DELETE permet aussi de supprimer les lignes d’une table, mais ne libère pas l’espace
de stockage utilisé par cette table.
La commande RENAME est utilisée pour renommer une table, vue, séquence ou synonyme.
La commande COMMENT permet d’ajouter un commentaire de 2000 octets au maximum sur une
colonne, table ou vue. Le commentaire est stocké dans le dictionnaire de données.
Avec le concept de vue on peut cataloguer un ordre SELECT sous un nom dans le dictionnaire de
données et « faire croire que c’est une table ».
Une vue ne contient pas de données, c’est un peu comme une fenêtre au travers de laquelle on peut
visualiser et modifier les données des tables.
Ainsi, une vue est une table logique basée sur une table ou une autre vue.
Exemple :
CREATE VIEW VOL_TUNIS
AS SELECT *
FROM VOL
WHERE UPPER(VILLEDEP) = ‘TUNIS’
La vue est calculée dynamiquement à chaque exécution d’une requête qui y fait référence.
La requête suivante affiche les données de la vue avec un ordre SELECT :
SELECT *
FROM VOL_TUNIS
ORDER BY VOLNUM
La clause WITH CHECK OPTION assure qu’à chaque utilisation de la vue (en modification ou en
suppression), le critère de sélection de la clause WHERE est vérifié.
La clause WCO précise que les opérations d’insertion (INSERT) et de mise à jour (UPDATE)
exécutées dans une vue n’autorisent pas la création de lignes que la vue ne peut pas sélectionner par
conséquent elle permet d’appliquer des contrôles de validation sur les données à insérer ou à mettre
à jour.
Nous vérifions qu’il n’y a pas de définition d’intégrité au niveau d’une vue (on ne parle pas
d’intégrité de vue mais d’intégrité de relation de base).
Pour faire une mise à jour sur une vue, il doit être possible de propager la mise à jour sur les tables
de base ou tables sources. Une vue qui ne respecte pas ces critères est dite en lecture seule.
Les ordres INSERT, DELETE et UPDATE ne peuvent s’appliquer qu’à une vue n’utilisant qu’une
seule table en respectant les trois règles suivantes.
1) Il est possible de supprimer une ligne au travers d’une vue sauf si elle a été construite à
partir d’un des éléments suivants :
- jointure
- fonctions de groupe
- clause GROUP BY ou HAVING
- option DISTINCT ou une function sur colonne
- la pseudo colonne ROWNUM
- les opérateurs ensemblistes INTERSECT, UNION, EXCEPT.
3) Il est possible d’insérer des données au travers d’une vue sauf si elle est basée sur l’un des
éléments cités ci-dessus ou si l’une des colonnes NOT NULL de la table de base n’est pas
ramenée par la vue. Toutes les colonnes obligatoires doivent être présentes dans la vue.
Un des moyens les plus fréquents utilisés pour résoudre les problèmes de mise à jour sur les vues
consiste à utiliser les procédures stockées. Ces procédures sont généralement écrites en PL/SQL et
enregistrées sur le serveur et regroupant plusieurs opérations de base. On utilise ainsi les vues pour
les sélections et la procédure stockées pour les mises à jour.
Il est possible de vérifier le nom et la définition des ordres SELECT associés aux vues en
interrogeant la vue USER_VIEWS du dictionnaire de données.
USER_VIEWS ( VIEW_NAME,
TEXT_LENGTH,
TEXT
)
« Afficher le nom et la description de toutes les vues qui appartiennent à l’utilisateur courant. »
Seul le propriétaire ou les utilisateurs ayant le privilège DROP ANY VIEW ont le droit de
supprimer une vue.
Vue en ligne
Une vue en ligne est une sous-interrogation intégrant un alias (ou nom de corrélation) que vous
pouvez utiliser dans une instruction SQL.
Une sous-interrogation nommée, contenue dans la clause FROM de l’interrogation principale est un
exemple de vue en ligne.
Le texte de cette requête est « Nom et salaire des pilotes gagnant moins que le salaire maximum des
pilotes de leur ville ».
La requête suivante « Quels sont les 5 premiers pilotes les mieux payés? »
Les séquences
Une séquence peut être utilisée pour générer des numéros séquentiels à insérer dans les lignes d’une
table.
Une séquence est un objet de la base de données créée par un utilisateur et peut être partagée entre
plusieurs utilisateurs.
L’utilisation classique des séquences est de produire les valeurs d’une clé primaire, qui doit être
différente pour chaque ligne. Le numéro est généré et incrémenté ou décrémenté par une routine
interne de Oracle. Cet objet peut vous permettre de gagner du temps étant donné qu’il ne nécessite
aucune programmation pour l’utilisateur.
Les numéros de séquence sont stockés et générés indépendamment des tables. Ainsi, la même
séquence peut être utilisée par plusieurs tables.
Ne pas utiliser CYCLE si la séquence est utilisée pour générer des valeurs de clés primaires.
USER_SEQUENCES ( SEQUENCE_NAME,
MIN_VALUE,
MAX_VALUE,
INCREMENT_BY,
LAST_NUMBER
)
« Créer la séquence PILOTE_ID qui sera utilisée pour renseigner la colonne PLNUM de la table
PILOTE. Faire commencer la séquence par le numéro 51 sans cache ni cycle. »
Une fois la séquence créée, vous pouvez l’utiliser pour générer des numéros séquentiels dans vos
tables. Les valeurs générées par la séquence sont référencées au travers de deux pseudo-colonnes :
NEXTVAL et CURRVAL.
Dès que vous référencez séquence.NEXTVAL, un nouveau numéro de séquence est généré et le
numéro de séquence courant est placé dans CURRVAL.
Les numéros de séquence peuvent être montés en mémoire cache pour avoir un accès plus rapide.
C’est au premier appel de la séquence que les numéros sont montés en mémoire. Chaque demande
de la valeur suivante de la séquence est recherchée en mémoire. Dès que tous les numéros sont
utilisés, c’est l’appel de la valeur suivante qui provoquera la montée en mémoire cache d’une autre
série de numéros.
Les séquences sont indépendantes des COMMIT et des ROLLBACK. Ainsi, si vous faites un
ROLLBACK par exemple sur un INSERT dans lequel vous avez utilisé une séquence, la ligne insérée
sera bien annulée mais le numéro de séquence sera perdu.
Un problème système, peut également provoquer des « trous » dans la séquence. Si l’option CACHE
a été utilisée, en cas de problème système toutes les valeurs présentes en mémoire cache seront
perdues.
Les séquences ne sont pas directement liées aux tables dans lesquels elles sont utilisées, la même
séquence peut donc être utilisée pour renseigner plusieurs tables. Si vous l’utilisez de cette façon,
chaque table pourra avoir des « trous » dans les numéros de séquence.
Il est possible de visualiser le prochain numéro de séquence disponible sans pour autant la faire
avancer, à condition d’avoir créé la séquence avec l’option NOCACHE, en interrogeant la vue
USER_SEQUENCES.
SELECT LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = ‘PILOTE_ID’.
Si vous atteignez la limite maximum (MAXVALUE) de la séquence, aucune autre valeur ne pourra
être attribuée et vous recevrez un message indiquant que la séquence ne peut dépasser MAXVALUE.
Pour pouvoir continuer à utiliser la séquence vous pouvez en modifier les caractéristiques en
utilisant la commande ALTER SEQUENCE.
Pour supprimer une séquence du dictionnaire de données, vous devez être propriétaire ou avoir le
privilège DROP ANY SEQUENCE.
Les indexs
Les objets décrits précédemment suffisent théoriquement à l’élaboration d’une base de données.
Néanmoins, en pratique il est nécessaire de disposer de méthodes d’accès efficaces.
Trois méthodes principales sont utilisées pour retrouver les données sous Oracle :
- Balayage complet de la table.
- Recherche à travers un index puis accès direct par adresse.
En cas d’absence d’index sur une colonne, la table est parcourue dans son intégralité.
Type d’index :
- Unique : garantit l’unicité des valeurs d’une colonne.
- Non-unique : accélère la recherche.
- Mono-colonne : il est composé d’une seule colonne.
Les types d’index ne sont pas mutuellement exclusifs. Par exemple, il est possible de créer un
index unique composé.
Création d’index
Beaucoup d’index sur une table n’optimise pas forcément les performances des requêtes. De plus,
chaque ordre du LMD validé demande une mise à jour des index associés à la table.
avec UNIQUE : précise si les valeurs des colonnes indexées sont uniques ou non.
asc/desc : précise si les valeurs de la colonne doivent être triées de façon
ascendante ou descendante.
- sur une colonne fréquemment utilisée telle que une clé primaire, une clé étrangère, un
attribut de jointure, critère de sélection dans un prédicat ;
- sur une colonne contenant un nombre important de valeurs distincts ;
- sur une colonne contenant beaucoup de NULL ;
- sur deux ou plusieurs colonnes utilisées simultanément dans un prédicat ou pour réaliser
une jointure ;
- sur une table importante où la plupart des requêtes ramènent moins de 10 à 15% des lignes
de la table.
L’index doit être judicieusement choisi au regard des analyseurs de requête. En général, il est
conseillé de ne pas créer plus de trois index par table.
Il est possible de vérifier l’existence des indexes partir de la vue USER_INDEXES du dictionnaire de
données.
Pour vérifier les colonnes participant à l’index, il faut interroger la vue USER_IND_COLUMNS.
Seul le propriétaire ou les utilisateurs ayant le privilège DROP ANY INDEX ont le droit de
supprimer un index.
Le langage de manipulation de données (LMD) est une partie essentielle du langage SQL. Pour
ajouter, modifier ou supprimer des données dans la base, vous utiliserez une commande du LMD.
Un ensemble d’instructions du LMD que vous n’avez pas encore validées est appelé transaction, ou
unité logique de travail.
Il est possible de définir une instruction de sélection générique en employant des variables de
substitution.
Il est possible d’exécuter autant de fois cette instruction et fournir à chaque fois des valeurs
différentes.
Il est possible d’utiliser la commande INSERT pour ajouter des lignes dans une table dont les
valeurs proviennent d’une autre table.
Suppression de lignes
Tous les tuples seront supprimés si la condition WHERE n’est pas spécifiée.
Si vous essayez de supprimer une ligne contenant une clé primaire utilisée comme clé étrangère
dans une autre table, la contrainte d’intégrité provoquera une erreur.
Une transaction est un ensemble de modifications de la base qui forment un tout indivisible. Il faut
effectuer ces modifications entièrement ou pas du tout sous peine de laisser la base dans un état
incohérent.
Exemple :
Un transfert de fonds doit se traduire par le débit sur un compte et le crédit sur un autre
compte du même montant. Les deux actions doivent réussir ou échouer. Le crédit ne doit pas
être validé si le débit ne l’est pas.
Au cours d’une transaction l’utilisateur travaille sur une copie privée des tables qu’il modifie : ainsi
il est le seul à voir les modifications qu’il a effectuées. Pour rendre ces modifications effectuées
pour l’ensemble des utilisateurs il doit les valider.
Une transaction est soit validée soit annulée.
Une transaction est validée explicitement avec la commande COMMIT ou implicitement à la sortie
définitive par EXIT.
COMMIT
Termine la transaction en validant définitivement les données modifiées.
Une transaction est annulée explicitement par la commande ROLLBACK ou implicitement à la fin
anormale d’une tâche utilisateur.
ROLLBACK
Termine la transaction en annulant toutes les modifications effectuées non
encore validées. Un ROLLBACK automatique est déclenché sur une sortie anormale
de SQL*PLUS ou sur une erreur système.
SAVEPOINT nom :
Pose une étiquette dans la transaction courante.
Si vous posez une étiquette de même nom qu’une étiquette posée auparavant, cette dernière sera
supprimée.
La plupart des SGBD gèrent la majorité de leurs propres informations dans un catalogue de tables
appelé métabase ou dictionnaire de données.
Le dictionnaire de données est l’un des composants principaux du serveur Oracle. Il est constitué
d’un ensemble de tables et de vues utilisables seulement en lecture et qui contiennent toutes les
informations portant sur la base de données. Les tables du dictionnaire de données sont rarement
accédées directement en raison de la complexité des informations qui y sont stockées.
Habituellement l’utilisateur interroge le dictionnaire de données au travers de vues qui présentent
les informations sous une forme plus facile à utiliser.
La mise à jour du dictionnaire SGBD lui-même en fonction des requêtes de création ou de gestion
des droits que chaque utilisateur fait.
DICTIONARY : Donne toutes les tables, vues et synonymes du dictionnaire des données
accessibles par l’utilisateur.
TABLE_PRIVILEGES : Privilèges sur les objets pour lesquels l’utilisateur a reçu ou donné des droits
ou dont il est propriétaire.
IND : C’est un synonyme pour la vue USER_INDEXES.
Sous Oracle existe trois catégories de vues. Chaque catégorie a un préfixe particulier.
USER_… : Les vues commençant par ce préfixe, contiennent les objets appartenant à l’utilisateur.
Par exemple, les vues ayant ce préfixe permettent à l’utilisateur de visualiser les informations
concernant les tables qu’il a créés et les privilèges qu’il a octroyés :
USER_OBJECTS, USER_CONSTRAINTS, USER_COL_COMMENTS, USER_TABLE_COMMENTS,
USER_CONS_COLUMNS
ALL_… : Donnent des informations sur les objets sur lesquels l’utilisateur a reçu des droits d’accès
et sur ceux qui lui appartiennent.
ALL_COL_COMMENTS, ALL_TAB_COMMENTS.
DBA_… : Permettent aux utilisateurs ayant le privilège DBA de retrouver les informations concernant
tous les objets de la base de données.