Vous êtes sur la page 1sur 39

Chapitre 7 Langage SQL

I. Introduction
SQL (Structured Query Language, ou langage de requtes structures) est l'interface externe la plus rpandue pour grer une base de donnes. C'est un langage dclaratif dans le sens o il suffit d'exprimer ce que l'on veut obtenir, sans devoir expliquer la mthode pour y parvenir. Ainsi, les oprations directement utilisables par les usagers sont en gnral celles des langages dits assertionnels. Ces langages, btis sur l'algbre relationnelle, permettent de manipuler des bases de donnes relationnelles. Nous pouvons citer titre d'exemple : - QUEL (QUEry Language) par Zook en 1977 - QBE (Query By Example) par Zloof en 1977 - SQL (Structured Query Language) par IBM Aujourd'hui, le langage SQL est normalis et constitue le standard d'accs aux bases de donnes relationnelles. Les autres interfaces par menus, fentres, grilles ou de programmation type langage de 3me ou 4me gnration (L3G et L4G) sont le plus souvent offertes au-dessus du langage SQL. Celui-ci constitue donc le point d'entre des SGBD relationnels. Il a t normalis quatre reprises (ISO et ANSI sont des organismes chargs de la normalisation) : 1986 : SQL 86 - ANSI* 1989 : - ISO* et ANSI 1992 : SQL 2 - ISO et ANSI 1999 : SQL 3 - ISO

II. Prsentation de SQL


SQL est un langage de gestion de bases de donnes relationnelles. Il tend l'algbre relationnelle et permet : - de crer des bases de donnes - d'ajouter, modifier et consulter des donnes d'une base de donnes existante - de contrler les accs aux informations d'une BD SQL est un langage ensembliste qui : - respecte lindpendance des niveaux - garantit la scurit - permet une gestion multi-utilisateurs - utilise un dictionnaire - respecte les contraintes dintgrit - est portable (standardisation) SQL tend l'algbre relationnelle, cependant il utilise les termes table, ligne et colonne au lieu des termes relationnels relation, tuple et attribut. Une instruction SQL peut s'crire sur plusieurs lignes. Pour tre excute, l'instruction doit se terminer par un point-virgule. SQL est un langage de requte, pas un langage de programmation. Par consquent, il n'y pas de variables ni de structures de contrles (if, while, for). C'est pourquoi on peut ventuellement l'intgrer dans un langage de programmation comme PL/SQL, C ou Java.

III. Les 3 facettes de SQL


SQL se subdivise en 3 sous-langages : - LDD (Langage de Dfinition de Donnes) : cration, modification et suppression des objets que peut manipuler une BD (tables, vues et index, etc). - LMD (Langage de Manipulation de Donnes) : ajout, suppression, modification et extraction des donnes. - LCD (Langage de Contrle de Donnes) : scurisation et validation des donnes.

Base de donnes

37

Chacun de ces sous-langages propose ses mots-cls propres. Voici les principales primitives que nous verrons au cours de ce chapitre : LDD CREATE ALTER DROP LMD SELECT INSERT UPDATE DELETE LCD GRANT REVOKE COMMIT ROLLBACK

IV. Le Langage de Dfinition de Donnes (LDD)


Dfinition : Le langage de dfinition de donnes permet la dfinition du schma d'une base de donnes ainsi que certaines de ses contraintes d'intgrit. Il comporte galement les oprations de mise jour de schma telles que la suppression d'une table ou la modification de la dfinition d'une table. Le LDD est donc compos de 3 primitives : - CREATE pour la cration d'un objet (table, index, vue, etc). - ALTER pour la modification d'un objet. - DROP pour la suppression d'un objet.

1. Cration de table
La cration de table se fait grce au mot-cl CREATE TABLE. Chaque table est dfinie par : - son nom - sa liste d'attributs - sa liste de contraintes sur table Chaque attribut est dfini par : - son type - sa valeur par dfaut - sa liste des contraintes sur attribut Le type des attributs est choisir parmi un ensemble fini de types. Les principaux types possibles sont selon les standards: - VARCHAR2(n) : chane de caractres de longueur variable (maximum n) - CHAR(n) : chane de caractres de longueur fixe (n caractres) - NUMBER : nombre entier (40 chiffres au maximum) - NUMBER(n,m) : nombre entier de longueur totale n avec m dcimales - INTEGER : entier - FLOAT : rel - DATE : date (DD-MON-YY est le format par dfaut) - ... Syntaxe de dfinition d'une table en SQL
CREATE TABLE nom_table (attribut1 type1 [DEFAULT valeur_par_dfaut] [contrainte sur attribut1], , attributN typeN [DEFAULT valeur_par_dfaut] [contrainte sur attributN], CONSTRAINT contrainte1 sur relation), , CONSTRAINT contrainteM sur relation);

Base de donnes

38

Notation (les lments entre [ ] sont optionnels) : - Valeur_par_dfaut doit tre compatible avec le type de l'attribut. Elle peut prendre une des valeurs parmi : o constante o NULL Contrainte sur attribut dcrit les contraintes mono-attributs. Elle peut prendre une valeur parmi : o NOT NULL o UNIQUE o REFERENCES nom_de_relation2 (pour les cls trangres) o CHECK (expression logique) o PRIMARY KEY Les contraintes sur attribut restreignent les valeurs d'un attribut (ex : l'ge d'une personne attribut Age ne peut pas tre ngatif et ne dpasse pas 130 ans). Remarque : S'il y a plusieurs contraintes sur un attribut, elles sont spares par des virgules. Contrainte sur relation dcrit les contraintes multi-attributs. Elle peut prendre une valeur parmi : o UNIQUE (liste d'attributs) o PRIMARY KEY (liste d'attributs) o FOREIGN KEY (liste d'attributs) REFERENCES nom_de_relation2 (liste d'attributs) S'il y a plusieurs contraintes multi-attribut, elles sont spares par des virgules.

Les contraintes sur relation dfinissent des rgles smantiques entre plusieurs attributs. Il n'y a pas d'ordre dans la dfinition des attributs ou des contraintes sur relation. Les dfinitions d'attributs et de contraintes sont spares par des virgules. Chaque dfinition de relation se termine par un point-virgule. Il est recommand de donner des noms de contraintes explicites (aprs le mot cl CONSTRAINT) afin de retrouver plus facilement l'origine des erreurs qui pourront tre signales par le SGBD, suite des violations de ces contraintes. La signification des diffrents mots-cls (NULL, NOT NULL, UNIQUE,) est donne dans la suite du chapitre.

a. Rgles d'criture des contraintes


Les contraintes sur attribut (C/A) ou sur relation (C/R) doivent satisfaire les rgles d'criture suivantes : 1. 2. 3. La clause NOT NULL dans les C/A et la valeur par dfaut NULL sont incompatibles. Un attribut ne peut pas tre NULL et NOT NULL en mme temps. La clause UNIQUE (aussi bien dans les C/A que dans les C/R) ne peut tre spcifie que sur des attributs dclars NOT NULL. L'expression logique de la condition CHECK ne peut contenir que des prdicats de comparaison d'attributs avec des constantes. La comparaison avec d'autres attributs ou l'usage de fonctions ou de sous-requtes ne sont pas autoriss. Les attributs de la clause PRIMARY KEY doivent tre pralablement dclars avec la clause NOT NULL. Dans les contraintes de relation, les clauses FOREIGN KEY et REFERENCES doivent apparatre simultanment Les attributs de la clause FOREIGN KEY doivent correspondre soit des attributs dclars comme PRIMARY KEY dans une autre relation, soit des attributs dclars UNIQUE dans une autre table. La premire option correspond une contrainte rfrentielle avec la cl primaire, la seconde correspond une contrainte rfrentielle avec une cl candidate. Si les attributs de FOREIGN KEY correspondent une cl primaire dans une autre relation, la clause REFERENCES ne spcifie que le nom de cette dernire.

4. 5. 6.

7.

Base de donnes

39

8.

Si les attributs de FOREIGN KEY correspondent une cl candidate dans une autre relation, la clause REFERENCES doit mentionner le nom de cette relation ainsi que la liste des attributs composant la cl candidate. Les clauses PRIMARY KEY, UNIQUE et NOT NULL sont redondantes lorsqu'il n'y a qu'une cl par relation. L'une ou l'autre des clauses suffit la spcifier. Selon la clause utilise, il faut assurer la cohrence de la dfinition des contraintes rfrentielles en utilisant respectivement la rgle 7 ou la rgle 8.

9.

10. Il faut enfin noter que l'ordre des CREATE TABLE peut tre trs important par rapport aux contraintes : les tables rfrences doivent apparatre avant les tables rfrenantes.

b. Exemple
CREATE TABLE VOITURE ( Immatriculation VARCHAR(8), Marque VARCHAR(20), Couleur VARCHAR(15), Prix INTEGER CONSTRAINT C1 CHECK (Prix>=0), CONSTRAINT C2 PRIMARY KEY (Immatriculation) );

Cette instruction SQL cre la table VOITURE suivante : Immatriculation Texte Marque Texte Couleur Texte Prix Nombre

On aperoit qu'on a inclut une contrainte sur l'attribut Prix, savoir qu'un prix ne peut pas tre ngatif. On a galement indiqu que le numro d'immatriculation est la cl primaire de la relation VOITURE.
CREATE TABLE PERSONNE ( NumroSS INTEGER NOT NULL UNIQUE, Nom VARCHAR(30), Prnom VARCHAR(20), Adresse VARCHAR(80) );

Cette instruction SQL cre la table PERSONNE suivante : NumroSS Nombre Nom Texte Prnom Texte Adresse Texte

Ici, on a dclar la cl primaire NumroSS, d'une autre manire que prcdemment : dans la relation VOITURE, la cl primaire avait t dclare grce la contrainte de relation PRIMARY KEY alors qu'ici, nous l'avons dclare grce aux contraintes sur attribut NOT NULL et UNIQUE.

Base de donnes

40

CREATE TABLE ACHAT ( numImmatriculation VARCHAR(8), numPersonne INTEGER, dateAchat DATE, CONSTRAINT C3 PRIMARY KEY (numImmatriculation, numPersonne), CONSTRAINT C4 FOREIGN KEY (numImmatriculation) REFERENCES VOITURE(Immatriculation), CONSTRAINT C5 FOREIGN KEY (numPersonne) REFERENCES Personne(NumroSS) );

Cette instruction SQL cre la table ACHAT suivante : numImmatriculation Texte numPersonne Nombre dateAchat Date

Dans cette instruction, nous avons dclar dans la contrainte C3, la cl primaire (cl compose de numImmatriculation et numPersonne) et, dans les contraintes C4 et C5, les dpendances avec les tables VOITURE et PERSONNE via les cls trangres.

c. Dfinition d'une table par requte


Il est possible de crer une table par rcupration des tuples d'une autre table. On peut, par exemple, crer une table appele ma_table par rcupration de la structure et du contenu de autre_table :
CREATE TABLE ma_table as SELECT * FROM autre_table;

On peut galement crer une table appele ma_table par rcupration d'une partie seulement de la structure et du contenu de ACHAT. On renomme dans l'exemple ci-dessous les colonnes numImmatriculation et nomPersonne en num et nom :
CREATE TABLE ma_table ( num integer, nom varchar(20) ) as SELECT numImmatriculation, nomPersonne FROM ACHAT;

2. Modification d'une table


La modification d'une table se fait grce au mot-cl ALTER TABLE. Les principales modifications sur la structure d'une table sont : - l'ajout dun attribut - la modification d'un attribut - la suppression d'un attribut Cependant, la modification de schma est une opration dlicate qui peut mettre en pril l'intgrit de la base de donnes. Aussi toutes les oprations de suppression ou de modification de relation, d'attribut ou de contrainte doivent tre faites avec prcaution. Pour viter les erreurs, la plupart des systmes

Base de donnes

41

restreignent ou interdisent certaines de ces oprations. La syntaxe suivante d'ORACLE donne un aperu de ces oprations. Syntaxe de modification d'une table en SQL
ALTER TABLE nom_table [ ADD (attribut1 type1 [DEFAULT valeur_par_dfaut] [contraintes sur attribut1], ..., attributN typeN [DEFAULT valeur_par_dfaut] [contraintes sur attributN]); ] | [ADD (contrainte sur relation);] | [ MODIFY (attribut1 type1 [DEFAULT valeur_par_dfaut] [contraintes sur attribut1], ..., attributN typeN [DEFAULT valeur_par_dfaut] [contraintes sur attributN]); ] | [DROP CONSTRAINT nom_de_contrainte;] | DROP COLUMN nom_de_colonne;

Notation (les lments entre [ ] sont optionnels) : - Le symbole "|" signifie "ou" ; ainsi dans l'instruction ALTER TABLE, ADD porte soit sur une contrainte d'attribut soit sur une contrainte de relation. - Le mot-cl ADD permet donc d'ajouter soit un attribut et ventuellement les contraintes associes cet attribut, soit une contrainte sur la relation. - Le mot-cl MODIFY permet de modifier la dfinition d'un attribut. - Le mot-cl DROP CONSTRAINT permet de supprimer une contrainte sur relation. - Le mot-cl DROP COLUMN permet de supprimer une colonne (et donc un champ).

a. Rgles
Dans une table ayant dj des tuples, l'ajout d'un attribut implique la mise NULL de toute la colonne correspondant cet attribut. Ceci implique que la clause NOT NULL ne doit pas tre spcifie pour cet attribut dans sa dfinition. La suppression d'un attribut doit obir aux quelques rgles suivantes : - On ne peut supprimer un attribut-cl ou faisant partie de la cl. - La suppression d'une cl trangre mono-attribut (une rfrence la cl d'une autre table) entrane automatiquement la suppression de la contrainte rfrentielle correspondante (puisque cette contrainte est dfinie en mme temps que l'attribut). - La suppression d'une cl trangre multi-attribut doit tre prcde de la suppression de la contrainte rfrentielle correspondante (puisque cette dernire est dclare part). Sans cette suppression de la contrainte, toute mise jour ultrieure de ces attributs peut entraner une anomalie dans le contrle de l'intgrit rfrentielle. La modification d'un attribut doit respecter les rgles suivantes : - Si le nom d'une cl change, il faut propager cette modification sur toutes les tables qui rfrencent cette cl. - Toute modification d'une contrainte sur attribut doit respecter les rgles de cohrence des contraintes 1 9 spcifies dans la leon relative la cration de table.

Base de donnes

42

La suppression de contrainte est une relaxation de contrainte qui rend les futures requtes plus permissives qu'elles ne l'taient avant. Cette suppression ne met pas particulirement en pril l'intgrit de la base. - Toute suppression de contrainte doit conserver les rgles sur contraintes 1 9 spcifies dans la leon relative la cration de table. La suppression de contrainte ncessite que cette contrainte possde un nom.

b. Exemple
On dsire ajouter les attributs Type et Puissance la table VOITURE. Voici l'instruction SQL permettant d'ajouter ces attributs.
ALTER TABLE VOITURE ADD(type VARCHAR(20), puissance INTEGER);

Cette instruction SQL modifie la table VOITURE en consquence : Immatriculation Texte Marque Texte Couleur Texte Prix Nombre Type Texte Puissance Nombre

On souhaite dsormais modifier la contrainte portant sur l'attribut Puissance. En effet, nous aimerions contraindre cette valeur pour qu'elle soit positive. Voici l'instruction SQL rsultante :
ALTER TABLE VOITURE ADD (CONSTRAINT C8 (CHECK (Puissance>=0)));

3. Suppression d'une table


La suppression d'une table se fait grce au mot-cl DROP TABLE. Syntaxe de suppression d'une table en SQL
DROP TABLE nom_table [CASCADE CONSTRAINTS];

Notation (les lments entre [ ] sont optionnels) : Le mot-cl CASCADE CONSTRAINTS dans la clause DROP TABLE permet de supprimer toutes les rfrences cette table dans les autres tables.

a. Rgles
L'opration de suppression de table peut se faire moyennant certaines prcautions : - Avant de supprimer une table, il faut supprimer toutes les rfrences cette table dans les autres tables (ou utiliser le CASCADE CONSTRAINTS). - Avant de supprimer une table, il faut avoir redfini ou supprim toutes les vues impliquant cette table (nous reviendrons un peu plus loin sur la dfinition des vues). La suppression d'une table implique de redfinir ou supprimer toutes les requtes impliquant la table supprime.

b. Exemple
On dsire supprimer la table VOITURE. Voici l'instruction SQL permettant d'effectuer cette requte :
DROP TABLE VOITURE CASCADE CONSTRAINTS;

Base de donnes

43

Remarque : on insre la clause CASCADE CONSTRAINTS afin de supprimer les rfrences la table VOITURE dans la table ACHAT.

4. Renommage dune table


Le renommage d'une table se fait grce au mot-cl RENAME. Syntaxe de renommage d'une table en SQL
RENAME nom_table TO nouvelle_table;

5. Consultation dune table


La consultation d'une table se fait grce au mot-cl DESC[RIBE]. Syntaxe de consultation d'une table en SQL
DESC[RIBE] nom_table;

V. Le Langage de Manipulation de Donnes (LMD)


Dfinition : Le Langage de Manipulation de Donnes permet de : - afficher ; - insrer ; - mettre jour ; - supprimer des donnes dans les tables. Le LMD est donc compos de 4 primitives : - SELECT pour l'affichage des donnes des tables. - INSERT pour l'insertion de donnes dans les tables. - UPDATE pour la mise jour des donnes. - DELETE pour la suppression des donnes.

1. SELECT
L'affichage des donnes d'une ou plusieurs tables se fait grce au mot-cl SELECT. Syntaxe de la primitive SELECT en SQL
SELECT * | [DISTINCT | ALL] <attributs> FROM <tables> [WHERE <condition logique de niveau tuple>] [GROUP BY <attributs> [HAVING <condition logique de niveau groupe>]] [ORDER BY <attributs>];

Notation (les lments entre [ ] sont optionnels) : - Le symbole "|" signifie "ou" ; ainsi on peut faire suivre le mot-cl SELECT par une * OU par <attributs> prcd le cas chant par DISTINCT ou ALL. La clause SELECT dcrit la relation rsultat, <attributs> dsigne : - soit une liste d'attributs ; - soit une expression obtenue l'aide des fonctions statistiques SUM (somme), AVG (moyenne), COUNT (compte), MIN et MAX ; - soit une expression.

Base de donnes

44

Les mots-cls DISTINCT et ALL permettent respectivement d'liminer ou de conserver les doublons aprs une projection mise en uvre par l'ordre SELECT suivi d'une liste d'attributs. La clause FROM dsigne les relations concernes par la requte. Chaque nom de relation peut tre suivi d'un alias (variables synonymes pour chaque relation). Cet alias permet parfois des conomies d'critures, mais il permet surtout de lever des ambiguts sur les noms d'attributs (plusieurs relations qui possdent le mme nom d'attribut). Des exemples de dfinition d'alias sont proposs dans la partie prsentant des exercices corrigs. La clause WHERE, optionnelle, spcifie les critres de slection. La condition logique de niveau tuple est une expression logique spcifiant les prdicats de restriction ou de jointure satisfaire par la rponse. On peut galement insrer dans la clause WHERE, une nouvelle instruction SELECT (requte imbrique) ce qui permet de travailler sur un ensemble de tuples restreints par cette slection. Lorsque ces critres portent sur des fonctions de groupe, on utilise la clause HAVING. La clause GROUP BY partitionne la relation en groupes. La liste des attributs spcifis dans cette clause indique le critre de groupement. La clause ORDER BY permet de trier les rsultats obtenus selon un tri ascendant (ASC) ou descendant (DESC). On veillera choisir des colonnes de tri prsent dans les attributs du SELECT.

a. La clause SELECT et la clause FROM


La clause SELECT et la clause FROM sont lies. En effet, lors de chaque opration de slection, le mot-cl FROM permet d'identifier la ou les tables ncessaires la construction du rsultat de la requte.
SELECT * FROM VOITURE;

Cette instruction SQL permet d'afficher tous les tuples de la table VOITURE : Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 Marque Renault Rover Citron Peugeot Renault Couleur Noire Bleue Rouge Verte Jaune Puissance 7 5 6 6 7 Prix 20 000 28 000 30 000 10 000 35 000

Remarque : le symbole * dans la clause SELECT signifie qu'on dsire rcuprer TOUS les champs de la table.
SELECT Marque FROM VOITURE;

Cette instruction SQL permet d'afficher le contenu du champ Marque des tuples de la table VOITURE : Marque Renault Rover Citron Peugeot Renault Remarque : la requte ne porte que sur un seul champ, cela quivaut une projection de la table VOITURE sur ce champ. On peut ajouter autant dattributs que lon dsire afficher.
SELECT DISTINCT Marque FROM VOITURE;

Base de donnes

45

Cette instruction SQL permet d'afficher le contenu du champ Marque des tuples de la table VOITURE, sans rptition de Marque, c'est--dire sans doublon de Marque : Marque Renault Rover Citron Peugeot

b. Les prdicats
Une condition est appele prdicat en SQL. Un prdicat permet de comparer 2 expressions de valeurs : - la premire expression contenant des spcifications de colonnes est appele terme ; - la seconde expression contenant seulement des spcifications de constantes est appele constante. Il existe une grande diversit de prdicats en SQL, on trouve en effet : 1. un prdicat de comparaison permettant de comparer un terme une constante l'aide des oprateurs suivants : - = : gal - <> ou != : diffrent - > : plus grand que - >= : plus grand ou gal - < : plus petit que - <= : plus petit ou gal Ces oprateurs sont valables pour les types NUMBER (NUMBER est un terme englobant les types INTEGER et FLOAT dsignant les nombres, ce type n'est cependant pas disponible pour tous les SGBD), CHAR, VARCHAR, DATE et valent NULL si un des termes de la comparaison est NULL. un prdicat d'intervalle BETWEEN permettant de tester si la valeur d'un terme est comprise entre la valeur de 2 constantes ; un prdicat de comparaison de texte not LIKE permettant de tester si un terme de type chane de caractres contient une ou plusieurs sous-chanes (ce prdicat est donc rserv aux types CHAR et VARCHAR). Le caractre % remplace une chane de caractres quelconque y compris la chane vide, le caractre _ remplace n'importe quel caractre unique ; un prdicat de test de nullit qui permet de tester si un terme a une valeur convenue NULL, signifiant que sa valeur est inconnue ou que le champ n'a pas t renseign. Pour tester la nullit, on utilise IS NULL, et la non nullit par IS NOT NULL ; un prdicat d'appartenance not IN qui permet de tester si la valeur d'un terme appartient une liste de valeurs constantes.

2. 3.

4.

5.

c. La clause WHERE
La clause WHERE spcifie une condition de slection. Une condition de slection dfinit un critre qui, appliqu un tuple, est vrai, faux ou inconnu (mettant en cause un attribut de valeur NULL). Cette condition peut inclure des oprateurs boolens (AND, OR, NOT), des conditions lmentaires et des parenthses. Les tableaux ci-aprs donnent les tables de vrit permettant de calculer les valeurs de vrit d'une condition de slection. Seuls les tuples satisfaisant la condition de slection sont pris en compte par la requte. AND Vrai Faux Inconnu Vrai Vrai Faux Inconnu Faux Faux Faux Faux Inconnu Inconnu Faux Inconnu

Base de donnes

46

OR Vrai Faux Inconnu NOT

Vrai Vrai Vrai Vrai Vrai Faux

Faux Vrai Faux Faux Faux Vrai

Inconnu Vrai Faux Inconnu Inconnu Inconnu

SELECT * FROM VOITURE WHERE Puissance <= 6 AND Prix >= 20 000;

Cette instruction SQL permet daffiche les tuples de la table VOITURE dont la Puissance est infrieure ou gale 6 chevaux et dont le prix est suprieur ou gal 20 000 : Immatriculation 1952LM62 3664PN75 Marque Rover Citron Couleur Bleue Rouge Puissance 5 6 Prix 28 000 30 000

AND : permet de vrifier TOUTES les conditions simultanment.


SELECT * FROM VOITURE WHERE Puissance <= 6 OR Prix >= 20 000;

Cette instruction SQL permet daffiche les tuples de la table VOITURE dont la Puissance est infrieure ou gale 6 chevaux ou dont le prix est suprieur ou gal 20 000 : Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 Marque Renault Rover Citron Peugeot Renault Couleur Noire Bleue Rouge Verte Jaune Puissance 7 5 6 6 7 Prix 20 000 28 000 30 000 10 000 35 000

OR : permet de vrifier AU MOINS UNE des conditions.


SELECT * FROM VOITURE WHERE NOT (Puissance = 6);

Cette instruction SQL permet daffiche les tuples de la table VOITURE dont la Puissance nest gale 6 chevaux : Immatriculation 4578QS59 1952LM62 4691TR95 Marque Renault Rover Renault Couleur Noire Bleue Jaune Puissance 7 5 7 Prix 20 000 28 000 35 000

NOT : permet de donner la ngation de la condition. Remarque : Les oprateurs logiques peuvent tre combins entre eux. Cependant, il faut veiller respecter un ordre de priorit. Ainsi, on trouve, du plus prioritaire au moins prioritaire : - NOT - AND - OR L'emploi de parenthses est possible pour changer l'ordre dvaluation ou rendre la lecture plus facile.

Base de donnes

47

Prdicats divers :
SELECT * FROM VOITURE WHERE Prix BETWEEN 25 000 AND 40 000;

Cette instruction SQL permet dafficher les tuples de la table VOITURE dont le Prix est compris entre 25 000 et 40 000 : Immatriculation 1952LM62 3664PN75 4691TR95 Marque Rover Citron Renault Couleur Bleue Rouge Jaune Puissance 5 6 7 Prix 28 000 30 000 35 000

BETWEEN min AND max : permet de rcuprer les donnes dont les valeurs sont comprises entre min et max (bornes incluses).
SELECT * FROM VOITURE

WHERE Marque LIKE 'Ren%' AND Couleur IN ('Noire', 'Bleue', 'Jaune') AND Prix IS NOT NULL; Cette instruction SQL permet dafficher tous les tuples de la table VOITURE dont le Marque commence par Ren, dont la couleur est soit noire, bleue ou jaune, et dont le prix nest pas inconnu (donc connu) : Immatriculation 4578QS59 4691TR95 Marque Renault Renault Couleur Noire Jaune Puissance 7 7 Prix 20 000 35 000

d. Les oprateurs arithmtiques


Les oprateurs arithmtiques ('+', '', '', '/') peuvent tre utiliss dans les clauses SELECT, WHERE et HAVING. Ces oprateurs sont valables pour les types NUMBER et DATE. Si une des oprandes est NULL, le rsultat est NULL. Ces oprateurs peuvent tre combins entre eux mais respectent une priorit d'valuation : - '' et '/' '+' et ''

Cet ordre peut, bien entendu, tre modifi l'aide de parenthses.

e. Les fonctions statistiques


Les fonctions statistiques (MAX, MIN, SUM, AVG, COUNT, STDDEV, VARIANCE) peuvent tre utilises dans les clauses SELECT, WHERE et HAVING. Les fonctions statistiques sont appliques l'ensemble d'une colonne (ou d'un groupe) et fournissent une valeur unique. La fonction MAX et la fonction MIN Les fonctions MAX et MIN renvoient respectivement le maximum et le minimum d'un champ. Ces fonctions sont utilisables pour les types CHAR, VARCHAR2, DATE et NUMBER.
SELECT MAX(Prix) FROM VOITURE;

Cette requte permet d'afficher le prix maximal parmi les tuples de la table VOITURE. MAX(Prix) 35 000

Base de donnes

48

La fonction COUNT La fonction COUNT comptabilise le nombre de lignes pour lesquelles l'expression est non NULL. Une * est souvent utilise avec COUNT pour indiquer le nombre de lignes. Si on ne veut pas compter plusieurs fois les valeurs identiques d'une mme colonne, il faut utiliser le mot-cl DISTINCT suivi du nom de la colonne (sauf s'il s'agit d'un attribut cl de la relation).
SELECT COUNT(DISTINCT Marque) FROM VOITURE WHERE Puissance > 6;

Cette requte permet d'afficher le nombre de tuples vrifiant la condition "Puissance suprieure 6 chevaux" de la table VOITURE, en ne comptant qu'une seule fois la marque mme si elle vrifie de nouveau la condition (3 tuples compts, on ne compte qu'une fois la Renault). COUNT(Marque) 1
SELECT COUNT(*) FROM VOITURE WHERE Puissance > 6;

Cette requte permet d'afficher le nombre de tuples vrifiant la condition "Puissance suprieure 6 chevaux" de la table VOITURE, en comptant toutes les lignes (4 tuples compts). COUNT(Marque) 2 La fonction SUM La fonction SUM effectue, pour un ensemble de tuples, la somme des valeurs d'un attribut. Cette fonction est uniquement utilisable pour le type NUMBER.
SELECT SUM(Prix) FROM VOITURE WHERE Puissance = 6;

Cette requte permet de calculer la somme des prix des VOITURES ayant une Puissance de 6 chevaux. SUM(Prix) 45 000 La fonction AVG La fonction AVG calcule, pour un ensemble de tuples, la moyenne arithmtique des valeurs d'un attribut. Cette fonction est uniquement utilisable pour le type NUMBER. Elle vrifie la formule suivante : AVG = Somme des valeurs non NULL / nombre de valeurs non NULL.
SELECT AVG(Prix) FROM VOITURE WHERE Puissance = 6;

Cette requte permet de calculer le prix moyen des VOITURES ayant une Puissance de 6 chevaux. AVG(Prix) 20 000 La fonction VARIANCE La fonction VARIANCE calcule, pour un ensemble de tuples, la variance des valeurs d'un attribut. Cette fonction est uniquement utilisable pour le type NUMBER. Elle vrifie la formule suivante : VARIANCE = Somme des carrs de la diffrence entre attribut de valeur non NULL et la moyenne arithtique / nombre dattributs de valeur non NULL.

Base de donnes

49

SELECT VARIANCE(Prix) FROM VOITURE WHERE Puissance = 6;

Cette requte permet de calculer la variance des prix des VOITURES ayant une Puissance de 6 chevaux. VARIANCE(Prix) 100 000 000 La fonction STDDEV La fonction STDDEV calcule, pour un ensemble de tuples, lcart type des valeurs d'un attribut. Cette fonction est uniquement utilisable pour le type NUMBER. Elle vrifie la formule suivante : STDDEV = racine carre de la variance.
SELECT STDDEV(Prix) FROM VOITURE WHERE Puissance = 6;

Cette requte permet de calculer lcart type des prix des VOITURES ayant une Puissance de 6 chevaux. STDDEV(Prix) 10 000

f.

La clause GROUP BY
La clause GROUP BY permet de partitionner la relation rsultat selon les valeurs d'un ou de plusieurs attributs. Les seuls noms de colonnes (en dehors des fonctions statistiques) qui peuvent apparatre dans le SELECT sont celles qui figurent dans le GROUP BY.
SELECT SUM(Prix), Puissance FROM VOITURE GROUP BY Puissance;

Cette commande permet de crer des partitions selon la Puissance dans la table VOITURE. On aura donc, pour notre exemple, 3 partitions correspondant aux puissances 5, 6 et 7 chevaux. La somme des Prix s'affichera pour chacune de ces partitions. Puissance 5 6 7 SUM(Prix) 28 000 40 000 55 000

g. La clause HAVING
La clause HAVING dfinit les conditions que les groupes doivent respecter pour tre retenus, elle slectionne les partitions dsires. Elle ne peut comprendre que des conditions dont le premier terme est une fonction statistique. La clause HAVING est aux groupes (GROUP BY) ce que la clause WHERE est aux lignes (SELECT).
SELECT MAX(Prix), Puissance FROM VOITURE GROUP BY Puissance HAVING COUNT(*)>1;

Base de donnes

50

Cette commande permet de crer des partitions selon la Puissance dans la table VOITURE. Elle calculera le prix maximum sur ces partitions. La clause HAVING limite l'affichage aux partitions contenant au moins 2 lments (tuples) : COUNT(*)>1 . On aura donc, pour notre exemple, 2 partitions correspondant aux puissances 6 et 7 chevaux (la partition relative la Puissance de 5 chevaux n'a pas t retenue car elle ne contient pas assez d'lments pour satisfaire la condition nonce dans la clause HAVING). Puissance 6 7 MAX(Prix) 30 000 35 000

h. La clause ORDER BY
La clause ORDER BY permet de trier les tuples du rsultat final. La clause ORDER BY permet d'ordonner la relation rsultat sur un ou plusieurs attributs, l'ordre pouvant tre croissant (grce au mot-cl ASC) ou dcroissant (grce au mot-cl DESC), ASC tant l'ordre par dfaut. Remarque : Dans une requte SQL, la clause ORDER BY se situe juste aprs une clause WHERE ou aprs une clause GROUP BY.
SELECT * FROM VOITURE ORDER BY Puissance [ASC];

Ces 2 requtes (avec ASC ou sans ASC) sont identiques et permettent d'afficher l'ensemble des tuples de la table VOITURE tris sur l'attribut Puissance selon un ordre croissant. Immatriculation 1952LM62 3664PN75 3671KH60 4578QS59 4691TR95 Marque Rover Citron Peugeot Renault Renault Couleur Bleue Rouge Verte Noire Jaune Puissance 5 6 6 7 7 Prix 28 000 30 000 10 000 20 000 35 000

La clause ORDER BY permet galement un tri sur plusieurs attributs : le tri sera effectu prioritairement sur le premier attribut, puis sur le second et ainsi de suite.
SELECT * FROM VOITURE ORDER BY Puissance DESC, Couleur;

Cette requte permet d'afficher l'ensemble des tuples de la table VOITURE tris sur l'attribut Puissance selon un ordre dcroissant puis sur l'attribut Couleur (ordre alphabtique) selon un ordre croissant . Immatriculation 4691TR95 4578QS59 3664PN75 3671KH60 1952LM62 Marque Renault Renault Citron Peugeot Rover Couleur Jaune Noire Rouge Verte Bleue Puissance 7 7 6 6 5 Prix 35 000 20 000 30 000 10 000 28 000

i.

Les oprateurs relationnels


Les oprateurs relationnels en SQL sont bass sur les oprateurs relationnels vus dans le chapitre Modle Relationnel. En SQL, les principaux oprateurs sont UNION, INTERSECTION, MINUS (diffrence). Les deux relations R1 et R2 sur lesquelles sont appliqus les oprateurs UNION, INTERSECTION et MINUS doivent absolument avoir avoir le mme schma de table (nombre quivalent d'attributs et attributs identiques deux deux).

Base de donnes

51

SELECT * FROM VOITURE WHERE Puissance = 5 UNION SELECT * FROM VOITURE WHERE Puissance = 7;

Cette requte permet d'afficher l'ensemble des tuples de la table VOITURE dont la Puissance est gale 5 ou 7 chevaux. Immatriculation 1952LM62 4578QS59 4691TR95 Marque Rover Renault Renault Couleur Bleue Noire Jaune Puissance 5 7 7 Prix 28 000 20 000 35 000

j.

La jointure
Le procd de la jointure en SQL est celui nonc dans le chapitre Algbre Relationnelle. La jointure est formule dans la clause WHERE Syntaxe de la primitive SELECT en SQL
SELECT <attributs> FROM <liste_de_noms_de_relations> WHERE <expression de jointure>;

Cas de l'quijointure
SELECT Immatriculation, numPersonne, dataAchat, Marque, Couleur, Puissance, Prix FROM VOITURE, ACHAT WHERE Immatriculation = numImmatriculation;

Cette requte permet de faire la jointure entre la table VOITURE et la table ACHAT ; cette jointure porte sur le numro d'immatriculation. Cette requte renverra donc tous les tuples de la table VOITURE et de la table ACHAT qui ont mme numro d'immatriculation (on na pas affich numImmatriculation). Immatriculation numPersonne dateAchat Marque Couleur Puissance Prix 4578QS59 1591259 12/12/2001 Renault Noire 7 20 000 1952LM62 2630662 08/11/1998 Rover Bleue 5 28 000 4691TR95 1120606 05/09/1997 Renault Jaune 7 35 000 Pour les autres types de jointure (non quijointure, autojointure, jointure externe), le principe est identique, seule l'expression de jointure diffre. Cas de la jointure naturelle
SELECT <attributs> FROM relation1 NATURAL JOIN relation2;

Cas de la thta-jointure
SELECT <attributs> FROM relation1 JOIN relation2 ON relation1.attrbut1 = relation2.attribut2;

Base de donnes

52

Cas de la clause AS (c'est--dire deux relations identiques qui ont le mme attribut)
SELECT <attributs> FROM relation R1, relation R2 WHERE R1.attribut = R2.attribut;

k. La requte imbrique et les quantificateurs


En SQL, il est possible d'imbriquer plusieurs requtes. L'imbrication se fait dans la clause WHERE.
SELECT * FROM VOITURE WHERE Prix > (SELECT AVG(Prix) FROM VOITURE);

Cette requte permet d'afficher tous les tuples de la table VOITURE dont le prix est suprieur la moyenne des prix de tous les tuples de cette mme table : Immatriculation 1952LM62 3664PN75 4691TR95 Marque Rover Citron Renault Couleur Bleue Rouge Jaune Puissance 5 6 7 Prix 28 000 30 000 35 000

Remarque : Toute requte de jointure peut se mettre sous forme de requte imbrique. Mais l'inverse n'est pas vrai comme l'illustre l'exemple propos ci-dessus. Dans une requte imbrique, il est possible dajouter un quantificateur. Il permet de faire une comparaison entre une ligne et toutes les lignes dune table retourne par un select imbriqu. Le ALL correspond et le SOME (ou ANY) .
SELECT * FROM COMMANDE WHERE dateCommande > ALL(SELECT dateLivraison FROM LIVRAISON);

Cette requte permet d'afficher tous les tuples de la table COMMANDE dont la date de commande est passe aprs la dernire livraison.
SELECT * FROM COMMANDE WHERE dateCommande < SOME(SELECT dateLivraison FROM LIVRAISON);

Cette requte permet d'afficher tous les tuples de la table COMMANDE dont la date de commande est passe avant la dernire livraison.

l.

Les alias
Les alias concourent amliorer la lisibilit et la concision d'une requte. Il existe deux types d'alias : les alias de tables et les alias de champs. Ils peuvent galement s'appliquer une fonction d'agrgation retournant des donnes sous forme de colonnes.
SELECT Alias_table.nom_champ AS Alias_champ FROM nom_table AS Alias_table;

Base de donnes

53

La clause AS, affectant un alias une table ou une colonne, peut tre remplace par un simple espace blanc.
SELECT Alias_table.nom_champ Alias_champ FROM nom_table Alias_table;

Les alias de champs peuvent tre des chanes de caractres composes de mots et d'espaces. Dans ce cas, il faut placer l'alias entre simple guillemet.
SELECT Alias_table.nom_champ AS Un alias de champ FROM nom_table AS Alias_table;

Lors de l'affichage des lignes rsultantes, les alias de champs se substitueront aux noms de colonnes. De cette manire, il devient possible d'attribuer des noms de colonnes plus explicites pour les utilisateurs de la base de donnes. Les alias sont particulirement utiles dans le cadre des jointures et des requtes imbriques. Dans les deux cas, il devient possible de faire appel des champs de noms identiques en les distinguant par des prfixes qui sont les alias de table. Cas de la jointure
SELECT v.Immatrivulation, v.Marque, v.Couleur, v.Puissance, v.Prix, a.numPersonne, a.dateAchat FROM Voiture v, Achat a WHERE v.Immatriculation = a.numImmatriculation;

Cas de la jointure rflexive


SELECT v.*, a.* FROM Voiture AS v, Achat AS a WHERE v.Immatriculation = a.numImmatriculation;

Cas de la requte imbrique


SELECT v.*, a.* FROM Voiture AS v, Achat AS a WHERE v.Immatriculation = a.numImmatriculation AND v.Prix >(SELECT AVG(Prix) FROM VOITURE);

2. INSERT
L'opration d'insertion se fait grce au mot-cl INSERT. Elle permet d'ajouter un ou plusieurs tuples une relation. Syntaxe de la primitive INSERT en SQL
INSERT INTO <nom_table> [attribut1, attribut2, ] VALUES (val1, val2, ) | clause SELECT;

Base de donnes

54

Exemples :
INSERT INTO VOITURE VALUES (2759QF78, BMW, Grise, 8, 45 000);

Cette commande permet d'insrer le tuple ('2759QF78', 'BMW', 'Grise', 8, 45 000) dans la table VOITURE : Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 2759QF78 Marque Renault Rover Citron Peugeot Renault BMW Couleur Noire Bleue Rouge Verte Jaune Grise Puissance 7 5 6 6 7 8 Prix 20 000 28 000 30 000 10 000 35 000 45 000

Les domaines des valeurs insres doivent correspondre aux types dclars.
INSERT INTO VOITURE (Immatriculation, Couleur, Prix) VALUES (1379FG09, Rouge, 29 500);

Cette commande permet d'insrer un nouveau tuple ayant les valeurs '1379FG09' pour l'Immatriculation, une couleur 'Rouge', et un Prix de 29 500 dans la table VOITURE. Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 2759QF78 1379FG09 Marque Renault Rover Citron Peugeot Renault BMW NULL Couleur Noire Bleue Rouge Verte Jaune Grise Rouge Puissance 7 5 6 6 7 8 NULL Prix 20 000 28 000 30 000 10 000 35 000 45 000 29 500

Les champs autres champs de ce tuple prendront la valeur NULL (ils ne devront pas avoir t dclars NOT NULL).
INSERT INTO VOITURE_ACHETEES (Immatriculation) SELECT numImmatriculation FROM ACHAT;

Cette commande permet de crer des tuples dans la table VOITURE_ACHETEES (qui aura t cre pralablement) initialiss avec les numros d'immatriculation prsents dans la table ACHAT. Les autres attributs tant initialiss NULL. Immatriculation 4578QS59 1952LM62 4691TR95

3. UPDATE
La commande UPDATE permet de mettre jour un ou plusieurs tuples d'une relation.

Base de donnes

55

Syntaxe de la primitive UPDATE en SQL


UPDATE <nom_table> SET <attribut1> = <expression1>, <attribut2> = <expression2>, [WHERE <condition>];

La clause WHERE est optionnelle ; cependant sans le WHERE, la mise jour affectera TOUS les tuples de la relation. Exemples :
UPDATE VOITURE SET Prix = Prix x 1.10;

Cette commande permet d'augmenter le Prix de vente de 10% (on multiplie par le coefficient 1.10) de tous les tuples de la table VOITURE : Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 2759QF78 1379FG09 Marque Renault Rover Citron Peugeot Renault BMW NULL Couleur Noire Bleue Rouge Verte Jaune Grise Rouge Puissance 7 5 6 6 7 8 NULL Prix 22 000 30 800 33 000 11 000 38 500 49 500 32 450

Ceci permet de modifier rapidement une colonne pour la globalit dune table.
UPDATE VOITURE SET Prix = Prix x 1.10 WHERE Marque = Renault;

Cette commande permet d'augmenter le Prix de vente de 10% uniquement sur les voitures de Marque Renault dans la table VOITURE. Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 2759QF78 1379FG09 Marque Renault Rover Citron Peugeot Renault BMW NULL Couleur Noire Bleue Rouge Verte Jaune Grise Rouge Puissance 7 5 6 6 7 8 NULL Prix 22 000 28 000 30 000 10 000 38 500 45 000 29 500

Ceci permet de modifier rapidement une colonne pour une partie de la table.
UPDATE VOITURE SET Prix = Prix x 1.10 WHERE Marque = Renault AND Prix > SELECT AVG(Prix) FROM VOITURE);

Cette commande permet d'augmenter le Prix de vente de 10% uniquement sur les voitures de Marque Renault dont le prix est suprieur au prix moyen de toutes les voitures de la table VOITURE.

Base de donnes

56

Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 4691TR95 2759QF78 1379FG09

Marque Renault Rover Citron Peugeot Renault BMW NULL

Couleur Noire Bleue Rouge Verte Jaune Grise Rouge

Puissance 7 5 6 6 7 8 NULL

Prix 20 000 28 000 30 000 10 000 38 500 45 000 29 500

4. DELETE
La suppression de tuples se fait grce la commande DELETE. La suppression peut concerner tous les tuples d'une relation ou un sous-ensemble de tuples qui vrifie une condition de slection. Il faut noter que DELETE opre sur le contenu d'une relation, c'est--dire que le schma d'une relation persiste aprs suppression de tous les tuples de la relation. Syntaxe de la primitive DELETE en SQL
DELETE FROM <nom_table> [WHERE <condition>];

La clause WHERE est optionnelle ; cependant sans le WHERE, la mise jour affectera TOUS les tuples de la relation. Exemples :
DELETE FROM VOITURE;

Cette commande permet de supprimer tous les tuples de la table VOITURE. Le schma de la table persiste cependant. Immatriculation Marque Couleur Puissance Prix

Ceci permet de supprimer rapidement tous les tuples dune table.


DELETE FROM VOITURE WHERE Marque = Renault;

Cette commande permet de supprimer toutes les voitures de Marque Renault de la table VOITURE. Immatriculation 1952LM62 3664PN75 3671KH60 2759QF78 1379FG09 Marque Rover Citron Peugeot BMW NULL Couleur Bleue Rouge Verte Grise Rouge Puissance 5 6 6 8 NULL Prix 28 000 30 000 10 000 45 000 29 500

Ceci permet de modifier rapidement une partie des tuples de la table.


DELETE FROM VOITURE WHERE Marque = Renault AND Prix > SELECT AVG(Prix) FROM VOITURE);

Cette commande permet de supprimer toutes les voitures de Marque Renault dont le prix est suprieur au prix moyen de toutes les voitures de la table VOITURE.

Base de donnes

57

Immatriculation 4578QS59 1952LM62 3664PN75 3671KH60 2759QF78 1379FG09

Marque Renault Rover Citron Peugeot BMW NULL

Couleur Noire Bleue Rouge Verte Grise Rouge

Puissance 7 5 6 6 8 NULL

Prix 22 000 28 000 30 000 10 000 45 000 29 500

VI. Le Langage de Contrle de Donnes (LCD)


Dfinition : Les instructions de contrle des donnes donnent l'administrateur de base de donnes le pouvoir de contrler la scurit de la base. Le LCD est compos de 4 commandes SQL : - GRANT - REVOKE - COMMIT - ROLLBACK GRANT et REVOKE sont utilises pour exercer un contrle sur l'accs des donnes. COMMIT et ROLLBACK sont utilises pour prserver l'intgrit des donnes. Pour utiliser une base de donnes, l'utilisateur doit passer par une procdure de connexion. Lors de cette procdure, il doit saisir un login (par exemple PDupont) et un mot de passe (par exemple xyz2V12). Ce login permet d'identifier chaque utilisateur et sert de repre pour lui accorder (ou lui enlever) des droits de manipulation de la base.

1. La commande GRANT
La commande GRANT permet d'autoriser un accs aux donnes de la base soit total, soit des degrs limits. Ainsi, il est possible, par exemple, d'autoriser la consultation de certaines tables sans possibilit de les modifier.

a. La syntaxe de la commande GRANT


Syntaxe de la commande GRANT en SQL
GRANT ALL PRIVILEGES | accs_spcifique ON nom_table | nom_vue TO nom_autoris | PUBLIC [WITH GRANT OPTION];

Avec la convention suivante : - Il est possible de donner tous les types de droits d'accs (consultation, modification, suppression,) avec ALL PRIVILEGES ou d'accorder des privilges spcifiques (accs_spcifique). - nom_autoris (ou login) : nom donn par l'utilisateur lors de sa connexion la base de donnes (cr par l'administrateur) - PUBLIC : tout le monde reoit le privilge accord (accs_spcifique) ou tous les privilges (ALL PRIVILEGES). - WITH GRANT OPTION : celui qui reoit le privilge peut lui-mme l'accorder un autre (opration dangereuse, viter). Concernant les types de droits d'accs, si des tables de la base sont identifies l'aide du nom du crateur de la base, cet utilisateur peut (si on lui a accord le privilge requis) autoriser l'accs ses tables pour d'autres utilisateurs.

Base de donnes

58

GRANT ALL PRIVILEGES ON VOITURE TO Martin WITH GRANT OPTION;

Cette instruction SQL permet l'administrateur de la base de donner Martin tous les droits sur la table VOITURE, il lui accorde galement l'autorisation de transfrer ces privilges.

b. Les droits d'accs


La gestion des droits d'accs aux tables est dcentralise : il n'existe pas d'administrateur global attribuant des droits. Seul le propritaire (crateur) d'une table peut attribuer des droits sur celleci. Les principaux droits d'accs spcifiques sont : - slection (SELECT) - insertion (INSERT) - suppression (DELETE) - mise jour (UPDATE) - indexation (INDEX) - rfrencer la table dans une contrainte (REFERENCES) Il peut ensuite passer ses droits slectivement d'autres utilisateurs ou tout le monde (PUBLIC). Un droit peut tre pass avec le droit de le transmettre (WITH GRANT OPTION) ou non. L'ensemble des droits d'accs (ALL PRIVILEGES) inclut les droits d'administration (changement de schma et destruction de la relation).
GRANT SELECT, UPDATE ON VOITURE, ACHAT TO Smith;

Cette commande permet de passer des droits de consultation et de mise jour de la table VOITURE et de la table ACHAT l'utilisateur Smith.
GRANT ALL PRIVILEGES (Immatriculation, Prix) ON VOITURE TO Smith, Vandenbrouck, Dubois;

Cette commande permet de passer l'ensemble des droits d'accs aux utilisateurs Smith, Vandenbrouck et Dubois uniquement sur les colonnes Immatriculation et Prix de la table VOITURE.
GRANT INSERT ON PERSONNE TO PUBLIC;

Cette commande attribue le droit d'insrer de nouveaux enregistrements dans la table PERSONNE tous ceux qui, dans la socit, disposent d'une identification pour se connecter sur la BD.

2. La commande REVOKE
La commande REVOKE permet de retirer l'accs, c'est la commande inverse de GRANT.

Base de donnes

59

Syntaxe de la commande REVOKE en SQL


REVOKE ALL PRIVILEGES | accs_spcifique ON nom_table | nom_vue FROM nom_utilisateur | PUBLIC;

Exemples :
REVOKE SELECT, UPDATE ON VOITURE, ACHAT FROM Smith;

Cette commande supprime les droits de consultation et de mise jour de la table VOITURE et de la table ACHAT qui avait t accords l'utilisateur Smith.
REVOKE ALL PRIVILEGES ON VOITURE FROM Martin;

Cette commande retire tous les privilges accords sur la table VOITURE Martin.

3. Le contrle d'intgrit
Les commandes COMMIT et ROLLBACK constituent des contrles (cf. le chapitre sur les transactions) ncessaires la prservation de l'intgrit de la base. Des systmes multi-utilisateurs disponibles dans le commerce emploient des contrles supplmentaires comme par exemple la commande LOCK pour empcher les valeurs de changer pendant qu'un utilisateur examine ou travaille sur ces valeurs (nous tudierons plus en dtails ces notions dans le chapitre sur les transactions).

4. La commande COMMIT
La commande COMMIT permet l'utilisateur de fixer le moment o les modifications en cours affecteront la base de donnes. Dans ce cadre, on utilise le concept de transaction. La transaction est une suite d'oprations telle que chaque opration de cette suite est ncessaire pour atteindre un rsultat unitaire. C'est la raison pour laquelle SQL propose l'utilisateur de n'enregistrer les modifications dans la base qu'au moment o la transaction est acheve grce la commande COMMIT. Une transaction (ou une partie de transaction) qui n'a pas encore t enregistre dfinitivement n'est visible que pour l'utilisateur qui l'introduit. Elle n'affecte pas la base tant que l'instruction n'est pas excute. Avant l'excution de l'instruction COMMIT, il est possible de restaurer la base par ROLLBACK, c'est--dire d'liminer les modifications rcentes. Aprs l'enregistrement dfinitif d'une transaction par COMMIT, il n'est plus possible de restaurer l'tat antrieur par ROLLBACK. S'il apparat aprs coup qu'une transaction doive tre modifie ou corrige, on ne pourra effecteur cette modification qu'au moyen d'une autre instruction SQL comme UPDATE ou DELETE.

5. La commande ROLLBACK
La commande ROLLBACK permet l'utilisateur de ne pas valider les dernires modifications en cours dans la base de donnes. Par exemple, si au cours du droulement d'une transaction, l'utilisateur fait une erreur ou si, pour une certaine raison, une transaction ne peut pas tre acheve, l'utilisateur peut supprimer les modifications

Base de donnes

60

afin d'viter des incohrences dans la base grce la commande ROLLBACK. Cette commande limine tous les changements depuis la dernire validation. Dans le cas d'une dfaillance du systme, l'intgrit de la base peut tre prserve par une option ROLLBACK automatique qui limine les transactions inacheves et empche donc qu'elles soient introduites dans la base.

6. La commande SAVEPOINT
Une transaction tant une squence de squence de commandes SQL considre comme unitaire, indivisible, il peut tre ncessaire de pouvoir revenir en arrire, nimporte quel endroit dans la transaction courante. Pour cela, il suffit de raliser des points de sauvegarde grce la commande SAVEPOINT <nom> lintrieur dune transaction pour situer un point ventuel de retour vers ltat de la base de donnes. Le retour en arrire seffectue grce la commande ROLLBACK WORK TO SAVEPOINT <nom>.

7. Terminaison d'une transaction

VII.

Les vues

Dfinition : Une vue est une relation virtuelle au sens o ses instances n'existent pas physiquement mais sont calcules chaque invocation de la vue. Une vue est dfinie par une requte qui utilise des relations ou des vues existantes. Syntaxe de la commande CREATE VIEW en SQL
CREATE VIEW nom_de_la_vue AS <clause SELECT>;

Exemples :
CREATE VIEW VOITURES_CHERES AS SELECT * FROM VOITURE WHERE Prix > 15 000;

La vue VOITURES_CHERES a le mme schma que la relation VOITURE.

Base de donnes

61

SELECT * FROM VOITURES_CHERES;

On peut accder grce cette vue toutes les voitures dont le Prix est suprieur 15 000 .
CREATE VIEW VOITURES_PUISSANTES (immat_voiture, marquee_voiture) AS SELECT Immatriculation, Marque FROM VOITURE WHERE Puissance > 6;

La vue Voitures-puissantes comporte les attributs Immatriculation et Marque renomms en immat_voiture et marque_voiture. Elle permet d'accder toutes les voitures dont la puissance est suprieure 6 chevaux. En interrogation, une vue est utilise comme toute autre relation. La seule diffrence rside dans le fait que ses tuples ne sont pas stocks mais ils sont le rsultat de l'valuation de la requte de dfinition. En mise jour, toute modification des relations ayant servi la dfinition de la vue est rpercute sur la vue (lors d'une nouvelle valuation de la requte de dfinition de la vue). Par contre, la mise jour d'une base de donnes " travers" une vue n'a pas trouv de solution gnrale : le problme vient du fait qu'il est parfois impossible de rpercuter la mise jour de la vue sur les relations sur lesquelles elle est dfinie. Cependant, quand des contraintes logiques ne viennent pas l'empcher la mise jour au travers des vues est possible. A titre d'exemple, si une vue comporte une colonne obtenue par une fonction d'agrgation, la mise jour de cette colonne supposerait que l'on soit capable de mettre jour les tuples concerns par la fonction d'agrgation, tant donne la valeur introduite, ce qui est logiquement impossible. Il est, de ce fait, ncessaire de consulter la documentation du systme dont on dispose pour connatre les types de mises jour autoriss en utilisant une vue. Enfin la suppression d'une vue est faite explicitement par DROP VIEW.

VIII. Les squences


Dfinition : Dfinir une squence quivaut dfinir une suite de nombres entiers. L'volution de cette suite est rgie par un certain nombre de paramtres. L'utilisation d'une squence permet donc d'avoir disposition une suite de valeurs. Ceci peut permettre de : - gnrer des cls uniques dans des tables - avoir un compteur titre informatif, que l'on incrmente quand on veut - etc...

1. Cration du squence
Syntaxe de la commande CREATE SEQUENCE en SQL
CREATE SEQUENCE nom_de_la_sequence [START WITH valeur_initiale] [INCREMENT BY incrment] [NOMAXVALUE | NOMINVALUE | MAXVALUE maximum | MINVALUE minimum] [NOCYCLE | CYCLE] [CACHE nombre_de_valeurs];

Notation (les lments entre [ ] sont optionnels) : - START WITH permet de fixer la valeur initiale de la squence. - INCREMENT BY permet de fixer le pas dincrmentation. Si celui-ci est positif, la squence est croissante, sinon elle dcrot.

Base de donnes

62

NOMAXVALUE et NOMMINVALUE permet de ne pas fixer de limite dans la squence. Si lon dsire fixer un plafond ne pas dpasser (pour une squence ascendante), on utilise MAXVALUE. Si lon dsire fixer un plancher (pour une squence descendante), on utilise MINVALUE. Loption CYCLE permet une fois la limite du compteur atteint, de reprendre le comptage la valeur MINVALUE (pour une squence ascendante) ou MAXVALUE (pour une suite descendante). Si lon dsire arrter la squence une fois la limite du compteur atteint, il suffit dutiliser loption NOCYCLE. Loption CACHE permet de mettre nombre_de_valeurs valeurs dans la mmoire cache afin doptimiser lutilisation des squences et avoir un effet significatif sur les performances, surtout lorsque nombre_de_valeurs est lev.

CREATE SEQUENCE SEQUENCE_VOITURE START WITH 5 INCREMENT BY 3;

Cette commande SQL permet de crer une squence SEQUENCE_VOITURE commenant la valeur 5 avec un pas dincrmentation de 3. La squence obtenue est alors : 5, 8, 11, 14, 17, 20,
CREATE SEQUENCE SEQUENCE_VOITURE START WITH 5 INCREMENT BY 3 MAXVALUE 30;

Cette commande SQL permet de crer une squence SEQUENCE_VOITURE commenant la valeur 5 avec un pas dincrmentation de 3, avec pour valeur maximale 30. La squence obtenue est alors : 5, 8, 11, 14, 17, 20, 23, 26, 29.
CREATE SEQUENCE SEQUENCE_VOITURE START WITH 5 INCREMENT BY 3 [NOMAXVALUE NOMINVALUE];

Cette commande SQL (avec ou sans loption NOMAXVALUE NOMINVALUE) permet de crer une squence SEQUENCE_VOITURE commenant la valeur 5 avec un pas dincrmentation de 3 sans limite. La squence obtenue est alors : 5, 8, 11, 14, 17, 20,
CREATE SEQUENCE SEQUENCE_VOITURE START WITH 1 MAXVALUE 10 MINVALUE -10 CYCLE;

Cette commande SQL permet de crer une squence SEQUENCE_VOITURE commenant la valeur 1 avec un pas dincrmentation de 1, avec pour valeur maximale 10 et pour valeur minimale -10. La squence est cyclique, si bien que lon a la squence : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -10, -9, -8, -7, -6,
CREATE SEQUENCE SEQUENCE_VOITURE CACHE 100;

Cette commande SQL permet de crer une squence SEQUENCE_VOITURE en stockant les 100 premires valeurs dans la mmoire cache. Par dfaut, la valeur est 20.

Base de donnes

63

2. Interroger la squence
L'interrogation d'une squence se fait par l'utilisation des "pseudo-colonnes" CURRVAL et NEXTVAL. On parle de pseudo-colonne car cela se manipule un peu comme une colonne de table, mais ce n'est pas une colonne de table. - La pseudo-colonne CURRVAL retourne la valeur courante de la squence. - La pseudo-colonne NEXTVAL incrmente la squence et retourne la nouvelle valeur.
SELECT SEQUENCE_VOITURE.NEXTVAL FROM DUAL; SELECT SEQUENCE_VOITURE.CURRVAL FROM DUAL;

Lors de la premire utilisation dun squence, il faut utiliser NEXTVAL pour linitialiser. Ensuite, CURRVAL permet dobtenir la valeur courante de la squence.

3. Modifier une squence


Syntaxe de la commande ALTER SEQUENCE en SQL
ALTER SEQUENCE nom_de_la_sequence [INCREMENT BY incrment] [NOMAXVALUE | NOMINVALUE | MAXVALUE maximum | MINVALUE minimum] [NOCYCLE | CYCLE] [CACHE nombre_de_valeurs];

Exemple :
ALTER SEQUENCE SEQUENCE_VOITURE INCREMENT BY 3;

Cette commande SQL permet de modifier le pas dincrmentation (valeur : 3) de la squence SEQUENCE_VOITURE.

4. Cration dune colonne de table auto-incrmente (pour une cl primaire)


Le principe est le suivant : - crer une squence qui permettra de gnrer des valeurs entires uniques - crer un TRIGGER qui se dclenchera chaque INSERT, pour alimenter le champ voulu avec une valeur unique.
CREATE TRIGGER TRIGGER_CLE_PRIMAIRE_VOITURE BEFORE INSERT ON VOITURE FOR EACH ROW BEGIN SELECT SEQUENCE_VOITURE.NEXTVAL INTO :VOITURE.cle_primaire FROM DUAL; END;

Cet exemple ne gre pas le contrle d'unicit de la valeur que l'on va insrer, mais si le champ n'est aliment QUE par l'utilisation de la squence qui lui est ddie, et si cette squence n'est pas paramtre pour reboucler, il n'y a pas de raison qu'une erreur de cl en double surgisse...

Base de donnes

64

IX. BLOCS PL/SQL


1. L'intro de l'intro
PL/SQL est un langage qui intgre SQL et permet de programmer de manire procdurale. Globalement, avec PL/SQL on aura notre disposition un vrai langage de programmation moins intuitif mais aussi plus puissant que le SQL. Les 2 langages sont minemment complmentaires. Les principaux avantages / inconvnients sont les suivants : - ne dispense pas de connatre le SQL ; - permet le traitement par bloc de SQL et donc optimise le trafic rseau ; - l'utilisation de variable de stockage et de type simple et structur dynamique (%TYPE, %ROWTYPE, ) ; - des traitements plus complexes, notamment pour la gestion des cas particuliers et des erreurs (traitement des exceptions) ; - un paramtrage et la cration d'ordres SQL dynamiques. Le PL/SQL peut tre utilis sous 3 formes : - un bloc de code, excut comme une commande SQL, via un interprteur standard - un fichier de commande PL/SQL - un programme stock (procdure, fonction, package ou trigger)

2. Ordres SQL supports dans PL/SQL


Les instructions du langage de manipulation de donnes (LMD) et certaines instructions de gestion de transaction, savoir : - INSERT, UPDATE, DELETE, SELECT ; - COMMIT, ROLLBACK, SAVEPOINT.

3. Blocs et sections PL/SQL


Les blocs de code s'appellent galement des blocs anonymes. Ils commenceront simplement par un 'BEGIN' ou un 'DECLARE'. Ils sont composs de 1 3 sections : Type de section section dclarative section excutable section de traitement des exceptions Obligatoire ? non oui non Mots cls DECLARE BEGIN END; EXCEPTION

La section 'EXCEPTION', quand elle est prsente, est incluse dans la section et NON PAS la suite de celle ci.
BEGIN NULL; END;

Le bloc prcdent est le plus petit bloc PL/SQL au monde. Le bloc ne peut pas tre vide et doit contenir au moins une instruction Syntaxe de bloc en PL/SQL (avec des exceptions)
DECLARE -- mes dclarations de variables -BEGIN -- dbut de la section excutable --- mes ordres SQL et PL/SQL -EXCEPTION -- mon traitement des exceptions -END; -- la fin du bloc excutable --

Base de donnes

65

Afin de pouvoir utiliser une exception, il faut tout dabord dclarer une variable dexception dans la partie DECLARE (ex : DECLARE erreur EXCEPTION;). Ensuite, dans la partie entre le BEGIN et le END, pour appeler une exception et stopper le bloc PL/SQL, on utilise la commande RAISE nom_exception (ex : RAISE erreur;). Cette commande stoppe le bloc PL/SQL et va dans la partie EXCEPTION. Dans cette partie, pour afficher un message derreur, on utilise la commande suivante : WHEN nom_exception THEN RAISE_APPLICATION_ERROR ( numero_erreur , message ); numero_erreur : reprsente le numro de lerreur utilisateur. Ce numro doit tre compris entre 20000 et 20999. message : chane de caractres dune longueur maximale de 2048 octets qui contient le message associ lerreur. Les exceptions prdfinies sont : NO_DATA_FOUND : cas o lon na aucune donne la sortie dun SELECT. TO_MANY_ROWS : cas o lon a trop de donnes la sortie dun SELECT. VALUE_ERROR : cas o lon a une erreur de valeur. ZERO_DIVIDE : cas dune division par zro. INVALIDE_NUMBER : cas dun nombre invalide.

4. Procdure PL/SQL
Une procdure est simplement un programme PL/SQL nomm, compil et stock dans la base. Syntaxe de procdure en PL/SQL (avec des exceptions)
CREATE [OR REPLACE] PROCEDURE nom_de_procdure ( par1 type1, par2 type2, ) IS BEGIN -- mes ordres SQL et PL/SQL -EXCEPTION -- mon traitement des exceptions -END;

Ce code est une commande SQL, qui cre la procdure PL/SQL, et donc compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et le END, en le rfrenant par nom_de_procdure. Et pour excuter cette procdure de manire autonome, on utilise la commande : EXECUTE nom_de_procdure. Les paramtres dentre doivent tre dclars (nom et type).
CREATE OR REPLACE PROCEDURE Client (nom VARCHAR2, ville VARCHAR2) IS BEGIN INSERT INTO CLIENTS (numclient,nomclient,villeclient) VALUES (SEQUENCE_NUM_CLIENT.NEXTVAL, nom, ville); COMMIT; END;

Cette commande permet de crer une procdure nomme Client, dont les paramtres dentre sont des chanes de caractres nom et ville. La procdure permet dinsrer un nouveau tuple dans la table CLIENTS de valeurs SEQUENCE_NUM_CLIENT.NEXTVAL (pour crer automatiquement une nouvelle valeur de cl primaire), nom et ville.

5. Fonctions PL/SQL
Une fonction est une procdure retournant une valeur.

Base de donnes

66

CREATE [OR REPLACE] FUNCTION nom_de_fonction ( par1 type1, par2 type2, ) RETURN type_de_sortie IS variable_de_sortie type_de_sortie IS BEGIN -- mes ordres SQL et PL/SQL -EXCEPTION -- mon traitement des exceptions -END;

Ce code est une commande SQL, qui cre la fonction PL/SQL, et donc compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et le END, en le rfrenant par nom_de_fonction. La valeur retourne en sortie correspond la variable_de_sortie dont le type est type_de_sortie. Les paramtres dentre doivent tre dclars (nom et type).
CREATE OR REPLACE FUNCTION solde (numero NUMBER) RETURN REAL IS le_solde REAL BEGIN SELECT solde INTO le_solde FROM clients WHERE numclient = numero; RETURN le_solde; END;

Cette commande permet de crer une fonction nomme solde, dont le paramtre dentre est le numro de client. La fonction permet de retourner en sortie, dans la variable relle le_solde, le solde du compte du client identifi par numero. Pour appeler cette fonction et utiliser son rsultat au sein dun ordre SQL, il suffit dexcuter la commande suivante : SELECT solde(1000) FROM DUAL.

6. Trigger
Les dclencheurs (Triggers) sont des procdures stockes appartenant une table prcise et s'excutant lorsqu'une action spcifique se produit sur la table concerne. Le dclenchement d'une telle procdure s'effectue subsquemment une instruction de manipulation de donnes (DML) comme INSERT, DELETE ou UPDATE. Il existe donc trois types de dclencheurs : sur insertion, sur mise jour et sur suppression. Une table peut comporter plusieurs dclencheurs d'un type donn, condition que chacun possde un nom diffrent. Cependant, un dclencheur donn ne peut tre assign qu' une seule et unique table tout en s'appliquant la fois, l'insertion, la mise jour et la suppression d'enregistrements sur la table en question. Une table ne peut possder qu'un seul dclencheur INSTEAD OF d'un type donn. Les dclencheurs se produisent soit aprs (AFTER), soit avant (BEFORE) soit la place (INSTEAD OF) d'une action DML : - Un dclencheur sur INSERT s'excute chaque opration d'insertion lance par l'utilisateur ou par un programme. Lors d'une insertion, l'enregistrement est insr la fois dans la table cible est dans une table temporaire dnomme inserted. Une telle table peut permettre de vrifier la cohrence des enregistrements. - Un dclencheur sur DELETE s'excute chaque opration de suppression lance par l'utilisateur ou un programme. Lors d'une suppression, l'enregistrement est supprim physiquement de la table cible et l'insre dans une table temporaire dnomme deleted. Cela peut permettre de rcuprer l'enregistrement supprim. - Un dclencheur sur UPDATE s'excute chaque opration de mise jour lance par l'utilisateur ou par un programme. Lors d'une mise jour, l'ancien enregistrement est supprim et insr dans la table temporaire deleted, tandis que le nouveau est insr la fois dans la table cible et dans la table inserted.

Base de donnes

67

La suppression des dclencheurs s'effectue par l'intermdiaire de l'instruction DROP.


DROP TRIGGER nom_trigger1 [,, nom_triggerN ];

La modification des dclencheurs s'effectue par l'intermdiaire de l'instruction ALTER. La syntaxe complte de la commande ALTER TRIGGER est en fait identique celle de CREATE TRIGGER.
ALTER TRIGGER nom_trigger ON nom_table FOR INSERT | UPDATE | DELETE AS instruction_SQL;

Tous les dclencheurs (ALL) ou certains peuvent tre activs (ENABLE) ou dsactivs (DISABLE) au moyen de l'instruction ALTER TABLE.
ALTER TABLE nom_table { ENABLE | DISABLE } TRIGGER { ALL | nom_trigger1 [,,nom_triggerN]};

Syntaxe de cration de trigger en PL/SQL


CREATE [OR REPLACE] TRIGGER nom_trigger AFTER | BEFORE | INSTEAD OF { [INSERT [OR DELETE [OR UPDATE OF nom_colonne1,,nom_colonneN] ] ] } ON nom_table FOR EACH ROW [WHEN (condition)] Instruction_PL/SQL | instruction_prodcure;

Notation (les lments entre [ ] sont optionnels) : - La commande OR REPLACE recre le dclencheur s'il existe dj. - La clause BEFORE indique que le dclencheur doit tre lanc avant l'excution de l'vnement. - La clause AFTER indique que le dclencheur doit tre lanc aprs l'excution de l'vnement. - Les instructions INSERT et DELETE indique au dclencheur de s'excuter lors respectivement d'une insertion ou d'une suppression dans la table. - La clause UPDATE OF indique que le dclencheur doit tre lanc lors de chaque mise jour d'une des colonnes spcifies. Si elle est omise, n'importe quelle colonne de la table modifie provoque le dclenchement du Trigger. - La clause ON dsigne le nom de la table associ son schma pour lequel le dclencheur a t spcifiquement cr. - La clause FOR EACH ROW dsigne le dclencheur pour tre un dclencheur de ligne. Oracle lance un dclencheur de ligne une fois pour chaque ligne qui est affecte par l'instruction de dclenchement. Si la clause est omise, le dclencheur est un dclencheur d'instruction. Oracle lance un dclencheur de d'instruction une fois seulement lorsque l'instruction dclenchante est mise si la contrainte du dclencheur optionnelle est rencontre.

CREATE TABLE TABLE_1 ( numero NUMBER, chaine CHAR(20) ); CREATE TABLE DELETE_LOG ( table CHAR(20), action CHAR(50), jour CHAR(20) ); CREATE OR REPLACE TRIGGER declencheur_suppression AFTER DELETE ON TABLE_1

Base de donnes

68

FOR EACH ROW DECLARE action_utilisateur VARCHAR2(50); BEGIN SELECT user INTO action_utilisateur FROM DUAL; INSERT INTO DELETE_LOG VALUES ('table_1',action_utilisateur,TO_CHAR(SYSDATE, 'DD/MON/YYYY-HH24:MI:SS')); END;

Cette commande SQL permet de crer deux tables puis cre un dclencheur qui insre un champ log l'intrieur de DELETE_LOG, pour chaque ligne supprime dans la table TABLE_1.
CREATE TABLE TABLE_1 ( numero NUMBER, chaine CHAR(20) ); CREATE TABLE TABLE_2 ( chaine CHAR(20), numero NUMBER) ); CREATE TRIGGER declencheur_insertion AFTER INSERT ON TABLE_1 FOR EACH ROW WHEN (NEW.numero <= 10) BEGIN INSERT INTO TABLE_2 VALUES (:NEW.numero, :NEW.chaine); END;

Cette commande SQL permet de crer deux tables TABLE_1 et TABLE_2 puis cre un dclencheur qui insre un enregistrement l'intrieur de TABLE_2 lorsquune opration d'insertion s'est accomplie dans TABLE_1. Le dclencheur vrifie si le nouvel enregistrement possde un premier composant infrieur ou gal 10 et si c'est le cas, inverse les enregistrements l'intrieur de TABLE_2. Les variables spciales NEW et OLD sont disponibles pour se rfrer respectivement des nouveaux ou d'anciens enregistrements. Les deux points (:) prcdent NEW et OLD dans VALUES sont dans ce cas obligatoires, par contre dans la clause conditionnelle WHEN, ils doivent tre omis.
CREATE TABLE EMP ( EmpNo NUMBER, Enom CHAR(20), Job CHAR(20), Sal NUMBER ); CREATE TABLE SALGRADE ( jobclass CHAR(20), minSal NUMBER, maxSal NUMBER ); CREATE TRIGGER sal_check BEFORE INSERT OR UPDATE OF sal, job ON EMP FOR EACH ROW DECLARE minSal NUMBER; maxSal NUMBER; sal_hors_rang EXCEPTION; BEGIN SELECT minSal, maxSal INTO minSal, maxSal FROM SALGRADE WHERE jobclass = :NEW.job; IF (:NEW.sal<minSal OR :NEW.sal>maxSal) THEN RAISE sal_hors_rang; END IF; EXCEPTION WHEN sal_hors_rang THEN RAISE_APPLICATION_ERROR(-20300,Salaire ||TO_CHAR (:NEW.sal)|| hors rang); WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20322,Job invalide); END;

Cette commande SQL permet de crer deux tables EMP (employs) et SALGRADE (grades de salaires), puis cre un dclencheur pour vrifier, avant une insertion ou modification de sal et job dans la table EMP, que le nouveau salaire soit valide (c'est--dire que le nouveau salaire ne soit pas infrieur minSal et ne soit pas suprieur maxSal) pour le nouvel emploi.

Base de donnes

69

X. CURSEURS
Les curseurs sont des pointeurs sur une zone mmoire pour les donnes extraites de la base. Il existe des curseurs implicites et explicites. Oracle ouvre toujours un curseur implicite pour traiter une instruction SQL, celui-ci ne se rapporte qu la dernire instruction SQL excute et il se nomme SQL . Le curseur contient des attributs (%NOTFOUND, %FOUND, %ROWCOUNT) qui fournissent des informations sur lexcution des instructions INSERT, UPDATE, DELETE, SELECT INTO. Un curseur implicite pour une instruction SELECT INTO ne peut grer quune seule ligne. Le curseur explicite quant lui place le rsultat dune requte multi-lignes dans un tampon mmoire et libre les lignes les unes aprs les autres lors du traitement. Le curseur se dfinit dans la partie dclarative du bloc PL/SQL (la requte nest pas excute ce momentl). Dans cette dclaration, il est possible de donner une clause FOR UPDATE OF nom_colonne(s) qui permet de verrouiller les lignes slectionnes (aucun autre utilisateur ne peut mettre jour tant que le verrou nest pas retir). La commande OPEN nom_curseur excute la requte et place le curseur en mmoire, elle ne retourne aucun rsultat. Linstruction FETCH nom_curseur INTO variable extrait la ligne courante du curseur, la place dans une variable et fait avancer le curseur la ligne suivante. Pour parcourir toutes les lignes du curseur, il faut utiliser une boucle LOOP. La clause CURRENT OF nom_curseur est utilise dans le WHERE dune commande UPDATE pour modifier la ligne courante (si un FOR UPDATE a t utilis pralablement). Larrt de la boucle est obtenu grce nom_curseur%NOTFOUND qui retourne false sil ne reste plus de lignes. Pour librer lespace mmoire, il faut fermer explicitement le curseur en utilisant CLOSE nom_curseur. Un curseur peut accepter des paramtres en entre, ils servent passer des informations au curseur et sont gnralement utiliss dans un WHERE pour limiter la requte. Les paramtres ont un type associ qui ne peut pas avoir dindication de longueur. Ils sont passs lors de la commande OPEN. Syntaxe de la commande DECLARE CURSOR en SQL
DECLARE nom1 table1.attribut1%TYPE; ; nomN tableN.attributN%TYPE; CURSOR nom_du_curseur [(paramtre1 type1 [,,paramtreN typeN])] [RETURN type_du_retour] IS SELECT attribut(s) FROM table(s) WHERE condition(s); BEGIN instruction_curseurs; END;

Il est galement possible de passer des paramtres un curseur. Suite au DECLARE, on trouve la dclaration des variables utiles au curseur en les dfinissant par nom table.attribut%TYPE.
DECLARE employe EMP.Ename%TYPE; salaire EMP.Sal%TYPE; CURSOR curseur (nom VARCHAR2, sal NUMBER) IS SELECT e.Empno, e.Ename, e.Job, r.Sal FROM EMP AS e, REMNUERATION AS r WHERE e.Ename = nom AND r.Sal = sal; BEGIN OPEN curseur(DUPONT,3000); LOOP FETCH curseur INTO @employe, @salaire; EXIT WHEN curseur%NOTFOUND; END LOOP; CLOSE curseur; END;

La commande SQL cre un curseur dont les paramtres dentre sont le nom et le salaire dun employ. La structure de slection permet de rcuprer la liste des employs (numro, nom, mtier) et de leur salaire. Dans la structure BEGINEND, on retrouve lopration douverture du curseur suivi de la commande FETCHINTO qui permet dextraire les diffrentes lignes des tuples renvoy par la structure de slection afin de les sauvegarder dans les variables employe et salaire dfinies dans la dclaration du

Base de donnes

70

curseur. L'attribut Oracle %NOTFOUND retourne FALSE si la dernire instruction FETCH renvoie un enregistrement ou TRUE en cas d'chec. Suite la fin de son utilisation, le curseur peut tre ferm afin de ne plus consommer de ressources.

XI. FONCTIONS SQL


1. Fonctions arithmtiques
ABS(nb) : Renvoie la valeur absolue de nb. CEIL(nb) : Renvoie le plus petit entier suprieur ou gal nb. COS(n) : Renvoie le cosinus de n, n tant un angle exprim en radians. COSH(n) : Renvoie le cosinus hyperbolique de n. EXP(n) : Renvoie e puissance n. FLOOR(nb) : Renvoie le plus grand entier infrieur ou gal nb. LN(n) : Renvoie le logarithme nprien de n qui doit tre un entier strictement positif. LOG(m,n) : Renvoie le logarithme en base m de n. m doit tre un entier strictement suprieur 1, et n un entier strictement positif. MOD(m,n) : Renvoie le reste de la division entire de m par n, si n vaut 0 alors renvoie m. Attention, utilise avec au moins un de ses arguments ngatifs, cette fonction donne des rsultats qui peuvent tre diffrents d'un modulo classique. Cette fonction ne donne pas toujours un rsultat dont le signe du diviseur. POWER(m,n) : Renvoie m puissance n, m et n peuvent tre des nombres quelconques entiers ou rels mais si m est ngatif n doit tre un entier. ROUND(n[,m]) : Si m est positif, renvoie n arrondi (et non pas tronqu) m chiffres aprs la virgule. Si m est ngatif, renvoie n arrondi m chiffres avant la virgule. m doit tre un entier et il vaut 0 par dfaut. SIGN(nb) : Renvoie -1 si nb est ngatif, 0 si nb est nul, 1 si nb est positif. SIN(n) : Renvoie le sinus de n, n tant un angle exprim en radians. SINH(n) : Renvoie le sinus hyperbolique de n. SQRT(nb) : Renvoie la racine carre de nb qui doit tre un entier positif ou nul. TAN(n) : Renvoie la tangente de n, n tant un angle exprim en radians. TANH(n) : Renvoie la tangente hyperbolique de n. TRUNC(n[,m]) : Si m est positif, renvoie n arrondi tronqu m chiffres aprs la virgule. Si m est ngatif, renvoie n tronqu m chiffres avant la virgule. m doit tre un entier et il vaut 0 par dfaut.

SELECT nom, ROUND(salaire/22.2) FROM EMP;

Cette instruction SQL permet dafficher le nom et le salaire journalier, arrondi lentier le plus proche, de chaque employ de la table EMP.

2. Expressions et fonctions sur les chanes de caractres


CONCAT(chane1,chane2) = chane1 || chane2 : Renvoie la chane obtenue en concatnant chane1 chane2. Cette fonction est quivalente l'oprateur de concatnation | |. INITCAP(chane) : Renvoie chane en ayant mis la premire lettre de chaque mot en majuscule et toutes les autres en minuscule. Les sparateurs de mots sont les espaces et les caractres non alphanumriques. LOWER(chane) : Renvoie chane en ayant mis toutes ses lettres en minuscules. LPAD(chane,long,[char]) : Renvoie la chane obtenue en compltant, ou en tronquant, chane pour qu'elle ait comme longueur long en ajoutant ventuellement gauche le caractre (ou la chane de caractres) char. La valeur par dfaut de char est un espace. LTRIM(chane[,ens]) : Renvoie la chane obtenue en parcourant partir de la gauche chane et en supprimant tous les caractres qui sont dans ens. On s'arrte quand on trouve un caractre qui n'est pas dans ens. La valeur de dfaut de ens est un espace. REPLACE(chaine,avant,aprs) : Renvoie chaine dans laquelle toutes les occurrences de la chane de caractres avant ont t remplacs par la chane de caractres aprs.

Base de donnes

71

RPAD(chane,n,[char]) : Renvoie la chane obtenue en compltant, ou en tronquant, chane pour qu'elle ait comme longueur n en ajoutant ventuellement droite le caractre (ou la chane de caractres) char. La valeur par dfaut de char est un espace. RTRIM(chane[,ens]) : Renvoie la chane obtenue en parcourant partir de la droite chane et en supprimant tous les caractres qui sont dans ens. On s'arrte quand on trouve un caractre qui n'est pas dans ens. La valeur de dfaut de ens est un espace. SOUNDEX(chane) : Renvoie la chane de caractres constitue de la reprsentation phontique des mots de chane. SUBSTR(chane,m[,n]) : Renvoie la partie de chane commenant au caractre m et ayant une longueur de n. TRANSLATE(chane,avant,aprs) : Renvoie une chane de caractres en remplaant chaque caractre de chane prsent dans avant par le caractre situ la mme position dans aprs. Les caractres de chane non prsents dans avant ne sont pas modifis. avant peut contenir plus de caractres que aprs, dans ce cas les caractres de avant sans correspondant dans aprs seront supprims de chane. UPPER(chane) : Renvoie chane en ayant mis toutes ses lettres en majuscules. number = INSTR(chane,sous-chane,debut,occ) : Renvoie la position, not number, du premier caractre de chane correspondant l'occurrence occ de sous-chane en commenant la recherche la position dbut. number = LENGTH(chane) : Renvoie la longueur de chane, not number, exprime en nombre de caractres.

SELECT UPPER nom FROM EMP;

Cette instruction SQL permet dafficher le nom des employs de la table EMP en majuscule.

3. Expressions et fonctions sur les dates a. Oprateurs sur les dates


date +/ nombre : le rsultat est une date obtenue en ajoutant/soustrayant le nombre de jours nombre la date date. date2 date1 : le rsultat est le nombre de jours entre les deux dates.

b. Fonctions sur les dates


ADD_MONTHS(date,n) : Renvoie la date obtenue en ajoutant n mois date. n peut tre un entier quelconque. Si le mois obtenu a moins de jours que le jour de date, le jour obtenu est le dernier du mois. LAST_DAY(date) : Renvoie la date du dernier jour du mois de date. MONTHS_BETWEEN(date2, date1) : Renvoie le nombre de mois entre date2 et date1, si date2 est aprs date1 le rsultat est positif, sinon le rsultat est ngatif. Si les jours date2 et date1 sont les mmes, ou si ce sont les derniers jours du mois, le rsultat est un entier. La partie fractionnaire est calcule en considrant chaque jour comme 1/31me de mois NEXT_DAY(date,nom_du_jour) : Renvoie la date du prochain jour de la semaine dont le nom est nom_de_jour. ROUND(date[,prcision]) : Renvoie date arrondie l'unit spcifie dans prcision. L'unit de prcision est indique en utilisant un des masques de mise en forme de la date. On peut ainsi arrondir une date l'anne, au mois, la minute,... Par dfaut la prcision est le jour. SYSDATE : Renvoie la date et l'heure courantes du systme d'exploitation hte. TRUNC(date[,prcision]) : Renvoie date tronque l'unit spcifie dans prcision. Les paramtres sont analogues ceux de la fonction ROUND.

SELECT NEXT_DAY(embauche,MONDAY) FROM EMP;

Base de donnes

72

Cette instruction SQL permet dafficher la date du lundi suivant lembauche de chaque employ de la table EMP.
SELECT ROUND(embauche,Y) FROM EMP;

Cette instruction SQL permet dafficher la date dembauche de chaque employ de la table EMP arrondie lanne.
SELECT ROUND(SYSDATE-embauche) FROM EMP;

Cette instruction SQL permet dafficher le nombre de jours depuis lembauche de chaque employ de la table EMP.

4. Fonctions de conversion
ASCII(chane) : Renvoie le nombre correspondant au code ascii du premier caractre de chaine. CHR(nombre) : Renvoie le caractre dont nombre est le code ascii. TO_CHAR(nombre,format) : Renvoie la chane de caractres en obtenue en convertissant nombre en fonction de format. Format est une chane de caractres pouvant contenir les caractres suivants : o 9 : reprsente un chiffre (non reprsent si non significatif) o 0 : reprsente un chiffre (reprsent mme si non significatif) o . : point dcimal apparent o V : dfinit la position du point dcimal non apparent o , : une virgule apparatra cet endroit o $ : un $ prcdera le premier chiffre significatif o B : le nombre sera reprsent par des blancs s'il vaut 0 o EEEE : le nombre sera reprsent avec un exposant (le spcifier avant MI ou PR) o MI : le signe ngatif sera droite o PR : un nombre ngatif sera entre <> TO_CHAR(date,format) : Renvoie conversion d'une date en chane de caractres. Le format indique quelle partie de la date doit apparatre, c'est une combinaison des codes suivants : o o o o o o o o o o o o o o o o o o o o o scc : sicle avec signe cc : sicle sy,yyy : anne (avec signe et virgule) y,yyy : anne( avec virgule) yyyy : anne yyy : 3 derniers chiffres de l'anne yy : 2 derniers chiffres de l'anne y : dernier chiffre de l'anne q : numro du trimestre dans l'anne ww : numro de la semaine dans l'anne w : numro de la semaine dans le mois mm : numro du mois ddd : numro du jour dans l'anne dd : numro du jour dans le mois d : numro du jour dans la semaine hh ou hh12 : heure (sur 12 heures) hh24 : heure sur 24 heures mi : minutes ss : secondes sssss : secondes aprs minuit j : jour du calendrier julien

Base de donnes

73

Les formats suivants permettent d'obtenir des dates en lettres (en anglais) : o syear ou year : anne en toutes lettres o month : nom du mois o mon : nom du mois abrg sur 3 lettres o day : nom du jour o dy : nom du jour abrg sur 3 lettres o am ou pm : indication am ou pm o bc ou ad : indication avant ou aprs Jsus Christ Les suffixes suivants modifient la prsentation du nombre auquel ils sont accols : o th : ajout du suffixe ordinat st, nd, rd, th o sp : nombre en toutes lettres Tout caractre spcial insr dans le format sera reproduit tel quel dans la chane de caractres rsultat. TO_DATE(chane,format) : Permet de convertir une chane de caractres en donne de type date. Le format est identique celui de la fonction TO_CHAR. TO_NUMBER(chane) : Convertit chane en sa valeur numrique.

Remarque : On peut galement insrer dans le format une chane de caractres quelconque, condition de la placer entre guillemets "".
SELECT TO_CHAR(embauche,DD/MM/YY HH24:MI:SS) FROM EMP;

Cette instruction SQL permet dafficher les dates dembauche de chaque employ de la table EMP sous le format jour/mois/anne heure:minute:seconde.
SELECT nom FROM EMP WHERE SOUNDEX(nom)=SOUNDEX(DUPONT);

Cette instruction SQL permet dafficher la liste de tous les employs de la table EMP dont le nom ressemble DUPONT.
SELECT LTRIM(nom,LE) FROM EMP;

Cette instruction SQL permet dafficher la liste de tous les employs de la table EMP en ayant supprim tous les L et les E en tte des noms.
SELECT TRANSLATE(nom,AM,**) FROM EMP;

Cette instruction SQL permet dafficher la liste de tous les employs de la table EMP en ayant remplac les A et les M par des * dans les noms.
SELECT TO_CHAR(salaire,<MATH>99900.00) FROM EMP;

Cette instruction SQL permet dafficher les salaires de chaque employ de la table EMP avec un $ en tte et au moins trois chiffres (dont deux dcimales).

Base de donnes

74

5. Autres fonctions
GREATEST(expr1,expr2,) : Renvoie la plus grande des valeurs expr1, expr2,.... Toutes les expressions sont converties au format de expr1 avant comparaison. LEAST(expr1,expr2,) : Renvoie la plus petite des valeurs expr1, expr2,.... Toutes les expressions sont converties au format de expr1 avant comparaison. NVL(expr1,expr2) : Prend la valeur expr1, sauf si expr1 est NULL auquel cas NVL prend la valeur expr2. Une valeur NULL en SQL est une valeur non dfinie. Lorsque l'un des termes d'une expression a la valeur NULL, l'expression entire prend la valeur NULL. D'autre part, un prdicat comportant une comparaison avec une expression ayant la valeur NULL prendra toujours la valeur faux. La fonction NVL permet de remplacer une valeur NULL par une valeur significative. DECODE(crit,val_1,res_1[,val_2,res_2],def) : Cette fonction permet de choisir une valeur parmi une liste d'expressions, en fonction de la valeur prise par une expression servant de critre de slection. Le rsultat rcupr est : o res_1 si l'expression crit a la valeur val_1 o res_2 si l'expression crit a la valeur val_2 o def (la valeur par dfaut) si l'expression crit n'est gale aucune des expressions val_1, val_2,...,. Les expressions rsultats res_1, res_2, ..., def peuvent tre de types diffrents : caractre et numrique, ou caractre et date (le rsultat est du type de la premire expression rencontr dans le DECODE). La fonction DECODE permet galement de mlanger dans une colonne rsultat des informations venant de plusieurs colonnes d'une mme table.
SELECT nom, salaire, comm, salaire+NVL(comm,0) FROM EMP;

Cette instruction SQL permet dafficher le salaire, la commission et le total des gains de chaque employ de la table EMP.
SELECT nom, DECODE(function,'PRESIDENT',1,'DIRECTEUR',2,3) FROM EMP;

Cette instruction SQL permet dafficher la liste des employs de la table EMP avec pour chacun d'eux sa catgorie (prsident = 1, directeur = 2, autre = 3).
SELECT DECODE(Detpno,10,fonction,nom) FROM EMP;

Cette instruction SQL permet dafficher la liste des employs de la table EMP en les identifiant par leur fonction dans le dpartement 10 et par leur nom dans les autres dpartements.