Vous êtes sur la page 1sur 13

Support de cours bases de données

CHAPITRE 3

Langage de Requêtes Structuré

SQL

Introduction: pourquoi le langage de manipulation des données?

SQL (Structured Query Language) est le langage de manipulation des données relationnelles le plus utilisé
aujourd’hui. Il est devenu un standard de fait pour les relationnels. Il possède des caractéristiques proches de
l’algèbre relationnelle (jointure par emboîtement) et d’autres proches du calcul des tuples (variables sur les
relations).

Les exemples dans ce chapitre s’appuient sur la base de données relative aux fournisseurs (F), produits (P),
usines (U) et livraisons (PUF), décrite par le schéma suivant:
F (NF, nomF, statut, ville)
P (NP, nomP, poids, couleur)
U (NU, nomU, ville)
PUF (NP, NU, NF, qt)

1. Format de base d'une requête


SELECT Liste des noms d'attributs du résultat
FROM Nom d'une relation (ou de plusieurs relations)
[ WHERE Condition logique qui définit les tuples du résultat ]

Exemple: nom et poids des produits rouges.

SELECT nomP, poids


FROM P
WHERE couleur = "rouge"

Exemple : tous les renseignements sur tous les fournisseurs.

SELECT NF, nomF, statut, ville


FROM F
ou
SELECT * /* l'étoile signifie: tous les attributs*/
FROM F

Un résultat sans doubles

Les SGBD commercialisés (dont les SQL…) ne suppriment pas automatiquement les doubles. La clause
DISTINCT permet à l'utilisateur d'avoir un résultat sans double

M. FOTSO CHATUE HERMANN


Exemple : liste des couleurs qui existent.

SELECT DISTINCT couleur


FROM P
Un résultat trié

La clause ORDER BY permet de définir un ordre de tri pour les tuples du résultat .

Exemple : liste des fournisseurs de Lausanne par ordre alphabétique.


SELECT nomF, NF, statut
FROM F
WHERE ville = "Lausanne"
ORDER BY nomF ASC , NF ASC
Si plusieurs fournisseurs ont le même nom, ils seront classés selon leurs numéros.

2. Recherche avec blocs emboîtés


Exemple : numéros des fournisseurs de produits rouges ?
ensemble des numéros des produits rouges
: SELECT NP
FROM P
WHERE couleur = "rouge"
ensemble des numéros des fournisseurs de produits rouges :
SELECT NF
FROM PUF
WHERE NP
IN
( SELECT
NP FROM P
WHERE couleur = "rouge" )

 Le mot clef IN signifie "appartient", l'opérateur mathématique de la théorie des ensembles (
La phrase NP IN (SELECT NP FROM P WHERE couleur = "rouge") est une condition
logique, signifiant "la valeur de NP est dans l'ensemble des numéros de produits rouges", ce qui est
vrai ou faux.

 Dans le WHERE , la condition logique peut avoir plusieurs formes :


- elle peut être composée de conditions élémentaires connectées par AND, OR, NOT, et par des
parenthèses;
- <opérateur de comparaison> ::= >  <  ≥  ≤  =  ≠
- <opérateur d'appartenance> ::= IN  NOT IN

Exemple : noms des fournisseurs n°1, 2, 3.


SELECT nomF
FROM F
WHERE NF = 1 OR NF =2 OR NF = 3
ou
SELECT
nomF FROM F
WHERE NF IN (1, 2, 3)
3. Qualification des noms d'attributs
Notations :
NP : attribut
P.NP, PUF.NP : attributs qualifiés par le nom d'une relation

Règle 1 : Un nom d'attribut non qualifié, référence la relation la plus interne qui a un attribut de ce nom-
là.

Règle 2 : On peut renommer localement une relation dans la clause FROM .


Exemple: ... FROM PUF PUF1 ...
la relation PUF s'appelle alors PUF1 pour le SELECT correspondant à ce FROM uniquement.

Exemple : noms des fournisseurs ne livrant pas le produit numéro 2.


SELECT nomF
FROM F
WHERE 2 NOT IN
(SELECT NP /* ensemble des NP
FROM PUF livrés par ce
WHERE PUF.NF = F.NF) fournisseur */

Dans le WHERE du SELECT interne, on aurait pu tout aussi bien écrire :


WHERE NF = F.NF (cf. règle 1).

Exemple : numéros des fournisseurs livrant le même produit que le fournisseur 1 en une quantité plus
grande.

Sur le schéma, la requête peut être décrite comme suit :


=1
PUF ( NP, NU, NF, qt )
= >
PUF ( NP, NU, NF, qt
)

Ce qui s'écrit en SQL:


SELECT
NF
FROM PUF PUFX /* PUF est renommé*/
WHERE NP IN
(SELECT NP /* ensemble
FROM PUF des produits du
WHERE NF = 1 AND qt < PUFX.qt) fournisseur 1
*/

4. Recherche sur plusieurs relations


simultanément
Format général:
SELECT
Ai

FROM R1, R2…, Rn
WHERE < condition de jointure entre les Ri >
AND < condition(s) de la requête >

Exemple : pour chaque produit livré, le nom du produit et les villes de leurs fournisseurs.
SELECT nomP, ville
FROM P, F, PUF
WHERE PUF.NP = P.NP AND PUF.NF = F.NF

5. Recherche avec quantificateurs : SOME, ANY, ALL


SQL permet d'écrire des conditions où apparaissent des quantificateurs proches de ceux de la logique ("il
existe" (), "quelque soit" () ), grâce aux mots clefs SOME, ANY et ALL Les mots clefs SOME et ANY
ont exactement la même signification; ce sont des synonymes.

Syntaxe
Cette commande s’utilise dans une clause conditionnelle juste après un opérateur conditionnel et juste avant
une sous-requête. L’exemple ci-dessous démontre une utilisation basique de ANY dans une requête SQL :
SELECT *
FROM table1
WHERE condition > ANY (
SELECT *
FROM table2
WHERE condition2
)
Cette requête peut se traduire de la façon suivante : sélectionner toutes les colonnes de table1, où la
condition est supérieure à n’importe quel résultat de la sous-requête.
A savoir : les opérateur conditionnels peuvent être les suivants : =, <, >, <>, !=,<=, >=.

ALL demande une comparaison à toutes les valeurs pour que le prédicat soit vrai
ANY (ou SOME qui est un synonyme) est vrai si, au moins une valeur de l'ensemble répond vrai à la
comparaison.

Le mot clef IN est équivalent à un quantificateur existentiel (SOME ou ANY) avec l'opérateur de
comparaison d'égalité. SOME et ANY sont donc plus puissants. De même, les requêtes avec un
quantificateur universel (ALL) et un comparateur d'égalité peuvent s'écrire avec une condition ensembliste
(voir le paragraphe suivant). Cependant le mot clef ALL ne permet pas d'exprimer toutes les requêtes
contenant un quantificateur du type "quelque soit". On peut alors écrire la requête inverse avec un "NOT
EXISTS" (voir paragraphe plus loin). Par exemple la requête "chercher les X qui pour tout Y satisfont telle
condition" peut aussi s'exprimer: "chercher les X tels qu'il n'existe aucun Y qui ne satisfait pas telle
condition".

Exemples:
Ensemble des numéros des fournisseurs de produits rouges :
SELECT NF
FROM PUF
WHERE NP =
ANY
( SELECT NP FROM P
WHERE couleur = "rouge" )
Ensemble des numéros des fournisseurs qui ne fournissent que des produits rouges :

SELECT NF
FROM F
WHERE "rouge" = ALL
( SELECT couleur
FROM P
WHERE NP = ANY ( SELECT NP FROM PUF
WHERE PUF.NF = F.NF) )

6. Recherche avec des conditions sur des ensembles


Dans les paragraphes précédents, les conditions élémentaires portant sur une valeur d'attribut ont été
définies. D'autres types de conditions élémentaires permettent de comparer des ensembles entre eux. Ce
sont:

6.1. Test d’égalité d’ensembles:


<ensemble 1> = <ensemble 2>
<ensemble 1> ≠ <ensemble 2>

6.2. Test d’inclusion d’ensembles:


<ensemble 1> CONTAINS <ensemble 2>

Cette condition signifie que l'ensemble 1 contient (ou est égal à) à l'ensemble 2, ce qui en théorie des
ensembles s'écrirait : <ensemble 1>  <ensemble 2>.

La condition:
<ensemble 1> NOT CONTAINS <ensemble 2>
est la négation de la précédente; elle est vraie si un élément de l'ensemble 2 n'appartient pas à l'ensemble 1.

Exemple : noms des fournisseurs qui fournissent tous les produits rouges.
SELECT nomF
FROM F
WHERE (SELECT NP
FROM PUF /* ensemble des produits du WHERE
NF = F. NF) fournisseur F*/
CONTAINS
(SELECT NP
FROM P /* ensemble des produits rouges*/ WHERE
couleur ="rouge")

6.3. EXISTS < ensemble>


Cette condition teste si l'ensemble n'est pas vide (ensemble ≠
Ø).
Exemple : noms des fournisseurs qui fournissent au moins un produit rouge.
SELECT nom
F FROM F
WHERE EXISTS (SELECT *
FROM PUF, P
WHERE
NF = F.NF AND couleur ="rouge" AND PUF.NP=P.NP)

Il existe aussi la condition inverse


: NOT EXISTS <ensem ble>
qui teste si l'ensemble est vide.

7. Fonctions d'agrégation
SQL offre les fonctions d'agrégation usuelles:
cardinal : COUNT
moyenne : AVG
minimum et maximum : MIN, MAX
total : SUM
qui opèrent sur un ensemble de valeurs prises par un attribut, ou pour COUNT uniquement, sur un ensemble
de tuples.

Exemple : quel est le nombre de livraisons faites par le fournisseur 1 ?


SELECT COUNT (*) /* on compte les tuples de PUF tels
FROM PUF que NF = 1 */
WHERE NF=1

Exemple : combien de produits différents a livré le fournisseur 1 ? Attention : il faut ôter les doubles, car
COUNT compte toutes les valeurs, y compris les valeurs doubles.
SELECT COUNT (DISTINCT
NP) FROM PUF
WHERE NF=1

8. Recherche avec partition des tuples d'une relation


8.1. Clause Group by

Exemple: combien de produits différents ont été livrés par chacun des fournisseurs ?
Il faut partitionner l'ensemble des tuples de PUF en un sous-ensemble (ou groupe) par numéro de
fournisseur. C'est ce que permet la clause GROUP BY.

SELECT NF, COUNT (DISTINCT


NP) FROM PUF
GROUP BY NF

Cette instruction génère dans le SGBD les actions suivantes :


1. Classer les tuples de PUF, groupe par groupe (un groupe = ensemble des tuples ayant même NF),
2. Pour chaque groupe :
- évaluer le résultat du SELECT (compter le nombre de NP différents dans ce groupe).

8.2. Clause Having <condition>

Exemple: combien de produits différents ont été livrés par chacun des fournisseurs, tels que la quantité totale
de produits livrés par ce fournisseur soit supérieure à l000 ?
SELECT NF, COUNT (DISTINCT
NP) FROM PUF
GROUP BY NF
HAVING SUM (qt) > 1000
La clause "HAVING <condition>" permet de sélectionner les groupes qui satisfont une condition.
Attention, contrairement à la clause "WHERE <condition>", la condition ne porte pas sur un tuple mais sur
l'ensemble des tuples d'un groupe.

9. Mise à jour de la base de données


9.1. Insérer des tuples

- Insérer un tuple : INSERT INTO nomrelation : < tuple constant>


- Insérer un ensemble de tuples : INSERT INTO nomrelation :
<requête SELECT dont le résultat a même schéma que la relation nomrelation>

Exemple : autre catalogue de produits à rajouter à P : Catalogue (NP, nomP, couleur, poids, prix).
INSERT INTO P :
SELECT NP, nomP, couleur, poids
FROM Catalogue.

9.2. Supprimer des tuples

DELETE nomrelation [WHERE condition]

Si la clause "WHERE condition" est présente, seuls les tuples satisfaisant la condition sont supprimés.
Si la clause "WHERE condition" est absente, alors tous les tuples sont supprimés; la relation continue
d'exister, mais sa population est vide.

9.3. Mettre à jour un (des) attribut(s)

UPDATE nom relation


SET nomattr1 = <expression1 qui définit une valeur pour l'attribut1> ,
nomattrn = <expression n qui définit une valeur pour l'attribut n>
[WHERE condition]

Exemple : pour les produits verts, changer leur couleur, elle devient "vert d'eau".
UPDATE P
SET couleur = "vert
d'eau" WHERE couleur =
"vert"

10. Plusieurs types d'utilisation de SQL


Le langage SQL a essentiellement été utilisé pour offrir une interface de manipulation d'une base de données
à des utilisateurs finaux (non informaticiens), dans un contexte d'interrogation/mise à jour ponctuelle
interactive.

Par ailleurs, dans plusieurs systèmes on a développé des passerelles entre SQL et un langage de
programmation (C, Cobol, Ada, …) de façon à permettre l'écriture de programmes qui peuvent ainsi, entre
autres, manipuler les données d'une base de données par des instructions SQL.

Enfin, il existe des environnements de programmation, dits de 4ème génération, où un langage de type SQL
permet de spécifier les traitements souhaités sur les données, ces spécifications étant ensuite traduites en
langage exécutable (invisible à l'utilisateur) par un générateur de programmes.
TD SQL

Exprimer en SQL les requêtes suivantes :


1. Date de naissance et adresse de Juliette Rochat.
2. Nom et adresse des employés qui travaillent au département de recherche.
3. Nom et prénom des employés dont le supérieur est Juliette Rochat.
4. Nom des employés qui travaillent plus de 10 heures sur un projet à Genève.
5. Nom des projets sur lesquels travaillent Jean Muller et Annie Grandjean
Attention le "et" du français signifie ici que l’un ou l’autre, ou les deux, doivent travailler au projet.
6. Nom des projets sur lesquels travaillent à la fois Jean Muller et Annie Grandjean.
7. Nom et prénom des employés qui ne travaillent sur aucun projet.
8. Numéro des projets qui ont au moins un participant de chaque département.
9. Nom des employés qui ne travaillent pas sur un projet à Genève.
10. Nom des employés qui ne travaillent que sur des projets à Genève.
Cha pitre 4 Approfo ndi sse m e nt du

SGBD

4.1 Gestion des Schémas


Le terme « schéma de base de données » peut faire référence à la représentation visuelle d'une base de données,
à un ensemble de règles qui régissent une base de données ou à l'ensemble des objets appartenant à un
utilisateur particulier.
4.2 Gestion des données et des contraintes d’Intégrité des données
Le but des contraintes d’intégrité est:
 Assurer l’implémentation d’une certaine sémantique.
Par exemple, un marin peut réserver un seul bateau par jour
 Assurer que les mises à jour ne violent pas la cohérence (l’intégrité) de la base
Par exemple, si le numéro d’identification d’un bateau est unique nous ne pouvons pas insérer un
nouveau bateau avec le numéro d’un bateau déjà existant.

Les contraintes de clés primaire


Une clé primaire est un sous ensemble minimal d’attributs pour lequel deux tuples de la base ne peuvent pas
avoir la même valeur. C’est un identificateur unique. Pour déterminer les clés nous avons besoin des
dépendances fonctionnelles Une relation peut avoir plusieurs clés.
En SQL nous pouvons déclarer qu’un ensemble d’attributs est une clé en utilisant la contrainte UNIQUE:
plusieurs sous ensembles d’attributs peuvent être déclarés comme unique la contrainte PRIMARY KEY: une
seule contrainte de ce type par relation.
Exemple
Les contraintes de clés étrangères
Les contraintes de clés étrangères mettent en rapport plusieurs tables. Soit deux relations R et S. Soit une clé
étrangère qui implémente la dépendance d’inclusion. Cela veut dire:
1. Les tuples (de valeurs) associés aux attribut X dans la relation R doivent apparaître comme tuples (de
valeurs) associés aux attributs Y d’une relation S.
2. Y est associé à une contrainte UNIQUE ou PRIMARY KEY

4.3 Contrôle des droits d’accès (groupes, rôles et procédures…)


Une base contient de nombreux objets (tables, vues, procédures stockées, fonctions…). Pour entreprendre
certaines actions sur ces objets (consulter, exécuter, modifier…) l'utilisateur doit avoir les privilèges (aussi
appelés droits) nécessaires. L'utilisateur peut obtenir ces droits de manière directe ou indirecte.
Le principe de base est donc finalement très simple. La mise en place peut être un peu plus complexe, comme
nous allons le voir.

4.3.1 Gestion des droits : principes


Dans cette section, nous allons comparer 2 implémentations pour la gestion des droits.
Pour que les exemples soient plus parlant, nous allons considérer une base de données avec :
 10 utilisateurs aux droits différents suivant leur rôle
 60 tables, vues, procédures stockées…
Implémentation naïve
Pour prendre conscience des problèmes que peut représenter une mauvaise gestion des droits, nous allons
imaginer l'implémentation suivante, très simple (mais très naïve) :
 pour chaque objet (table, vue, procédure stockée) on affecte les droits de manière individuelle à chaque
utilisateur
Cette implémentation posera les problèmes suivants :
 à chaque fois que l'on ajoute un objet dans la base, il faut affecter les droits pour chacun des 10
utilisateurs
 à chaque ajout d'un utilisateur, il faudra affecter les droits sur chacun des 60 objets de la base de
données
En résumé, avec une implémentation aussi naïve , la gestion des droits est loin d'être aisée.
Implémentation plus efficace
Maintenant, considérons l'implémentation suivante :
 on définit la notion de rôle (= groupe d'utilisateurs partageant les mêmes droits)
 un utilisateur appartient à un ou plusieurs rôle(s)
 pour chaque objet de la base, on affecte les droits aux différents rôles. Tous les membres d'un rôle
donné hériteront des droits du rôle

Avec cette implémentation :


 à chaque fois que l'on ajoute un objet dans la base, il suffit d'affecter les droits à 1 rôle pour que tous les
utilisateurs du rôle bénéficient des droits d'accès
 lorsqu'on crée un nouvel utilisateur, il suffit de l'ajouter à 1 groupe d'utilisateurs (rôle) pour qu'il
bénéficie de tous les droits du rôle
 pour changer les droits d'un utilisateur, il suffit de changer son appartenance aux différents rôles
La gestion des droits devient alors nettement plus facile !
4.3.2 Qu'est-ce qu'un rôle exactement ?
Un rôle, c'est un ensemble de responsabilités. Un rôle représente un ensemble de responsabilités au sein de
l'application. Chacune de ces responsabilités s'accompagne d'un certain nombre de tâches. Pour accomplir ces
différentes tâches, les membres d'un rôle doivent pouvoir accéder à différentes données (au travers de vues,
procédures stockées, etc.), ce qui implique d'avoir les droits nécessaires pour accéder à ces données.
Lors de l'analyse, on doit donc identifier:
 les utilisateurs (users)
 les responsabilités (rôles)
 les tâches à effectuer et les moyens d'accès aux données (procédures stockées, vue, tables...)

SQL fournit les commandes GRANT pour donner des privilèges à des utilisateurs et REVOKE pour les
supprimer.
a) Commande GRANT
GRANT privileges ON object TO user [WITH GRANT OPTION]
Dans notre cadre, object est une table ou une vue
Les privilèges sont : SELECT | INSERT | UPDATE | DELETE
Exemple 1 :
Le script suivant donne le droit à visiteur d'exécuter la commande SELECT à la table produit de la
base bddgestion :
1 GRANT SELECT ON bddgestion.produit TO visiteur ;
Le script suivant montre qu'on peut donner en une seule commande GRANT plusieurs privilèges, sur plusieurs
tables, à plusieurs utilisateurs :
1 GRANT SELECT, UPDATE, DELETE, INSERT
2 ON bddgestion.produit, bddgestion.gamme
3 TO admin, visiteur;
Donner tous les droits d'un coup : GRANT ALL : Le script suivant donne tous les droits (sauf le droit
d'accorder des droits) sur toutes les tables de la base bddgestion :
1 GRANT ALL ON bddgestion.* TO admin ;
Le script suivant donne les droits uniquement sur les colonnes nom et prénom de la table user :
1 GRANT SELECT (nom, prénom), UPDATE (nom, prénom) ON bddgestion.user TO visiteur ;

b) La commande REVOKE
Retirer des privileges: Le script suivant retire le droit de mise à jour sur la table user à visiteur:
REVOKE UPDATE ON bddgestion.user TO visiteur ;
Retirer tous les privilèges : ALL PRIVILEGES: Le script suivant retire tous les privilèges de la table user :
REVOKE ALL PRIVILEGES ON bddgestion.user TO visiteur ;
Retirer le privilège d'accorder des privilège (GRANT OPTION): Le script suivant conserve les privilèges, mais
retire le droit de les accorder à d'autres utilisateurs :
REVOKE GRANT OPTION TO secretaire ;

4.4 Opérateurs Relationnels


Operateurs relationnels spécifiques sont: ´ • selection ´ • projection • jointure Confère chapitre précédent

4.5 Support des procedures et declencheurs


Les procédures stockées sont des programmes créés et exécutés du côté serveur. Elles sont destinées à être
appelées par un ou plusieurs clients de la base de données et sont très importantes pour plusieurs raisons :
 Elles sont pré-compilées à la création et donc l’utilisation d’une procédure stockée garantit un temps de
réponse plus rapide et une meilleure performance système ;
 Elles évitent de réécrire plusieurs fois les mêmes instructions ;

Les Triggers (déclencheurs) sont un type particulier de procédures stockées qui ne peuvent être appelés
explicitement par des applications mais se déclenchent automatiquement suite à des opérations d’ajout, de
modification ou de suppression de données. Ils sont associés à certaines tables pour renforcer l’intégrité des
données de la base de données ou pour intercepter des opérations sur les données demandées par l’utilisateur
avant qu’elles ne soient définitivement appliquées.

4.6 Gestion des vues


Une vue est une relation correspondant au résultat d’une requête sur la base. Cette relation n’est pas stockée
dans la base, mais calculée à chaque fois que nous avons besoin. Nous pouvons faire des requêtes et des mises
à jour sur une vue (des limites pour les mises à jour sont imposées par les SGBD).
Exemple
4.7 Echange de données : Import / Export de données
De plus en plus, les applications échangent des données, et les SGBD n'y font pas exception. Il y a bien sûr le
fameux "copier-coller", qui marche en de nombreuses occasions. Mais dans des cas plus difficiles ou plus
spécifiques, il faut recourir à des opérations d'importation ou d'exportation. C'est pourquoi, dans les menus
des applications, à la rubrique "Fichier", on constate de plus en plus souvent la présence des fonctions
"Importer..." et/ou "Exporter...".
L'exportation et l'importation de données est un processus utilisé par un nombre grandissant de logiciels qui va
permettre d’exporter un document ou des données (information) dans un format interopérable par
importation avec un ou des autres logiciels.
Actuellement, l'importation/exportation concerne principalement la gestion des données du système
d'information et évolue progressivement vers la gestion des traitements associés.

Exemple : Access de Microsoft est capable d'exporter/importer une base de données représentant sous forme
XML les éléments qui la composent (données, structure de table…).

Vous aimerez peut-être aussi