Académique Documents
Professionnel Documents
Culture Documents
Support de cours
INFORMATIQUE
MP – PC – PSI – PT
Chapitre 1 :
BASES DE DONNÉES RELATIONNELLES
Axes d’étude
3/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
Une Base de données est ensemble structuré de données informatiques (chaînes de
caractères, valeurs numériques, . . .) dans lequel
o les données sont enregistrées sur un support permanent
o les données ne figurent qu’une seule fois (pour éviter toute redondance d’informations)
o chaque objet ou entité possède un identifiant unique
Une Base de données relationnelle est un type de base de données où les données sont
liées à d'autres informations au sein des bases de données. L’information est organisée
dans des tableaux à deux dimensions appelés des relations ou tables
o un attribut est un identificateur (un nom) décrivant une information stockée dans une base
(l'âge d'une personne, le nom d'une personne, le numéro de sécurité sociale),
o Le domaine d'un attribut est l'ensemble, fini ou infini, de ses valeurs possibles
o une occurrence, ou ligne ou enregistrement ou n-uplets, ou tuples, est un élément de
l'ensemble figuré par une relation 4/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
Exemples de relations
Définitions
o Un schéma de relation précise le nom de la relation ainsi que la liste des attributs avec
leurs domaines
Exemple de relation de schéma :
Personne(N° sécu : Entier, Nom : Chaîne, Prénom : Chaîne)
o Un schéma de relation précise le nom de la relation ainsi que la liste des attributs avec
leurs domaines
o Un schéma relationnel est constitué par l'ensemble des schémas de relation,
o Une base de données relationnelle est constituée par l'ensemble des n-uplets des
différentes relations du schéma relationnel
o La cardinalité d'une relation est son nombre d'occurrences
Cardinalité de la relation Personne :
4
6/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
o Une clé candidate d'une relation est un ensemble minimal des attributs de la relation
dont les valeurs identifient à coup sûr une occurrence.
o La clé primaire d'une relation est une de ses clés candidates. Pour signaler la clé
primaire, ses attributs sont généralement soulignés.
o Une clé étrangère dans une relation est formée d'un ou plusieurs attributs qui constituent
une clé primaire dans une autre relation.
7/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
Un Système de gestion de Bases de Données (SGBD) est un logiciel qui permet de
décrire, modifier, interroger la base de données ;
Un système de gestion de bases de données doit permettre une plus grande rapidité
d’accès aux données, un mode multi utilisateurs, assurer la sécurité, la confidentialité,
l’intégrité, utiliser un langage "universel", une efficacité dans les mises à jour, etc
Exemples de SGBD :
o Microsoft Access
o Microsoft SQL Server
o MySQL
o Oracle Database
o Db2 (IBM)
8/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Généralités
L'architecture client-serveur est un modèle de fonctionnement logiciel qui peut se
réaliser sur tout type d'architecture matérielle (petites ou grosses machines), si ces
architectures peuvent être interconnectées. Cette architecture est basée sur
l'utilisation de deux types de logiciels : un logiciel serveur et un logiciel client .
Le client :
o fait une requête (sollicite un service au serveur)
o reçoit une réponse du serveur
le serveur :
o réalise ce service sollicité
o renvoie le résultat au client.
9/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Généralités
Architecture 3-tiers
Évolution de l’architecture client/serveur dans laquelle on a trois couches
logicielles. Le serveur est scindé en deux:
o Serveur 1 : stockage de données
o Serveur 2 : serveur métier, effectuant la gestion logicielle.
Normalisation relationnelle
Notion de dépendance fonctionnelle (DF)
o Les dépendances fonctionnelles expriment la sémantique entre les attributs d’une relation
o Soit R(A1, A2,… An) un schéma de relation, et X et Y des sous-ensembles de A1, A2,… An. On
dit que X détermine Y ou que Y dépend fonctionnellement de X si, et seulement si, des
valeurs identiques de X impliquent des valeurs identiques de Y. On le note : X → Y
o Autrement dit, il existe une dépendance fonctionnelle entre un ensemble d'attributs X et un
ensemble d'attributs Y, que l'on note X → Y, si connaissant une occurrence de X on ne peut lui
associer qu'une seule occurrence de Y.
Exemple : Soit le schéma de relation suivant : Commande Cours Heure Jour Salle
(Num_Commande, Num_Article, Designation, Qte_Commandée) , Informatique 10h Lundi 1
On a les dépendances fonctionnelles suivantes: Français 10h Lundi 2
Num_Article → Designation Français 16h Mardi 1
Num_Commande → Qte_Commandée Anglais 18h Mercredi 1
{salle, jour, heure} → cours, car dans une salle à un
moment donné il ne peut avoir lieu qu'un cours. 11/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
propriétés de la dépendance fonctionnelle
Réflexivité : X X et X Y Y X
Transitivité : X Y et Y Z X Z
Projection : X Y , Z X Y et X Z
Augmentation : X Y Z , X , Z Y
Pseudo transitivité : X Y et Y , Z T X , Z T
Additivité : X Y et X Z X Y , Z
12/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
dépendance fonctionnelle élémentaire
o Une dépendance fonctionnelle élémentaire est une dépendance fonctionnelle de la forme
X → A, où A est un attribut unique n'appartenant pas à X et où il n'existe pas X′ inclus au sens
strict dans X (i.e. X′ ⊂ X) tel que X′ → A.
o Autrement dit, une dépendance fonctionnelle est élémentaire si la cible est un attribut unique et
si la source ne comporte pas d'attributs superflus.
13/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
Dépendance multivaluée
o Etant donnée une relation R(A1, A2,… An), si à une valeur de X peuvent correspondre
plusieurs valeurs de Y, on dit qu’il existe une dépendance multivaluée de X vers Y et on note :
X ↠ Y ; ce qui se lit X multidétermine Y.
Exemple : Assuré (N°Assuré, Nom, Sinistre, Véhicule)
N°Assuré ↠ Véhicule , car un assuré peut posséder plusieurs véhicules
o La dépendance fonctionnelle est un cas particulier de la dépendance multivaluée
14/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
Normalisation
o C’est un processus qui consiste à partir d’une table universelle composée de la
totalité des attributs sur laquelle on applique un algorithme de normalisation pour
avoir plusieurs tables,
o cet algorithme dit de normalisation est constitué des étapes qui vérifient si les
tables sont dans des états bien définis. Ces états s’appellent Formes normales
15/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
Codd (fondateur du modèle relationnel) a proposé 3 formes normales:
o 1NF: 1ère forme normale
o 2NF: 2ème forme normale
o 3NF: 3ème forme normale
16/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
Première forme normale
o Une relation est en première forme normale si tous ses attributs sont en dépendance
fonctionnelle de la clé primaire et ne contiennent qu’une seule information. autrement dit, si tous les
attributs qui la composent sont atomiques c-à-d non sémantiquement décomposables (si aucune
subdivision de l‘information initiale n’apporte une information supplémentaire ou complémentaire)
o l'atomicité est violée si les attributs sont :
- constitués par un ensemble de valeurs énumérées (liste, tableaux...) dont les différentes
valeurs sont sémantiquement indépendantes.
- n'ayant aucune valeur (le "NULL" n'existe pas en algèbre relationnelle)
Exemple : Personnes (idpers, nom prenoms, tel, classe) , Clé primaire : idpers. Ici les attributs sont en
dépendance fonctionnelle de la clé primaire mais l’attribut « nom prenoms" contient deux informations (nom,
prenoms); il faut donc séparer cet attribut en deux attributs :
Emprunteurs( idpers, nom, prenoms, tel, classe)
17/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
Deuxième forme normale
o On dit qu’une relation est en deuxième forme Normale si elle est en 1ère Forme Normale et si
tout attribut non clé primaire est dépendant de la clé primaire entièrement.
o Lorsque la clé primaire est constituée de plusieurs attributs, on dit qu’une relation est en
deuxième forme normale si elle est en première forme normale et si tous les attributs sont en
dépendance fonctionnelle de l’intégralité de la clé primaire et pas seulement que d’une partie de
celle-ci.
18/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Normalisation relationnelle
Troisième forme normale
o Une relation est en troisième forme normale si elle est en deuxième forme normale et si
tous les attributs sont en dépendance fonctionnelle directe de la clé primaire et uniquement de
la clé primaire.
o autrement dit tout attribut non clé ne dépend pas d’un attribut non clé
Exemple : Eleves (Ideleve, Nom, Prenom, Adresse, CP, Ville, Tel, Classe, Salle)
Cette relation n’est pas en troisième forme normale car l’attribut Salle ne dépend pas de la clé
primaire Ideleve, mais de l’attribut Classe.
Exemple de règles de gestion
1) Un client passe une ou plusieurs commandes alors qu’une commande est passée par un et un seul client
2) Un fournisseur fournit au moins un produit alors qu’un produit peut être fourni par un et un seul fournisseur
3) Une commande porte sur au moins un produit alors qu’un produit peut ou non être l’objet d’une ou de
plusieurs commandes 19/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
20/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
21/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
22/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
23/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Langage SQL
24/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Introduction
L'algèbre relationnelle est un support mathématique cohérent sur lequel repose le
modèle relationnel. Elle permet de décrire les opérations qu'il est possible d'appliquer sur
des relations pour produire de nouvelles relations.
On peut distinguer trois familles d'opérateurs relationnels :.
o Les opérateurs unaires (Sélection, Projection) : ce sont les opérateurs les plus simples. Ils
permettent de produire une nouvelle table à partir d'une autre table.
o Les opérateurs binaires ensemblistes (Union, Intersection, Différence) : Ils permettent de
produire une nouvelle relation à partir de deux relations de même degré (nombre d'attributs) et de
même domaine.
o Les opérateurs binaires ou n-aires (Produit cartésien, Jointure, Division) : ils permettent de
produire une nouvelle table à partir de deux ou plusieurs autres tables.
25/160
25/78
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Sélection
On considère la relation A de schéma A(A1; A2; … ; An)
La sélection (parfois appelée restriction) de la relation A suivant le critère de sélection P est
une relation R de même schéma dont les tuples sont ceux de A satisfaisant le critère P.
o on note R = σP (A) ou R = RESTRICT(A/P) ou R = SELECT (A/P).
o Il s’agit d’extraction de lignes d’une table.
Algèbre relationnelle
Projection
On considère la relation A de schéma A(A1; A2; … ; An)
La projection consiste à supprimer les attributs autres que A1,… An d'une relation et à
éliminer les n-uplets en double apparaissant dans la nouvelle relation ;
o on note R = π (A1; A2; … ; An )A ou R = PROJECT(A/ A1; A2; … ; An )
o C’est l’extraction de colonnes d’une table
Algèbre relationnelle
Union
L'union est une opération portant sur deux relations R1 et R2 ayant le même schéma et
construisant une troisième relation constituée des n-uplets appartenant à chacune des deux
relations R1 et R2 sans doublon, on la note R1 ∪ R2.
o on la note R1 ∪ R2.
o Il s'agit une opération binaire ensembliste commutative
Relation R1 Relation R2 Relation R
Nom Prénom Nom Prénom Nom Prénom
Durand Caroline Dupont Lisa Durand Caroline Exemple d'union :
R = R1 ∪ R2
Germain Stan Juny Carole Germain Stan
Dupont Lisa Fourt Lisa Dupont Lisa
Germain Rose-Marie Germain Rose-Marie
Juny Carole
Fourt Lisa 28/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Intersection
L'intersection est une opération portant sur deux relations R1 et R2 ayant le même schéma et
construisant une troisième relation dont les n-uplets sont constitués de ceux appartenant aux
deux relations.
o on la note R1 ∩ R2.
o Il s'agit une opération binaire ensembliste commutative
Relation R1 Relation R2 Relation R
Nom Prénom Nom Prénom Nom Prénom
Exemple
Durand Caroline Dupont Lisa Durand Caroline d'intersection :
Germain Stan Juny Carole Dupont Lisa R = R1 ∩ R2
Dupont Lisa Fourt Lisa Juny Carole
Germain Rose-Marie Durand Caroline
Juny Carole
29/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Différence
La différence est une opération portant sur deux relations R1 et R2 ayant le même schéma et
construisant une troisième relation dont les n-uplets sont constitués de ceux ne se trouvant que
dans la relation R1 ;
o on la note R1 − R2
o Il s'agit une opération binaire ensembliste non commutative
Algèbre relationnelle
Produit cartésien
Le produit cartésien est une opération portant sur deux relations R1 et R2 et qui construit une
troisième relation regroupant exclusivement toutes les possibilités de combinaison des
occurrences des relations R1 et R2.
o on la note R1 × R2.
o Il s'agit une opération binaire commutative
Relation Amie Relation Cadeau Relation R
Nom Prénom Article Prix Nom Prénom Article Prix
Fourt Lisa livre 45 Fourt Lisa livre 45 Exemple de produit
Juny Carole poupée 25 Fourt Lisa poupée 25 cartésien :
R = Amie × Cadeau
montre 87 Fourt Lisa montre 87
Juny Carole livre 45
Juny Carole poupée 25
Juny Carole montre 87 31/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Jointure
La jointure est une opération portant sur deux relations R1 et R2 qui construit une troisième relation
regroupant exclusivement toutes les possibilités de combinaison des occurrences des relations R1 et
R2 qui satisfont l'expression logique E.
o on la note R1 ▷◁ER2. ; Il s'agit une opération binaire commutative
la jointure n'est rien d'autre qu'un produit cartésien suivi d'une sélection : R1 ▷◁E R2 = σE (R1 × R2)
Exemple de jointure : R = Famille ▷◁ ( (Age ≤ AgeC) ∧ (Prix < 50) ) Cadeau
Relation Famille Relation Cadeau Relation R
Nom Prénom Age AgeC Article Prix Nom Prénom Age AgeC Article Prix
Fourt Lisa 6 99 livre 30 Fourt Lisa 6 99 livre 30
Juny Carole 42 6 poupée 60 Fourt Lisa 6 20 baladeur 45
Fidus Laure 16 20 baladeur 45 Fourt Lisa 6 10 montre 15
10 montre 15 Juny Carole 42 99 livre 30
Fidus Laure 16 99 livre 30
Fidus Laure 16 20 baladeur 45 32/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Fonctions de calculs
Expression arithmétique construite à partir d’attributs d’une relation, de constantes,
d’opérateurs arithmétiques et de fonctions simples sur les ensembles
o les opérateurs utilisés sont : + (pour l’addition), - (pour la soustraction), * (pour la multiplication), /
(pour la division).
o Les opérandes peuvent être des attributs de relations comportant les mêmes nombres de lignes ou
des constantes et des attributs de relation.
o Ces opérations portent sur des attributs du domaine de type numérique
33/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Algèbre relationnelle
Fonctions de calculs
les fonctions sont :
o somme () : pour la somme des éléments d’une colonne ou la somme des éléments composant
chaque regroupement de lignes de la colonne. Les éléments composant les lignes de la colonne
doivent être de types numériques
o moyenne() : pour la moyenne des éléments d’une colonne ou la moyenne des éléments composant
chaque regroupement de lignes de la colonne. Les éléments composant les lignes de la colonne
doivent être de types numériques
o Compte() : pour compter le nombre de lignes composant la colonne ou le nombre de lignes
composant chaque regroupement de lignes de la colonne
o maximum() : pour rechercher le plus grand élément d’une colonne dont les lignes sont comparables
o Minimum() : pour rechercher le plus petit élément d’une colonne dont les lignes sont comparables
34/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
SQL (Structured Query Language)
SQL est un langage de « programmation » standardisé qui est utilisé pour gérer des
bases de données relationnelles et effectuer diverses opérations sur les données
qu’elles contiennent. Créé à l’origine dans les années 1970, SQL est régulièrement
utilisé non seulement par les administrateurs de bases de données, mais aussi par les
développeurs qui écrivent des scripts d’intégration de données et les analystes de
données qui cherchent à mettre en place et à exécuter des requêtes analytiques.
Ce langage est commun à tous les SGBD
Il permet
o de construire la base
o d’éditer la base
o d’effectuer des recherches dans la base
35/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
SQL (Structured Query Language)
Il est doté d'une syntaxe particulière que l'on doit respecter pour que la communication avec
la base de données se passe au mieux. Pour cela, on utilisera des mots clés spéciaux.
NB :
o La plupart des requêtes portant sur une base de données relationnelle ne peuvent pas être
réalisées à partir d'une seule opération mais en enchaînant successivement plusieurs opérations
o le langage SQL, contrairement à Python, n’est pas sensible à la casse, mais par convention, on
choisit de mettre uniquement en majuscule, les instructions du langage.
36/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Définitions
SQL (Structured Query Language)
Il est doté d'une syntaxe particulière que l'on doit respecter pour que la communication avec
la base de données se passe au mieux. Pour cela, on utilisera des mots clés spéciaux.
NB :
o La plupart des requêtes portant sur une base de données relationnelle ne peuvent pas être
réalisées à partir d'une seule opération mais en enchaînant successivement plusieurs opérations
o le langage SQL, contrairement à Python, n’est pas sensible à la casse, mais par convention, on
choisit de mettre uniquement en majuscule, les instructions du langage.
37/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Je vous conseille de choisir la version Serveur only. Puis le cliquez bouton Next. Sur la page suivante, cliquez sur Execute 38/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
39/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
o C’est celui qu’on utilise pour installer des logiciels sur notre machine. Mais attention à ne
jamais l’utiliser en production ! En effet, il serait très dangereux qu’un utilisateur puisse
l’utiliser, car il obtiendrait l’accès à toutes nos données.
o Utiliser “en production” désigne l’utilisation de votre base par votre application, depuis
un serveur. Alors que “l’utilisation en local” signifie l’utilisation sur votre ordinateur, à des
fins de développement uniquement.
41/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
42/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Lancez MySQL
L'installation de MySQL est terminée, il faut maintenant le lancer. Dans la barre de recherche tapez MySQL :
43/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Connexion
En tant que root
Tapez votre mot de passe et vous devriez avoir ceci :
44/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
o La commande WHERE s’utilise en complément à une requête utilisant SELECT en vue
d’extraire les lignes d’une base de données qui respectent une condition. Les opérateurs :
Opérateurs de
Opérateurs logiques Autres opérateurs
comparaison
= égal AND ET logique IN Liste de plusieurs valeurs possibles
Valeur comprise dans un intervalle donnée (utile pour les
<> Pas égal OR OU logique BETWEEN
nombres ou dates)
!= Pas égal NOT NON LIKE Recherche en spécifiant le début, milieu ou fin d'un mot.
> supérieur IS NULL Valeur est nulle
< inférieur IS NOT NULL Valeur n'est pas nulle
>= Supérieur ou égal
<= Inférieur ou égal
45/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db) ci-
dessous. Depuis l’invite de commande MySQL exécutez chacune des requêtes qui suivent.
id_etd nom_etd prenoms_etd age_etd tel_etd
mpd01 DUPONT Alain 17 01-45-42-56-63
mpd02 MARTIN Marc 18 01-44-28-52-52
mpd03 BOUVIER Alain 16 01-44-28-52-50
mpd04 DUBOIS Paul 19 06-11-86-78-89
mpd05 DREYFUS Jean 18 02-41-58-89-52
mpd06 FAURE Alain 17 01-51-58-52-50
mpd07 PAUL Marcel 17 01-54-11-43-21
mpd08 DUVAL Arsene 16 06-55-41-42-95
mpd09 PHILIPPE Andre 18 01-48-98-92-21
mpd10 CHABAUD Daniel 17 01-44-22-56-21
mpd11 BAILLY Jean-Atanase 18 01-47-20-16-11
46/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.01 : Sélection de toutes les données de la table etudiants
use mp-d-2022_db;
DESCRIBE etudiants;
47/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.02 : Sélection de toutes les données de la table etudiants Req.03 : sélection des données avec condition ( prénoms est alain)
48/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.04 : Sélection de toutes les données de la table etudiants Req.05 : sélection des données avec condition ( prénoms est alain)
SELECT * FROM etudiants; SELECT * FROM etudiants WHERE prenoms_etd =
'alain';
49/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.06 : sélection des données avec condition ( age ≥ 18) Req.07 : sélection des données avec condition ( age ≠ 18)
SELECT * FROM etudiants WHERE age_etd >= 18; SELECT * FROM etudiants WHERE age_etd != 18;
50/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
Commande LIKE : SELECT * FROM table WHERE colonne LIKE modele;
o LIKE ‘%a’ : le caractère « % » est un caractère joker qui remplace tous les autres caractères. Ainsi, ce
modèle permet de rechercher toutes les chaines de caractère qui se termine par un « a ».
o LIKE ‘a%’ : ce modèle permet de rechercher toutes les lignes de « colonne » qui commence par un « a ».
o LIKE ‘%a%’ : ce modèle est utilisé pour rechercher tous les enregistrement qui utilisent le caractère « a ».
o LIKE ‘ta%on’ : ce modèle permet de rechercher les chaines qui commence par « ta » et qui se terminent
par « on », comme « talon » ou « tampon » ou « tacheron » ou « tabulation » ou « tarification ».
o LIKE ‘a_c’ : peu utilisé, le caractère « _ » (underscore) peut être remplacé par n’importe quel caractère,
mais un seul caractère uniquement (alors que le symbole pourcentage « % » peut être remplacé par un
nombre incalculable de caractères . Ainsi, ce modèle permet de retourner les lignes « aac », « abc » ou
même « azc ».
51/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table WHERE condition ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.08 : sélection des données avec condition Req.09 : sélection des données avec condition ( nom
( nom commence par ‘D’ ) contenant ‘il’ )
SELECT * FROM etudiants WHERE nom_etd SELECT * FROM etudiants WHERE nom_etd
LIKE 'd%'; LIKE '%il%';
52/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
Commande WHERE avec des exemples utilisant les opérateurs.
Si code_postal, date_naiss et ville y figuraient
o SELECT * FROM etudiants WHERE age_etd IN (15, 16, 17) ;
o SELECT * FROM etudiants WHERE age_etd BETWEEN 16 AND 18 ;
o SELECT * FROM etudiants WHERE CodePostal LIKE '42%' ; // sous Access : LIKE "42*"
o SELECT * FROM etudiants WHERE Ville IS NULL ; // Etudiants pour lesquels la ville n'est pas
renseignée
o SELECT * FROM etudiants WHERE Ville IS NOT NULL ; // Etudiants pour lesquels la ville est
renseignée
o SELECT * FROM etudiants WHERE age_etd >= ALL (SELECT age_etd FROM etudiants) ; //
Etudiant(s) le(s) plus âgé(s)
o SELECT * FROM etudiants WHERE date_naiss BETWEEN ‘2003-04-01’ AND ‘2005-04-20’
53/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
Commande LIMIT : SELECT * FROM table LIMIT nbre_result ;
o En SQL, la commande LIMIT permet de spécifier le nombre maximum de résultats que l’on souhaite
obtenir. Cette clause est souvent associée à un OFFSET permettant d'effectuer un décalage sur
l'ensemble des résultats. Un cas d'utilisation courant consiste à utiliser ces commandes dans le cadre du
développement d'une pagination.
54/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sélection ou restriction
SELECT * FROM table LIMIT nbre_result ;
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.10 : sélection des 4 premiers enregistrements Req.11 : sélection des 4 premiers enregistrements à partir du 5e
de la table etudiants
SELECT * FROM etudiants limit 4; SELECT * FROM etudiants limit 4 OFFSET 5;
55/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Projection
La commande SELECT peut sélectionner une ou plusieurs colonnes d’une table.
o Obtenir une ou plusieurs colonnes avec doublons
SELECT nom_du_champ1, nom_du_champ2,…. FROM table ;
Ou sous Oracle :
SELECT UNIQUE nom_du_champ1, nom_du_champ2,…. FROM table ;
56/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Projection
Exemple : Considérons la table : etudiants (de la base de données mp-d-2022_db)
Req.12 : Sélection de tous les prenoms de la table etudiants Req.13 : sélection des données avec condition ( prénoms est alain)
SELECT prenoms_etd FROM etudiants; SELECT DISTINCT prenoms_etd FROM etudiants;
57/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Intersection
SELECT * FROM tableA, tableB ;
Exemple : Considérons les tables : etudiants, livres, consulter de la base de données mp-d-2022_db
SELECT * FROM livres;
58/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Intersection
SELECT * FROM tableA, tableB ;
Avec SQL de base
SELECT attribut1, attribut2, ... FROM table1 WHERE attribut1 IN (SELECT attribut1 FROM table2) ; ou
SELECT attribut1, attribut2, ... FROM table1 WHERE EXISTS (SELECT * FROM table2 WHERE table1.attribut1 = table2.attribut1) ; ou
SELECT attribut1, attribut2, ... FROM table1 WHERE attribut1 = ANY (SELECT attribut1 FROM table2) ;
Exemple : Considérons les tables : etudiants, livres, consulter de la base de données mp-d-2022_db
Req.14 : Sélection des étudiants (identifiants, noms et prenoms)
ayant consulté des livres
SELECT id_etd, nom_etd, prenoms_etd FROM etudiants
WHERE id_etd IN(SELECT id_etd FROM consulter);
59/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Intersection
SELECT * FROM tableA, tableB ;
Avec SQL2 : l’opérateur INTERSECT ou une équi-jointure
SELECT attribut1, attribut2, ... FROM table1 INNER JOIN table2 ON table1.attribut1 = table2.attribut1 ; ou
SELECT attribut1, attribut2, ... FROM table1 INTERSECT SELECT attribut1, attribut2, ... FROM table2 ;
SQL INTERSECT : pour l’utiliser convenablement il faut que les 2 requêtes retourne le même nombre de colonnes, avec les
mêmes types et dans le même ordre. Compatibilité : PostgreSQL, SQL Server, Oracle et SQLite. Pas disponible sous MySQL
Exemple : Considérons les tables : etudiants, livres, consulter de la base de données mp-d-2022_db
Req.15 : Sélection des étudiants (identifiants, noms et prenoms)
ayant consulté des livres
SELECT etudiants.id_etd, nom_etd,
prenoms_etd FROM etudiants INNER JOIN
consulter ON etudiants.id_etd =
consulter.id_etd;
Différence
En SQL de base, plusieurs possibilités :
SELECT attribut1, attribut2, ... FROM table1 WHERE attribut1 NOT IN (SELECT attribut1 FROM table2); ou
SELECT attribut1, attribut2, ... FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.attribut1=table2.attribut1); ou
SELECT attribut1, attribut2, ... FROM table1 WHERE attribut1 <> ALL (SELECT attribut1 FROM table2);
Req.16 : Sélection des étudiants (identifiants, noms et prenoms)
n’ayant consulté aucun livres
SELECT id_etd, nom_etd, prenoms_etd FROM etudiants
WHERE id_etd NOT IN (SELECT id_etd FROM consulter);
En SQL2 avec la jointure externe (dans le cas d’une vieille version de MySQL qui ne dispose ni du
EXCEPT, ni de la possibilité de SELECT imbriqués) :
SELECT table1.attribut1, table1.attribut2,... FROM table1 LEFT JOIN table2 ON table1.attribut1 =
table2.attribut1 WHERE table2.attribut1 IS NULL ;
61/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Union
Sans doublons SELECT liste d'attributs FROM table1 UNION SELECT liste d'attributs FROM table 2 ;
Avec doublons SELECT liste d'attributs FROM table1 UNION ALL SELECT liste d'attributs FROM table 2 ;
NB: Les deux requêtes SELECT doivent retourner exactement le même nombre de
colonnes, avec les mêmes types de données et dans le même ordre.
Req.17 : Sélection tous les étudiants (identifiants, noms et prenoms) de la table etudiants et ceux de la table etudiants1, sans doublon
SELECT id_etd, nom_etd, prenoms_etd
FROM etudiants UNION SELECT id_etd,
nom_etd, prenoms_etd FROM etudiants1;
Jointure
SELECT * FROM tableA, tableB, tableC, ... WHERE tableA.key1 = tableB.key1 AND tableB.key2=tableC.key2 AND ...;
Avec la clause INNER JOIN (jointure dite interne) à partir du SQL2: jointure interne pour retourner les
enregistrements quand la condition est vrai dans les 2 tables
SELECT *FROM tableA INNER JOIN tableB ON tableA.key = tableB.key
o Le mot clé INNER est facultatif sur la plupart des SGBDR (sauf MS Access).
o L'oubli d'un ON (et donc de la condition de jointure) empêchera l'exécution de la requête, alors qu'avec l'ancienne notation,
l'oubli d'une condition de jointure derrière WHERE, n'empêche pas l'exécution de la requête, produisant alors un produit
cartésien entre les tables.
o un enregistrement des tables tableA et tableB sont sélectionnés lorsque la donnée de la colonne « key » de tableA est
égal à la donnée de la colonne key de tableB.
Avec la clause NATURAL JOIN (équi-jointure naturelle) à partir du SQL2: joindre les 2 tables sur l'ensemble des
attributs qu'elles ont en commun (portant le même nom), mais en ne gardant qu'une seule colonne pour chaque
attribut joint:
SELECT * FROM tableA NATURAL JOIN tableB;
63/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Jointure
SELECT * FROM tableA, tableB, tableC, ... WHERE tableA.key1 = tableB.key1 AND tableB.key2=tableC.key2 AND ...;
Req.19 : Sélection des différents livres consultés (titre, auteur, date) par les étudiants (identifiants, noms et prenoms)
64/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Jointure
SELECT * FROM tableA, tableB, tableC, ... WHERE tableA.key1 = tableB.key1 AND tableB.key2=tableC.key2 AND ...;
Req.20 : Sélection des différents livres consultés (titre, auteur, date) par les étudiants (identifiants, noms et prenoms)
65/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Jointure
LEFT JOIN (ou LEFT OUTER JOIN) : jointure externe pour retourner tous les
enregistrements de la table de gauche (LEFT = gauche) même si la condition n’est pas vérifié
dans l’autre table. Le résultat est NULL du côté droit, s'il n'y a pas de correspondance.
SELECT * FROM tableA LEFT JOIN tableB ON tableA.key = tableB.key
RIGHT JOIN (ou RIGHT OUTER JOIN) : jointure externe pour retourner tous les
enregistrements de la table de droite (RIGHT = droite) même si la condition n’est pas vérifié
dans l’autre table. Les colonnes manquantes sont alors complétées par des valeurs NULL.
SELECT * FROM tableA RIGHT JOIN tableB ON tableA.key = tableB.key
FULL JOIN (ou FULL OUTER JOIN) : jointure externe pour retourner les résultats quand la
condition est vrai dans au moins une des 2 tables.
SELECT * FROM tableA FULL JOIN tableB ON tableA.key = tableB.key
La clause WHERE tableA.key IS NULL permet d’obtenir sans intersection les résultats des
jointures LEFT, RIGHT, FULL 66/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Sous requêtes
Dans le langage SQL une sous-requête (aussi appelé « requête imbriquée » ou
« requête en cascade ») consiste à exécuter une requête à l’intérieur d’une autre
requête. Une requête imbriquée est souvent utilisée au sein d’une clause WHERE
ou de HAVING pour remplacer une ou plusieurs constante.
SELECT * FROM nom_table1 WHERE nom_colonne = ( SELECT valeur FROM table2 LIMIT 1 )
67/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Renommage
Alias sur une colonne
SELECT nom_attribut1 AS alias_attribut1, nom_attribut2 FROM nom_table ou
SELECT nom_attribut1 alias_attribut1, nom_attribut2 FROM nom_table
Alias sur une table
SELECT * FROM table1 AS alias_de_table1; Ou SELECT * FROM table1 alias_de_table1
NB : Il est recommandé dans le standard ISO d’utiliser AS pour concevoir une requête SQL
Req.21 : Renommage du l’id_etd, nom_etd et prenom_etd en matricule, nom et prenom
68/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Tri
SELECT attribut1, attribut2, attribut3, ...FROM table ORDER BY attribut1, attribut2
Par défaut les résultats sont classés par ordre ascendant, toutefois il est possible d’inverser
l’ordre en utilisant le suffixe DESC après le nom de la colonne. Par ailleurs, il est possible de
trier sur plusieurs colonnes en les séparant par une virgule.
SELECT attribut1, attribut2, attribut3, ...FROM table ORDER BY attribut1 ASC, attribut2
o ASC : par ordre croissant (Ascending)
o DESC : par ordre décroissant (Descending)
o Le tri s'effectue sur un ou plusieurs attributs, dans l'ordre croissant ou décroissant.
o La relation résultat a la même structure et le même contenu que la relation de départ.
69/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Tri
Req.22 : Sélection des etudiants (identifiant, nom, prenoms et age) du plus petit au plus grand
70/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Tri
Req.23 : Sélection des etudiants (identifiant, nom, prenoms et age) du plus grand au plus petit
71/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
HAVING
Presque similaire à WHERE à la seule différence que HAVING permet de filtrer en utilisant
des fonctions telles que SUM(), COUNT(), AVG(), MIN() ou MAX().
SELECT colonne1, SUM (colonne2) FROM nom_table GROUP BY colonne1
HAVING function (colonne2) operateur valeur
72/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Exemple : Considérons les tables : etudiants, livres, consulter de la base de données mp-d-2022_db
Req.24 : Calcul de la moyenne des prix des livres Req.25 : Calcul de la moyenne des âges des étudiants
SELECT AVG (prix_livre) FROM livres; SELECT AVG (age_etd) FROM etudiants;
74/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
75/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
76/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Req.29 : Déterminer la somme des prix des livres Req.30 : Déterminer le prix du livre le plus cher de Victor Hugo
SELECT SUM(prix_livre) FROM livres; SELECT MAX(prix_livre) FROM livres
WHERE auteur_livre = 'Victor Hugo';
77/160
NOTION DE BASE DE DONNÉES Bases de données relationnelles
Langage SQL
Comparaison
SQL ALL
Dans le langage SQL, la commande ALL permet de comparer une valeur dans l’ensemble de valeurs d’une sous-requête. En
d’autres mots, cette commande permet de s’assurer qu’une condition est « égale », « différente », « supérieure »,
« inférieure », « supérieure ou égale » ou « inférieure ou égale » pour tous les résultats retourné par une sous-requête.
SELECT * FROM table1 WHERE condition > ALL ( SELECT * FROM table2 WHERE condition2 )
79/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Chapitre 2 :
DICTIONNAIRES ET
PROGRAMMATION DYNAMIQUE
Axes d’étude
Les dictionnaires sont utilisés en boîte noire dès la première année. En deuxième année,
80/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Généralités
Principes du hachage
Définition :
o Une table de hachage est une structure de données classique qui permet une association clé-
élément, où chaque élément est associé à une clé et chaque clé correspond à un seul élément.
o Elle consiste en un tableau (la table de hachage), dont les cases sont appelées alvéoles, et une
fonction (la fonction de hachage).
o La fonction de hachage associe à une clé une valeur de hachage. Elle fait donc correspondre la
clé d'un élément à une valeur qui est utilisée comme index dans la table de hachage pour cet
élément
81/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Généralités
Principes du hachage
But :
o Le but de cette structure de données est d'accéder le plus rapidement possible à un élément à
partir de sa clé.
o Les opérations permises par une table de hachage H sont les suivantes :
• INSÈRE (élt, clé) : insère dans la table de hachage un élément élt dont la clef est clé.
• ÉLÉMENT RECHERCHE (clé) : recherche dans la table de hachage si un élément est associé à la
clef clé et renvoie cet élément ; le cas échéant, renvoie nil.
• BOOLÉEN APPARTIENT (clé) : renvoie vrai si un élément est associé à la clef clé dans la table de
hachage.
Lorsque deux clés distinctes ont la même valeur de hachage, on dit qu'on a une collision.
82/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Rappel
o Un dictionnaire est une collection d'objets non-ordonnées.
o Il est composé d'éléments et chaque élément se compose d'une paire clé : valeur. Dans
certains langages de programmation, on parle de tableaux associatifs ou de hashs.
o Comme les listes, les dictionnaires sont des objets muables et dynamiques. Ils peuvent être
modifiés et s'étendre selon vos besoins.
o Un dictionnaire peut contenir des objets de n'importe quel type et même inclure d'autres
dictionnaires.
o C'est grâce à ces caractéristiques que les dictionnaires sont souvent utilisés pour créer des
structures de données complexes où plusieurs éléments sont imbriqués les uns dans les
autres !
83/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Rappel
o Les clés sont uniques et à chacune de ces clés est associée une valeur.
o Les clés doivent être des objets non mutables - en général on utilise des entiers, des chaînes de
caractères ou des tuples. Les valeurs peuvent être totalement quelconques.
o Un dictionnaire en Python peut s'apparenter à un dictionnaire de français où on accède à une
définition avec un mot.
o Contrairement aux listes qui sont délimitées par des crochets, on utilise des accolades pour les
dictionnaires.
84/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Création et manipulation
dict() ou {} dictionnaire vide
{c1:v1, c2:v2, ...} création d’un dictionnaire avec les clés 𝑐𝑖 et les valeurs 𝑣𝑖
accès à la valeur associée à la clé cle (en lecture et écriture). Lors d’une affectation, la clé
d[cle]
est créée si elle n’existe pas
d.keys() ensemble des clés du dictionnaires (objet itérable)
d.values() les valeurs du dictionnaires (objet itérable)
d.items() les couples clé/valeurs du dictionnaires (objet itérable)
len(d) taille du dictionnaire (nombre de clés)
k in d (ou k not in d) teste si la clé k est présente (absente) dans le dictionnaire
d.copy() réalise une copie superficielle du dictionnaire
d.pop(cle) retire le couple clé/valeur du dictionnaire et renvoie la valeur
d.popitem() retire et renvoie un couple clé/valeur du dictionnaire (le dernier créé)
del d[cle] efface le couple clé/valeur associé à la clé
85/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Création et manipulation
Exemples :
86/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Comparaison listes et dictionnaires
o L’accès aux éléments d’un dictionnaire est très efficace et utilise une fonction de « hachage » qui
associe un entier à chaque élément du dictionnaire.
o Les points à retenir (en simplifiant, notamment la fonction de hachage) et en notant n la taille de
la liste/dictionnaire :
• une liste est intéressante lorsque l’ordre des éléments est important, ou que l’indexation par des entiers est
importante - à l’opposé, un dictionnaire permet d’avoir un ensemble de clés totalement quelconque;
• le test d’appartenance est en 𝑂(1) pour un dictionnaire, alors qu’il peut être en 𝑂(𝑛) pour une liste;
• les temps d’accès à un élément donné est en 𝑂(1) pour les deux (un peu plus rapide pour les listes),
• le temps de suppression d’un élément est en 𝑂(1) pour un dictionnaire et en 𝑂(𝑛) pour une liste (sauf si c’est
le dernier élément qu’on retire avec pop())
87/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Adressage directe vs hachage
L’un des moyens simples de gérer un ensemble de valeurs est la liste dynamique Python. Elles sont
gérées par adressage direct. L’univers des clés est un ensemble d’entiers de 0 à 𝑛 − 1 et on a
directement accès à la case 𝑘, puis à sa donnée correspondante :
88/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Adressage directe vs hachage
On pourrait alors avoir une structure analogue mais « avec des trous », lorsqu’on a un ensemble fini
de clés possibles mais qu’elles ne sont pas toutes utilisées :
On voit l’avantage évident d’une plus grande souplesse
mais également l’inconvénient immédiat : si l’ensemble
des clés possibles est très grand alors on aura réservé
un tableau d’adresse très grand (donc beaucoup de
place mémoire) pour finalement peu de cases utilisées.
Admettons qu’on veuille des clés qui sont des chaînes
de 5 caractères, on aurait 265 (presque 12 millions)
cases à réserver pour n’en utiliser que quelques
centaines/milliers.
89/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Adressage directe vs hachage
L’idée est donc de réduire l’ensemble des clés par une fonction de hachage, c’est-à-dire une
fonction ℎ qui part du domaine des clés et renvoie un entier entre 0 et 𝑛 − 1 de sorte que pour les
clés utilisées, les valeurs de ℎ soient différentes. Cela donne un schéma ci-dessous
90/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Adressage directe vs hachage
Évidemment la fonction ℎ ne sera pas injective... le but est d’avoir une fonction de hachage suffisamment
aléatoire pour qu’il n’y ait pas de collisions sur les valeurs. Tant que la situation reste sous le format du dessin
précédent, le temps nécessaire pour savoir si une clé est présente dans le dictionnaire est en 𝑂(1) (on évalue
la fonction ℎ sur la clé souhaitée et on regarde s’il y a une valeur correspondante).
Plusieurs questions se posent alors :
• Quelle taille choisir pour les valeurs de ℎ ? l’idée, en Python, est de partir sur une taille pas trop grande et de doubler
la taille du dictionnaire dès qu’on se rapproche de cette valeur (comme les fonctions de hachage vont travailler
modulo 𝑛, c’est encore plus simple si 𝑛 est une puissance de 2 - ce qui explique le doublement).
• que faire s’il y a malgré tout des collisions? le principe est de chaîner les données dont les clés ont même valeur
hachée, comme dans le dessin suivant. Le test d’existence d’une clé sera un peu plus long puisqu’il faudra parcourir
la liste chaînée dans certains cas).
91/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Dictionnaires
Adressage directe vs hachage
92/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Principe général
On aborde une nouvelle méthode de résolution de problèmes. Son principe général repose
sur une approche récursive dans laquelle on casse le problème principal en sous-problèmes
similaires.
Pour illustrer le principe général, on peut parler du problème de la recherche du plus court
chemin entre deux sommets 𝐴 et 𝐵. Si ce chemin passe par un sommet 𝐶 alors le sous-chemin de
𝐴 vers 𝐶 est aussi minimal (sinon on aurait un chemin plus court entre 𝐴 et 𝐶 , ce qui permettrait de
créer un chemin plus court entre 𝐴 et 𝐵). La technique est très différente de celles des algorithmes
de type diviser pour régner - penser aux exemples d’algorithmes de tri , tri-fusion ou tri rapide - car
pour ce dernier type, les sous-problèmes sont plutôt indépendants alors que dans la programmation
dynamique, au contraire, on obtient des sous-problèmes avec de fort liens entre eux.
93/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Mémoïsation
En informatique, la mémoïsation est la mise en cache des valeurs de retour d'une fonction
selon ses valeurs d'entrée. Le but de cette technique d'optimisation de code est de diminuer le
temps d'exécution d'un programme informatique en mémorisant les valeurs retournées par une
fonction.
A titre d’exemple, considérons la suite de Fibonacci. Elle est définie par 𝐹0 = 𝐹1 = 1 et, pour
tout 𝑛 ⩾ 2, 𝐹𝑛 = 𝐹𝑛−1 + 𝐹𝑛−2.
La méthode récursive basique recalcule les termes plusieurs fois. Le principe de la
mémoïsation est de conserver une valeur déjà calculée afin de la réutiliser si besoin. On évite donc
les rappels inutiles à la fonction mais la contrepartie est qu’on doit stocker toutes ou beaucoup de
valeurs de la fonction. Voici plusieurs versions de ladite fonction :
94/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Mémoïsation
La première approche est de conserver la définition récursive et de stocker les valeurs qu’on a
effectivement calculées.
95/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Mémoïsation
La seconde approche est au contraire de partir du début et de remonter jusqu’à la valeur souhaitée.
Avec un dictionnaire
96/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Mémoïsation
La seconde approche est au contraire de partir du début et de remonter jusqu’à la valeur souhaitée.
Avec une liste :
97/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Mémoïsation
Plusieurs commentaires peuvent-être relevés sur ces exemples :
o on peut évidemment, dans les versions itératives, utiliser une variable Fibo globale et continuer
à la remplir uniquement si on demande une valeur plus élevée que celles calculées (sur la base
du dernier terme calculé)
o la version récursive est toujours limitée par la profondeur de récursion autorisée dans Python.
On ne peut pas directement demander 𝐹10000 alors que la version itérative le permet,
o on a évidemment un gain de temps énorme par rapport à la version récursive basique (on passe
d’une complexité exponentielle à une complexité linéaire),
o on voit apparaître deux approches très différentes entre les deux versions :
→ la version itérative est de type Bottom-Up ou de bas en haut : on part du bas et on remonte
vers les termes d’indices plus élevés,
→ la version récursive est de type Top-Down ou de haut en bas : on détermine la valeur
d’indice 𝑛 en redescendant vers les termes d’indices inférieurs (jusqu’à pouvoir les calculer)
98/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Principe :
o On dispose de pièces de certaines valeurs pour rendre la monnaie (on suppose que le nombre de
pièce est illimité). On doit rendre un certain montant à l’aide de ces pièces, en donnant le moins
de pièces possibles.
99/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton :
o Le principe est le suivant : on rend la pièce la plus élevée possible à chaque fois.
o Cet algorithme ne rend pas toujours la meilleure réponse; en fait cela dépend du jeu de
pièce... on dit que le jeu de pièces est canonique lorsque l’algorithme glouton fournit la
meilleure réponse - ce qui est le cas pour les pièces usuelles.
Par exemple, pour obtenir 8 avec L = [1, 4, 6], l’algorithme renvoie les 3 pièces suivantes :
6 + 1 + 1 alors que le meilleur choix est : 4 + 4.
100/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Programmation dynamique
o Si on doit rendre une valeur de 𝑛 avec le moins de pièces possibles et si l’une des
pièces à la valeur 𝑘, alors les 𝑛 − 𝑘 restant doivent être rendu de façon optimale (c’est ce
qu’on appelle la propriété de sous-structure optimale).
o Si on note 𝑡𝑛 le nombre minimum de pièces pour avoir une somme de 𝑛, on obtient la
relation de récurrence :
tn 1 inf tnk
kL
o Cette borne inférieure peut être atteinte pour différentes valeurs de k (mais ce n’est pas encore
la question). On obtient ainsi une formule de récurrence simple permettant de calculer 𝑡𝑛. Afin de
ne pas à avoir à recalculer les valeurs de 𝑡𝑛−k beaucoup trop de fois, on réutilise la technique de
mémoïsation pour stocker les valeurs précédentes de 𝑡.
101/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Programmation dynamique
Une version avec une liste recalculée à chaque fois :
102/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Programmation dynamique
On peut utiliser un dictionnaire qui permet de ne pas refaire les calculs déjà fait pour d’autres valeurs:
103/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Reconstituer le rendu
Savoir combien de pièces rendre, c’est bien. Savoir lesquelles on doit rendre c’est encore mieux!
o l’une des méthodes est de stocker, pour chaque montant, la liste des pièces à rendre et, lors
du calcul du minimum, ajouter à cette liste la pièce en cours. Cela risque de créer de longue liste
(et ainsi prendre beaucoup de place).
o on peut le faire de nouveau récursivement : pour le montant 𝑛, il suffit de savoir qu’elle est
l’une des pièces à rendre et de repartir ensuite au montant restant.
104/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Reconstituer le rendu
105/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Reconstituer le rendu
On peut adapter l’algorithme rendu pour
qu’il renvoie le nombre de pièces et la
dernière pièce rendue, puis écrire une
fonction qui donne toutes les pièces :
106/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Rendre la monnaie
Algorithme glouton : Reconstituer le rendu
ce qui donne par exemple
107/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Présentation du problème :
o On dispose d’une matrice de taille 𝑝×𝑞 remplies
d’entiers positifs (ou de réels positifs). On part de la
case en haut à gauche et on veut rejoindre la case en
bas à droite par des déplacements uniquement vers le
bas ou vers la droite et ce, en maximisant la somme S
des valeurs des cases parcourues.
108/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Présentation du problème :
Nombre total de chemins possibles :
p 1
C p q 2
p q 2 !
p 1! p q 2 p 1 !
C p 1
p q 2 !
(a)
p q 2
p 1! q 1!
Si p q n 2
p 1
C n 1
2n 2 !
2 n 2 !
C (b)
p q 2 2 n2
n 1! n 1! n 1! 2
Nous allons utiliser de nouveau les techniques Si n 3, On a 6 chemins possibles
précédentes, mais cette fois-ci, sur deux dimensions. 109/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Algorithme glouton :
On part en haut à gauche. À chaque étape, on choisit la situation qui permet de gagner le plus,
jusqu’à aboutir à l’arrivée. C’est évidemment aisé à programmer, la complexité est d’ordre O(𝑝 + 𝑞)
(choisir un terme parmi deux à chaque pas) mais cela ne donne pas forcément le résultat optimal.
S = 49 S = 54
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Programmation dynamique : calcul du gain maximum:
Considérons la case d’arrivée (i, j). On y arrive par l’une des
deux cases adjacentes (i-1, j) et (i, j-1). Plus précisément, on
aura le gain maximum en (i, j) si et seulement si on arrive de la
case qui a elle même un gain maximum à partir du départ. On a
donc à connaître le gain maximum des chemins allant à chacune
de ses deux cases... et ainsi de suite.
Généralisation : Si on note 𝑡𝑖,𝑗 le gain maximum en arrivant à la
case (𝑖, 𝑗) (et 𝑎𝑖,𝑗 la valeur de cette case, on aura alors la
formule (c) illustrée par le schéma ci-contre :
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Programmation dynamique : calcul du gain maximum:
Un seul chemin
On peut alors proposer un algorithme basé sur ces remarques
afin de remplir un tableau avec les gains maximaux pour chaque
case en remplissant case par case : Sens de remplissage
112/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Programmation dynamique : calcul du gain maximum:
Un seul chemin
3 11 18 20 24 31
10 16 26 28 29 35
17 19 30 35 43 52
23 25 36 46 47 54
113/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Programmation dynamique : calcul du gain maximum:
114/160
DICTIONNAIRES & Prog. DYNAMIQUE Généralités
Programmation dynamique
Programmation dynamique
Meilleur chemin - déplacements Nord-Est
Programmation dynamique : calcul du gain maximum:
115/160