CM3 4
CM3 4
[Link]@[Link]
Année universitaire : 2024-2025
BDD1 1 / 82
Organisation du cours
Volume horaire
6 séances de CM (1h) : lundi de 13h30 à 14h30
6 séances de TD (1h30/semaine) : 6*1.5h = 9h TD
6 séances de TDM (2h/semaine) : 6*2h = 12h TDM
BDD1 2 / 82
Organisation du cours
Intervenants
Imen Sayar ([Link]@[Link]) : CM/TD/TP
Jean-François Roos ([Link]@[Link]) (Info)
Ioan Marius Bilasco ([Link]@[Link]) (Info)
Hugo Monfleur ([Link]@[Link]) (Info)
Mikael Salson ([Link]@[Link]) (M1 MISO)
Sara Riva ([Link]@[Link]) (Info)
Emilie Allart ([Link]@[Link]) (Info)
Hela Kadri ([Link]@[Link]) (Info + PEIP)
Philippe Lesueur ([Link]@[Link]) (IM)
Pierrick Uro ([Link]@[Link]) (PEIP)
Jean Luc Intumwayase ([Link]@[Link])
(PEIP)
BDD1 3 / 82
Evaluation
BDD1 4 / 82
Exemple concret : une bibliothèque
Imaginez une bibliothèque classique où
les informations sur chaque livre sont enregistrées sur des
fiches papier
chaque fiche contient des détails tels que le titre, l’auteur,
l’année de publication, et la catégorie du livre
Si on veut
trouver un livre spécifique ou consulter ses informations
suivre quels livres sont empruntés, qui les ont empruntés, à
quelles dates, etc.
ajouter un nouveau livre ou modifier les informations d’un
livre existant
le/la bibliothécaire doit
parcourir manuellement des centaines, voire des milliers de fiches
et modifier manuellement ces fiches
BDD1 5 / 82
Exemple concret : une bibliothèque
Avantages
recherche rapide
gestion simple des données
stockage des données sous une forme structurée et efficace
BDD1 6 / 82
Qu’est-ce qu’une base de données ?
BDD1 7 / 82
Base de données (BD)
Avantages
Efficacité : Accès rapide et gestion facile des données.
Fiabilité : Prévention des erreurs et maintien de l’intégrité des
données.
Sécurité : Contrôle d’accès aux informations sensibles.
Scalabilité : Capacité à gérer de grandes quantités de données.
BDD1 8 / 82
Système de Gestion d’une Bases de Données (SGBD)
BDD1 9 / 82
Modèles de données
Les modèles
Un modèle de données est une façon de structurer les données.
C’est un paradigme, une logique d’organisation.
Il existe plusieurs modèles de données :
relationnel
hiérarchique
réseau
objet
relationnel-objet
... différents modèles dits « NoSQL »
Le cours de BDD
est consacré uniquement au modèle relationnel
BDD1 10 / 82
Bases relationnelles
Le modèle relationnel
formalisé par E.F. CODD, en 1970
devenu le plus utilisé depuis les années 1980.
les données sont structurées en un ensemble
de relations → selon une approche mathématique
de tables → selon une approche plus « graphique »
BDD1 11 / 82
Le schéma d’une relation, dans le modèle relationnel
BDD1 12 / 82
Le schéma d’une relation, dans le modèle relationnel
Graphiquement :
chaîne chaîne entier
étudiants : nom prénom groupe
BDD1 13 / 82
La relation, dans le modèle relationnel
Une relation contient des tuples
Une relation est un ensemble de n-uplets appelés tuples.
le tuple comporte une valeur pour chaque attribut.
chaque valeur doit appartenir au domaine correspondant.
BDD1 15 / 82
Les relations
BDD1 16 / 82
Comment filtrer, combiner, et extraire des informations à partir des
bases de données ?
⇒ Besoin d ′ opérations
Algèbre relationnelle
BDD1 17 / 82
L’algèbre relationnelle
BDD1 18 / 82
Opérations relationnelles : la projection (π)
Sous-schéma
Si s = (A1 , A2 , ...An ), un sous-schéma de s est un schéma
s ′ = (Ai1 , Ai2 , ...Aim ) où ik ∈ [1, n]
Ex : s ′ = (nom : chaine, groupe : entier )
BDD1 19 / 82
Opérations relationnelles : la projection (π)
Exemple de projection
Projection de la relation « étudiants » sur le sous-schéma
(nom, groupe) :
BDD1 20 / 82
Opérations relationnelles : la restriction (σ)
Restriction
La restriction d’une relation R par une qualification q est une
relation définie sur le même schéma que R.
BDD1 22 / 82
Opérations relationnelles : la restriction (σ)
Exemple
Restriction de la relation « étudiants » par la qualification
« groupe=1 »
BDD1 23 / 82
Opérations relationnelles : la restriction (σ)
Exemple
Restriction de la relation « étudiants » par la qualification
« nom=prénom »
σnom=prenom (etudiants) = ∅
BDD1 24 / 82
Opérations relationnelles : union (∪)
Schémas
Cette opération fait intervenir 2 tables qui doivent être
définies sur le même schéma
la table résultante est aussi sur le même schéma
BDD1 25 / 82
Opérations relationnelles : différence (−)
Exemple de différence
R
R’
nom prénom groupe
nom prénom groupe
Dupont Alfred 2 −
Smith John 1
Smith John 1
Smith Arthur 3
Durand Alfred 1
R − R′
nom prénom groupe
Dupont Alfred 2
Durand Alfred 1
BDD1 26 / 82
Produit cartésien (×)
Remarque
le nombre d’attributs (« colonnes ») est la somme des
nombres d’attributs des tables d’origine
le nombre de tuples (« lignes ») est le produit des nombres
de tuples des tables d’origine
BDD1 27 / 82
Produit cartésien (×)
Exemple de produit cartésien
étudiants
groupes
nom prénom groupe
numéro salle
Dupont Alfred 2 ×
1 B-27
Smith John 1
2 A-14
Durand Alfred 1
étudiants × groupes
nom prénom groupe numéro salle
Dupont Alfred 2 1 B-27
Smith John 1 1 B-27
Durand Alfred 1 1 B-27
Dupont Alfred 2 2 A-14
Smith John 1 2 A-14
Durand Alfred 1 2 A-14
BDD1 31 / 82
Select
BDD1 32 / 82
Select
BDD1 33 / 82
Restriction (sélection) : where
La clause where
permet de réaliser une restriction du résultat (choix de lignes)
optionnelle
est suivie d’une qualification.
BDD1 34 / 82
Tris : order by
BDD1 35 / 82
Du modèle à la pratique...
exemple
select prenom select distinct prenom
from etudiants from etudiants
prenom
prenom
Alfred
Alfred
Alfred
John
John
BDD1 36 / 82
Du modèle à la pratique...
Absence de valeur
sauf indication contraire, la valeur d’un attribut peut ne pas
être définie (absence de valeur)
l’absence de valeur est un état particulier appelé NULL
testé par le prédicat IS NULL (jamais =NULL, puisque ce
n’est pas une valeur)
négation : IS NOT NULL
NB : on verra ultérieurement que, dans la définition d’une relation,
on peut interdire l’absence de valeur
BDD1 37 / 82
Les spécifications d’attributs
Renommage
select nom as lastname,
prenom as firstname
from etudiants
lastname firstname
Dupont Alfred
Smith John
Durand Alfred
BDD1 38 / 82
Les spécifications d’attributs
Une spécification d’attribut est une expression
faisant intervenir noms d’attributs, constantes, opérateurs,
appels de fonction
les chaînes sont délimitées par des simples quotes
les noms d’attributs peuvent être délimités par des doubles
quotes
opérateurs
arithmétiques (usuels)
de comparaison (usuels)
de concatenation : ||
test nullité : IS NULL, IS NOT NULL
appels de fonctions
voir doc PostgreSQL (ou du SGBD utilisé)
Exemple
select prenom || ' ' || nom as "Nom complet"
from etudiants
Nom complet
Alfred Dupont
John Smith
Alfred Durand
BDD1 40 / 82
Op. ensemblistes : union, except, intersect
combiner 2 relations (ou plus)
union : UNION, différence : EXCEPT, intersection :
INTERSECT
condition
les relations doivent avoir le même nombre de colonnes
les domaines (types) des colonnes doivent être compatibles
(par conversion de type)
(voir le cours sur l’algèbre relationnelle)
mix
select prenom as mix
Alfred
from etudiants
Dupont
union
Durand
select nom from etudiants
John
order by mix
Smith
mix
Alfred
select prenom as mix
John
from etudiants
Alfred
union all
Durand
select nom from etudiants
Smith
Dupont
BDD1 42 / 82
Jointure
Syntaxe SQL
select spécification_attributs
from table1 join table2 on condition
Exemple
select * from etudiants
join groupes on [Link]=[Link]
étudiants
groupes
nom prenom groupe
numero salle
Dupont Alfred 2 ⋊
⋉groupe=numero
1 B-27
Smith John 1
2 A-14
Durand Alfred 1
nom prenom groupe numero salle
Smith John 1 1 B-27
Durand Alfred 1 1 B-27
Dupont Alfred 2 2 A-14
BDD1 43 / 82
Jointure
Les alias de nom de table
Dans une requête select, on peut attribuer un alias à chaque table
(nom local valide uniquement dans la requête)
pour simplifier ou clarifier l’écriture
pour réaliser une auto-jointure (jointure d’une table avec
elle-même)
Exemple
select [Link], [Link], [Link], [Link]
from etudiants as t1
join groupes as t2
on [Link]=[Link]
nom prenom groupe salle
Smith John 1 B-27
Durand Alfred 1 B-27
Dupont Alfred 2 A-14
BDD1 44 / 82
Les différents types de jointure
BDD1 45 / 82
Jointure : join/inner join
BDD1 46 / 82
Jointure : left join
BDD1 47 / 82
Jointure : right join
BDD1 48 / 82
Jointure : full join
Jointure externe complète (full join ou full outer join )
étudiants
groupes
nom prenom groupe
numero salle
Dupont Alfred 2
1 B-27
Smith John 1
2 A-14
Cheval Aline 4
3 A-4
Durand Alfred 1
select * from etudiants
full join groupes on [Link]=[Link]
nom prenom groupe numero salle
Smith John 1 1 B-27
Durand Alfred 1 1 B-27
Dupont Alfred 2 2 A-14
Cheval Aline 4 NULL NULL
NULL NULL NULL 3 A-4
BDD1 49 / 82
SQL : Les fonctions de regroupement (ou agrégation)
Exemple
Soit une table de relevé téléphonique (decompte)
date numero cout
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
2016-01-05 +33320434343 0.05
2016-01-05 +33328778551 0.12
2016-02-29 +33320434343 0.60
Comment obtenir la somme des coûts ?
sum(cout)
Le résultat comporte une seule ligne :
1.27
BDD1 50 / 82
SQL : Les fonctions de regroupement
Exemple
select sum(cout) from decompte
NB :
count(*) compte le nombre de lignes
count( attribut ) compte le nombre de lignes dont l’attribut n’est
pas NULL
NB :
count(*) compte le nombre de lignes
count( attribut ) compte le nombre de lignes dont l’attribut n’est
pas NULL
Exemple
select count(*) from decompte
ou
select count(cout) from decompte
BDD1 53 / 82
SQL : Les fonctions de regroupement
NB :
count(*) compte le nombre de lignes
count( attribut ) compte le nombre de lignes dont l’attribut n’est
pas NULL
Exemple
select count(cout) from decompte
BDD1 54 / 82
SQL : Les fonctions de regroupement
Exemple
select avg(cout) as moyenne, count(*) as nombre
from decompte
BDD1 55 / 82
SQL : Les fonctions de regroupement
Exemple
select avg(cout) as moyenne, count(cout) as nombre
from decompte
BDD1 56 / 82
SQL : Les fonctions de regroupement
Exemple
select avg(cout) as moyenne, count(cout) as nombre
from decompte
BDD1 57 / 82
SQL : Les fonctions de regroupement : group by
la clause group by
précise le critère de constitution des groupes
toutes les lignes ayant le même résultat vis à vis du critère
sont dans un même groupe
BDD1 58 / 82
SQL : Les fonctions de regroupement : group by
la clause group by
précise le critère de constitution des groupes
toutes les lignes ayant le même résultat vis à vis du critère
sont dans un même groupe
numero
date numero cout sum(cout)
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
1.15
2016-01-05 +33320434343 0.05
2016-02-29 +33320434343 0.60
o
2016-01-05 +33328778551 0.12 0.12
BDD1 60 / 82
SQL : Les fonctions de regroupement : group by
dans la clause group by, on peut
utiliser plusieurs attributs comme critère de regroupement
Exemple
select sum(cout) from decompte group by date,numero
date,numero
date numero cout ) sum(cout)
2016-01-05 +33320434343 0.40
0.45
2016-01-05 +33320434343 0.05 )
2016-02-29 +33320434343 0.60
0.70
2016-02-29 +33320434343 0.10 o
2016-01-05 +33328778551 0.12 0.12
Quelle interprétation de cette requête ?
BDD1 61 / 82
SQL : Les fonctions de regroupement : group by
Exemple
select sum(cout) from decompte group by date,numero
date,numero
date numero cout ) sum(cout)
2016-01-05 +33320434343 0.40
0.45
2016-01-05 +33320434343 0.05 )
2016-02-29 +33320434343 0.60
0.70
2016-02-29 +33320434343 0.10 o
2016-01-05 +33328778551 0.12 0.12
Quelle interprétation de cette requête ?
⇒ le coût total des appels du même numéro aux mêmes dates
BDD1 62 / 82
SQL : Les fonctions de regroupement : group by
Exemple (correct)
select date, numero, sum(cout) as total
from decompte
group by date,numero
date numero total
2016-01-05 +33320434343 0.45
2016-02-29 +33320434343 0.70
2016-10-05 +33328778551 0.12
>>
Exemple
Trouver le nombre de coureurs dans chaque équipe
BDD1 65 / 82
Les fonctions de regroupement : un autre exemple
>>
Exemple
Trouver le nombre de coureurs dans chaque équipe
select count(dossard) as nombreCoureurs, equipe
from coureurs
group by equipe
>>
BDD1 66 / 82
Les fonctions de regroupement
la clause having
permet de faire une sélection portant sur
le résultat d’une fonction de regroupement.
La clause having est liée à une clause « group by ».
Exemple
date numero cout
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
2016-01-05 +33320434343 0.05
2016-01-05 +33328778551 0.12
2016-02-29 +33320434343 0.60
Q1 : Trouver les numéros de téléphones où la somme des coûts est
supérieure à 0.5 pour les mêmes dates
BDD1 67 / 82
Les fonctions de regroupement
la clause having
permet de faire une sélection portant sur
le résultat d’une fonction de regroupement.
La clause having est liée à une clause « group by ».
Exemple
Q1 : Trouver les numéros de téléphones où la somme des coûts
est supérieure à 0.5 pour les mêmes dates
select date,numero,sum(cout) from decompte
group by date,numero
having sum(cout)>0.5
date numero sum(cout)
2016-02-29 +33320434343 0.7
BDD1 68 / 82
Les fonctions de regroupement
BDD1 70 / 82
Les fonctions de regroupement
la clause having
permet de faire une sélection portant sur
le résultat d’une fonction de regroupement.
La clause having est liée à une clause « group by ».
Exemple
date numero cout
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
2016-01-05 +33320434343 0.05
2016-01-05 +33328778551 0.12
2016-02-29 +33320434343 0.60
Q2 : Trouver les numéros de téléphones qui ne figurent qu’une
seule fois dans le relevé téléphonique, ainsi que la somme de leurs
coûts ?
BDD1 71 / 82
Les fonctions de regroupement
Réponse à Q2
select numero,sum(cout) from decompte
group by numero
having count(*)=1;
numero sum(cout)
+33328778551 0.12
BDD1 72 / 82
Les fonctions de regroupement
Réponse à Q2 : explication
1- on groupe par numéro de téléphone et on calcule la somme
des coûts pour chaque groupe
numero
date numero cout sum(cout)
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
1.15
2016-01-05 +33320434343 0.05
2016-02-29 +33320434343 0.60
2016-01-05 +33328778551 0.12 0.12
2- on conserve le(s) groupe(s) qui sont sur une seule ligne
le groupe +33320434343 est sur 4 lignes, il est donc exclu.
le groupe +33328778551 est sur 1 ligne, il est donc conservé.
numero sum(cout)
+33328778551 0.12
BDD1 73 / 82
Les fonctions de regroupement
where vs having
where est une qualification des lignes de la table source, donc
s’applique
avant regroupement
BDD1 74 / 82
where vs. having : exemple
date numero cout
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
2016-01-05 +33320434343 0.05
2016-01-05 +33328778551 0.12
2016-02-29 +33320434343 0.60
where
select numero, sum(cout) from decompte
where cout > 0.1
group by numero;
La clause where filtre d’abord les lignes où le coût (cout) est
supérieur à 0.1 avant de regrouper les résultats par numéro.
Ensuite, les lignes restantes sont regroupées par numero, et la
somme des coûts est calculée pour chaque groupe.
BDD1 75 / 82
where vs. having : exemple
date numero cout
2016-01-05 +33320434343 0.40
2016-02-29 +33320434343 0.10
2016-01-05 +33320434343 0.05
2016-01-05 +33328778551 0.12
2016-02-29 +33320434343 0.60
having
select numero, sum(cout) from decompte
group by numero
having sum(cout) > 0.5;
La clause group by regroupe d’abord les lignes par numéro de
téléphone.
Ensuite, la clause having filtre les groupes dont la somme des
coûts (sum(cout)) est supérieure à 0.5.
BDD1 76 / 82
Ajout de données : commande insert into
BDD1 77 / 82
Ajout de données : insert ... select
BDD1 78 / 82
Suppression de données : commande delete
BDD1 79 / 82
Modification de données : commande update
BDD1 80 / 82
Les principaux types de données (variable selon SGBD)
Numériques
INTEGER Entier signé, sur 32 bits
SMALLINT Entier signé, sur 16 bits
BIGINT Entier signé, sur 64 bits
NUMERIC(n,d) n chiffres dont d après la virgule
REAL Flottant
Textuels
CHAR(n) Chaîne de n caractères exactement.
VARCHAR(n) Chaîne de n caractères maximum.
TEXT Texte.
Dates
DATE date A-M-J
TIME temps H:MN:S
TIMESTAMP temps (estampille)
Binaires
BYTEA donnée binaire (NB :dénomination Postgresql)
BDD1 81 / 82
Création de table
Exemple
BDD1 82 / 82