Vous êtes sur la page 1sur 7

1 Le Langage d’Interrogation de Données

Langage de requêtes : SQL


2 Le Langage de manipulation de Données
Fred Hémery

IUT Béthune
Département
3 Le Langage de Définition des données
Réseaux & Télécommunications

Base de Données (I4) — 05/06 4 Le Langage de Contrôle d’accès aux Données

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 1 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 2 / 95

Introduction Introduction

Le langage SQL (Structured Query Language) comprend à lui seul


l’ensemble des instructions nécessaires à la spécification et à l’utilisation SQL intègre plusieurs langage :
d’une base de données relationnelle. I un langage d’interrogation de données (LID) qui va permettre l’accès aux
données ;
C’est un langage de type déclaratif c’est-à-dire que l’on spécifie les I un langage de manipulation de données (LMD, ou DML data manipulation
propriétés des données que l’on recherche et pas, comme dans un language) qui permet de modifier, ajouter, supprimer des données ;
langage impératif, comment les retrouver. I un langage de définition des données (LDD) qui permet de créer, modifier,
Historique supprimer des définitions de données ;
I 1981 Oracle propose le premier SGBDR qui implémente SQL ;
I un langage de contrôle des données et des utilisateurs (LCD) qui permet la
I 1983 IBM l’utilise avec DB2 ; gestion des accès aux données.
I
I 1992 SQL2 norme encore en cours d’utilisation
I actuellement SQL3 en cours de normalisation (intègre une couche objet)

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 3 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 4 / 95

Base de données : Exemple Le Langage d’Interrogation de Données

Le plus visible par les utilisateurs.


Soit la base de données suivante :
La commande SELECT constitue, à elle seule, le langage permettant
fournisseur(fno,nom, adresse, ville) d’interroger une base de données. Elle permet :
produit(pno, libelle, prix, poids, couleur, pnoPhare) I de sélectionner certaines colonnes d’une table : c’est l’opération de
commande(cno, fno, pno, quantite) projection ;
I de sélectionner certaines lignes d’une table en fonction de leur contenu :
c’est l’opération de restriction ;
I de combiner des informations venant de plusieurs tables : ce sont les
opérations de jointure, union, intersection,différence relationnelle ;
I de combiner entre elles ces différentes opérations.
Une interrogation, on parle plutôt de requête, est une combinaison
d’opérations portant sur des tables (relations) et dont le résultat est
lui-même une table dont l’existence est éphémère (le temps de la
requête).
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 5 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 6 / 95

Le Langage d’Interrogation de Données Le Langage d’Interrogation de Données : La projection

SELECT permet de mettre en place l’opérateur de projection de l’algèbre


Syntaxe de la commande SELECT
relationnelle
SELECT [DISTINCT | ALL] La requête minimale
{ *
| { [schema.]{table | view | snapshot}.* | expr [c_alias]
[, { [schema.]{table | view | snapshot}.* | expr [c_alias] } ] ... } SELECT < l i s t e des noms de colonnes >
FROM [schema.]{table | view | snapshot} [t_alias] [, [schema.] FROM < l i s t e des noms de t a b l e s >
{table | view | snapshot} [t_alias] ] ...
[WHERE condition ]
[ [START WITH condition] CONNECT BY condition] SELECT ∗ FROM f o u r n i s s e u r ;
[GROUP BY expr [, expr] ... [HAVING condition] ]
[{UNION | UNION ALL | INTERSECT | MINUS} SELECT command ]
[ORDER BY {expr|position} [ASC | DESC] [, {expr | position} [ASC | DESC]] ...] Par défaut la sélection n’enlève pas les doublons éventuels, sauf si on
[FOR UPDATE [OF [[schema.]{table | view}.]column précise le mot clé DISTINCT
[, [[schema.]{table | view}.]column] ...] [NOWAIT] ]
SELECT DISTINCT c o u l e u r FROM p r o d u i t ;

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 8 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 10 / 95
Le Langage d’Interrogation de Données : La restriction Le Langage d’Interrogation de Données : La restriction

l’opérateur BETWEEN
expr1 BETWEEN expr2 AND expr3
On peut préciser de la restriction dans la requête SELECT en utilisant le
mot clé WHERE à la suite de la liste des tables I vrai si expr 1 est compris entre expr 2 et expr 3, bornes incluses

SELECT ∗ FROM p r o d u i t WHERE p o i d s > 1 5 ; SELECT ∗ FROM p r o d u i t WHERE p o i d s BETWEEN 15 AND 3 5 ;

Le prédicat de la clause WHERE (qui exprime la restriction) est une l’opérateur IN


expression simple ou composée (expr simples combinées avec des expr1 IN ( expr2 , expr3 , ...)
opérateurs logiques, AND, OR, NOT)
Les expressions utilisent des opérateurs arithmétiques (<, >, <=, >=, =) I vrai si expr 1 est égale à l’une des expressions de la liste entre parenthèses

SELECT ∗ FROM f o u r n i s s e u r
WHERE v i l l e IN ( ’ L i l l e ’ , ’ Lyon ’ , ’ Nice ’ ) ;

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 12 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 14 / 95

Le Langage d’Interrogation de Données : La restriction Le Langage d’Interrogation de Données : Valeurs NULL

La valeur NULL permet d’indiquer une absence de valeur dans une


l’opérateur LIKE colonne.

expr LIKE chaine La valeur NULL est différente de la valeur zéro.


Le prédicat expr = NULL est toujours faux, et ne permet donc pas de
I où chaine est une chaîne de caractères pouvant contenir l’un des tester si l’expression a la valeur NULL.
caractères jokers :
Une expression de la forme NULL + val donne NULL comme résultat
F _ remplace exactement 1 caractère
F % remplace une chaîne de caractères de longueur quelconque (0..N). quelle que puisse être la valeur de val.
L’opérateur IS NULL permet de tester la valeur NULL : le prédicat
SELECT ∗ FROM f o u r n i s s e u r WHERE nom NOT LIKE ’D% ’ ; expr IS NULL est vrai si l’expression a la valeur NULL

SELECT ∗ FROM f o u r n i s s e u r WHERE adresse IS NULL ;

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 16 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 18 / 95

Le Langage d’Interrogation de Données : Le tri du résultat Le Langage d’Interrogation de Données : Limite le résultat

SELECT permet le tri des tuples qui constituent le résultat (qui sont dans
un ordre indéterminé) en utilisant une clause ORDER BY SELECT permet de limiter le nombre des tuples qui constituent le résultat
ORDER BY column [ ASC | DESC ] [ , ...] en utilisant une clause LIMIT
LIMIT { count | ALL }
I ASC pour un tri ascendant (du plus petit au plus grand) OFFSET s t a r t
I DESC pour un tri descendant (duplus grand au plus petit)
I count indique le nombre maxi de tuples à renvoyer tandis que start indique
SELECT l i b e l l e , c o u l e u r FROM p r o d u i t
le nombre de tuples à passer avant de commencer à selectionner les
WHERE c o u l e u r IN ( ’ Rouge ’ , ’ V e r t ’ , ’ Bleu ’ )
tuples.
ORDER BY l i b e l l e , c o u l e u r DESC; I La clause LIMIT s’utilise en général avec la clause ORDER BY pour
garantir un résultat souhaité.
On peut changer le nom de la colonne dans la table résultat. On utilise la
clause AS. Par exemple : afficher le produit le plus cher
SELECT l i b e l l e AS " d e s i g n a t i o n du p r o d u i t " , SELECT ∗ FROM p r o d u i t ORDER BY p r i x LIMIT 1 ;
c o u l e u r AS " Couleur du p r o d u i t "
FROM p r o d u i t ;
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 20 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 22 / 95

Le Langage d’Interrogation de Données : Les jointures Le Langage d’Interrogation de Données : Les jointures

Les jointures sont faites en donnant la liste des tables et en spécifiant la On peut utiliser les synonymes pour éviter de taper les noms des tables à
qualification de jointure dans la clause WHERE. chaque fois dans les requêtes complexes
Il peut y avoir ambiguïté si le nom d’un attribut se retrouve dans deux SELECT f . nom , c . cno , c . q u a n t i t e
tables différentes. On lève l’ambiguïté en faisant précéder le nom de FROM f o u r n i s s e u r AS f , commande AS C
l’attribut par le nom de la table suivi d’un point. WHERE f . f n o = c . f n o ;
SELECT ∗ FROM p r o d u i t , commande
La syntaxe SQL2 permet d’intégrer la jointure dans le champ FROM en
WHERE p r o d u i t . pno = commande . pno ;
utilisant la clause JOIN ... ON.
Quand la qualification de jointure n’est pas spécifier, on obtient le produit SELECT p . pno , l i b e l l e , p o i d s , q u a n t i t e
cartésien des tables. FROM p r o d u i t AS p JOIN commande AS c ON p . pno = c . pno
WHERE p o i d s < 2 0 ;
SELECT ∗ FROM p r o d u i t , commande ;

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 24 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 26 / 95
Le Langage d’Interrogation de Données : Les jointures Le Langage d’Interrogation de Données : Les jointures
externes
Lorsqu’une jointure est faite entre deux tables T1 et T2, il se peut que
certaines lignes de l’une ou l’autre des tables qui n’entre pas dans la
Jointure d’une table à elle-même
qualification de la jointure n’apparaissent plus dans le résultat.
I Il peut être utile de rassembler des informations venant d’une ligne d’une
par exemple afficher les produits de moins de 20 KGs en cours de
table avec des informations venant d’une autre ligne de la même table.
I Pour cela il faut donner un synonyme à une des copies de la table commande éventuellement
I Soit par exemple la requête qui pour chaque produit donne le nom du SELECT p . nom AS "Nom P r o d u i t "
produit phare : FROM p r o d u i t AS p , commande AS c
WHERE p . p o i d s < 20 AND p . pno = c . pno ;
SELECT p1 . nom AS "Nom P r o d u i t " , p2 . nom AS " P r o d u i t Phare "
FROM p r o d u i t AS p1 , p r o d u i t AS p2 Si on veut toutes les lignes de la table on utilise tout ou partie de la
WHERE p1 . pnoPhare = p2 . pno ;
jointure externe en utilisant les clauses LEFT, RIGHT, FULL
SELECT p . nom AS "Nom P r o d u i t "
FROM p r o d u i t AS p
LEFT JOIN commande AS c ON p . pno = c . pno
logo WHERE p . p o i d s < 2 0 ; logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 28 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 30 / 95

Le Langage d’Interrogation de Données : Les types de Le Langage d’Interrogation de Données : Les types de
données données

CHAR(len) SMALLINT entier court


CHARACTER(len) chaînes de caractères de longueur fixe BIT(len) chaîne d’octets de longueur fixe
VARCHAR(len) BIT VARYING(len) chaîne d’octets de longueur variable
CHAR VARYING(len) FLOAT(precision) nombres à virgule flottante
CHARACTER VARYING(len) chaînes de caractères de longueur variable REAL nombres à virgule flottante (faible précision)
INTEGER DOUBLE PRECISION nombres à virgule flottante (grande précision)
INT entiers DATE date du calendrier
NUMERIC(precision,scale) TIME(precision) temps
DECIMAL(precision,scale) TIMESTAMP(precision) Date et temps
DEC(precision,scale) nombres décimaux INTERVAL intervalle de temps

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 32 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 34 / 95

Le Langage d’Interrogation de Données : Les fonctions de Le Langage d’Interrogation de Données : Les sous requêtes
manipulation de la date et du temps
Fonction Type retourné Exemple résultat
age(timestamp, ti- interval age(timestamp ’2001-04-10’, timestamp 43 years 9 mons
mestamp) ’1957-06-13’) 27 days
age(timestamp) interval age(timestamp ’1957-06-13’) 43 years 8 mons Il est possible de déclencher des sous-requêtes SQL dans une requête
3 days
current_date date
SQL.
current_time time Les sous requêtes sont utilisées dans les clauses WHERE
date_part(text, ti- double precision date_part(’hour’, timestamp ’2001-02-16 20
mestamp) 20 :38 :40’) La sous requête doit suivre obligatoirement l’opérateur de comparaison
date_part(text, in- double precision date_part(’month’, interval ’2 years 3 3
terval) months’) Le résultat d’une sous requête peut être
date_trunc(text, timestamp date_trunc(’hour’, timestamp ’2001-02-16 2001-02-16 I une valeur
timestamp) 20 :38 :40’) 20 :00 :00 I une colonne
extract(field from double precision extract(hour from timestamp ’2001-02-16 20
timestamp) 20 :38 :40’)
I plusieurs colonnes
extract(field from double precision extract(month from interval ’2 years 3 3
On peut imbriquer plusieurs niveaux de sous-requêtes.
interval) months’)
isfinite(timestamp) boolean isfinite(timestamp ’2001-02-16 21 :28 :30’) true
isfinite(interval) boolean isfinite(interval ’4 hours’) true
localtime time
localtimestamp timestamp
logo logo
now() timestamp
timeofday() text
(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 36 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 37 / 95

Le Langage d’Interrogation de Données : Les sous requêtes Le Langage d’Interrogation de Données : Les sous requêtes
comparaison avec une constante L’opérateur EXISTS permet de construire un prédicat vrai si la
SELECT ∗ FROM f o u r n i s s e u r WHERE f n o > 125; sous-interrogation qui suit ramène au moins une ligne.
SELECT ∗ FROM f o u r n i s s e u r WHERE EXISTS (SELECT ...);
comparaison avec le résultat d’une sous-requête qui doit renvoyer une
seule ligne d’une seule colonne Une sous-interrogation peut ramener plusieurs lignes à condition que
l’opérateur de comparaison admette à sa droite un ensemble de valeurs.
SELECT ∗ FROM f o u r n i s s e u r WHERE f n o > (SELECT f n o FROM . . . ) ;
Les opérateurs permettant de comparer une valeur à un ensemble de
comparaison avec le résultat d’une sous-requête qui doit renvoyer valeurs sont :
plusieurs lignes d’une seule colonne I l’opérateur IN
I les opérateurs obtenus en ajoutant ANY ou ALL à la suite d’un opérateur
SELECT ∗ FROM f o u r n i s s e u r WHERE f n o > (SELECT f n o FROM . . . ) ; de comparaison classique (=, !=, >, >=, <, <=)
F ANY : la comparaison est vraie si elle est vraie pour au moins un des
comparaison avec le résultat d’une sous-requête qui doit renvoyer éléments de l’ensemble.
plusieurs lignes ayant le même nombre de colonnes que la partie gauche F ALL : la comparaison est vraie si elle est vraie pour tous les éléments de
du prédicat l’ensemble.

SELECT ∗ FROM commande


SELECT ∗ FROM f o u r n i s s e u r WHERE f n o < ANY (SELECT f n o FROM . . . ) ;
WHERE ( pno , f n o ) = (SELECT pno , f n o FROM . . . ) ; logo
SELECT ∗ FROM f o u r n i s s e u r WHERE f n o > ALL (SELECT f n o FROM . . .logo
);

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 39 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 41 / 95
Le Langage d’Interrogation de Données : Les opérateurs Le Langage d’Interrogation de Données : Les opérateurs
ensemblistes ensemblistes

Une expression est un ensemble de variables (contenu d’une colonne),


Les opérateurs ensemblistes permettent de "joindre" des tables
de constantes et de fonctions combinées au moyen d’opérateurs. Les
verticalement c’est-à-dire de combiner dans un résultat unique des lignes
fonctions prennent une valeur dépendant de leurs arguments qui peuvent
provenant de deux interrogations. Les lignes peuvent venir de tables
être eux-mêmes des expressions.
différentes mais après projection on doit obtenir des tables ayant même
Les expressions peuvent figurer :
schéma de relation.
I en tant que colonne résultat d’un SELECT,
Les opérateurs ensemblistes sont les suivants : I dans une clause WHERE,
I l’union : UNION I dans une clause ORDER BY.
I l’intersection : INTERSECT
I la différence relationnelle : EXCEPT Il existe trois types d’expressions correspondant chacun à un type de
données de SQL : arithmétique, chaîne de caractères, date. A chaque
SELECT pno FROM p r o d u i t WHERE p o i d s > 20 type correspondent des opérateurs et des fonctions spécifiques.
UNION
SELECT pno FROM commande WHERE f n o = 1 5 ; SELECT pno , l i b e l l e ,
p r i x ∗ 1.196 AS " P r i x u n i t a i r e TTC" FROM p r o d u i t ;
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 43 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 45 / 95

Le Langage d’Interrogation de Données : Les fonctions de Le Langage d’Interrogation de Données : Les fonctions de
regroupement regroupement

On peut spécifier un regroupement sur lequel vont travailler les fonctions


Il existe un type de SELECT qui permet d’effectuer des calculs sur en utilisant la clause GROUP BY.
l’ensemble des valeurs d’une colonne. Ces calculs sur l’ensemble des SELECT SUM( q u a n t i t e ) FROM commande GROUP BY f n o ;
valeurs d’une colonne se font au moyen de l’une des fonctions suivantes : SELECT fno ,COUNT( ∗ ) AS
I AVG() moyenne, Nombre FROM commande GROUP BY f n o ;
I COUNT() compte le nombre de lignes,
I MAX() renvoie la valeur maxi La clause HAVING permet d’exprimer des restrictions sur les lignes de
I MIN() renvoie la valeur mini regroupement. Après la clause HAVING on peut trouver une
I SUM() renvoie la somme des valeurs sous-requête.
Par exemple : La liste des fournisseurs qui ont moins de 3 commandes
SELECT COUNT( ∗ ) FROM p r o d u i t ;
SELECT AVG( p r i x ) FROM p r o d u i t ;
SELECT fno ,COUNT( ∗ ) AS Nombre
FROM commande GROUP BY f n o
HAVING COUNT( ∗ ) < 3 ;
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 47 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 49 / 95

Le Langage de manipulation de Données Le Langage de manipulation de Données : L’insertion

Pour effectuer l’insertion d’un tuple dans une table on utilise le mot clé
INSERT. Il y a deux type d’insertion :
I Insertion par extension en utilisant la clause VALUES
Le langage de manipulation de données est le langage permettant de INSERT INTO
modifier les informations contenues dans une base de données. p r o d u i t ( pno , l i b e l l e , p r i x , p o i d s c o u l e u r , pnoPhare )
L’unité manipulée est la ligne. VALUES ( 1 8 , ’ Ecrou i n o x ’ , 5 , 12 , ’ V e r t ’ , 1 2 ) ;

Il existe trois commandes SQL permettant d’effectuer les trois types de I On peut aussi faire des insertions sans préciser la liste des colonnes, dans
modifications des données : ce cas les valeurs données, seront rangées dans les colonnes indiquées
I ajout, lors de la création de la table.
I modification et INSERT INTO p r o d u i t
I suppression. VALUES ( 1 8 , ’ Ecrou i n o x ’ , 5 , 12 , ’ V e r t ’ , 1 2 ) ;
I Insertion par intention en utilisant une sous requête
INSERT INTO petitesCommandes ( pno , q u a n t i t e )
SELECT pno , q u a n t i t e FROM commande WHERE q u a n t i t e < 5 ;
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 51 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 53 / 95

Le Langage de manipulation de Données : La mise à jour Le Langage de manipulation de Données : La suppression

La commande UPDATE permet de modifier les valeurs d’une ou plusieurs


colonnes, dans une ou plusieurs lignes existantes d’une table. La syntaxe
est la suivante :
La commande DELETE permet de supprimer des lignes d’une table.
Les valeurs des colonnes nom_col1 , nom_col2 , ..., nom_colp sont
La syntaxe est la suivante :
modifiées dans toutes les lignes satisfaisant au prédicat. En l’absence
d’une clause WHERE, toutes les lignes sont mises à jour. DELETE FROM nom_table WHERE p r e d i c a t ;
Les expressions expression1, expression2,... peuvent faire référence aux
anciennes valeurs de la ligne. Toutes les lignes pour lesquelles le prédicat est évalué à vrai sont
supprimées. En l’absence de clause WHERE, toutes les lignes de la table
UPDATE nom_table sont supprimées.
SET nom_col1 = { e x p re s s i o n 1 | ( SELECT . . . ) } ,
nom_col2 = { e x p r es s i on 2 | ( SELECT . . . ) } , DELETE FROM p r o d u i t WHERE p r i x > 100;
. . . , nom_colp = { e x p r e s s i on p | ( SELECT . . . ) }
WHERE p r e d i c a t

UPDATE p r o d u i t SET p r i x = p r i x ∗ 1.05 WHERE c o u l e u r = ’ Rouge ’ ;


logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 55 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 57 / 95
Le Langage de Définition des données Les contraintes d’intégrité

Les contraintes d’intégrité permettent de spécifier des règles qui doivent


être respectées lorsqu’une modification est faite dans une base de
données.
CREATE TABLE nom_table Les contraintes d’intégrité peuvent s’exprimer pour l’ensemble de la table.
( nom_col1 TYPE1 ,
nom_col2 TYPE2 , CREATE TABLE nom_table (
...) nom_col_1 type_1 ,
nom_col_2 type_2 ,
...
CREATE TABLE groupe (num integer , nom varchar ( 2 5 ) ) ;
nom_col_n type_n
CONSTRAINT [ nom_contrainte_1 ] c o n t r a i n t e _ 1 ,
CONSTRAINT [ nom_contrainte_2 ] c o n t r a i n t e _ 2 ,
...
CONSTRAINT [ nom_contrainte_m ] c o n t r a i n t e _ m
);
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 59 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 61 / 95

Les contraintes d’intégrité Les contraintes d’intégrité

Les contraintes d’intégrité peuvent s’exprimer par colonne.

CREATE TABLE nom_table ( Les contraintes différentes que l’on peut déclarer sont les suivantes :
nom_col_1 type_1 CONSTRAINT [ nom_contrainte_1_1 ] c o n t r a i n t e _ 1 _ 1
CONSTRAINT [ nom_contrainte_1_2 ] c o n t r a i n t e _ 1 _ 2 NOT NULL La colonne ne peut pas contenir de valeurs NULL.
... UNIQUE Chaque ligne de la table doit avoir une valeur différente ou
CONSTRAINT [ nom_contrainte_1_m ] contrainte_1_m ,
NULL pour cette (ou ces) colonne.
nom_col_2 type_2 CONSTRAINT [ nom_contrainte_2_1 ] c o n t r a i n t e _ 2 _ 1
CONSTRAINT [ nom_contrainte_2_2 ] c o n t r a i n t e _ 2 _ 2 PRIMARY KEY Chaque ligne de la table doit avoir une valeur différente pour
... cette (ou ces) colonne. les valeurs NULL sont rejetées.
CONSTRAINT [ nom_contrainte_2_p ] c o n t r a i n t e _ 2 _ p , FOREIGN KEY Cette colonne fait référence à une colonne clé d’une autre
...
table.
nom_col_n type_n CONSTRAINT [ nom_contrainte_n_1 ] c o n t r a i n t e _ n _ 1
CONSTRAINT [ nom_contrainte_n_2 ] c o n t r a i n t e _ n _ 2 CHECK Permet de spécifier les valeurs acceptables pour une colonne.
...
CONSTRAINT [ nom_contrainte_n_q ] c o n t r a i n t e _ n _ q
);
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 63 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 65 / 95

Les contraintes d’intégrité Les contraintes d’intégrité


Les contraintes de clé Les contraintes d’intégrité référentielle
I Une contrainte de clé permet de vérifier que la (ou les) valeur est unique REFERENCES r e f t a b l e [ ( r e f c o l u m n ) ] [ MATCH matchtype ]
(et non nulle) dans toute la table. [ ON DELETE a c t i o n ] [ ON UPDATE a c t i o n ]
nom_col t y p e CONSTRAINT n o m _c on t r a i n t e PRIMARY KEY ( column c o n s t r a i n t ) FOREIGN KEY ( column [ , . . . ] )
. . . , CONSTRAINT n om _c o n t ra i n t e REFERENCES r e f t a b l e [ ( r e f c o l u m n [ , . . . ] ) ]
PRIMARY KEY ( nom_col1 , nom_col2 ) [ MATCH matchtype ] [ ON DELETE a c t i o n ]
[ ON UPDATE a c t i o n ] ( t a b l e c o n s t r a i n t )

Les contraintes de type de données Les clauses ON DELETE et ON UPDATE permettent de déclencher une
I Elles permettent d’indiquer un domaine de valeurs
action de type :
I NO ACTION : Provoque une erreur qui indique qu’une suppression ou une
nom_col t y p e CONSTRAINT n o m _c on t r a i n t e modification a entrainé une violation de la contrainte. C’est laction par
CHECK ( nom_col between 0 AND 20) défaut.
I RESTRICT : même chose que NO ACTION.
I CASCADE : Détruit toutes les lignes qui font référence à cette valeur ou
Les contraintes d’intégrité référentielle modifie la valeur.
I Elles permettent de vérifier la présence de données référencées dans I SET NULL : remplace la valeur par NULL.
logo logo
d’autres tables. I SET DEFAULT : remplace la valeur par la valeur par défaut.
(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 67 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 69 / 95

Les contraintes d’intégrité : Exemples de création de tables Le Langage de Définition des données : La suppression

CREATE TABLE f o u r n i s s e u r ( f n o integer ,


nom varchar ( 2 5 ) , La suppression d’une table
adresse varchar ( 3 5 ) ,
DROP t a b l e nom_table
v i l l e varchar ( 3 0 ) DEFAULT ’ L i l l e ’ ,
CONSTRAINT c l e _ p r i m a i r e _ f o u r n i s s e u r PRIMARY KEY ( f n o ) ) ;
CREATE TABLE p r o d u i t ( pno integer ,
La modification d’une table
l i b e l l e varchar ( 2 5 ) , ALTER t a b l e nom_table
p r i x i n t e g e r CHECK ( p r i x between 0 and 1000) , ADD ( nom_col t y p e _ c o l , . . . )
p o i d s numeric ( 6 , 3 ) , ou MODIFY ( nom_col t y p e _ c o l , . . . )
c o u l e u r char ( 1 0 ) CHECK( c o u l e u r IN ( ’ Rouge ’ , ’ V e r t ’ , ’ Bleu ’ ) ) , ou DROP ( nom_col t y p e _ c o l , . . . )
pnoPhare i n t e g e r REFERENCES p r o d u i t ,
CONSTRAINT c l e _ p r i m a i r e _ p r o d u i t PRIMARY KEY ( f n o ) ) ;

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 71 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 73 / 95
Les vues Les vues

Les vues permettent d’assurer l’objectif d’indépendance logique. Grace à


elles, chaque utilisateur pourra avoir sa vision propre des données.
Le résultat d’un SELECT est lui-même une table. Une telle table, qui Un exemple
n’existe pas dans la base mais est créée dynamiquement lors de CREATE VIEW u n _ f o u r n i s s e u r AS
l’exécution du SELECT, peut être vue comme une table réelle par les SELECT f . nom , f . adresse , SUM ( c . q u a n t i t e ) as somme
utilisateurs. Pour cela, il suffit de cataloguer le SELECT en tant que vue. FROM f o u r n i s s e u r AS f , commande AS c
Les utilisateurs pourront consulter la base, ou modifier la base (avec WHERE f . f n o = c . f n o GROUP BY f . nom , f . adresse ;
certaines restrictions) à travers la vue, c’est-à-dire manipuler la table
La suppression d’une vue
résultat du SELECT comme si c’était une table réelle.
DROP VIEW nom_vue
CREATE VIEW view [ column [ , . . . ] ]
AS SELECT e x p r e s s i o n [ AS colname ] [ , . . . ]
FROM t a b l e [ WHERE c o n d i t i o n ]
[ WITH [ CASCADE | LOCAL ] CHECK OPTION ]

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 75 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 77 / 95

Les index Les index

CREATE [ UNIQUE ] INDEX index_name ON t a b l e


Considérons le SELECT suivant : [ USING acc_method ] ( column [ ops_name ] [ , . . . ] )
[ WHERE p r e d i c a t e ]
SELECT ∗ FROM f o u r n i s s e u r WHERE nom = ’MARTIN ’ CREATE [ UNIQUE ] INDEX index_name ON t a b l e
[ USING acc_method ] ( func_name ( column [ , . . . ] ) [ ops_name ] )
Un moyen de retrouver la ou les lignes pour lesquelles nom est égal à [ WHERE p r e d i c a t e ]
MARTIN est de balayer toute la table.
Un tel moyen d’accès conduit à des temps de réponse prohibitifs pour Indexer en priorité :
des tables dépassant quelques centaines de lignes. 1 les clés primaires
2 les colonnes servant de critère de jointure
Une solution offerte par tous les systèmes de gestion de bases de 3 les colonnes servant souvent de critère de recherche
données est la création d’index, qui permettra de satisfaire aux requêtes
Ne pas indexer :
les plus fréquentes avec des temps de réponse acceptables.
1 les colonnes contenant peu de valeurs distinctes (index alors peu efficace)
2 les colonnes fréquemment modifiées

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 79 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 81 / 95

Le Langage de Contrôle d’accès aux Données Le Langage de Contrôle d’accès aux Données

Chaque accès à la base est fait par un utilisateur identifié et authentifié.


Quand un système d’information est partagé par plusieurs personnes, il
est nécessaire d’introduire dans le SGBD un mécanisme qui réglemente Chaque utilisateur dispose d’un ensemble de permissions en fonction des
l’accès aux données pour permettre : objets auxquels il veut accéder et qui lui permettent d’effectuer un
I la gestion des types d’accès (lecture, écriture, modification) et de la ensemble d’actions.
confidentialité, Il y a deux types de permissions
I la gestion de l’accès concurrent. I les permissions administratives (gestion de la base reservées aux DBA),
Le contrôle d’accès aux données est géré à partir d’un utilisateur I les permissions d’accès aux données
particulier : l’administrateur de base de données (DBA). C’est lui qui a le La gestion des permissions comprend 2 mécanismes
droit de modifier le dictionnaire de données, c’est à dire I ajout/suppression des permissions
I les utilisateurs I contrôle des permissions
I les tables
I les vues A chaque requête, il y a vérification dans le dictionnaire que l’utilisateur à
I les index la permission d’effectuer le type d’accès aux données indiqué par la
requête.
logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 83 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 85 / 95

Le Langage de Contrôle d’accès aux Données Le Langage de Contrôle d’accès aux Données

Ajouter des privilèges


A la création d’un objet (table, vue, index), seul le propriétaire (ou le DBA) GRANT < l i s t e p r i v i l ^^ e8ges> ON < l i s t e o b j e t s >
à les privilèges pour modifier les permissions sur cet objet. TO < l i s t e u t i l i s a t e u r s >
[ WITH GRANT OPTION ]
La clause GRANT permet d’ajouter des permissions
La clause REVOKE permet de supprimer des permissions I l’option WITH GRANT OPTION permet d’indiquer que la liste d’utilisateurs
Les clauses s’appliquent à un utilisateur ( ou un groupe d’utilisateurs) et aura le privilège de donner à son tour les privilèges.
précisent le type d’accès ajouté ou supprimé.
Retirer des privilèges
I SELECT permet de lire le contenu d’une table ou d’une vue
I INSERT permet d’insérer un tuple dans un table ou une vue REVOKE [GRANT OPTION FOR] < l i s t e p r i v i l ^^ e8ges>
I DELETE permet de supprimer un tuple dans la table ou la vue ON < l i s t e o b j e t s > FROM < l i s t e u t i l i s a t e u r s >
I UPDATE permet de modifier un tuple dans la table ou la vue
I REFERENCES permet de faire référence à une table ou une vue dans une I Il faut noter qu’il peut être complexe de gérer le retrait de permissions car
contrainte d’intégrité Les droits peuvent s’appliquer à une liste de colonnes elles peuvent avoir été acquises par des utilisateurs différents.

logo
GRANT SELECT, INSERT ,UPDATE ON commande TO m a r t i n , dupont ; logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 87 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 89 / 95
Le Langage de Contrôle d’accès aux Données : Le Langage de Contrôle d’accès aux Données : Révocation
Transmission des privilèges de privilèges

Les privilèges qui ont été accordés avec la commande GRANT peuvent
être retirés avec la commande REVOKE
Seul le propriétaire d’un objet peut donner un privilège d’accès sur celui-ci
Quand un privilège a été accordé avec l’option GRANT, alors la
Le bénéficiaire ne pourra pas donner ce privilège à un autre
révocation va suivre elle aussi le chemin pour supprimer le privilège
Il est utile, parfois, de déléguer le droit de donner un privilège à d’autres jusqu’au dernier utilisateur qui en a bénéficié.
utilisateurs Avec Postgresql :
Il faut alors spécifier l’option WITH GRANT OPTION I si A donne un privilège avec l’option Grant à B, puis B donne le privilège à
Celui qui reçoit l’option GRANT sur un privilège peut à son tour donner l’utilisateur C.
l’option GRANT sur ce privilège (uniquement).
I Si A décide de supprimer le privilège pour B, alors il faut utiliser en plus le
mot clé CASCADE pour que la commande soit validée pour C aussi.
I Si B avait reçu de D le même privilège, alors il conserve le privilège.
Cependant C a perdu le privilège.

logo logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 91 / 95 (IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 93 / 95

Le Langage de Contrôle d’accès aux Données :


Identification

Toute la sécurité d’accès aux données (privilèges) est basée sur l’identité
du sujet.
Le mécanisme d’authentification est là pour garantir l’identité du sujet
I Postgresql propose de nombreux mécanismes d’authentification
F Local
F Réseau (filtrage en fonction de la machine)
F Authentification par mot de passe (MD5,crypt, passwd), kerberos, pam
(Pluggable Authentication Modules)

logo

(IUT Béthune — Département R&T) Langage de requêtes : SQL Base de Données (I4) — 05/06 95 / 95

Vous aimerez peut-être aussi