Vous êtes sur la page 1sur 100

Introduction aux Bases de

Données
Dr. Amiyne ZAKOUNI

Ecole Supérieure de Technologie – Sidi Bennour


Plan du cours

1. Introduction

2. Le modèle entité association

3. Bases de données relationnelles

4. Le langage SQL

Introduction aux BDD 4.2


Rappel: dépendance fonctionnelle

Définition:

les dépendances fonctionnelles expriment la


sémantique entre les attributs.

Un attribut (ou groupe d'attributs) B d'une table T est


fonctionnellement dépend d'un autre attribut A
d'une table T, si, á tous instant, chaque valeur de A
n'a qu'une valeur associée de B

on note: A → B (A détermine B) ou (B dépend de A)

Introduction aux BDD 4.3


Normalisation: Rôle des dépendance
fonctionnelle

Règle 1:

Une propriété non identifiant d'une entité (d'une


association) doit dépendre fonctionnellement de
l'identifiant. Toutes les propriétés de l’entité doivent
dépendre fonctionnellement de d'identifiant de
celle-ci.

Introduction aux BDD 4.4


Normalisation: Rôle des dépendance
fonctionnelle

Règle 2:

Une propriété dans une relation DOIT dépendre


fonctionnellement des identifiants des entités qui
participent a la relation.

Introduction aux BDD 4.5


Normalisation: dépendance fonctionnelle
propriétés

Propriétés de base (Armstrong)

réflexivité : si Y ⊆ X alors X → Y

augmentation : si X → Y alors X ∪ Z → Y ∪ Z

transitivité : si X → Y et Y → Z alors X → Z

Propriétés déduites
union : si X → Y et X → Z alors X → Y ∪ Z

Pseudo-transitivité : si X → Y et W ∪ Y → Z alors W ∪ X → Z

décomposition : si X → Y ∪ Z alors X → Y et X → Z

Introduction aux BDD 4.6


Normalisation: dépendance fonctionnelle
propriétés
fermeture d’un ensemble de dépendances fonctionnelles F :

F+ ensemble de toutes les dépendances fonctionnelles


déduites obtenues par l’application répétées des propriétés
de base.

F et G deux ensembles de dépendances fonctionnelles F et


G sont équivalents si F+ = G+

fermeture transitive d’un ensemble de dépendances


fonctionnelles F : ensemble de toutes les dépendances
fonctionnelles déduites obtenues par transitivité

Introduction aux BDD 4.7


Exercices: dépendance fonctionnelle

Introduction aux BDD 4.8


Exercices: dépendance fonctionnelle

1. Soit la relation r suivante :

Question : quelles sont les dépendances


fonctionnelles satisfaites par r ?
Introduction aux BDD 4.9
Exercices: dépendance fonctionnelle

Réponse : les dépendances fonctionnelles satisfaites


par r sont les suivantes :
A -> E ;
B -> E ;
C -> ABDE ;
D -> E ;
AB -> D ;
AD -> B ;
BD -> A.

Introduction aux BDD 4.10


Exercices: dépendance fonctionnelle

2. Soit F = { A -> D ; AB -> E ; BI -> E ; CD -> I ; E -> C }.

Question 1: calculer la fermeture, sous F, de AE

Introduction aux BDD 4.11


Exercices: dépendance fonctionnelle

Solution:

au départ, (AE)+ = AE,

A -> D permet d'ajouter D : (AE)+ = AED,

E -> C permet d'ajouter C : (AE)+ = AEDC,

CD -> I permet d'ajouter I : (AE)+ = AEDCI.

Introduction aux BDD 4.12


Exercices: dépendance fonctionnelle

3. Soit F = { AB -> C ; B -> D ; CD -> E ; CE -> GH ;


G -> A }.

Question: en utilisant la notion de


fermeture d'un ensemble d'attributs,
montrer que AB -> E,

Introduction aux BDD 4.13


Exercices: dépendance fonctionnelle

Solution :

B -> D |= AB -> D par augmentation,

AB -> C et AB -> D |= AB -> CD par union,

AB -> CD et CD -> E |= AB -> E par transitivité.

Introduction aux BDD 4.14


Le langage SQL
Rappels:: Résumé de la démarche de conception d’une BD
Rappels

Introduction aux BDD 4.16


Plan du cours

Introduction
Langage de Manipulation des Données (LMD)
Langage de Définition des Données (LDD)
Langage de Contrôle des Données (LCD)

Introduction aux BDD 4.17


Définition

Structured Query Language (SQL)


Langage informatique standard et
normalisé destiné à interroger ou manipuler
une base de données relationnelle

Introduction aux BDD 4.18


Historique

Modèle relationnel pour SGBD


(Codd,1970)
SQUARE
Algèbre relationnelle ~ anglais
(Boyce, Chamberlin, King & Hammer, 1975)
SEQUEL
Structured English QUEry Language
(Chamberlin, Astrahan, Eswaran, Chamberlin, Griffiths & Lorie, 1976)
SQL1
Standard ANSI(1986) et ISO(1987)
Ajout des contraintes de référence en 1989 (clés primaire/étrangère)
SQL2
Révision majeure : expressions régulières, requêtes récursives,
déclencheurs,… (1992)
SQL3
Fonctions orientées objet, manipulation XML,etc… (2003)

Introduction aux BDD 4.19


Logiciels implémentant SQL

Access Mimer
Advantage Database MySQL
Base Ocelot
DB2 Oracle
PostgreSQL
Firebird
SmallSQL
FoxPro - Visual Foxpro
SQL 2000 i (Pervasive)
HyperFile
SQLBase (Centura)
Informix
SQLite
Ingres
SQL/MM
InterBase
Sybase
MaxDB
Paradox
Microsoft SQL Server
Windev

Introduction aux BDD 4.20


Subdivisions du SQL

Data Definition Language (DDL)


Définition et modification de la base de données
CREATE, ALTER, DROP
Data Manipulation Language (DML)
Manipulation des données de la base
SELECT, INSERT, UPDATE, DELETE
Data Control Language (DCL)
Gestion des utilisateurs de la base SQL1 Complet
GRANT, REVOKE
Transaction Control Language (TCL)
Gestion des transactions (« paquets d’instructions »)
SET TRANSACTION, COMMIT, ROLLBACK
SQL Procédural
Eléments procéduraux pour interfaçage avec autres languages
PSM (Persistent Stored Module), CLI (Call Level Interface), Embedded SQL,…

Introduction aux BDD 4.21


Implémentations du SQL

SQL est une norme, mais chaque éditeur a développé son


propre dialecte

Bases de données incompatibles


Par rapport à la norme, certaines
fonctions sont implémentées de manière
différente, ou pas du tout, d’autres sont
ajoutées
Liste comparative :

http://sql.developpez.com/sqlaz/fonctions/

Introduction aux BDD 4.22


Schéma utilisé comme exemple
Modèle Conceptuel de Données
Article
Client
Num閞o Article
Num閞o Passe D閠ail Commande Description
Nom 1,n 0,n
Quantit? Quantit?en stock
T 閘閘pone Prix Unitaire
N癝S

1,1 1,n
0,n

Commande
D閠ailsLivraison
Num閞o cmd 0,n
Date Quantit?
1,1
Assurer
1,n
0,n
Employ?
N?SS Livraison
Nom Employ? N?Livraison
Salaire Date

Modèle Logique de Données


Client (noClient, Nom, Téléphone, N°SS)
Article (N° Article, Description, P.U., Quantité en stock)
Commande (N° Com, Date, N° Client, N°SS_Employé)
Détail commande (N° Com, N° Article, Quantité)
Employé (N°SS, Nom_Employé, Salaire)
Livraison (N°Livraison, Date)
DétailsLivraison (N°Livraison, N°Cmd, N°Art, Quantité)

Introduction aux BDD 4.23


Langage de Manipulation des
Données (LMD)

SELECT
Projection
Sélection
Tri
Conflit de noms d’attributs
Jointures
Opérateurs ensemblistes
Fonctions
Regroupements
Requêtes imbriquées
Conditions ALL,ANY,EXISTS
Modification de données

Introduction aux BDD 4.24


Commande de base : SELECT

Syntaxe
SELECT [DISTINCT | ALL] <clause1>[<clause2>…]
FROM <nom_table1> [, <nom_table2>,…]
[WHERE <condition1> [AND|OR <condition2> …]]
[GROUP BY <regroupement1>[<regroup2>…]]
[HAVING condition]
[ORDER BY liste de colonnes ]

Composé de 6 parties, dont 2 sont obligatoires

Introduction aux BDD 4.25


SELECT minimal

Afficher l’ensemble des commandes


ATTENTION, comme vous sélectionnez tous
les attributs de la table,
Commande il n'y a pas de projection

SELECT *
FROM Commande

Table Commande
N° Com Date N° Client N°SS Emp

1 01/06/2000 10 123
2 02/06/2000 20 456
3 02/06/2000 10 123
4 05/07/2000 10 456
5 09/07/2000 30 789
6 09/07/2000 20 789
7 15/07/2000 40 789
8 15/07/2000 40 123

Introduction aux BDD 4.26


Projection

Quels sont pour chaque commande, le numéro du client et la date de la


commande ?

π noClient, dateCommande (Commande)

SELECT noClient, dateCommande


FROM Commande
noClient dateCommande
10 01/06/2000

Table Commande 20 02/06/2000

N° Com Date N° Client N°SS Emp 10 02/06/2000


10 05/07/2000
1 01/06/2000 10 123
30 09/07/2000
2 02/06/2000 20 456
20 09/07/2000
3 02/06/2000 10 123
4 05/07/2000 10 456 40 15/07/2000

5 09/07/2000 30 789 40 15/07/2000


6 09/07/2000 20 789
7 15/07/2000 40 789 PROJECTION sans éliminer les doublons
8 15/07/2000 40 123

Introduction aux BDD 4.27


Projection
Quels sont pour chaque commande, le numéro du client et la date de la
commande ?

π noClient, dateCommande (Commande)


SELECT DISTINCT noClient, dateCommande
FROM Commande

noClient dateCommande
10 01/06/2000
Table Commande
20 02/06/2000
N° Com Date N° Client N°SS Emp
10 02/06/2000

1 01/06/2000 10 123 10 05/07/2000


2 02/06/2000 20 456 30 09/07/2000
3 02/06/2000 10 123 20 09/07/2000
4 05/07/2000 10 456
40 15/07/2000
5 09/07/2000 30 789
6 09/07/2000 20 789
7 15/07/2000 40 789
8 15/07/2000 40 123

Introduction aux BDD 4.28


Sélection
Quels sont les Articles de numéro supérieur à 30 dont le prix est inférieur à
20 Euros ?

Algèbre relationnelle : σ prixUnitaire < 20.00 ET noArticle > 30 (Article)


SELECT *
FROM Article
WHERE prixUnitaire < 20 AND noArticle > 30

noArticle description prixUnitaire Quantité


60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
95 Génévrier 15.99 10

Introduction aux BDD 4.29


Sélection
Afficher les Articles dont le numéro est supérieur à 30 et le prix est
inférieur à 20 Euros, ou dont le numéro est inférieur à 20 et le prix
supérieur à 30 euros

SELECT *
FROM Article
WHERE prixUnitaire < 20 AND noArticle > 30
OR prixUnitaire > 30 AND noArticle < 20

AND est plus fort que OR


On peut utiliser les parenthèses pour définir
la priorité de résolution des conditions

SELECT *
FROM Article
WHERE (prixUnitaire < 20 AND noArticle > 30)
OR (prixUnitaire > 30 AND noArticle < 20)

Introduction aux BDD 4.30


Sélection
Afficher les Commandes du mois de juin de l'année 2000

SELECT *
FROM Commande
WHERE dateCommande BETWEEN 01/06/2000 AND 30/06/2000

SELECT *
FROM Commande
WHERE dateCommande >= 01/06/2000 AND dateCommande <=30/06/2000

Table Commande
N° Com Date N° Client N°SS Emp
1 01/06/2000 10 123
2 02/06/2000 20 456 N° Com Date N° Client N°SS Emp
3 02/06/2000 10 123 1 01/06/2000 10 123
4 05/07/2000 10 456
2 02/06/2000 20 456
5 09/07/2000 30 789
3 02/06/2000 10 123
6 09/07/2000 20 789
7 15/07/2000 40 789
8 15/07/2000 40 123

Introduction aux BDD 4.31


Sélection
Afficher les Commandes des Clients de numéro 10, 40 et 80

SELECT *
FROM Commande
WHERE noClient = 10 OR noClient = 40 OR noClient = 80

SELECT *
FROM Commande
WHERE noClient IN (10; 40; 80)

Table Commande
N° Com Date N° Client N°SS Emp
1 01/06/2000 10 123
3 02/06/2000 10 123
4 05/07/2000 10 456
7 15/07/2000 40 789
8 15/07/2000 40 123

Introduction aux BDD 4.32


Sélection
Afficher les Clients dont le nom commence par D

SELECT *
FROM Client
WHERE nomClient LIKE "D*"
N° Nom_Client Téléphone N°SS Emp

20 Dollard Cash (888)888-8888 456


80 Dollard Cash (333)333-3333 123

Afficher les Clients dont la 3ème lettre du nom est L et dont la dernière lettre du
nom est un h
SELECT *
FROM Client
WHERE nomClient LIKE "??L*h"

Introduction aux BDD 4.33


Sélection

Afficher les Clients dont le numéro de téléphone a été saisi

N° Nom_Client Téléphone N°SS Emp


10 Hugh Paycheck (999)999-9999 123
20 Dollard Cash (888)888-8888 456
30 Ye San Le Sou (777)777-7777 123
40 Le Comte Hasek (666)666-6666 456
50 Hafedh Lajoie (555)555-5555 789
60 Comtesse Hasek (666)666-6666 789
70 Coco McPoulet (444)444-4419 789
80 Dollard Cash (333)333-3333 123

expression IS [NOT] NULL


IS NULL est vraie si et seulement si la valeur associée est absente (valeur nulle)

Introduction aux BDD 4.34


Exercice::
Exercice
Gestion des notes

Etudiant(NumEtu, Nom, Prénom, DateNais, #CodSex)


Sexe(CodSex, LibSex)
Matière(NumMat, NomMat, #NumEns)
Enseignant(NumEns, Nom, Prénom, Grade)
Evaluer(NumEtu, NumMat, Note)

a. Afficher le nom et le prénom des garçons.


b. Afficher le nom et le grade des enseignants.
c. Afficher le nom et l’âge des filles.
d. Afficher le nom et le prénom des enseignants
de P1, P3, P5.
c. Trier par ordre croissant les résultats des questions
1 et 3.
d. Trier par ordre décroissant les résultats des questions
2 et 4.
Introduction aux BDD 4.35
Exercice::
Exercice
Gestion des notes (Correction)

a/ Select Nom, Prénom From Etudiant where CodSex=’’M’’;

b/ Select Nom, Grade From Enseignant;

c/ Select Nom, Date()-DateNais As Age From Etudiant where


CodSex=’’F’’;

d/ Select Nom, Prénom From Enseignant As E, Matière As M


where E.NumEns = M.NumEns And M.NumMat IN (‘’P1’’, ‘’P3’’,
‘’P5’’);
e/ Select Nom, Prénom From Etudiant where CodSex=’’M’’ Order
by Nom;
Select Nom, Date()-DateNais As Age From Etudiant where
CodSex=’’F’’ Order By Nom;

f/ Select Nom, Grade From Enseignant Order by Nom Desc;


Select Nom, Prénom From Enseignant As E, Matière As M where
E.NumEns = M.NumEns And M.NumMat IN (‘’P1’’, ‘’P3’’, ‘’P5’’)
Order by Nom Desc
Introduction aux BDD 4.36
Sélection et projection

Afficher les noClient et dateCommande des Commandes saisies après le


05/07/2000

π noClient, dateCommande (σ dateCommande > 05/07/2000 (Commande))

SELECT noClient, dateCommande


FROM Commande
WHERE dateCommande > 05/07/2000

noClient dateCommande
30 09/07/2000
20 09/07/2000
40 15/07/2000
40 15/07/2000

Introduction aux BDD 4.37


Projection avec Alias
• On peut utiliser des alias pour changer l’affichage
d’un attribut

π nom, Téléphone, ρ N°SS [Num sécurité Sociale] (Client)

Nom_Client Téléphone Num sécurité sociale


Hugh Paycheck (999)999-9999 951 ATTENTION,
Dollard Cash (888)888-8888 753
Ye San Le Sou (777)777-7777 486 Sous Access, le nouveau nom
Le Comte Hasek (666)666-6666 197 doit être entre crochets
Hafedh Lajoie (555)555-5555 123
Comtesse Hasek (666)666-6666 164
Coco McPoulet (444)444-4419 188
Dollard Cash (333)333-3333 133

Introduction aux BDD 4.38


Requête paramétrée
Afficher le téléphone et le nom du client dont le numéro INSEE est saisi par
l'utilisateur

π nom, Téléphone (σ N°SS = [Saisissez le Num sécurité Sociale] (Client))

SELECT Nom, Téléphone, N°SS AS [Num sécurité sociale]


FROM Client
WHERE N°SS = [Saisissez le Num Sécurité Sociale]

Nom_Client Téléphone Num sécurité sociale


Hugh Paycheck (999)999-9999 951

Introduction aux BDD 4.39


Tri du résultat
Afficher le nom et le téléphone des Clients dont le numéro est différent de 30 par
ordre alphabétique

Nom Téléphone Nom Téléphone


Coco McPoulet (444)444-4419 Coco McPoulet (444)444-4419
Comtesse Hasek (666)666-6666 Comtesse Hasek (666)666-6666
Dollard Cash (888)888-8888 Dollard Cash (333)333-3333
Dollard Cash (333)333-3333 Dollard Cash (888)888-8888
Hafedh Lajoie (555)555-5555 Hafedh Lajoie (555)555-5555
Hugh Paycheck (999)999-9999 Hugh Paycheck (999)999-9999
Le Comte Hasek (666)666-6666 Le Comte Hasek (666)666-6666

Introduction aux BDD 4.40


Conflit de noms d’attributs
Deux techniques :

Préfixage
• Nom_table . nom_colonne
SELECT Client.Nom,…,
FROM Client, …

Renommage (si nom long, ou auto-jointure)


SELECT Cl.noClient, nomClient, noTéléphone, noCommande,
dateCommande
FROM Client AS Cl, Commande AS Co
WHERE Cl.noClient = Co.noClient

SELECT Client.noClient, nomClient, noCommande


FROM Client AS Cl, Commande AS Co
WHERE Cl.noClient = Co.noClient

Introduction aux BDD 4.41


Produit Cartésien
R1 X R2
SQL 1
SELECT *
FROM R1, R2
SQL 2 SELECT *
FROM R1 CROSS JOIN R2
Afficher toutes les combinaisons possibles de lignes de Client et de Commande

SELECT *
FROM Client, Commande

Introduction aux BDD 4.42


Thêta--produit (thêta-
Thêta (thêta-jointure)
Afficher toutes les combinaisons possibles de lignes de Client numéro 10 et de
Commande

π Client.noClient, nomClient, noTéléphone, noCommande (Client noClient=10 Commande)


SELECT Client.noClient, nomClient, noTéléphone, noCommande
FROM Client, Commande
WHERE Client. noClient = 10

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client JOIN Commande
ON Client.noClient = 10

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client JOIN Commande
USING (Client.noClient = 10)

Introduction aux BDD 4.43


Jointure naturelle (*)
Afficher toutes les informations au sujet des Clients et de leurs Commandes

π Client.noClient, nomClient, noTéléphone, noCommande (σ Client.noCliente = Commande.noClient (Client × Commande))

La jointure avec NATURAL JOIN est faite sur les colonnes de même nom (noClient)

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client, Commande
WHERE Client.noClient = Commande.noClient

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client NATURAL JOIN Commande

Introduction aux BDD 4.44


Jointure naturelle (*)

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client JOIN Commande ON
Client.noClient = Commande.numeroClient

Quand les noms des colonnes sont différents, on peut utiliser JOIN avec une
condition

Introduction aux BDD 4.45


Jointure naturelle (*)
Afficher le nom des Clients qui ont passé des Commandes le 01/07/2002

SELECT nomClient
FROM Client Cl, Commande Co
WHERE Cl.noClient = Co.noClient
AND Co.date = 01/07/2002

SELECT nomClient
FROM Client
WHERE noClient IN
(SELECT noClient
FROM COMMANDE
WHERE Date = 01/07/2002)

Introduction aux BDD 4.46


Jointure naturelle de plus de deux
tables
Afficher le nom des Clients qui ont commandé au moins un article Imprimante

π nomClient (σ description = “Imprimante ”

(Client *Commande * DétailsCommande * Article))

SELECT nomClient
FROM Client, Commande, DétailsCommande, Article
WHERE description = 'Imprimante' AND
Client.noClient = Commande.noClient AND
Commande.noCommande = DétailsCommande.noCommande AND
DétailsCommande.noArticle = Article.noArticle

Introduction aux BDD 4.47


Jointure naturelle de plus de deux
tables
Afficher le nom des Clients qui ont commandé au moins un article Imprimante

π nomClient (σ description = “Imprimante ”

(Client *Commande * DétailsCommande * Article))


SELECT nomClient
FROM Client
WHERE noClient IN

SELECT noClient
FROM Commande
WHERE noCommande IN

SELECT noCommande
FROM DétailsCommande
WHERE noArticle IN

SELECT noArticle
FROM Article
WHERE description = 'Imprimante'
Introduction aux BDD 4.48
Demi--Jointures
Demi
Gauche

Afficher toutes les informations au sujet des Clients et de leurs Commandes et


des Clients qui n'ont passé aucune commande

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client LEFT OUTER JOIN Commande
Droite

Afficher toutes les informations au sujet des Clients et de leurs Commandes et


des Commandes dont le client n'est pas défini

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client RIGHT OUTER JOIN Commande

Introduction aux BDD 4.49


Jointure Externe
Afficher toutes les informations au sujet des Clients et de leurs Commandes,
des Commandes dont le client n'est pas défini, et des Clients qui n'ont pas de
commande

SELECT Client.noClient, nomClient, noTéléphone, noCommande


FROM Client FULL OUTER JOIN Commande

Introduction aux BDD 4.50


Auto--jointure
Auto
Afficher les Clients qui ont le même numéro de téléphone

π Client.noClient, Client2.noClient, (σ Client.noTéléphone = Client2.noTéléphone (Client × ρ Client2 (Client)))


SELECT Client.noClient, Client2.noClient
FROM Client, Client AS Client2
WHERE Client.noTéléphone = Client2.noTéléphone
AND Client.noClient <> Client2.noClient

SELECT noClient, noClient2


FROM Client JOIN Client AS Client2
ON Client.noTéléphone = Client2.noTéléphone

L'utilisation d'ALIAS est indispensable

Introduction aux BDD 4.51


Auto--jointure
Auto

π noClient, noClient2 (Client * ρ Client2(noClient2, nomClient2, noTéléphone, N°SS2) (Client))

SELECT noClient, noClient2


FROM Client NATURAL JOIN
Client AS Client2(noClient2, nomClient2, noTéléphone, N°SS2)

La jointure avec NATURAL JOIN est faite sur les colonnes de même nom

Introduction aux BDD 4.52


Auto--jointure
Auto
Afficher les Employés qui gagnent plus que l'employé "Chbeir"

SELECT Employé.N°SS, CHBEIR.N°SS


FROM Employé, Employé AS CHBEIR
WHERE Employé.Salaire > CHBEIR.Salaire
AND CHBEIR.Nom = "Chbeir"

SELECT Employé.N°SS
FROM Employé
WHERE Salaire > (SELECT Salaire
FROM Employé
WHERE Nom = "Chbeir")

Une seule valeur doit être retournée

Introduction aux BDD 4.53


Opérateurs ensemblistes

UNION ∪
INTERSECT ∩
MINUS −

Seul UNION est implémenté dans Access !

Les schémas des relations d’origine doivent être identiques (même


nombre et mêmes types de colonnes)
Par défaut, les doublons sont éliminés (préciser ALL pour afficher les
doublons)
Les noms des colonnes à l'affichage sont ceux du premier SELECT

Introduction aux BDD 4.54


UNION
Afficher le N°SS et le nom de toutes les personnes de la base, que ce soit des
clients ou des employés

π ρN°SS [N° INSEE], ρnomClient [NomPersonne] (Client) ∪ π N°SS,nom_employé (Employé)


(SELECT N°SS as N°INSEE, nomClient as nomPersonne
FROM Client)
UNION ALL N° INSEE NomPersonne
(SELECT N°SS, nom_Employé
951 Hugh Paycheck
FROM Employé)
753 Dollard Cash
486 Ye San Le Sou
197 Le Comte Hasek
123 M. Barth
164 Comtesse Hasek
188 Coco McPoulet
133 Dollard Cash
456 M. Chbeir

789 Mme Kacimi


123 M. Barth

Introduction aux BDD 4.55


UNION
Afficher le N°SS et le nom de toutes les personnes de la base, que ce soit des
clients ou des employés

(SELECT N°SS as N°INSEE, nomClient as nomPersonne


FROM Client)
UNION
(SELECT N°SS, nom_Employé
FROM Employé)

N° INSEE NomPersonne
951 Hugh Paycheck
753 Dollard Cash
486 Ye San Le Sou
197 Le Comte Hasek
123 M. Barth
164 Comtesse Hasek
188 Coco McPoulet
133 Dollard Cash
456 M. Chbeir

789 Mme Kacimi

Introduction aux BDD 4.56


INTERSECT
Afficher le N°SS et le nom de tous les clients qui sont également employés

(SELECT N°SS as N°INSEE, nomClient as nomPersonne


FROM Client)
INTERSECT
(SELECT N°SS, nom_Employé
FROM Employé)

N° INSEE NomPersonne
123 M. Barth

Par défaut, l'intersection est faite sur la position des colonnes

Introduction aux BDD 4.57


INTERSECT
Afficher le N°SS et le nom de tous les clients qui sont également employés

N° INSEE NomPersonne
123 M. Barth

L'intersection est faite sur la colonne N°SS

Introduction aux BDD 4.58


Fonctions
Fonctions dépendantes du SGBD
Fonctions sur chaînes de caractères
Fonctions sur des entiers
Fonctions sur des dates

Exple : Fonctions intégrées dans Access

Afficher les Commandes de la journée

SELECT *
FROM Commande
WHERE dateCommande = Maintenant()

Introduction aux BDD 4.59


Fonctions
Fonctions génériques
Fonctions arithmétiques
+, *, /, -
Fonctions ensemblistes
MAX : Fournit la valeur maximale Valeurs
numériques,
MIN : Fournit la valeur minimale caractère et date
COUNT : Fournit la cardinalité d’un ensemble
SUM : Somme de toutes les valeurs
AVG : Moyenne de toutes les valeurs Valeurs Numériques

Introduction aux BDD 4.60


Fonctions Ensemblistes
Elles peuvent être utilisées dans la clause SELECT ou dans la
clause WHERE
Elles agissent sur un ensemble de valeurs d'une colonne
Elles donnent toujours une seule valeur
Si l'argument est l'ensemble vide
COUNT donne 0
Les autres fonctions donnent NULL
L'argument de ces fonctions ne peut pas être une fonction
SELECT AVG(SUM(Salaire)) FROM … est invalide
Mais on peut faire:
SELECT AVG(x) FROM (SELECT SUM(Salaire) AS x FROM ..))
Les valeurs nulles sont éliminées avant l'application de la
fonction, sauf pour COUNT(*)

Introduction aux BDD 4.61


Moyenne AVG
Afficher le salaire moyen des employés

SELECT AVG(Salaire)
FROM Employé

Afficher les employés qui gagnent plus que le salaire moyen

SELECT Nom
FROM Employé
WHERE Salaire >=(SELECT AVG(Salaire)
FROM EMployé)

Introduction aux BDD 4.62


Count(*)

COUNT(*) compte toutes les lignes d'une


table ou d'un résultat d'une sélection (sans
éliminer les doublons)
COUNT(DISTINCT attribut) compte le nombre
d'attributs sans doublons
COUNT(DISTINCT *) est invalide

Introduction aux BDD 4.63


Count
Afficher le nombre de salariés qui ont un salaire fixe

SELECT COUNT(*)
FROM Employé
WHERE Salaire IS NOT NULL

Afficher le nombre d'employés qui ne gagnent pas le même salaire

SELECT COUNT(DISTINCT Salaire)


FROM Employé

Introduction aux BDD 4.64


Regroupements
Afficher le nombre de Commandes de chaque Client (qui a passé au moins une
Commande)

SELECT noClient, COUNT(*) AS nombreCommandes


FROM Commande
GROUP BY noClient

Table Commande
noCommande dateCommande noClient
1 01/06/2000 10
3 02/06/2000 10 noClient nombreCommandes
4 05/07/2000 10 10 3
2 02/06/2000 20
6 09/07/2000 20
20 2
5 09/07/2000 30 30 1
7 15/07/2000 40 40 2
8 15/07/2000 40

Introduction aux BDD 4.65


Subtilités des Regroupements

SELECT noClient, NomClient AS nombreCommandes


FROM Commande
GROUP BY noClient

SELECT noClient, NomClient


FROM Commande
GROUP BY noClient, NomClient
SELECT noClient, COUNT(*) AS nombreCommandes
FROM Commande
GROUP BY noClient

Introduction aux BDD 4.66


Subtilités des Regroupements

SELECT noClient, count(*) AS nombreCommandes


FROM Commande

SELECT noClient, Count(*) AS nombreCommandes


FROM Commande
GROUP BY noClient
SELECT COUNT(*) AS nombreCommandes
FROM Commande

Introduction aux BDD 4.67


Subtilités des Regroupements

SELECT noClient, NomClient


FROM Commande
GROUP BY noClient

SELECT NomClient
FROM Commande
GROUP BY noClient, NomClient
SELECT NomClient
FROM Commande
GROUP BY NomClient

Introduction aux BDD 4.68


Regroupements :
Clause HAVING
Afficher le nombre de Commandes de chaque Client qui a passé deux
Commandes ou plus

SELECT noClient, COUNT(*) AS nombreCommandes


FROM Commande
GROUP BY noClient
WHERE COUNT(*) >= 2

La clause WHERE ne peut pas être utilisée après GROUP BY

SELECT noClient, COUNT(*) AS nombreCommandes


FROM Commande
GROUP BY noClient
HAVING COUNT(*) >= 2

Introduction aux BDD 4.69


Regroupements :
Clause HAVING
Afficher le nombre de Commandes de chaque Client passées après le
02/06/2000
SELECT noClient, COUNT(*) AS nombreCommandes
FROM Commande
WHERE dateCommande > '02/06/2000'
GROUP BY noClient

Afficher le nombre de Commandes de chaque Client qui a passé deux


Commandes ou plus après le 02/06/2000

SELECT noClient, COUNT(*) AS nombreCommandes


FROM Commande
WHERE dateCommande > '02/06/2000'
GROUP BY noClient
HAVING COUNT(*) >= 2

Introduction aux BDD 4.70


Requêtes imbriquées
Afficher toutes les informations concernant les Clients qui ont passé au moins
une Commande

SELECT Client.noClient, nomClient, noTéléphone


FROM Client, Commande
WHERE Client.noClient = Commande.noClient

SELECT noClient, nomClient, noTéléphone


FROM Client
WHERE noClient IN
(SELECT noClient
FROM Commande)

Introduction aux BDD 4.71


Requêtes imbriquées
SELECT *
FROM Commande
WHERE noClient =
(SELECT noClient
FROM Client
WHERE nomClient = 'Chbeir')
Valide car une seule ligne renvoyée par la sous-requête

SELECT *
FROM Client Référence à une
WHERE 0 < colonne non locale
(SELECT COUNT(*)
FROM Commande
WHERE noClient = Client.noClient)

Introduction aux BDD 4.72


Requêtes imbriquées

SELECT noClient, dateCommande


FROM
(SELECT * SQL 2 !
FROM Commande
WHERE dateCommande > '05/07/2000'
)

Introduction aux BDD 4.73


Conditions ALL, ANY
Afficher les employés qui touchent un salaire supérieur à n'importe quel autre
employé (le plus élevé)

SELECT *
FROM Employé
WHERE Salaire >= ALL (
SELECT Salaire
FROM Employé)

Afficher les employés qui touchent un salaire supérieur à un employé


quelconque dont le nom commence par c
SELECT *
FROM Employé
WHERE Salaire > ANY (
SELECT Salaire
FROM Employé
WHERE Nom_employe like "c*")

Introduction aux BDD 4.74


EXISTS, NOT EXISTS
Afficher les Clients qui ont passé au moins une Commande
SELECT *
FROM Client
WHERE EXISTS
(SELECT *
FROM Commande
WHERE noClient = Client.noClient)

Afficher les Clients qui ne sont pas en même temps des employés
SELECT *
FROM Client e
WHERE NOT EXISTS
(SELECT *
FROM Employé
WHERE N°SS_Employé = e.N°SS)

Introduction aux BDD 4.75


Exprimer une division algébrique
avec count()
Clients(n°client,nomclient,preclient)
Commande(n°client,n°commande,n°produit,quantité,PU)
Produits(n°produit,stock,PU)

Quels sont les clients qui ont commandé tous les produits ?
Solution avec count() :

Compter le nombre de produits différents


Compter pour chaque client le nombre de
produits différents commandés
Comparer les deux résultats

Introduction aux BDD 4.76


Exprimer une division algébrique
Select n°client from Commandes
Group by n°client
Having count(distinct n°produit) =
Select count (*) from Produits

Introduction aux BDD 4.77


Exprimer une division relationnelle
avec EXISTS
Clients(n°client,nomclient,preclient)
Commande(n°client,n°commande,n°produit,quantité,PU)
Produits(n°produit,stock,PU)

Quels sont les clients qui ont commandé tous les produits ?
Solution avec EXISTS :

Sélectionner les clients tels que


Il n’existe pas de produit qui n’ait pas été
commandé

Introduction aux BDD 4.78


Exprimer une division relationnelle
avec EXISTS

Sélectionner les clients tels qu’il n’existe pas


de produit qui n’ait pas été commandé
Équivaut à
Sélectionner les clients c tels que
Il n’existe pas de produit p tel que
Il n’existe pas de ligne de commande pour le
produit p et le client c

Introduction aux BDD 4.79


Exprimer une division relationnelle
avec EXISTS
Select n°client c from Client
Where not exists
(Select n°produit p from Produits
Where not exists
(Select * from Commandes where n°produit=p and n°client=c))

Introduction aux BDD 4.80


Modification de données
Insérer des données

INSERT INTO Nom_de_la_table(colonne1,colonne2,colonne3,...)


VALUES (Valeur1,Valeur2,Valeur3,...)

INSERT INTO Nom_de_la_table(colonne1,colonne2,...)


SELECT colonne1,colonne2,...
FROM Nom_de_la_table2
WHERE qualification

Introduction aux BDD 4.81


Modification de données
Modifier des lignes de données

UPDATE Nom_de_la_table
SET Colonne = Valeur_Ou_Expression
WHERE qualification

Supprimer des données

DELETE FROM Nom_de_la_table


WHERE qualification

Introduction aux BDD 4.82


Langage de Définition des Données
(LDD)
Création de base de données
Création de Table

Table simple
Contraintes d’intégrité
Clé primaire
Intégrité référentielle
Modification de structure d’une table
Suppression d’une table

Introduction aux BDD 4.83


Création de Base de Données
Norme SQL :
CREATE SCHEMA [ nom_schema ]
[ AUTHORIZATION utilisateur ]
[ DEFAULT CHARACTER SET jeu_caractères ] [
liste_des_objets_du_schéma ]

TABLES
Peu implémenté dans les SGBDR CREATE DATABASE

Introduction aux BDD 4.84


Création de table
La plus simple:

CREATE TABLE CLIENT (


CLI_NOM VARCHAR(32),
CLI_PRENOM VARCHAR(32)
)

Introduction aux BDD 4.85


Contrainte NULL / NOT NULL
On précise NOT NULL pour indiquer un champ qui doit
obligatoirement être renseigné

CREATE TABLE PERSONNE (


ID INTEGER NOT NULL,
NOM VARCHAR(32) NOT NULL,
PRENOM VARCHAR(32) NULL, DATE_NAISSANCE
DATE)

Optionnel

Introduction aux BDD 4.86


Valeur par défaut

CREATE TABLE PERSONNE (


ID INTEGER NOT NULL,
NOM VARCHAR(32) NOT NULL,
PRENOM VARCHAR(32) NULL,
SEXE CHAR(1) DEFAULT ‘M’,
DATE_NAISSANCE DATE DEFAULT CURRENT_DATE)

Fonction dépendante du SGBD

Il est interdit de spécifier comme valeur par défaut le


résultat d’une requête

Introduction aux BDD 4.87


Unicité
CREATE TABLE PERSONNE (
ID INTEGER NOT NULL UNIQUE,
NOM VARCHAR(32) NOT NULL,
PRENOM VARCHAR(32) NULL, DATE_NAISSANCE
DATE)

Selon le SGBD, NOT NULL avant UNIQUE est


obligatoire ou interdit ! ☺

Introduction aux BDD 4.88


Validation
On peut spécifier des contraintes de validation très complexes

CREATE TABLE PERSONNE (


ID INTEGER CHECK (VALUE>0),
NOM VARCHAR(32) CHECK (CHARACTER_LENGTH(VALUE)>2), PRENOM
VARCHAR(32),
SEXE CHAR(1) CHECK (VALUE IN (‘M’,’F’)),
DEPT VARCHAR(32) CHECK (VALUE IN (SELECT NOM FROM
DEPARTEMENT) OR IS NULL)
)

SELECT est autorisé

Introduction aux BDD 4.89


Validation globale

CONSTRAINT nom_contrainte CHECK (prédicat)

CREATE TABLE PERSONNE (


ID INTEGER,
NOM VARCHAR(32) CHECK (CHARACTER_LENGTH(VALUE)>2), PRENOM
VARCHAR(32),
SEXE CHAR(1) CHECK (VALUE IN (‘M’,’F’)),
DEPT VARCHAR(32)
CONSTRAINT CK_PRS CHECK ((ID>0) AND (DEPT IN (SELECT NOM FROM
DEPARTEMENT) OR IS NULL))

Introduction aux BDD 4.90


Clé primaire
Simple

CREATE TABLE PERSONNE (


ID INTEGER NOT NULL PRIMARY KEY,
NOM VARCHAR(32) NOT NULL,
PRENOM VARCHAR(32) NULL, DATE_NAISSANCE
DATE)
Composée

CONSTRAINT nom_contrainte PRIMARY KEY (liste_colonne)

CREATE TABLE PERSONNE (


NOM VARCHAR(32) NOT NULL,
PRENOM VARCHAR(32) NULL, DATE_NAISSANCE
DATE
CONSTRAINT C_PRS PRIMARY KEY (NOM,PRENOM)
)

Introduction aux BDD 4.91


Intégrité référentielle
FOREIGN KEY permet de définir une contrainte d’intégrité
référentielle entre deux tables

CREATE TABLE FACTURE (


ID_FACT INTEGER,
ID INTEGER FOREIGN KEY REFERENCES PERSONNE(ID),
DATE DATE
)

L’utilisation d’un nom identique n’est pas obligatoire, mais très


conseillée (natural join)

Introduction aux BDD 4.92


Intégrité référentielle
multi--colonnes
multi

CREATE TABLE FACTURE (


ID_FACT INTEGER,
NOM VARCHAR(32),
PRENOM VARCHAR(32),
DATE DATE,
CONSTRAINT C_FACT_PERS FOREIGN KEY (NOM,PRENOM) REFERENCES
PERSONNE(NOM,PRENOM)
)

Introduction aux BDD 4.93


Contraintes d’intégrité référentielle
Syntaxe complète

CONSTRAINT nom_contrainte FOREIGN KEY (liste_colonne_table) REFERENCES


table_référencée (liste_colonne_référencées)
[ MATCH { FULL | PARTIAL | SIMPLE } ]
[ { ON UPDATE { NO ACTION | CASCADE | RESTRICT | SET NULL | SET DEFAULT } ]
[ { ON DELETE { NO ACTION | CASCADE | RESTRICT | SET NULL | SET DEFAULT } ]
[ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } [ [ NOT ] DEFERRABLE ] | [ NOT ]
DEFERRABLE [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] ]

Introduction aux BDD 4.94


Modification de la structure
ALTER permet de :

supprimer une colonne


Supprimer une contrainte
Ajouter une colonne
Ajouter une contrainte
ALTER ne permet pas de :

Changer le nom d’une colonne


Changer le type d’une colonne

Introduction aux BDD 4.95


Modification de la structure
Syntaxe
ALTER TABLE nom_table {
ADD definition_colonne |
ALTER nom_colonne {
SET DEFAULT valeur_défaut |
DROP DEFAULT } |
DROP nom_colonne [ CASCADE | RESTRICT ] |
ADD définition_contrainte_ligne |
DROP nom_contrainte [ CASCADE | RESTRICT ] }

Introduction aux BDD 4.96


Modification de la structure
Comment modifier le nom d’une colonne ?

Introduction aux BDD 4.97


Supprimer une table
DROP TABLE nom_table

Introduction aux BDD 4.98


Langage de Contrôle des Données
(LCD)
Base de Données multi-utilisateur
But du LCD : contrôler l’accès aux données des différents
utilisateurs
Moyens :

Définition d’utilisateurs, de groupes


d’utilisateurs (dépendant du SGBD)
Octroi de privilèges (GRANT)
Révocation de privilèges(REVOKE)

Introduction aux BDD 4.99


GRANT / REVOKE
GRANT autorise pour une personne :

La consultation d’une table


La modification d’une table
La transmission de ses droits à un autre
utilisateur
REVOKE fait l’inverse ☺

Gestion Complexe Travail du DBA (Administrateur de Bases


de Données)

Introduction aux BDD 4.100