# Cours de bases de données - Ecole doctorale

Sylvie Damy

► To cite this version:

Sylvie Damy. Cours de bases de données - Ecole doctorale. Doctorat. Introduction aux bases de données relationnelles, Besançon, France. 2024, pp.275. hal-04573261

HAL Id: hal-04573261

https://univ-fcomte.hal.science/hal-04573261

Submitted on 16 May 2024

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
<figure><img src="image_1.png" /></figure>

HAL
open science

# Cours de bases de données - Ecole doctorale

Sylvie Damy

► To cite this version:

Sylvie Damy. Cours de bases de données - Ecole doctorale. Doctorat. Introduction aux bases de données relationnelles, Besançon, France. 2024, pp.275. hal-04573261

HAL Id: hal-04573261

https://univ-fcomte.hal.science/hal-04573261v1

Submitted on 16 May 2024

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_2.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
# Introduction aux Bases de données

Ecole doctorale - Formations permanentes - Année 2023-2024

Sylvie DAMY

CHRONO
ENVIRONNEMENT

UBFC
UNIVERSITÉ
BOURGOGNE FRANCHE-COMTÉ
# Introduction aux Bases de données

Ecole doctorale - Formations permanentes - Année 2023-2024

Sylvie DAMY

CHRONO
ENVIRONNEMENT

UBFC
UNIVERSITÉ
BOURGOGNE FRANCHE-COMTÉ
# Objectifs du cours

Utilisateurs avertis des bases de données

Etre capable de :

* concevoir un modèle de BD « simple »

* créer la base de données

* intégrer des données

* interroger la base de données : requêtes simples ... requêtes de comptage
# Objectifs du cours

Utilisateurs avertis des bases de données

Etre capable de :

* concevoir un modèle de BD « simple »

* créer la base de données

* intégrer des données

* interroger la base de données : requêtes simples ... requêtes de comptage
Plan du cours

<figure><img src="image_2.png" /></figure>

Qu'est-ce qu'une base de données ?

<figure><img src="image_3.png" /></figure>

Modélisation - MCD

<figure><img src="image_4.png" /></figure>

Modèle relationnel

<figure><img src="image_5.png" /></figure>

SQL : Langage d'interrogation
# Plan du cours

<figure><img src="image_3.png" /></figure>

* Qu'est-ce qu'une base de données ?

<figure><img src="image_4.png" /></figure>

* Modélisation - MCD

<figure><img src="image_5.png" /></figure>

* Modèle relationnel

<figure><img src="image_6.png" /></figure>

* SQL : Langage d'interrogation
# Organisation

<figure><img src="image_6.png" /></figure>

Séance 1 : 07 février 2024
MCD + Modélisation
relationnelle

<figure><img src="image_7.png" /></figure>

Séance 2 : 21 février 2024
Travail sur vos données
→ MCD

<figure><img src="image_8.png" /></figure>

Séance 3 : 04 mars 2024
SQL + première requêtes

<figure><img src="image_9.png" /></figure>

Séance 4 : 13 mars 2024
Requêtes

<figure><img src="image_10.png" /></figure>

Séance 5 : 20 mars 2024
Requêtes

<figure><img src="image_11.png" /></figure>

Salle 110K
# Organisation

<figure><img src="image_7.png" /></figure>

Séance 1 : 07 février 2024
MCD + Modélisation
relationnelle

<figure><img src="image_8.png" /></figure>

Séance 2 : 21 février 2024
Travail sur vos données
→ MCD

<figure><img src="image_9.png" /></figure>

Séance 3 : 04 mars 2024
SQL + première requêtes

<figure><img src="image_10.png" /></figure>

Séance 4 : 13 mars 2024
Requêtes

<figure><img src="image_11.png" /></figure>

Séance 5 : 20 mars 2024
Requêtes

<figure><img src="image_12.png" /></figure>

Salle 110K
Pour le 15 février :
Envoi de vos données ou confirmation que vous viendrez avec des données sur lesquelles nous pourrons travailler

<figure><img src="image_12.png" /></figure>

sylvie.damy@univ-fcomte.fr
Pour le 15 février :
Envoi de vos données ou confirmation que vous viendrez avec des données sur lesquelles nous pourrons travailler

<figure><img src="image_13.png" /></figure>

sylvie.damy@univ-fcomte.fr
# Partie 1
Qu'est-ce qu'une base de données ?

<figure><img src="image_13.png" /></figure>
# Partie 1
Qu'est-ce qu'une base de données ?

<figure><img src="image_14.png" /></figure>
Pourquoi des bases de données ?

* Stockage permanent des données

* Mise à jour des données

* Accès facile

* Présentation des données

* Qualité des données

* Sécurité

* Partage

<figure><img src="image_14.png" /></figure>
Pourquoi des bases de données ?

* Stockage permanent des données

* Mise à jour des données

* Accès facile

* Présentation des données

* Qualité des données

* Sécurité

* Partage

<figure><img src="image_15.png" /></figure>
Bases de données : définitions

Ensemble d'informations modélisant les objets d'une
partie du monde réel et servant de support à une
application informatique

Collection organisée, interrogeable et persistante de
données ou d'informations, concernant un thème donné pour
l'entreprise

<figure><img src="image_15.png" /></figure>

<figure><img src="image_16.png" /></figure>

<figure><img src="image_17.png" /></figure>

<figure><img src="image_18.png" /></figure>
Bases de données : définitions

Ensemble d'informations modélisant les objets d'une
partie du monde réel et servant de support à une
application informatique

Collection organisée, interrogeable et persistante de
données ou d'informations, concernant un thème donné pour
l'entreprise

<figure><img src="image_16.png" /></figure>

<figure><img src="image_17.png" /></figure>

<figure><img src="image_18.png" /></figure>

<figure><img src="image_19.png" /></figure>
# Bases de données : définitions

## D'un point de vue plus informatique

Ensemble de fichiers comprenant un certain nombre
d'articles formés chacun d'un type de données,
avec des liens entre ces articles

Ensemble d'opérateurs permettant la recherche, le
tri, la fusion ou toute autre opération de même
type

Ensemble de données et de métadonnées (données qui
décrivent les données → schéma de la base)
# Bases de données : définitions

## D'un point de vue plus informatique

Ensemble de fichiers comprenant un certain nombre
d'articles formés chacun d'un type de données,
avec des liens entre ces articles

Ensemble d'opérateurs permettant la recherche, le
tri, la fusion ou toute autre opération de même
type

Ensemble de données et de métadonnées (données qui
décrivent les données → schéma de la base)
# SGBD : Système de Gestion des Bases de Données

## Outil principal de gestion des bases de données

Ensemble de logiciels fournissant un environnement fournissant des applications pour :

* décrire,

* mémoriser,

* manipuler,

* traiter des ensembles de données,

* en contrôler l'accès,

* partager ces données,

* gérer des pannes...

<figure><img src="image_19.png" /></figure>
# SGBD : Système de Gestion des Bases de Données

## Outil principal de gestion des bases de données

Ensemble de logiciels fournissant un environnement fournissant des applications pour :

* décrire,

* mémoriser,

* manipuler,

* traiter des ensembles de données,

* en contrôler l'accès,

* partager ces données,

* gérer des pannes...

<figure><img src="image_20.png" /></figure>
Un peu de vocabulaire

Base de données

Collection organisée de données

<figure><img src="image_20.png" /></figure>

Système de gestion de base de données

Logiciel qui gère et permet l'accès aux données de la base

<figure><img src="image_21.png" /></figure>

Application de base de données

Programme qui interagit avec la base de données à certains moments de
son exécution en lui adressant des requêtes (SQL)

<figure><img src="image_22.png" /></figure>

Système d'information

Ensemble formé par la ou les bases de données, le SGBD et les applications
de base de données liées à cette base de données

<figure><img src="image_23.png" /></figure>
Un peu de vocabulaire

Base de données

Collection organisée de données

<figure><img src="image_21.png" /></figure>

Système de gestion de base de données

Logiciel qui gère et permet l'accès aux données de la base

<figure><img src="image_22.png" /></figure>

Application de base de données

Programme qui interagit avec la base de données à certains moments de
son exécution en lui adressant des requêtes (SQL)

<figure><img src="image_23.png" /></figure>

Système d'information

Ensemble formé par la ou les bases de données, le SGBD et les applications
de base de données liées à cette base de données

<figure><img src="image_24.png" /></figure>
<figure><img src="image_24.png" /></figure>
<figure><img src="image_25.png" /></figure>
Votre utilisation des Bases de Données

<figure><img src="image_25.png" /><figcaption>Introduction aux bases de données relationnelles</figcaption></figure>
Votre utilisation des Bases de Données

<figure><img src="image_26.png" /><figcaption>Introduction aux bases de données relationnelles</figcaption></figure>
BD versus feuille de calcul

<table><thead><tr><th></th><th>Base de Données</th><th>Feuille de calcul</th></tr></thead><tbody><tr><td>Organisation des données</td><td>Liste, formulaire</td><td>Liste</td></tr><tr><td>Qualité des données</td><td>Contrôle de la cohérence</td><td></td></tr><tr><td>Volume d'information</td><td>Non limité</td><td>Limites des tableurs</td></tr><tr><td>Nature des informations</td><td>Texte, numérique, image, fichier, ...</td><td>Chaine de caractères, numérique, booléen</td></tr></tbody></table>
BD versus feuille de calcul

<table><thead><tr><th></th><th>Base de Données</th><th>Feuille de calcul</th></tr></thead><tbody><tr><th scope="row">Organisation des données</th><td>Liste, formulaire</td><td>Liste</td></tr><tr><th scope="row">Qualité des données</th><td>Contrôle de la cohérence</td><td></td></tr><tr><th scope="row">Volume d'information</th><td>Non limité</td><td>Limites des tableurs</td></tr><tr><th scope="row">Nature des informations</th><td>Texte, numérique, image, fichier, ...</td><td>Chaine de caractères, numérique, booléen</td></tr></tbody></table>
BD versus feuille de calcul

<table><thead><tr><td></td><td>Bases de Données</td><td>Feuille de calcul</td></tr></thead><tbody><tr><td>Recherche d'information</td><td>Requêtes → SQL</td><td>Tris</td></tr><tr><td>Partage des informations</td><td>Plusieurs utilisateurs</td><td>Un seul utilisateur</td></tr><tr><td>Sécurité</td><td>Confidentialité des données<br>Profil d'utilisateur</td><td></td></tr></tbody></table>
BD versus feuille de calcul

<table><thead><tr><td></td><td>Bases de Données</td><td>Feuille de calcul</td></tr></thead><tbody><tr><td>Recherche d'information</td><td>Requêtes → SQL</td><td>Tris</td></tr><tr><td>Partage des informations</td><td>Plusieurs utilisateurs</td><td>Un seul utilisateur</td></tr><tr><td>Sécurité</td><td>Confidentialité des données<br>Profil d'utilisateur</td><td></td></tr></tbody></table>
# Rôles dans les bases de données

Différents types de personnes peuvent manipuler une
base de données :

* Administrateurs

* Concepteurs

* Développeurs

* Utilisateurs
# Rôles dans les bases de données

Différents types de personnes peuvent manipuler une
base de données :

* Administrateurs

* Concepteurs

* Développeurs

* Utilisateurs
# Rôles dans les bases de données : Administrateurs

## Administrateur de données ou DA

* connaissance des données disponibles,

* acquisition et échange des données,

* animation du dispositif autour de la base de données.

## Administrateur de bases de données ou DBA

* intégrité des données,

* sécurité et performance,

* aide au développement et au test,

* recouvrement de données et gestion des pannes,

* validation et conseil,

* migration et mise à jour

<figure><img src="image_26.png" /></figure>
# Rôles dans les bases de données : Administrateurs

## Administrateur de données ou DA

* connaissance des données disponibles,

* acquisition et échange des données,

* animation du dispositif autour de la base de données.

## Administrateur de bases de données ou DBA

* intégrité des données,

* sécurité et performance,

* aide au développement et au test,

* recouvrement de données et gestion des pannes,

* validation et conseil,

* migration et mise à jour

<figure><img src="image_27.png" /></figure>
# Rôles dans les bases de données : Concepteurs

## Concepteurs logiques

* s'intéressent à l'ensemble de l'organisation à mettre en place, et en particulier à l'identification des données (entités, attributs, associations, contraintes).

* travaillent avec les utilisateurs futurs de la base de données.

## Concepteurs physiques

* traitent le passage du modèle logique de données vers un modèle physique. Ils représentent le schéma logique en un ensemble de relations et de contraintes d'intégrité, et s'intéressent à la sécurité des données.

* travail qui dépend fortement du SGBD choisi

<figure><img src="image_27.png" /></figure>
# Rôles dans les bases de données : Concepteurs

## Concepteurs logiques

* s'intéressent à l'ensemble de l'organisation à mettre en place, et en particulier à l'identification des données (entités, attributs, associations, contraintes).

* travaillent avec les utilisateurs futurs de la base de données.

## Concepteurs physiques

* traitent le passage du modèle logique de données vers un modèle physique. Ils représentent le schéma logique en un ensemble de relations et de contraintes d'intégrité, et s'intéressent à la sécurité des données.

* travail qui dépend fortement du SGBD choisi

<figure><img src="image_28.png" /></figure>
# Rôles dans les bases de données

## Développeurs d'applications

* réalisent des applications de bases de données qui permettent aux utilisateurs finaux d'utiliser/d'interagir avec la base de données.

<figure><img src="image_28.png" /></figure>

## Utilisateurs

<figure><img src="image_29.png" /></figure>

* clients de la base de données. Certains ne travaillent qu'à travers le biais des applications de base de données et n'ont aucune connaissance dans le domaine des bases de données.

* autres utilisateurs, plus expérimentés, peuvent écrire leurs propres requêtes SQL pour interroger la base de données.
# Rôles dans les bases de données

## Développeurs d'applications

* réalisent des applications de bases de données qui permettent aux utilisateurs finaux d'utiliser/d'interagir avec la base de données.

<figure><img src="image_29.png" /></figure>

## Utilisateurs

<figure><img src="image_30.png" /></figure>

* clients de la base de données. Certains ne travaillent qu'à travers le biais des applications de base de données et n'ont aucune connaissance dans le domaine des bases de données.

* autres utilisateurs, plus expérimentés, peuvent écrire leurs propres requêtes SQL pour interroger la base de données.
Rôles dans les bases de données

<table><thead><tr><td>Rôle /Personne</td><td>Vous – Chercheur</td><td>Informaticien - Modélisation</td><td>Informaticien - Développeur</td><td>Informaticien – Administrateur</td></tr></thead><tbody><tr><td>Administrateur de données</td><td>✓</td><td></td><td></td><td></td></tr><tr><td>Administrateur de BD</td><td></td><td></td><td>✓</td><td>✓</td></tr><tr><td>Concepteurs logiques</td><td>✓</td><td>✓</td><td></td><td></td></tr><tr><td>Concepteurs physiques</td><td></td><td>✓</td><td>✓</td><td></td></tr><tr><td>Développeurs d'applications</td><td></td><td></td><td>✓</td><td></td></tr><tr><td>Utilisateur simple</td><td>✓</td><td></td><td></td><td></td></tr><tr><td>Utilisateur averti</td><td>✓</td><td></td><td></td><td></td></tr></tbody></table>
Rôles dans les bases de données

<table><thead><tr><td>Rôle /Personne</td><td>Vous – Chercheur</td><td>Informaticien - Modélisation</td><td>Informaticien - Développeur</td><td>Informaticien – Administrateur</td></tr></thead><tbody><tr><td>Administrateur de données</td><td>✓</td><td></td><td></td><td></td></tr><tr><td>Administrateur de BD</td><td></td><td></td><td>✓</td><td>✓</td></tr><tr><td>Concepteurs logiques</td><td>✓</td><td>✓</td><td></td><td></td></tr><tr><td>Concepteurs physiques</td><td></td><td>✓</td><td>✓</td><td></td></tr><tr><td>Développeurs d'applications</td><td></td><td></td><td>✓</td><td></td></tr><tr><td>Utilisateur simple</td><td>✓</td><td></td><td></td><td></td></tr><tr><td>Utilisateur averti</td><td>✓</td><td></td><td></td><td></td></tr></tbody></table>
## Exemple de manipulation de bases de données

<figure><img src="image_30.png" /></figure>

Utilisateur simple

<figure><img src="image_31.png" /></figure>
# Exemple de manipulation de bases de données

<figure><img src="image_31.png" /></figure>

Utilisateur simple

<figure><img src="image_32.png" /></figure>
## Exemple de manipulation de bases de données

<figure><img src="image_32.png" /></figure>

Utilisateur averti

<figure><img src="image_33.png" /></figure>
# Exemple de manipulation de bases de données

<figure><img src="image_33.png" /></figure>

Utilisateur averti

<figure><img src="image_34.png" /></figure>
Exemple de manipulation de bases de données

<figure><img src="image_34.png" /></figure>

Modélisateur

<figure><img src="image_35.png" /></figure>
Exemple de manipulation de bases de données

<figure><img src="image_35.png" /></figure>

Modélisateur

<figure><img src="image_36.png" /></figure>
## Partie 2
# Modélisation - MCD

<figure><img src="image_36.png" /></figure>
## Partie 2
# Modélisation - MCD

<figure><img src="image_37.png" /></figure>
Les étapes de la conception d'une base de données

Analyse du système à modéliser

<figure><img src="image_37.png" /></figure>

Création du modèle de données

<figure><img src="image_38.png" /></figure>

Création de la base de données dans
un SGBD

<figure><img src="image_39.png" /></figure>
Les étapes de la conception d'une base de données

Analyse du système à modéliser

<figure><img src="image_38.png" /></figure>

Création du modèle de données

<figure><img src="image_39.png" /></figure>

Création de la base de données dans
un SGBD

<figure><img src="image_40.png" /></figure>
<figure><img src="image_40.png" /></figure>
<figure><img src="image_41.png" /></figure>
<figure><img src="image_41.png" /></figure>

Merise, UML
<figure><img src="image_42.png" /></figure>

Merise, UML
# Modélisation - MCD

## Première étape :

* Recueillir les informations puis les transcrire sous une forme facilitant le passage à un modèle de base de données (modèle relationnel)

* Utilisation du modèle entité-association (MERISE)

* Autre possibilité : UML - diagramme de classes (non vu dans ce cours)
# Modélisation - MCD

## Première étape :

* Recueillir les informations puis les transcrire sous une forme facilitant le passage à un modèle de base de données (modèle relationnel)

* Utilisation du modèle entité-association (MERISE)

* Autre possibilité : UML - diagramme de classes (non vu dans ce cours)
Première description du monde réel

Comment appréhender et
simplifier le monde réel
pour réaliser une
modélisation ?

Processus itératif

<figure><img src="image_42.png" /></figure>

<figure><img src="image_43.png" /></figure>

Entretiens

sujet – verbe –
complément

Besoins, objectifs,
processus d'alimentation
en données
Première description du monde réel

Comment appréhender et
simplifier le monde réel
pour réaliser une
modélisation ?

Processus itératif

<figure><img src="image_43.png" /></figure>
# Première description du monde réel

Formulation des besoins sous forme de phrases simples :

« sujet - verbe - complément »

* Faire l'inventaire des objets du « monde réel »

* Décrire l'activité en termes simples

* Caractériser les liens entre les objets

<figure><img src="image_44.png" /></figure>

<figure><img src="image_45.png" /></figure>

<figure><img src="image_46.png" /></figure>

## Description des données, des objets et des liens
# Première description du monde réel

Formulation des besoins sous forme de phrases simples :

« sujet - verbe - complément »

* Faire l'inventaire des objets du « monde réel »

* Décrire l'activité en termes simples

* Caractériser les liens entre les objets

<figure><img src="image_44.png" /></figure>

<figure><img src="image_45.png" /></figure>

<figure><img src="image_46.png" /></figure>

## Description des données, des objets et des liens
<figure><img src="image_47.png" /></figure>

Exemple : Les gauloiseries

Faire l'inventaire des objets du monde réel :

• Ingrédient

• Potion

Décrire l'activité en termes simples :

“ l'application à concevoir doit permettre de gérer l'ensemble des potions et leur composition.”
<figure><img src="image_47.png" /></figure>

Exemple : Les gauloiseries

Faire l'inventaire des objets du monde réel :

• Ingrédient

• Potion

Décrire l'activité en termes simples :

“ l'application à concevoir doit permettre de gérer l'ensemble des potions et leur composition.”
<figure><img src="image_48.png" /></figure>

## Exemple : Les gauloiseries

Caractériser les liens entre objets :

* Un ingrédient peut entrer dans la composition de plusieurs potions.

* Une potion peut être composée de plusieurs ingrédients...

Décrire les objets :

* Un ingrédient a un nom, un lieu de récolte

* Une potion a un nom, un effet, une durée d'effet
<figure><img src="image_48.png" /></figure>

## Exemple : Les gauloiseries

Caractériser les liens entre objets :

* Un ingrédient peut entrer dans la composition de plusieurs potions.

* Une potion peut être composée de plusieurs ingrédients...

Décrire les objets :

* Un ingrédient a un nom, un lieu de récolte

* Une potion a un nom, un effet, une durée d'effet
<figure><img src="image_49.png" /></figure>

Représentation graphique des informations recueillies
dans un modèle : MCD ou Modèle Conceptuel des Données

Une entité est
un objet du
monde réel

Une
association
est un lien
entre entités

Une propriété
est une
caractéristique
associée à une
entité ou à une
association
<figure><img src="image_49.png" /></figure>

Représentation graphique des informations recueillies
dans un modèle : MCD ou Modèle Conceptuel des Données

Une entité est
un objet du
monde réel

Une
association
est un lien
entre entités

Une propriété
est une
caractéristique
associée à une
entité ou à une
association
<figure><img src="image_50.png" /></figure>

Une entité est un objet spécifique du monde réel

Désigne : une personne, un objet, un concept abstrait, un événement

Caractérisée par son unicité

Exemples d'entités : potion magique, tomate
<figure><img src="image_50.png" /></figure>

Une entité est un objet spécifique du monde réel

Désigne : une personne, un objet, un concept abstrait, un événement

Caractérisée par son unicité

Exemples d'entités : potion magique, tomate
# Entités ou entités types

L'ensemble des entités qui ont la même sémantique et les mêmes propriétés forment un ensemble d'entités appelé *entité type*

Représentation graphique d'une
entité type

<table><tr><td>MonEntite</td></tr><tr><td>idEntite</td></tr></table>

<table><tr><td>ingredient</td></tr><tr><td>idIngredient</td></tr><tr><td>ingName</td></tr><tr><td>ingLocation</td></tr></table>

Représentation graphique d'une
entité

<table><tr><td>ingredient</td></tr><tr><td>1</td></tr></table>

<table><tr><td>ingredient</td></tr><tr><td>2</td></tr></table>
# Entités ou entités types

L'ensemble des entités qui ont la même sémantique et les mêmes propriétés forment un ensemble d'entités appelé **entité type**

Représentation graphique d'une entité type

<table><tr><td>MonEntite</td></tr><tr><td>idEntite</td></tr></table>

<table><tr><td>ingredient</td></tr><tr><td>idIngredient</td></tr><tr><td>ingName</td></tr><tr><td>ingLocation</td></tr></table>

Représentation graphique d'une entité

<table><tr><td>ingredient</td></tr><tr><td>1</td></tr></table>

<table><tr><td>ingredient</td></tr><tr><td>2</td></tr></table>
Propriété ou attribut

Toute entité-type possède des propriétés, appelées *attri*

<figure><img src="image_51.png" /></figure>

Exemple : nom de la personne, prénom, date de naissance, ...

* Un attribut ne peut pas être partagé par plusieurs entités-types ou associations-types

* Un attribut est une donnée élémentaire (pas de données calculées)

* L'entité-type et ses attributs forment un ensemble cohérent
Propriété ou attribut

Toute entité-type possède des propriétés, appelées *attri*

<figure><img src="image_51.png" /></figure>

Exemple : nom de la personne, prénom, date de naissance, ...

* Un attribut ne peut pas être partagé par plusieurs entités-types ou associations-types

* Un attribut est une donnée élémentaire (pas de données calculées)

* L'entité-type et ses attributs forment un ensemble cohérent
# Identifiant

Toute entité-type a un **identifiant** : (est un attribut ou ensemble d'attributs qui permet d'identifier chaque entité

L'identifiant ne peut pas prendre la même valeur pour deux entités distinctes

Exemples d'identifiants : Numéro de sécurité sociale d'une

personne, D°, T°, ... Représentation graphique de l'identifiant

<table><tr><td>Mon_entite</td></tr><tr><td>IDEntite</td><td>Auto_increment</td></tr><tr><td>NomEntite</td><td>Char</td></tr></table>

<table><tr><td>Mon_entite</td></tr><tr><td>IDEntite</td><td>NomEntite</td></tr></table>

<table><tr><td>Mon_entite</td></tr><tr><td>IDEntite</td><td>NomEntite</td></tr></table>

<table><tr><td>MonEntite</td></tr><tr><td>idEntite</td><td>nomEntite</td></tr></table>

MoCoDonline

Analyse SI

Looping
# Identifiant

Toute entité-type a un **identifiant** : (c'est un attribut ou
ensemble d'attributs qui permet d'identifier chaque entité

L'identifiant ne peut pas prendre la même valeur pour deux
entités distinctes

Exemples d'identifiants : Numéro de sécurité sociale d'une

personne, D°, T°, ... Représentation graphique de l'identifiant

<table><tr><td>Mon_entite</td></tr><tr><td>IDEntite</td><td>Auto_increment</td></tr><tr><td>NomEntite</td><td>Char</td></tr></table>

<table><tr><td>Mon_entite</td></tr><tr><td>IDEntite</td><td>NomEntite</td></tr></table>

<table><tr><td>Mon_entite</td></tr><tr><td>IDEntite</td><td>NomEntite</td></tr></table>

<table><tr><td>MonEntite</td></tr><tr><td>idEntite</td><td>nomEntite</td></tr></table>

MoCoDonline

Analyse_SI

Looping
# Identifiant

## Entité-type PERSONNE

nom de personne unique →
Identifiant = nom de la personne (NomPersonne)

nom et prénom uniques →
Identifiant = (NomPersonne, PrenomPersonne)
# Identifiant

## Entité-type PERSONNE

nom de personne unique →
Identifiant = nom de la personne (NomPersonne)

nom et prénom uniques →
Identifiant = (NomPersonne, PrenomPersonne)
# Identifiant

## Entité-type PERSONNE

Dans la pratique on évite des identifiants composés de plusieurs attributs → l seul attribut

ID_Personne : numéro automatique géré par le SGBD

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>

<figure><img src="image_52.png" /></figure>

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>PrK IDPersonne</td><td>Auto_increment</td></tr><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>
# Identifiant

## Entité-type PERSONNE

Dans la pratique on évite des identifiants composés de plusieurs attributs → l seul attribut

ID_Personne : numéro automatique géré par le SGBD

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>

<figure><img src="image_52.png" /></figure>

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>PrK IDPersonne</td><td>Auto_increment</td></tr><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>
# Les entités : représentation graphique

Rectangle comportant en haut le nom de l'entité-type et dans le bas la liste des attributs

## Entité-type

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>PrK IDPersonne</td><td>Auto_increment</td></tr><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>

## Entités

<table><tr><td>PERSONNE</td></tr><tr><td>12<br>Dubois<br>Pierre<br>12/02/1978</td></tr></table>

<table><tr><td>PERSONNE</td></tr><tr><td>134<br>Durand<br>Marie<br>15/09/1980</td></tr></table>
# Les entités : représentation graphique

Rectangle comportant en haut le nom de l'entité-type et dans le bas la liste des attributs

## Entité-type

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>PrK IDPersonne</td><td>Auto_increment</td></tr><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>

## Entités

<table><tr><td>PERSONNE</td></tr><tr><td>12<br>Dubois<br>Pierre<br>12/02/1978</td></tr></table>

<table><tr><td>PERSONNE</td></tr><tr><td>134<br>Durand<br>Marie<br>15/09/1980</td></tr></table>
# Association

Une **association** représente un lien entre plusieurs entités. Elle peut contenir des attributs.

- Jean Dupont possède le livre de code ISBSN 97821000720057

- Jean Dupont est marié avec Marie Dubois

Une association-type est un ensemble d'associations qui possèdent les mêmes caractéristiques

Une association-type représente un lien entre plusieurs entités-type

<figure><img src="image_53.png" /></figure>
# Association

Une association représente un lien entre plusieurs entités. Elle peut contenir des attributs.

- Jean Dupont possède le livre de code ISBSN 97821000720057

- Jean Dupont est marié avec Marie Dubois

Une association-type est un ensemble d'associations qui possèdent les mêmes caractéristiques

Une association-type représente un lien entre plusieurs entités-type

<figure><img src="image_53.png" /></figure>
Cardinalité d'une association-type

On définit une cardinalité sur chaque patte de l'association-type. Elle lie une entité-type et une association-type et est composée de 2 nombres :

valeur minimale : nombre minimal d'interventions d'une entité de l'entité-type dans l'association-type. Elle a pour valeur 0 ou 1

valeur maximale : nombre maximal d'interventions d'une entité de l'entité-type dans l'association-type. Elle a pour valeur 1 ou n
Cardinalité d'une association-type

On définit une cardinalité sur chaque patte de l'association-type. Elle lie une entité-type et une association-type et est composée de 2 nombres :

valeur minimale : nombre minimal d'interventions d'une entité de l'entité-type dans l'association-type. Elle a pour valeur 0 ou 1

valeur maximale : nombre maximal d'interventions d'une entité de l'entité-type dans l'association-type. Elle a pour valeur 1 ou n
# Cardinalité d'une association-type

La cardinalité est obligatoire pour chaque patte de l'association-type

<figure><img src="image_54.png" /></figure>
Cardinalité d'une association-type

La cardinalité est obligatoire pour chaque patte de
l'association-type

<figure><img src="image_54.png" /></figure>
Obl → une entité
peut être impliquée
dans aucune
association ou une
au plus

On → une entité
peut être impliquée
dans aucune
association ou dans
plusieurs (sans
limite)

L1 → une entité
est impliquée dans
une et une seule
association

Ln → une entité
est impliquée dans
au moins une
association
Obl → une entité
peut être impliquée
dans aucune
association ou une
au plus

On → une entité
peut être impliquée
dans aucune
association ou dans
plusieurs (sans
limite)

L1 → une entité
est impliquée dans
une et une seule
association

Ln → une entité
est impliquée dans
au moins une
association
Cardinalité d'une association-
type

<figure><img src="image_55.png" /></figure>

Une personne habite dans l et l seule ville
Cardinalité d'une association-
type

<figure><img src="image_55.png" /></figure>

Une personne habite dans l et l seule ville
# Association-type et association

<figure><img src="image_56.png" /><figcaption>## Associations</figcaption></figure>

<figure><img src="image_57.png" /></figure>
# Association-type et association

<figure><img src="image_56.png" /><figcaption>## Associations</figcaption></figure>

<figure><img src="image_57.png" /></figure>
Cardinalité d'une association-type

<figure><img src="image_58.png" /></figure>

Que veulent dire ces cardinalités ?
Cardinalité d'une association-type

<figure><img src="image_58.png" /></figure>

Que veulent dire ces cardinalités ?
# Cardinalité d'une association-type

## APourDirecteurGeneral :

Une personne peut être directeur général d'au plus une entreprise

<figure><img src="image_59.png" /></figure>

Une entreprise a un et un seul directeur général
# Cardinalité d'une association-type

## APourDirecteurGeneral :

Une personne peut être directeur général d'au plus une entreprise

<figure><img src="image_59.png" /></figure>

Une entreprise a un et un seul directeur général
# Cardinalité d'une association-type

## EstEmployeDe :

Une personne travaille dans une
à plusieurs entreprises

<table><thead><tr><th colspan="2">PERSONNE</th></tr></thead><tbody><tr><td>PrK IDPersonne</td><td>Auto_increment</td></tr><tr><td>NomPersonne</td><td>Char</td></tr><tr><td>PrenomPersonne</td><td>Char</td></tr><tr><td>DateNaissance</td><td>Date</td></tr></tbody></table>

Une entreprise a de un à n
employés

<figure><img src="image_60.png" /></figure>

<table><thead><tr><th colspan="2">ENTREPRISE</th></tr></thead><tbody><tr><td>PrK IDEntreprise</td><td>Auto_increment</td></tr><tr><td>NomEntreprise</td><td>Char</td></tr></tbody></table>

**Quotite** : attribut placé dans l'association type *EstEmployeDe*

Chaque valeur de cet attribut dépend d'une personne et d'une entreprise.
Cardinalité d'une association-type

EstEmployeDe :

Une personne travaille dans une
à plusieurs entreprises

<figure><img src="image_60.png" /></figure>

Quotite : attribut placé dans l'association type EstEmployeDe

Chaque valeur de cet attribut dépend d'une personne et d'une entreprise.
# Cardinalité d'une association-type

EstChefService :

Une personne peut être chef de 0 à n services dans des entreprises

<figure><img src="image_61.png" /></figure>

Une entreprise a 1 à n chefs de service
# Cardinalité d'une association-type

EstChefService :

Une personne peut être chef de 0 à n services dans des entreprises

<figure><img src="image_61.png" /></figure>

Une entreprise a 1 à n chefs de service
# Associations-types particulières

## Association-type binaire : associe deux entités-types

<figure><img src="image_62.png" /></figure>

## Association-type réflexive : associe une entité-type à elle-même

<figure><img src="image_63.png" /></figure>

**APourChef** : une personne peut avoir 0 ou 1 chef de service
# Associations-types particulières

## Association-type binaire : associe deux entités-types

<figure><img src="image_62.png" /></figure>

## Association-type réflexive : associe une entité-type à elle-même

<figure><img src="image_63.png" /></figure>

**APourChef** : une personne peut avoir 0 ou 1 chef de service
# Associations-types particulières

Association-type n-aire : associe plus de deux entités.

<figure><img src="image_64.png" /></figure>

Pas de cardinalité maximale égale à 1

Une personne réalise de 0 à n tâches dans différents projets (l'ensemble des projets est égale à 1).
# Associations-types particulières

Association-type n-aire : associe plus de deux entités.

<figure><img src="image_64.png" /></figure>

Pas de cardinalité maximale égale à 1

Une personne réalise de 0 à n tâches dans différents projets (l'ensemble des projets est égale à 1).
# Associations-types particulières

<figure><img src="image_65.png" /></figure>
# Associations-types particulières

<figure><img src="image_65.png" /></figure>
# Construction d'un MCD : Les étapes

Recueil des besoins :

* Documents

* Cahier des charges

...

Tri de l'information :

Problèmes de

* synonymie

* polysémie des attributs

Identification des entités-type :

* Repérer les attributs servant d'identifiant

* Une entité a une existence propre

Identification des associations-type :

* Relier les entités-type.

* Regarder les associations type de cardinalité 1:1

Vérification du modèle :

* Normalisation
# Construction d'un MCD : Les étapes

Recueil des besoins :

* Documents

* Cahier des charges

...

Tri de l'information :

Problèmes de

* synonymie

* polysémie des attributs

Identification des entités-type :

* Repérer les attributs servant d'identifiant

* Une entité a une existence propre

Identification des associations-type :

* Relier les entités-type.

* Regarder les associations type de cardinalité 1-to-1

Vérification du modèle :

* Normalisation
# Construction d'un MCD : Quelques conseils

## Choix des noms

* Entité-type : Nom au singulier

* Personne, Entreprise, ...

* Association-type : Verbe

* Conjugué, à l'infinitif, avec un adverbe, ...

* Attribut : Nom au singulier qui peut être complété avec le nom de l'entité type

* NomClient, AdresseEntreprise, ...

## Choix des identifiants

* Eviter les identifiants

* Composés de plusieurs attributs

* Qui peuvent changer au cours du temps

* De type chaine de caractères

* Privilégier les identifiants de type entier pour les entités type → Deviendront des clés primaires de type incrément automatique (auto-incrément) dans le SGBD
# Construction d'un MCD : Quelques conseils

## Choix des noms

* Entité-type : Nom au singulier

* Personne, Entreprise, ...

* Association-type : Verbe

* Conjugué, à l'infinitif, avec un adverbe, ...

* Attribut : Nom au singulier qui peut être complété avec le nom de l'entité type

* NomClient, AdresseEntreprise, ...

## Choix des identifiants

* Eviter les identifiants

* Composés de plusieurs attributs

* Qui peuvent changer au cours du temps

* De type chaine de caractères

* Privilégier les identifiants de type entier pour les entités type → Deviendront des clés primaires de type incrément automatique (auto-incrément) dans le SGBD
# Dictionnaire des données

## Document qui regroupe tous les attributs de la base de données

Peut servir pour la rédaction d'un DMP !!!

Pour chaque attribut on décrit :

* Nom : libellé décrivant l'attribut (ou proche)

* Descriptif : décrit à quoi sert l'attribut

* Type : Caractères, Numérique, Date, Booléen, ...

* Taille : Nombre de caractères, entier long, court, réel double, ...

* Information supplémentaire : si nécessaire

Informations supplémentaires :
Standard utilisé, liste de valeurs, unité utilisée, ...

NomPays, Nom du pays, Chaine de car., 50 CodePays, Code ISO 3166 du pays, Chaine de caractères, 3
# Dictionnaire des données

## Document qui regroupe tous les attributs de la base de données

Peut servir pour la rédaction d'un DMP !!!

Pour chaque attribut on décrit :

* Nom : libellé décrivant l'attribut (ou proche)

* Descriptif : décrit à quoi sert l'attribut

* Type : Caractères, Numérique, Date, Booléen, ...

* Taille : Nombre de caractères, entier long, court, réel double, ...

* Information supplémentaire : si nécessaire

Informations supplémentaires :
Standard utilisé, liste de valeurs, unité utilisée, ...

NomPays, Nom du pays, Chaine de car., 50 CodePays, Code ISO 3166 du pays, Chaine de caractères, 3
Exemple : Les gauloiseries

<figure><img src="image_66.png" /></figure>

<table><thead><tr><td>Nom</td><td>Descriptif</td><td>Type</td><td>Taille</td><td>Informations supplémentaires</td></tr></thead><tbody><tr><td>idPotion</td><td>Identifiant de la potion</td><td>Increment auto</td><td></td><td>Peut-on générer automatiquement les identifiants de potion ou existe-t-il déjà une façon de les identifier ?</td></tr><tr><td>poName</td><td>Nom de la potion</td><td>car</td><td>50</td><td>Si on a déjà des listes de valeurs regarder la longueur des noms de potions</td></tr><tr><td>poEffect</td><td>Effet de la potion</td><td>car</td><td>50</td><td></td></tr><tr><td>poDuration</td><td>Durée d'effet de la potion</td><td>entier</td><td></td><td>Durée en minutes</td></tr></tbody></table>
Exemple : Les gauloiseries

<figure><img src="image_66.png" /></figure>

<table><thead><tr><td>Nom</td><td>Descriptif</td><td>Type</td><td>Taille</td><td>Informations supplémentaires</td></tr></thead><tbody><tr><td>idPotion</td><td>Identifiant de la potion</td><td>Increment auto</td><td></td><td>Peut-on générer automatiquement les identifiants de potion ou existe-t-il déjà une façon de les identifier ?</td></tr><tr><td>poName</td><td>Nom de la potion</td><td>car</td><td>50</td><td>Si on a déjà des listes de valeurs regarder la longueur des noms de potions</td></tr><tr><td>poEffect</td><td>Effet de la potion</td><td>car</td><td>50</td><td></td></tr><tr><td>poDuration</td><td>Durée d'effet de la potion</td><td>entier</td><td></td><td>Durée en minutes</td></tr></tbody></table>
Exemple : Les cinémas

<table><thead><tr><td>Nom</td><td>Descriptif</td><td>Type</td><td>Taille</td><td>Informations supplémentaires</td></tr></thead><tbody><tr><td>NumCinema</td><td>Identifiant du cinéma</td><td>Increment auto</td><td></td><td>Peut-on générer automatiquement les identifiants du cinéma ou existe-t-il déjà une façon de les identifier ?</td></tr><tr><td>NomCinema</td><td>Nom du cinéma</td><td>car</td><td>100</td><td>Si on a déjà des listes de valeurs regarder la longueur des noms de cinémas</td></tr><tr><td>VilleCinema</td><td>Commune sur laquelle le cinéma est situé</td><td>car</td><td>100</td><td>Voir si il existe des listes de villes de référence intéressantes</td></tr><tr><td>Adresse Cinema</td><td>Rue et autres éléments complémentaires</td><td>car</td><td>200</td><td>A-t-on besoin de décomposer l'adresse ?</td></tr><tr><td>Telephone Cinema</td><td>Numéro de téléphone du cinéma</td><td>car Num</td><td>10 Entier</td><td>On considère qu'il n'y a qu'un seul numéro de tel. par cinéma. A gérer plutôt en caractères qu'en numérique</td></tr><tr><td>CodePostal</td><td>Code postal</td><td>Num</td><td>Entier</td><td>Attention aux entiers (>= 32747)</td></tr></tbody></table>
Exemple : Les cinémas

<table><thead><tr><td>Nom</td><td>Descriptif</td><td>Type</td><td>Taille</td><td>Informations supplémentaires</td></tr></thead><tbody><tr><td>NumCinema</td><td>Identifiant du cinéma</td><td>Increment auto</td><td></td><td>Peut-on générer automatiquement les identifiants du cinéma ou existe-t-il déjà une façon de les identifier ?</td></tr><tr><td>NomCinema</td><td>Nom du cinéma</td><td>car</td><td>100</td><td>Si on a déjà des listes de valeurs regarder la longueur des noms de cinémas</td></tr><tr><td>VilleCinema</td><td>Commune sur laquelle le cinéma est situé</td><td>car</td><td>100</td><td>Voir si il existe des listes de villes de référence intéressantes</td></tr><tr><td>Adresse Cinema</td><td>Rue et autres éléments complémentaires</td><td>car</td><td>200</td><td>A-t-on besoin de décomposer l'adresse ?</td></tr><tr><td>Telephone Cinema</td><td>Numéro de téléphone du cinéma</td><td>car Num</td><td>10 Entier</td><td>On considère qu'il n'y a qu'un seul numéro de tel. par cinéma. A gérer plutôt en caractères qu'en numérique</td></tr><tr><td>CodePostal</td><td>Code postal</td><td>Num</td><td>Entier</td><td>Attention aux entiers (>= 32747)</td></tr></tbody></table>
<figure><img src="image_67.png" /></figure>

Exemple : Les gauloiseries

Nous souhaitons manipuler les informations permettant de décrire des potions et leurs ingrédients.

Une potion a un nom,
un effet et une
durée

Un ingrédient a un
nom et un lieu de
récolte

Un ingrédient pour apparaître dans la composition de plusieurs
potions et une potion peut avoir dans sa composition plusieurs
ingrédients.
<figure><img src="image_67.png" /></figure>

Exemple : Les gauloiseries

Nous souhaitons manipuler les informations permettant de décrire des potions et leurs ingrédients.

Une potion a un nom,
un effet et une
durée

Un ingrédient a un
nom et un lieu de
récolte

Un ingrédient pour apparaître dans la composition de plusieurs
potions et une potion peut avoir dans sa composition plusieurs
ingrédients.
# Construction du MCD

Looping : Outil libre https://www.looping-mcd.fr/#

<figure><img src="image_68.png" /></figure>
# Construction du MCD

Looping : Outil libre https://www.looping-mcd.fr/#

<figure><img src="image_68.png" /></figure>
AnalyseSI : outil libre

http://www.cairns-sans-nom.com/AnalyseSI/index.php

<figure><img src="image_69.png" /></figure>

<figure><img src="image_70.png" /></figure>
AnalyseSI : outil libre

http://www.cairns-sans-nom.com/AnalyseSI/index.php

<figure><img src="image_69.png" /></figure>

<figure><img src="image_70.png" /></figure>
# Construction du MCD

## Mocodo : outil en ligne

http://www.mocodo.net/

<figure><img src="image_71.png" /></figure>

<figure><img src="image_72.png" /></figure>
# Construction du MCD

## Mocodo : outil en ligne

http://www.mocodo.net/

<figure><img src="image_71.png" /></figure>

<figure><img src="image_72.png" /></figure>
# Partie 3
## Modèle relationnel

<figure><img src="image_73.png" /></figure>

<figure><img src="image_74.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
# Partie 3
## Modèle relationnel

<figure><img src="image_73.png" /></figure>

<figure><img src="image_74.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
# Partie 3
## Modèle relationnel

<figure><img src="image_75.png" /></figure>

<figure><img src="image_76.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
# Partie 3
## Modèle relationnel

<figure><img src="image_75.png" /></figure>

<figure><img src="image_76.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
# A relational model of data for large shared data banks

**Author:**

<figure><img src="image_77.png" /></figure>

E. F. Codd <u>Authors Info & Claims</u>

Communications of the ACM, Volume 13, Issue 6 ● June 1970 ● pp
377-387 ● https://doi.org/10.1145/362384.362685

## Approche basée sur la théorie mathématique des ensembles

Aucune
modification
révolutionnaire

<figure><img src="image_78.png" /></figure>
# A relational model of data for large shared data banks

**Author:**

<figure><img src="image_77.png" /></figure>

E. F. Codd <u>Authors Info & Claims</u>

Communications of the ACM, Volume 13, Issue 6 ● June 1970 ● pp
377-387 ● https://doi.org/10.1145/362384.362685

## Approche basée sur la théorie mathématique des ensembles

Aucune
modification
révolutionnaire

<figure><img src="image_78.png" /></figure>
# Définitions

Base de données

Quesako ?
# Définitions

Base de données

Quesako ?
Connexion au serveur de bases de données

<figure><img src="image_79.png" /></figure>

votre login est sdamy

Votre mot de passe pour l'acces à phpmyadmin est: ?????
Accedez a [.phpmyadmin](#)

https://coursbdd.univ-fcomte

<figure><img src="image_80.png" /></figure>

Solution réservée
aux membres de
l'uFC

<figure><img src="image_81.png" /></figure>

phpMyAdmin

Bienvenue dans phpMyAdmin

Langue - Language

Français - French

<figure><img src="image_82.png" /></figure>

Connexion

<figure><img src="image_83.png" /></figure>

Utilisateur :

sdamy

Mot de passe :

......

Exécuter
Connexion au serveur de bases de données

<figure><img src="image_79.png" /></figure>

votre login est sdamy

Votre mot de passe pour l'acces à phpmyadmin est: ?????
Accedez a [.phpmyadmin](#)

https://coursbdd.univ-fcomte

<figure><img src="image_80.png" /></figure>

Solution réservée
aux membres de
l'uFC

<figure><img src="image_81.png" /></figure>

phpMyAdmin

Bienvenue dans phpMyAdmin

Langue - Language

Français - French

<figure><img src="image_82.png" /></figure>

Connexion

<figure><img src="image_83.png" /></figure>

Utilisateur :

sdamy

Mot de passe :

......

Exécuter
Connexion au serveur de bases de données

<figure><img src="image_84.png" /></figure>

Il faut installer MySQL ou MariaDB sur votre machine

https://www.youtube.com/watch?v=trPjbiGRwBw

<figure><img src="image_85.png" /></figure>

Pour les autres membres d'UBFC
Connexion au serveur de bases de données

<figure><img src="image_84.png" /></figure>

Il faut installer MySQL ou MariaDB sur votre machine

https://www.youtube.com/watch?v=trPjbiGRwBw

<figure><img src="image_85.png" /></figure>

Pour les autres membres d'UBFC
<figure><img src="image_86.png" /></figure>

## Consulter une base de données

### 1ère étape : création de votre BD

Importez le fichier gauloiseries.sql (que je vous ai envoyé par mail) sous phpmyadmin

<figure><img src="image_87.png" /></figure>
<figure><img src="image_86.png" /></figure>

## Consulter une base de données

### 1ère étape : création de votre BD

Importez le fichier gauloiseries.sql (que je vous ai envoyé par mail) sous phpmyadmin

<figure><img src="image_87.png" /></figure>
<figure><img src="image_88.png" /></figure>

## Consulter une base de données

### Qui-a-t-il dedans ?

<figure><img src="image_89.png" /></figure>
<figure><img src="image_88.png" /></figure>

# Consulter une base de données

## Qui-a-t-il dedans ?

<figure><img src="image_89.png" /></figure>
<figure><img src="image_90.png" /></figure>

## Consulter une base de données

Consultez le contenu de la table *potion*

Qui-a-t-il dedans ?

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>
<figure><img src="image_90.png" /></figure>

## Consulter une base de données

Consultez le contenu de la table *potion*

Qui-a-t-il dedans ?

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>
Définitions de base

Table : Une table, R, sur un ensemble de domaines D₁, D₂, ..., Dn, est constituée de 2 parties :
l'en-tête : ensemble fixé d'attributs.
le corps : ensemble de t-uplets.

T-uplet : Un t-uplet correspond à une ligne

Attribut : Un attribut correspond à une colonne
Définitions de base

Table : Une table, R, sur un ensemble de domaines D₁, D₂, ..., Dn, est constituée de 2 parties :
l'en-tête : ensemble fixé d'attributs.
le corps : ensemble de t-uplets.

T-uplet : Un t-uplet correspond à une ligne

Attribut : Un attribut correspond à une colonne
<table><thead><tr><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th><th></th></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td><td rowspan="2">Entête</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td><td rowspan="2">Corps</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

Attribut
<figure><img src="image_91.png" /></figure>
Définitions

Domaine : Ensemble fini ou infini de valeurs
dans lequel des attributs puisent leurs valeurs

Cardinalité : Nombre de t-uplets

Degré : Nombre d'attributs
**Domaine** : Ensemble fini ou infini de valeurs dans lequel des attributs puisent leurs valeurs

**Cardinalité** : Nombre de t-uplets

**Degré** : Nombre d'attributs
**Domaine :** Ensemble fini ou infini de valeurs dans lequel des attributs puisent leurs valeurs

**Cardinalité :** Nombre de caractères

poName, poEffect : chaine de caractères

idPotion, poDuration entiers

**Degré :** Nombre de lettres

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>
Domaine : Ensemble fini ou infini de valeurs
dans lequel des attributs puisent leurs valeurs

Cardinalité : Nombre de caractères

poName, poEffect :  
chaîne  
de caractères

idPotion, poDuration  
entiers

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

Degré : Nombre de degrés
# Définitions

Domaine : Ensemble dans lequel des attributs Cardinalité = Degré = 4

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

Cardinalité : Nombre de t-uplets

Degré : Nombre d'attributs
Domaine : Ensemble dans lequel des attributs Cardinalité = Degré = 4

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

Cardinalité : Nombre de t-uplets

Degré : Nombre d'attributs
Définitions

Clé : Groupe d'attributs dont la valeur permet d'identifier de manière unique tout t-uplet de la table.

Schéma relationnel : Ensemble de relations qui forment la base de données (noms différents)
Définitions

Clé : Groupe d'attributs dont la valeur permet d'identifier de manière unique tout t-uplet de la table.

Schéma relationnel : Ensemble de relations qui forment la base de données (noms différents)
Clé : Groupe d'attributs dont la valeur permet d'identifier de manière unique tout t-uplet de la table.

Schéma relationnel :
forment la base de do

Clé primaire
idPotion

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>
Clé : Groupe d'attributs dont la valeur permet d'identifier de manière unique tout t-uplet de la table.

Schéma relationnel :
forment la base de do

Clé primaire
idPotion

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>
## Exemple de table : potion

<figure><img src="image_91.png" /></figure>

Une potion a un identifiant, un nom, un effet et une durée d'effet

Les attributs de cette table sont :

idPotion, poName, poEffect et pol

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

La potion 4, appellée « Anger potion », rend furieux pendant 5 minutes

<figure><img src="image_92.png" /></figure>

potion(*idPotion, poName, poEffect, poDuration)
Exemple de table : potion

<figure><img src="image_92.png" /></figure>

Une potion a un identifiant, un nom, un effet et une durée d'effet

Les attributs de cette table sont :

idPotion, poName, poEffect et pol

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

La potion 4, appellée « Anger potion », rend furieux pendant 5 minutes

<figure><img src="image_93.png" /></figure>

potion(*idPotion, poName, poEffect, poDuration)
# Exemple de table : potion

Une potion a un identifiant, un nom, un effet et une durée d'effet

Les attributs de cette table sont :

idPotion, poName, poEffect et poDuration

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

potion(*idPotion, poName, poEffect, poDuration)

<figure><img src="image_93.png" /></figure>

Nom de la table

Clé de la table

<figure><img src="image_94.png" /></figure>
## Exemple de table : potion

<figure><img src="image_94.png" /></figure>

Une potion a un identifiant, un nom, un effet et une durée d'effet

Les attributs de cette table sont :

idPotion, poName, poEffect et poDuration

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

potion(*idPotion, poName, poEffect, poDuration)

<figure><img src="image_95.png" /></figure>

Nom de la table

Clé de la table
Tables potion et ingredient

<figure><img src="image_95.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
# Tables potion et ingredient

<figure><img src="image_96.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
<figure><img src="image_96.png" /></figure>

# Schéma relationnel Gauloiseries

<figure><img src="image_97.png" /></figure>

potion(*idPotion, poName, poEffect,
poDuration)

ingredient(*idIngredient, ingName,
ingLocation)
<figure><img src="image_97.png" /></figure>

# Schéma relationnel Gauloiseries

<figure><img src="image_98.png" /></figure>

potion(*idPotion, poName, poEffect,
poDuration)

ingredient(*idIngredient, ingName,
ingLocation)
# Définitions

## Propriétés des tables
# Définitions

## Propriétés des tables
# Propriétés des relations

## Définition mathématique de la notion de relation

* Pas de duplication de t-uplets

* Les t-uplets ne sont pas ordonnés

* Les attributs ne sont pas ordonnés

* Les valeurs des attributs sont atomiques

* Les valeurs d'un attribut font toutes parties d'un même domaine
# Propriétés des relations

## Définition mathématique de la notion de relation

* Pas de duplication de t-uplets

* Les t-uplets ne sont pas ordonnés

* Les attributs ne sont pas ordonnés

* Les valeurs des attributs sont atomiques

* Les valeurs d'un attribut font toutes parties d'un même domaine
Pas de duplication de t-uplets

Ensemble des t-uplets d'une table = ensemble au sens
mathématique

Une même valeur ne peut pas apparaître deux fois dans un
ensemble.

→ Toute table possède une
clé
Pas de duplication de t-uplets

Ensemble des t-uplets d'une table = ensemble au sens
mathématique

Une même valeur ne peut pas apparaître deux fois dans un
ensemble.

→ Toute table possède une
clé
# Ajout de données dans potion

<figure><img src="image_98.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

On ne peut pas avoir 2 t-uplets avec la même valeur.

<table><thead><tr><td>Colonne</td><td>Type</td><td>Fonction</td><td>Null</td><td>Valeur</td></tr></thead><tbody><tr><td>idPotion</td><td>int(11)</td><td></td><td></td><td>1</td></tr><tr><td>poName</td><td>varchar(50)</td><td></td><td></td><td>Magic potion</td></tr><tr><td>poEffect</td><td>varchar(50)</td><td></td><td></td><td>Make you strong</td></tr></tbody></table>

## Erreur

Requête SQL :

<figure><img src="image_99.png" /></figure>

Éditer

<figure><img src="image_100.png" /></figure>

Ignorer

Colonne Type

INSERT INTO `potion` (`idPotion`, `poName`, `poEffect`,

<figure><img src="image_101.png" /></figure>

<figure><img src="image_102.png" /></figure>

idPotion int

poName varchar(50)

MySQL a répondu :

<figure><img src="image_103.png" /></figure>

#1062 - Duplicata du champ '1' pour la clef 'PRIMARY'
# Ajout de données dans potion

<figure><img src="image_99.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

On ne peut pas avoir 2 t-uplets avec la même valeur.

<table><thead><tr><td>Colonne</td><td>Type</td><td>Fonction</td><td>Null</td><td>Valeur</td></tr></thead><tbody><tr><td>idPotion</td><td>int(11)</td><td>□</td><td></td><td>1</td></tr><tr><td>poName</td><td>varchar(50)</td><td>□</td><td></td><td>Magic potion</td></tr><tr><td>poEffect</td><td>varchar(50)</td><td>□</td><td></td><td>Make you strong</td></tr></tbody></table>

## Erreur

Requête SQL :

<figure><img src="image_100.png" /></figure>

Éditer

<figure><img src="image_101.png" /></figure>

Ignorer

Colonne Type

INSERT INTO `potion` (`idPotion`, `poName`, `poEffect`,

<figure><img src="image_102.png" /></figure>

<figure><img src="image_103.png" /></figure>

idPotion int

poName varchar(50)

MySQL a répondu :

<figure><img src="image_104.png" /></figure>

#1062 - Duplicata du champ '1' pour la clef 'PRIMARY'
Les t-uplets ne sont pas ordonnés

Ensemble des t-uplets d'une table = Ensemble au sens mathématique.

Les t-uplets ne sont pas ordonnés.

→ Il n'existe pas de 2° t-uplet dans une table, pas plus que de t-uplet suivant.
Les t-uplets ne sont pas ordonnés

Ensemble des t-uplets d'une table = Ensemble au sens mathématique.

Les t-uplets ne sont pas ordonnés.

→ Il n'existe pas de 2° t-uplet dans une table, pas plus que de t-uplet suivant.
# Table potion

<figure><img src="image_104.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<figure><img src="image_105.png" /></figure>

<figure><img src="image_106.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>
# Table potion

<figure><img src="image_105.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<figure><img src="image_106.png" /></figure>

<figure><img src="image_107.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>
Les attributs ne sont pas ordonnés

L'en-tête d'une table = ensemble d'attributs.

Comme pour les t-uplets, les attributs ne sont pas
ordonnés.

→ Les attributs sont référencés par un nom et non par une position dans l'en-tête.
Les attributs ne sont pas ordonnés

L'en-tête d'une table = ensemble d'attributs.

Comme pour les t-uplets, les attributs ne sont pas
ordonnés.

→ Les attributs sont référencés par un nom et non par une position dans l'en-tête.
<figure><img src="image_107.png" /></figure>

Table potion

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead></table>

<figure><img src="image_108.png" /></figure>

<table><tr><td>poEffect</td><td>idPotion</td><td>poDuration</td><td>poName</td></tr></table>
<figure><img src="image_108.png" /></figure>

Table potion

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead></table>

<figure><img src="image_109.png" /></figure>

<table><tr><td>poEffect</td><td>idPotion</td><td>poDuration</td><td>poName</td></tr></table>
Les valeurs des attributs sont atomiques

Les domaines contiennent des valeurs atomiques

Dans une table à l'intersection d'une ligne et
d'une colonne il ne peut y avoir qu'une seule
valeur

→ table normalisée : l° forme
normale
Les valeurs des attributs sont atomiques

Les domaines contiennent des valeurs atomiques

Dans une table à l'intersection d'une ligne et
d'une colonne il ne peut y avoir qu'une seule
valeur

→ table normalisée : l° forme
normale
<figure><img src="image_109.png" /></figure>

<table><thead><tr><th>*idPotion<br>n</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1, 2</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>3</td><td>Invisibility<br>Potion</td><td>Makes you invisible</td><td>10, 20</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry,<br>Makes people happy</td><td>15</td></tr></tbody></table><table><thead><tr><th>Cit_I<br>D</th><th>Cit_Autho<br>r</th><th>Year</th><th>Citation</th></tr></thead><tbody><tr><td>1</td><td>Sitting<br>Bull</td><td>1880</td><td>Lorsque la dernière goutte d'eau sera polluée, le dernier animal chassé et le dernier arbre coupé, l'homme blanc comprendra que l'argent ne se mange pas</td></tr></tbody></table>
<figure><img src="image_110.png" /></figure>

<table><thead><tr><th>*idPotion<br>n</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1, 2</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>3</td><td>Invisibility<br>Potion</td><td>Makes you invisible</td><td>10, 20</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry,<br>Makes people happy</td><td>15</td></tr></tbody></table><table><thead><tr><th>Cit_I<br>D</th><th>Cit_Autho<br>r</th><th>Year</th><th>Citation</th></tr></thead><tbody><tr><td>1</td><td>Sitting<br>Bull</td><td>1880</td><td>Lorsque la dernière goutte d'eau sera polluée, le dernier animal chassé et le dernier arbre coupé, l'homme blanc comprendra que l'argent ne se mange pas</td></tr></tbody></table>
Domaine unique

Dans une table les valeurs possibles d'un attribut sont données par son domaine

Pas d'association de plusieurs domaines à un même attribut (pas d'union de type)
Domaine unique

Dans une table les valeurs possibles d'un attribut sont données par son domaine

Pas d'association de plusieurs domaines à un même attribut (pas d'union de type)
## Domaine unique : table potion

<figure><img src="image_110.png" /></figure>

<table><thead><tr><td>#</td><td>Nom</td><td>Type</td><td>Interclassement</td><td>Attributs</td><td>Null</td><td>Valeur par défaut</td><td>Commentaires</td><td>Extra</td></tr></thead><tbody><tr><td>1</td><td>idPotion</td><td>varchar(50) utf8_bin</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td>AUTO_INCREMENT</td></tr><tr><td>2</td><td>poName</td><td>varchar(50) utf8_bin</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td></td></tr><tr><td>3</td><td>poEffect</td><td>varchar(50) utf8_bin</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td></td></tr><tr><td>4</td><td>poDuration</td><td>int(11)</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td></td></tr></tbody></table>

<figure><img src="image_111.png" /></figure>

### Domaines

poDuration ne peut pas prendre la valeur 'ND' ou '??' si l'utilisateur ne la connait pas. C'est un option.
## Domaine unique : table potion

<figure><img src="image_111.png" /></figure>

<table><thead><tr><td>#</td><td>Nom</td><td>Type</td><td>Interclassement</td><td>Attributs</td><td>Null</td><td>Valeur par défaut</td><td>Commentaires</td><td>Extra</td></tr></thead><tbody><tr><td>1</td><td>idPotion</td><td>varchar(50) utf8_bin</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td>AUTO_INCREMENT</td></tr><tr><td>2</td><td>poName</td><td>varchar(50) utf8_bin</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td></td></tr><tr><td>3</td><td>poEffect</td><td>varchar(50) utf8_bin</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td></td></tr><tr><td>4</td><td>poDuration</td><td>int(11)</td><td>int(11)</td><td>Non</td><td>Aucun(e)</td><td></td><td></td><td></td></tr></tbody></table>

<figure><img src="image_112.png" /></figure>

### Domaines

poDuration ne peut pas prendre la valeur 'ND' ou '??' si l'utilisateur ne la connait pas. C'est un option.
# Définitions

Propriétés des
schémas relationnels
# Définitions

Propriétés des
schémas relationnels
# Propriétés du schéma relationnel

Noms des tables et des attributs uniques :

* Schéma de base de données = Ensemble de tables

* Table = Ensemble d'attributs

Il n'est pas possible d'avoir deux fois le même élément dans un ensemble

* Référencement ambigu
# Propriétés du schéma relationnel

Noms des tables et des attributs uniques :

* Schéma de base de données = Ensemble de tables

* Table = Ensemble d'attributs

Il n'est pas possible d'avoir deux fois le même élément dans un ensemble

* Référencement ambigu
# Propriétés du schéma relationnel

Une table a un nom unique dans le schéma relationnel

Un attribut a un nom unique dans une table
# Propriétés du schéma relationnel

Une table a un nom unique dans le schéma relationnel

Un attribut a un nom unique dans une table
Propriétés du schéma relationnel

<figure><img src="image_112.png" /></figure>

On ne peut pas avoir 2 tables portant le nom « potion »

On ne peut pas avoir 2 attributs dans la table « potion »
portant le nom « poName »
Propriétés du schéma relationnel

<figure><img src="image_113.png" /></figure>

On ne peut pas avoir 2 tables portant le nom « potion »

On ne peut pas avoir 2 attributs dans la table « potion »
portant le nom « poName »
# Propriétés du schéma relationnel

<figure><img src="image_113.png" /><figcaption>## Créer une nouvelle table « potion »</figcaption></figure>

<figure><img src="image_114.png" /></figure>

### Erreur

MySQL a répondu :

La table potion existe déjà !
# Propriétés du schéma relationnel

<figure><img src="image_114.png" /><figcaption>## Créer une nouvelle table « potion »</figcaption></figure>

<figure><img src="image_115.png" /></figure>

### Erreur

MySQL a répondu :

<figure><img src="image_116.png" /></figure>

La table potion existe déjà !
<figure><img src="image_115.png" /></figure>

Base de données « Gauloiseries »

potion(*idPotion, poName, poEffect, poDuration)

ingredient(*idIngredient, ingName, ingLocation)

composition(*idingredient, idPotion,
comQuantity)
<figure><img src="image_117.png" /></figure>

Base de données « Gauloiseries »

potion(*idPotion, poName, poEffect, poDuration)

ingredient(*idIngredient, ingName, ingLocation)

composition(*idingredient, idPotion,
comQuantity)
# Compréhension du modèle

## Pouvez-vous donner la recette de la potion magique ?

<table><thead><tr><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><th>idIngredient</th><th>ingName</th><th>ingLocation</th></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
# Compréhension du modèle

## Pouvez-vous donner la recette de la potion magique ?

<table><thead><tr><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><th>idIngredient</th><th>ingName</th><th>ingLocation</th></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
# Partie 3
## Modèle relationnel

<figure><img src="image_116.png" /></figure>

<figure><img src="image_117.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
# Partie 3
## Modèle relationnel

<figure><img src="image_118.png" /></figure>

<figure><img src="image_119.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
Intégrité des données

Intégrités des
données ?
Intégrité des données

Intégrités des
données ?
# Intégrité des données relationnelles

Une base de données contient une configuration particulière des valeurs de données

Certaines configurations de valeurs n'ont pas de sens

→ Définition d'une base de données étendue pour inclure

certaines contraintes dites d'intégrité
# Intégrité des données relationnelles

Une base de données contient une configuration particulière des valeurs de données

Certaines configurations de valeurs n'ont pas de sens

→ Définition d'une base de données étendue pour inclure

certaines contraintes dites d'intégrité
# Intégrité des données

Contraintes d'intégrité : règles qui permettent au SGBD de conserver automatiquement la cohérence de la base de données

<figure><img src="image_118.png" /></figure>
# Intégrité des données

Contraintes d'intégrité : règles qui permettent au SGBD de conserver automatiquement la cohérence de la base de données

<figure><img src="image_120.png" /></figure>
Intégrité des données
relationnelles

Comment ?

* en vérifiant les données lors de leur chargement,

* en vérifiant les données lors de toute modification (saisie, mise à jour),

* en répercutant certaines mises à jour entre tables,

* en gérant les références entre tables.
Intégrité des données
relationnelles

Comment ?

* en vérifiant les données lors de leur chargement,

* en vérifiant les données lors de toute modification (saisie, mise à jour),

* en répercutant certaines mises à jour entre tables,

* en gérant les références entre tables.
# Les 4 règles d'intégrité des données

## Contraintes d'intégrité :

* Unicité de clé

* Contraintes de domaine

* Contraintes de références

* Intégrité des entités
# Les 4 règles d'intégrité des données

## Contraintes d'intégrité :

* Unicité de clé

* Contraintes de domaine

* Contraintes de références

* Intégrité des entités
# Intégrité des données

## Notions préliminaires

### clé, lien, NULL
# Intégrité des données

## Notions préliminaires

### clé, lien, NULL
Clé : Ensemble d'attributs de la table qui identifie chaque t-uplet de la table

• Super-clé

• Clé candidate

• Clé primaire

• Clé étrangère

<figure><img src="image_119.png" /></figure>
Clé : Ensemble d'attributs de la table qui identifie chaque t-uplet de la table

* Super-clé

* Clé candidate

* Clé primaire

* Clé étrangère

<figure><img src="image_121.png" /></figure>
Une super-clé pour une table R est un sous-ensemble
de l'ensemble des attributs de R qui identifie de
façon unique chaque t-uplet de R

Une super-clé possède la Propriété d'unicité :
Il n'existe pas deux t-uplets distincts de R ayant la
même valeur pour cet ensemble d'attributs
Une super-clé pour une table R est un sous-ensemble
de l'ensemble des attributs de R qui identifie de
façon unique chaque t-uplet de R

Une super-clé possède la Propriété d'unicité :
Il n'existe pas deux t-uplets distincts de R ayant la
même valeur pour cet ensemble d'attributs
<figure><img src="image_120.png" /></figure>

## Super-clés de potion

`potion(idPotion, poName, poEffect, poDuration)`

<figure><img src="image_121.png" /></figure>

Deux potions ne peuvent pas avoir le même `idPotion` → (`idPotion`) est une super-clé de potion.

<figure><img src="image_122.png" /></figure>

Deux potions ne peuvent pas avoir le même `idPotion` et le même nom → (`idPotion`, `poName`) est une super-clé de potion.
<figure><img src="image_122.png" /></figure>

potion(idPotion, poName, poEffect, poDuration)

<figure><img src="image_123.png" /></figure>

Deux potions ne peuvent pas avoir le même idPotion → (idPotion) est une super-clé de potion.

<figure><img src="image_124.png" /></figure>

Deux potions ne peuvent pas avoir le même idPotion et le même nom → (idPotion, poName) est une super-clé de potion.
Les clés candidates

Une clé candidate pour une table *R* est une super-clé irréductible

Propriété d'irréductibilité : Un ensemble d'attributs *K* est irréductible si aucun sous-ensemble strict de *K* n'est une super-clé
Les clés candidates

Une clé candidate pour une table *R* est une super-clé irréductible

Propriété d'irréductibilité : Un ensemble d'attributs *K* est irréductible si aucun sous-ensemble strict de *K* n'est une super-clé
<figure><img src="image_123.png" /></figure>

## Clés candidates de potion

potion(idPotion, poName, poEffect,

poDuration)

(idPotion) est une super-clé de potion :

(lé réduite à un seul attribut →
Irréductible

→ (lé candidate

<figure><img src="image_124.png" /></figure>

(idpotion, poName) est une super-clé de
potion : Non irréductible → Non clé
candidate

<figure><img src="image_125.png" /></figure>
<figure><img src="image_125.png" /></figure>

## Clés candidates de potion

potion(idPotion, poName, poEffect,

poDuration)

(idPotion) est une super-clé de potion :

(lé réduite à un seul attribut →
Irréductible

→ (lé candidate

<figure><img src="image_126.png" /></figure>

(idpotion, poName) est une super-clé de
potion : Non irréductible → Non clé
candidate

<figure><img src="image_127.png" /></figure>
Les clés candidates

Les clés candidates fournissent un mécanisme d'adressage dans la table, car elles permettent de repérer un t-uplet dans la table.

idpotion est la clé de potion

<figure><img src="image_126.png" /></figure>
Les clés candidates

Les clés candidates fournissent un mécanisme d'adressage dans la table, car elles permettent de repérer un t-uplet dans la table.

idpotion est la clé de potion

<figure><img src="image_128.png" /></figure>
Les clés primaires

Une clé primaire est une clé choisie arbitrairement parmi les clés candidates

Il est possible d'avoir plusieurs clés candidates pour une table

→ Introduction de la notion de clé primaire, qui elle, est unique pour une table donnée
# Les clés primaires

> Une clé primaire est une clé choisie arbitrairement parmi les clés candidates

Il est possible d'avoir plusieurs clés candidates pour une table

> Introduction de la notion de clé primaire, qui elle est unique pour une table donnée
# Clé primaire de potion

<figure><img src="image_127.png" /></figure>

Ajoutez dans la table *potion* le t-uplet :

* `idPotion` = 10

* `poName` = Magic potion

* `poEffect` = Makes you strong

* `poDuration` = 30

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

`idPotion` différents => T-uplets différents
pour le SGBD

<figure><img src="image_128.png" /></figure>
# Clé primaire de potion

<figure><img src="image_129.png" /></figure>

Ajoutez dans la table *potion* le t-uplet :

* `idPotion` = 10

* `poName` = Magic potion

* `poEffect` = Makes you strong

* `poDuration` = 30

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<figure><img src="image_130.png" /></figure>

`idPotion` différents => T-uplets différents
pour le SGBD
Clé primaire de potion

<figure><img src="image_129.png" /></figure>

Ajoutez dans la table potion le t-uplet :

* `idPotion = 1`

* `poName = Laughing potion`

* `poEffect = Makes you laugh`

* `poDuration = 50`

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

`idPotion égaux => Mêmes T-uplets pour le SGBD`

<figure><img src="image_130.png" /></figure>
Clé primaire de potion

<figure><img src="image_131.png" /></figure>

Ajoutez dans la table potion le t-uplet :

* `idPotion = 1`

* `poName = Laughing potion`

* `poEffect = Makes you laugh`

* `poDuration = 50`

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

`idPotion égaux => Mêmes T-uplets pour le SGBD`

<figure><img src="image_132.png" /></figure>
## Clé primaire de potion

<figure><img src="image_131.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

On ne peut pas avoir 2 t-uplets avec la même valeur de la clé idPotion

<figure><img src="image_132.png" /></figure>
## Clé primaire de potion

<figure><img src="image_133.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

On ne peut pas avoir 2 t-uplets avec la même valeur de la clé idPotion

<figure><img src="image_134.png" /></figure>
# Les clés étrangères

Certains attributs ou ensemble d'attributs peuvent apparaître dans
plusieurs relations

Une clé étrangère est un ensemble d'attributs d'une relation S
qui est clé candidate d'une relation C

On parle de lien entre les relations S et C
# Les clés étrangères

Certains attributs ou ensemble d'attributs peuvent apparaître dans
plusieurs relations

Une clé étrangère est un ensemble d'attributs d'une relation S
qui est clé candidate d'une relation C

On parle de lien entre les relations S et C
<figure><img src="image_133.png" /></figure>

Les clés étrangères

Certains attributs ou ensemble d'attributs peuvent
apparaître dans plusieurs tables

<figure><img src="image_134.png" /></figure>
<figure><img src="image_135.png" /></figure>

Les clés étrangères

Certains attributs ou ensemble d'attributs peuvent
apparaître dans plusieurs tables

<figure><img src="image_136.png" /></figure>
<figure><img src="image_135.png" /></figure>

# Saisie de données dans composition

Essayez de saisir des informations telles que :

* idPotion = 2, idIngredient = 1 et comQuantity = 2

* idPotion = 15, idIngredient = 1 et ComQuantity = 1

* idPotion = 2, idIngredient = 12 et ComQuantity = 1

Que se passe-t-il ?
<figure><img src="image_137.png" /></figure>

# Saisie de données dans composition

Essayez de saisir des informations telles que :

* idPotion = 2, idIngredient = 1 et comQuantity = 2

* idPotion = 15, idIngredient = 1 et ComQuantity = 1

* idPotion = 2, idIngredient = 12 et ComQuantity = 1

Que se passe-t-il ?
Base de données Gauloiseries

<figure><img src="image_136.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
Base de données Gauloiseries

<figure><img src="image_138.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>test</td><td>test</td><td>2</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
Les clés relationnelles

Soit C une table (cible), une **clé étrangère** dans C est un sous-ensemble EtrC,
de l'ensemble des attributs de C, tel que :

• Il existe une table S (source) avec une clé candidate CleS,

• et à tout instant, chaque valeur de EtrC dans la tableC, est identique à une valeur de CleS dans la table S.

On définit un lien entre les tables S(source) et
C(ible).
Les clés relationnelles

Soit C une table (cible), une **clé étrangère** dans C est un sous-ensemble EtrC,
de l'ensemble des attributs de C, tel que :

• Il existe une table S (source) avec une clé candidate CleS,

• et à tout instant, chaque valeur de EtrC dans la tableC, est identique à une valeur de CleS dans la table S.

On définit un lien entre les tables S(source) et
C(ible).
<figure><img src="image_137.png" /></figure>

Les clés étrangères

Certains attributs ou ensemble d'attributs peuvent
apparaître dans plusieurs tables

<figure><img src="image_138.png" /></figure>

Source → Cible
<figure><img src="image_139.png" /></figure>

Les clés étrangères

Certains attributs ou ensemble d'attributs peuvent
apparaître dans plusieurs tables

<figure><img src="image_140.png" /></figure>
# Représentation d'un lien

<figure><img src="image_139.png" /></figure>

S(CleS, S1, ...)[CleS] (? .. ?) → [EtrC]
R(C1, ..., EtrC, ...)
Représentation d'un lien

<figure><img src="image_141.png" /></figure>

S(CleS, S1, ...)[CleS] (? .. ?) → [EtrC]
R(C1, ..., EtrC, ...)
Les clés relationnelles

Différents types de liens selon le nombre de fois où la valeur de la clé primaire peut apparaître en tant que clé étrangère dans la relation cible

Lien 1..n : une valeur de la clé candidate peut apparaître 0 à n fois en tant que clé étrangère

Lien 1..1 : une valeur de la clé candidate ne peut apparaître qu'une et une seule fois en tant que clé étrangère
Les clés relationnelles

Différents types de liens selon le nombre de fois où la valeur de la clé primaire peut apparaître en tant que clé étrangère dans la relation cible

Lien 1..n : une valeur de la clé candidate peut apparaître 0 à n fois en tant que clé étrangère

Lien 1..1 : une valeur de la clé candidate ne peut apparaître qu'une et une seule fois en tant que clé étrangère
Les clés relationnelles

Différents types de liens selon le nombre de fois où la valeur de la clé primaire peut apparaître en tant que clé étrangère dans la relation cible

Lien 1..n : une valeur de la clé candidate peut apparaître 0 à n fois en tant que clé étrangère

Lien 1..1 : une valeur de la clé candidate ne peut apparaître qu'une et une seule fois en tant que clé étrangère
Les clés relationnelles

Différents types de liens selon le nombre de fois où la valeur de la clé primaire peut apparaître en tant que clé étrangère dans la relation cible

Lien 1..n : une valeur de la clé candidate peut apparaître 0 à n fois en tant que clé étrangère

Lien 1..1 : une valeur de la clé candidate ne peut apparaître qu'une et une seule fois en tant que clé étrangère
Les clés relationnelles

Lien

1..n

<figure><img src="image_140.png" /></figure>

Lien

1..1

<figure><img src="image_141.png" /></figure>
Les clés relationnelles

Lien

1..n

<figure><img src="image_142.png" /></figure>

Lien

1..1

<figure><img src="image_143.png" /></figure>
# Les clés relationnelles

<figure><img src="image_142.png" /></figure>

Lien
1.0.1

Cle
S

<figure><img src="image_143.png" /></figure>

lien
1..1

Cle
S

Les liens vus en
modélisation
relationnelle et les
pattes d'une association
sont deux concepts
différents
Les clés relationnelles

<figure><img src="image_144.png" /></figure>

Lien
1.0.1

Cle
S

<figure><img src="image_145.png" /></figure>

Etr
C Etr Etr
C Etr
C Etr
C

lien
1.0.1

Cle
S

Les liens vus en
modélisation
relationnelle et les
pattes d'une association
sont deux concepts
différents
Définition de lien entre relations

Un lien est toujours défini d'une clé primaire vers une clé étrangère.

J'ai une valeur dans une relation (clé primaire) elle peut être référencée dans une autre table (clé étrangère).
Définition de lien entre relations

Un lien est toujours défini d'une clé primaire vers une clé étrangère.

J'ai une valeur dans une relation (clé primaire) elle peut être référencée dans une autre table (clé étrangère).
Lien entre ingredient et composition

<figure><img src="image_144.png" /></figure>

<figure><img src="image_145.png" /></figure>

<figure><img src="image_146.png" /></figure>

Lien entre ces tables : Quel sens ?
Lien entre ingredient et composition

<figure><img src="image_146.png" /></figure>

<figure><img src="image_147.png" /></figure>

<figure><img src="image_148.png" /></figure>

Lien entre ces tables : Quel sens ?
Lien entre ingredient et composition

<figure><img src="image_147.png" /></figure>

<figure><img src="image_148.png" /></figure>

Quel type de lien : l..l ou l..n
?
Lien entre ingredient et composition

<figure><img src="image_149.png" /></figure>

<figure><img src="image_150.png" /></figure>

Quel type de lien : l..l ou l..n
?
Lien entre ingredient et composition

<figure><img src="image_149.png" /></figure>

<figure><img src="image_150.png" /></figure>

Type de lien : 1..n
Lien entre ingredient et composition

<figure><img src="image_151.png" /></figure>

<figure><img src="image_152.png" /></figure>

Type de lien : 1..n
## Valeur NULL

Pas toujours possible de renseigner complètement toutes les données d'une base de données

→ Introduction de la valeur NULL

NULL : valeur conventionnelle introduite dans une relation lorsque que la valeur d'un des attributs est inconnue ou inapplicable.

Représente l'absence de valeur
# Valeur NULL

Pas toujours possible de renseigner complètement toutes les données d'une base de données

→ Introduction de la valeur NULL

NULL : valeur conventionnelle introduite dans une relation lorsque que la valeur d'un des attributs est inconnue ou inapplicable.

Représente l'absence de valeur
# Valeur NULL

Conception de la base de données : on précise si un attribut est autorisé ou non à prendre la valeur NULL

* Si l'attribut peut prendre la valeur NULL, cette valeur lui sera attribuée automatiquement par le SGBD, dès que l'utilisateur ne précisera pas la valeur de l'attribut

* Dans le cas contraire le SGBD rejettera tout t-uplet où la valeur de l'attribut ne serait pas renseignée
Valeur NULL

Conception de la base de données : on précise si un attribut est autorisé ou non à prendre la valeur NULL

* Si l'attribut peut prendre la valeur NULL, cette valeur lui sera attribuée automatiquement par le SGBD, dès que l'utilisateur ne précisera pas la valeur de l'attribut

* Dans le cas contraire le SGBD rejettera tout t-uplet où la valeur de l'attribut ne serait pas renseignée
<figure><img src="image_151.png" /></figure>

# Valeur NULL

## Conception de la base de données : on précise si un attribut est autorisé ou non à prendre la valeur NULL

<figure><img src="image_152.png" /></figure>
<figure><img src="image_153.png" /></figure>

# Valeur NULL

## Conception de la base de données : on précise si un attribut est autorisé ou non à prendre la valeur NULL

<figure><img src="image_154.png" /></figure>
# Ajout de donnée

<figure><img src="image_153.png" /></figure>

<figure><img src="image_154.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>12</td><td></td><td>NULL</td><td>NULL</td></tr></tbody></table>
Ajout de donnée

<figure><img src="image_155.png" /></figure>

<figure><img src="image_156.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>12</td><td></td><td>NULL</td><td>NULL</td></tr></tbody></table>
# Intégrité des données

## Règles d'intégrité
# Intégrité des données

## Règles d'intégrité
L'unicité de clé

Première règle d'intégrité, basée sur les notions

• de clé candidate

• et de clé primaire
L'unicité de clé

Première règle d'intégrité, basée sur les notions

• de clé candidate

• et de clé primaire
Règle de l'unicité de clé

Règle de l'unicité de clé : dans une base de données, toutes les relations doivent posséder une clé unique, appelée clé primaire.

Permet de mettre en place des mécanismes de contrôle, qui vérifient que deux informations identiques ne peuvent pas être présentes dans une relation de la base de données

→ La clé primaire ne peut prendre deux fois la même valeur
Règle de l'unicité de clé

Règle de l'unicité de clé : dans une base de données, toutes les relations doivent posséder une clé unique, appelée clé primaire.

Permet de mettre en place des mécanismes de contrôle qui vérifient que deux informations identiques ne peuvent pas être présentes dans une relation de la base de données

→ La clé primaire ne peut prendre deux fois la même valeur
## Clé primaire de potion

<figure><img src="image_155.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

On ne peut pas avoir 2 t-uplets avec la même valeur de la clé idPotion.

<figure><img src="image_156.png" /></figure>
## Clé primaire de potion

<figure><img src="image_157.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

On ne peut pas avoir 2 t-uplets avec la même valeur de la clé idPotion.

<figure><img src="image_158.png" /></figure>
Contraintes de domaine

Chaque attribut d'une relation prend ses valeurs dans un
domaine (ensemble)

Domaines : types de base tels que entier, réel, chaine de
caractères, ...

Contrainte de domaine : contrainte d'intégrité qui définit la
propriété que doit vérifier toute valeur d'un attribut d'une
relation donnée
Contraintes de domaine

Chaque attribut d'une relation prend ses valeurs dans un
domaine (ensemble)

Domaines : types de base tels que entier, réel, chaine de
caractères, ...

Contrainte de domaine : contrainte d'intégrité qui définit la
propriété que doit vérifier toute valeur d'un attribut d'une
relation donnée
Contrainte traitée par le SGBD lors :

- de la saisie

- de la mise à jour d'information

pour vérifier la cohérence des données

> Mise en œuvre de cette contrainte pas claire
dans MySQL
Contrainte traitée par le SGBD lors :

- de la saisie

- de la mise à jour d'information

pour vérifier la cohérence des données

Mise en œuvre de cette contrainte pas claire
dans MySQL
<figure><img src="image_157.png" /></figure>

comQuantity :
domaine = entier compris entre 0 et 100

Mise en œuvre de cette contrainte non opérationnelle
dans MySQL
<figure><img src="image_159.png" /></figure>

comQuantity :
domaine = entier compris entre 0 et 100

Mise en œuvre de cette contrainte non opérationnelle
dans MySQL
Les contraintes de références

Permettent au SGBD de gérer automatiquement la présence de
**données référencées** dans différentes relations de la base
de données
Les contraintes de références

Permettent au SGBD de gérer automatiquement la présence de
**données référencées** dans différentes relations de la base
de données
Lien entre ingredient et composition

<figure><img src="image_158.png" /></figure>

<figure><img src="image_159.png" /></figure>

Le t-uplet (`1`, `1`, `10`) permet de dire que l'ingrédient `1` intervient
dans la potion `1` en quantité = `10`
On ne peut pas utiliser dans une potion un ingrédient qui
n'existe pas
Lien entre ingredient et composition

<figure><img src="image_160.png" /></figure>

<figure><img src="image_161.png" /></figure>

Le t-uplet (`1`, `1`, `10`) permet de dire que l'ingrédient `1` intervient
dans la potion `1` en quantité = `10`
On ne peut pas utiliser dans une potion un ingrédient qui
n'existe pas
**Intégrité référentielle** : la base de données ne doit pas contenir de valeurs de clés étrangères non unifiables

Si une clé étrangère prend une valeur alors cette valeur existe dans la table source référencée par le lien
**Intégrité référentielle** : la base de données ne doit pas contenir de valeurs de clés étrangères non unifiables

Si une clé étrangère prend une valeur alors cette valeur existe dans la table source référencée par le lien
L'intégrité référentielle

Le SGBD doit gérer les situations où un utilisateur
réalise des opérations qui invalident cette règle :

* 1ère possibilité : refuser toute modification de cette nature,

* 2ème possibilité : accepter l'opération, et prendre en compte un certain nombre d'opérations supplémentaires nécessaires pour garantir la cohérence des données.

Les règles de mises à jour permettent de définir la
stratégie de prise en compte de ce type d'opérations
L'intégrité référentielle

Le SGBD doit gérer les situations où un utilisateur
réalise des opérations qui invalident cette règle :

* 1ère possibilité : refuser toute modification de cette nature,

* 2ème possibilité : accepter l'opération, et prendre en compte un certain nombre d'opérations supplémentaires nécessaires pour garantir la cohérence des données.

Les règles de mises à jour permettent de définir la
stratégie de prise en compte de ce type d'opérations
# L'intégrité référentielle

<figure><img src="image_160.png" /></figure>

A quel moment intervient l'intégrité référentielle ?
# L'intégrité référentielle

<figure><img src="image_162.png" /></figure>

A quel moment intervient l'intégrité référentielle ?
Intégrité référentielle et
saisie

<figure><img src="image_161.png" /></figure>

Saisie de la valeur d'une clé étrangère:

* Contrôle permettant de savoir si la valeur existe dans la table référencée

* Réalisé immédiatement

<figure><img src="image_162.png" /></figure>

Lors de la saisie d'un t-uplet dans composition, le SGBD vérifie qu'il existe dans ingredient un t-uplet avec la même valeur de idIngredient
# Intégrité référentielle et saisie

<figure><img src="image_163.png" /></figure>

## Saisie de la valeur d'une clé étrangère:

* Contrôle permettant de savoir si la valeur existe dans la table référencée

* Réalisé immédiatement

<figure><img src="image_164.png" /></figure>

Lors de la saisie d'un t-uplet dans *composition*, le SGBD vérifie qu'il existe dans *ingredient* un t-uplet avec la même valeur de *idIngredient*.
# Les règles de mises à jour

## Opérations de modification ou suppression de données

RESTRICTED ou NO ACTION : opération de mise à jour "restreinte" au cas où aucune référence à cette valeur n'existe dans les autres relations en lien avec la relation de base, dans les autres cas elle est interdite.

CASCADE : opération de mise à jour réalisée en "cascade" dans les autres relations.
# Les règles de mises à jour

## Opérations de modification ou suppression de données

RESTRICTED ou NO ACTION : opération de mise à jour "restreinte" au cas où aucune référence à cette valeur n'existe dans les autres relations en lien avec la relation de base, dans les autres cas elle est interdite.

CASCADE : opération de mise à jour réalisée en "cascade" dans les autres relations.
<figure><img src="image_163.png" /></figure>

## Restricted ou No action

<figure><img src="image_164.png" /></figure>

RESTRICTED ou NO ACTION : opération de mise à jour "restreinte" au cas où aucune référence à cette valeur n'existe dans les autres tables en lien avec la table de base, dans les autres cas elle est interdite
<figure><img src="image_165.png" /></figure>

## Restricted ou No action

<figure><img src="image_166.png" /></figure>

RESTRICTED ou NO ACTION : opération de mise à jour "restreinte" au cas où aucune référence à cette valeur n'existe dans les autres tables en lien avec la table de base, dans les autres cas elle est interdite
<figure><img src="image_165.png" /></figure>

## Cascaded

<figure><img src="image_166.png" /></figure>

CASCADE : opération de mise à jour réalisée en "cascade" dans les autres tables.
<figure><img src="image_167.png" /></figure>

## Cascaded

<figure><img src="image_168.png" /></figure>

CASCADE : opération de mise à jour réalisée en "cascade" dans les autres tables.
Les clés primaires et NULL

Règle d'intégrité des données : les attributs appartenant à la clé primaire d'une table ne sont pas autorisés à prendre la valeur NULL.
Les clés primaires et NULL

Règle d'intégrité des données : les attributs appartenant à la clé primaire d'une table ne sont pas autorisés à prendre la valeur NULL.
Les clés étrangères et NULL

Toute valeur d'une clé étrangère doit contenir une
valeur unifiable.

Cette définition peut être étendue pour prendre en
compte la valeur NULL.

Le concepteur de la BD peut préciser si oui ou non une
clé étrangère peut prendre la valeur NULL. (Sauf, si
celle-ci fait partie de la clé primaire)
Les clés étrangères et NULL

Toute valeur d'une clé étrangère doit contenir une
valeur unifiable.

Cette définition peut être étendue pour prendre en
compte la valeur NULL.

Le concepteur de la BD peut préciser si oui ou non une
clé étrangère peut prendre la valeur NULL. (Sauf, si
celle-ci fait partie de la clé primaire)
Les clés primaires et NULL

Règle d'intégrité des données : les attributs appartenant à la clé primaire d'une table ne sont pas autorisés à prendre la valeur NULL.

<figure><img src="image_167.png" /></figure>

L'attribut idIngredient ne peut pas prendre la valeur NULL

<figure><img src="image_168.png" /></figure>

L'attribut idIngredient ne peut pas prendre la valeur NULL

L'attribut idPotion ne peut pas prendre la valeur NULL
Les clés primaires et NULL

Règle d'intégrité des données : les attributs appartenant à la clé primaire d'une table ne sont pas autorisés à prendre la valeur NULL.

<figure><img src="image_169.png" /></figure>

L'attribut idIngredient ne peut pas prendre la valeur NULL

<figure><img src="image_170.png" /></figure>

L'attribut idIngredient ne peut pas prendre la valeur NULL

L'attribut idPotion ne peut pas prendre la valeur NULL
# Partie 3
Modèle relationnel

<figure><img src="image_169.png" /></figure>

<figure><img src="image_170.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle
relationnel
# Partie 3
## Modèle relationnel

<figure><img src="image_171.png" /></figure>

<figure><img src="image_172.png" /></figure>

Définitions

Intégrité des données

Passage du MCD au modèle relationnel
# Passage du MCD au modèle relationnel

<figure><img src="image_171.png" /><figcaption>## Modèle logique de données ou MLD : Modèle relatif</figcaption></figure>
# Passage du MCD au modèle relationnel

<figure><img src="image_173.png" /><figcaption>## Modèle logique de données ou MLD : Modèle relatif</figcaption></figure>
# Les règles de transformation : Conversion d'une entité-type

## Conversion d'une entité-type

* Chaque entité-type du MCD est représentée par une relation dont la clé est l'identifiant de l'entité

* Chaque attribut de l'entité-type devient un attribut de la relation

<table><tr><td>ingredient</td></tr><tr><td>idIngredient</td></tr><tr><td>ingName</td></tr><tr><td>ingLocation</td></tr></table>

<figure><img src="image_172.png" /></figure>

<table><tr><td>ingredient</td></tr><tr><td>idIngredient</td></tr><tr><td>ingName</td></tr><tr><td>ingLocation</td></tr></table>
# Les règles de transformation : Conversion d'une entité-type

## Conversion d'une entité-type

* Chaque entité-type du MCD est représentée par une relation dont la clé est l'identifiant de l'entité

* Chaque attribut de l'entité-type devient un attribut de la relation

<figure><img src="image_174.png" /></figure>
Les règles de transformation : Conversion d'une
association-type

Chaque patte a une cardinalité maximale égale à n

* Devient une relation ou table

* Chaque attribut de l'association-type devient un attribut de la table

* Si l'association-type contient un identifiant il devient la clé primaire de la table

* Sinon la clé est formée de la concaténation des identifiants des entités-types qui interviennent dans l'association-type
Les règles de transformation : Conversion d'une
association-type

Chaque patte a une cardinalité maximale égale à n

* Devient une relation ou table

* Chaque attribut de l'association-type devient un attribut de la table

* Si l'association-type contient un identifiant il devient la clé primaire de la table

* Sinon la clé est formée de la concaténation des identifiants des entités-types qui interviennent dans l'association-type
Les règles de transformation : Conversion d'une
association-type

Chaque patte a une cardinalité maximale égale à n

<figure><img src="image_173.png" /></figure>
Les règles de transformation : Conversion d'une
association-type

Chaque patte a une cardinalité maximale égale à n

<figure><img src="image_175.png" /></figure>
Les règles de transformation : Conversion d'une
association-type

Chaque patte a une cardinalité maximale égale à n

<figure><img src="image_174.png" /></figure>

<figure><img src="image_175.png" /></figure>
Les règles de transformation : Conversion d'une
association-type

Chaque patte a une cardinalité maximale égale à n

<figure><img src="image_176.png" /></figure>

<figure><img src="image_177.png" /></figure>
# Les règles de transformation : Conversion d'une association-type

Une patte a une cardinalité maximale égale à 1

* Ne devient pas une relation

* On ajoute à la table correspondant à l'entité-type dont la patte vers l'association-type a la cardinalité maximale égale à 1, un attribut (clé étrangère) qui est l'identifiant de l'autre entité

<figure><img src="image_176.png" /></figure>
# Les règles de transformation : Conversion d'une association-type

Une patte a une cardinalité maximale égale à 1

* Ne devient pas une relation

* On ajoute à la table correspondant à l'entité-type dont la patte vers l'association-type a la cardinalité maximale égale à 1, un attribut (clé étrangère) qui est l'identifiant de l'autre entité

<figure><img src="image_178.png" /></figure>
# Les règles de transformation : Conversion d'une association-type

Les pattes ont une cardinalité maximale égale à 1

* Ne devient pas une relation

* On ajoute à la table correspondant à l'entité-type dont la patte vers l'association a la cardinalité minimale égale à 1, un attribut (clé étrangère) qui est l'identifiant de l'autre entité

<figure><img src="image_177.png" /></figure>
# Les règles de transformation : Conversion d'une association-type

Les pattes ont une cardinalité maximale égale à 1

* Ne devient pas une relation

* On ajoute à la table correspondant à l'entité-type dont la patte vers l'association a la cardinalité minimale égale à 1, un attribut (clé étrangère) qui est l'identifiant de l'autre entité

<figure><img src="image_179.png" /></figure>

<figure><img src="image_180.png" /></figure>
<figure><img src="image_178.png" /></figure>

Exemple des gauloiseries

<figure><img src="image_179.png" /></figure>

MCD

<figure><img src="image_180.png" /></figure>

<figure><img src="image_181.png" /></figure>

MLD
<figure><img src="image_181.png" /></figure>

Exemple des gauloiseries

<figure><img src="image_182.png" /></figure>

MCD

<figure><img src="image_183.png" /></figure>

<figure><img src="image_184.png" /></figure>

MLD
# Exemple des gauloiseries

<figure><img src="image_182.png" /><figcaption>## Script de création de la base de données</figcaption></figure>
# Exemple des gauloiseries

<figure><img src="image_185.png" /><figcaption>## Script de création de la base de données</figcaption></figure>
<figure><img src="image_183.png" /></figure>

Exemple

<figure><img src="image_184.png" /><figcaption>MLD</figcaption></figure>

<figure><img src="image_185.png" /></figure>
<figure><img src="image_186.png" /></figure>

Exemple

MCD

<figure><img src="image_187.png" /></figure>

MLD

<figure><img src="image_188.png" /></figure>
## Partie 4 : SQL

<figure><img src="image_186.png" /></figure>

### La requête SELECT
## Partie 4 : SQL

<figure><img src="image_189.png" /></figure>

### La requête SELECT
SQL : Structured Query Language.

Langage conçu dans les années 1970 par IBM

Langage relationnel standard géré par presque tous
les produits du marché

1er version de SQL intégrée dans un SGBD en 1981
(ORACLE)
SQL : Structured Query Language.

Langage conçu dans les années 1970 par IBM

Langage relationnel standard géré par presque tous
les produits du marché

1er version de SQL intégrée dans un SGBD en 1981
(ORACLE)
SQL1 : 1986 l'ANSI fait de SQL une norme ... SQL
2020+

Nous travaillerons avec la version de SQL installée
sur MySQL
Historique de SQL

SQL1 : 1986 l'ANSI fait de SQL une norme ... SQL
2020+

Nous travaillerons avec la version de SQL installée
sur MySQL
# Les sous-langages de SQL

## DML : Data Manipulation Language

Permet d'extraire et de mettre à jour les données dans la base.

## DDL : Data Definition Language

Permet de créer, modifier ou supprimer des tables, de définir les liens entre ces tables, leurs clés primaires.

## DCL : Data Control Language

Permet de gérer des protections d'accès aux tables en environnement multi-utilisateurs.
Les sous-langages de SQL

DML : Data Manipulation Language

Permet d'extraire et de mettre à jour les données dans la
base.

DDL : Data Definition Language

Permet de créer, modifier ou supprimer des tables, de
définir les liens entre ces tables, leurs clés primaires.

DCL : Data Control Language

Permet de gérer des protections d'accès aux tables en
environnement multi-utilisateurs.
# L'obtention des données

## Syntaxe de l'ordre SELECT

SELECT Liste-Attributs

FROM Liste-tables

WHERE critère de sélection

GROUP BY liste-attributs-groupe

HAVING critère-groupe

ORDER BY Liste-attributs
# L'obtention des données

## Syntaxe de l'ordre SELECT

SELECT Liste-Attributs

FROM Liste-tables

WHERE critère de sélection

GROUP BY liste-attributs-groupe

HAVING critère-groupe

ORDER BY Liste-attributs
Syntaxe de l'ordre SELECT

<figure><img src="image_187.png" /></figure>

2 clauses
obligatoires :

• SELECT : sorties

• FROM : entrées
Syntaxe de l'ordre SELECT

<figure><img src="image_190.png" /></figure>

2 clauses
obligatoires :

• SELECT : sorties

• FROM : entrées
<figure><img src="image_188.png" /></figure>

# Nom des potions

## Les informations qui nous intéressent

<figure><img src="image_189.png" /></figure>

<figure><img src="image_190.png" /></figure>

<figure><img src="image_191.png" /></figure>
<figure><img src="image_191.png" /></figure>

Nom des potions

Les informations qui nous intéressent

<figure><img src="image_192.png" /></figure>

<figure><img src="image_193.png" /></figure>

<figure><img src="image_194.png" /></figure>
<figure><img src="image_192.png" /></figure>

Nom des potions

Les informations qui nous intéressent

<figure><img src="image_193.png" /></figure>

<figure><img src="image_194.png" /></figure>

<figure><img src="image_195.png" /></figure>

<figure><img src="image_196.png" /></figure>
# Nom des potions

<figure><img src="image_195.png" /></figure>

## Les informations qui nous intéressent

<figure><img src="image_196.png" /></figure>

<figure><img src="image_197.png" /></figure>

<figure><img src="image_198.png" /></figure>

<figure><img src="image_199.png" /></figure>
# Nom des potions

<figure><img src="image_197.png" /></figure>

## La requête

SELECT poName
FROM potion

<figure><img src="image_198.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_199.png" /></figure>

poName

Magic potion

Happiness Potion

Invisibility Potion

Anger potion
# Nom des potions

<figure><img src="image_200.png" /></figure>

## La requête

SELECT poName
FROM potion

<figure><img src="image_201.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_202.png" /></figure>

poName

Magic potion

Happiness Potion

Invisibility Potion

Anger potion
Syntaxe de l'ordre SELECT

<figure><img src="image_200.png" /></figure>

Requête

« classique » :

• SELECT : sorties

• FROM : entrées

• WHERE : sélection
Syntaxe de l'ordre SELECT

<figure><img src="image_203.png" /></figure>
Nom des potions dont la durée > 20 minutes

<figure><img src="image_201.png" /></figure>

Les informations qui nous intéressent

<figure><img src="image_202.png" /></figure>

<figure><img src="image_203.png" /></figure>

<figure><img src="image_204.png" /></figure>
Nom des potions dont la durée > 20 minutes

<figure><img src="image_204.png" /></figure>

Les informations qui nous intéressent

<figure><img src="image_205.png" /></figure>

<figure><img src="image_206.png" /></figure>

<figure><img src="image_207.png" /></figure>
Nom des potions dont la durée > 20 minutes

<figure><img src="image_205.png" /></figure>

Les informations qui nous intéressent

<table><tr><td><span style="display: inline-block; width: 1em; height: 1em; background-color: #0070c0; color: white; text-align: center; line-height: 1em; font-weight: bold; font-family: sans-serif; font-size: 0.8em; margin-right: 0.2em;"></span> V</td><td>sdamy</td><td>potion</td></tr><tr><td>idPotion</td><td>: int(11)</td></tr><tr><td>poName</td><td>: varchar(50)</td></tr><tr><td>poEffect</td><td>: varchar(50)</td></tr><tr><td># poDuration</td><td>: int(11)</td></tr></table>

<table><tr><td><span style="display: inline-block; width: 1em; height: 1em; background-color: #0070c0; color: white; text-align: center; line-height: 1em; font-weight: bold; font-family: sans-serif; font-size: 0.8em; margin-right: 0.2em;"></span> V</td><td>sdamy</td><td>composition</td></tr><tr><td>idIngredient</td><td>: int(11)</td></tr><tr><td>idPotion</td><td>: int(11)</td></tr><tr><td># comQuantity</td><td>: int(11)</td></tr></table>

<table><tr><td><span style="display: inline-block; width: 1em; height: 1em; background-color: #0070c0; color: white; text-align: center; line-height: 1em; font-weight: bold; font-family: sans-serif; font-size: 0.8em; margin-right: 0.2em;"></span> V</td><td>sdamy</td><td>ingredient</td></tr><tr><td>idIngredient</td><td>: int(11)</td></tr><tr><td>ingName</td><td>: varchar(50)</td></tr><tr><td>ingLocation</td><td>: varchar(30)</td></tr></table>

<figure><img src="image_206.png" /></figure>
Nom des potions dont la durée > 20 minutes

<figure><img src="image_208.png" /></figure>

Les informations qui nous intéressent

<table><tr><td><span style="display: inline-block; width: 1em; height: 1em; background-color: #0070c0; color: white; text-align: center; line-height: 1em; font-weight: bold; font-family: sans-serif; font-size: 0.8em; margin-right: 0.5em; border-radius: 50%; position: relative; top: 0.2em; left: 0.5em;"></span>sdamy</td><td><strong>potion</strong></td></tr><tr><td>idPotion : int(11)</td><td></td></tr><tr><td>poName : varchar(50)</td><td></td></tr><tr><td>poEffect : varchar(50)</td><td></td></tr><tr><td>poDuration : int(11)</td><td></td></tr></table>

<table><tr><td><span style="display: inline-block; width: 1em; height: 1em; background-color: #0070c0; color: white; text-align: center; line-height: 1em; font-weight: bold; font-family: sans-serif; font-size: 0.8em; margin-right: 0.5em; border-radius: 50%; position: relative; top: 0.2em; left: 0.5em;"></span>sdamy</td><td><strong>composition</strong></td></tr><tr><td>idIngredient : int(11)</td><td></td></tr><tr><td>idPotion : int(11)</td><td></td></tr><tr><td># comQuantity : int(11)</td><td></td></tr></table>

<table><tr><td><span style="display: inline-block; width: 1em; height: 1em; background-color: #0070c0; color: white; text-align: center; line-height: 1em; font-weight: bold; font-family: sans-serif; font-size: 0.8em; margin-right: 0.5em; border-radius: 50%; position: relative; top: 0.2em; left: 0.5em;"></span>sdamy</td><td><strong>ingredient</strong></td></tr><tr><td>idIngredient : int(11)</td><td></td></tr><tr><td>ingName : varchar(50)</td><td></td></tr><tr><td>ingLocation : varchar(30)</td><td></td></tr></table>

<figure><img src="image_209.png" /></figure>
Nom des potions dont la durée > 20 minutes

<figure><img src="image_207.png" /></figure>

La requête

SELECT poName
FROM potion
WHERE poDuration > 20

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

poName
Magic potion
Happiness Potion

<figure><img src="image_208.png" /></figure>
Nom des potions dont la durée > 20 minutes

<figure><img src="image_210.png" /></figure>

La requête

SELECT poName
FROM potion
WHERE poDuration > 20

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

poName
Magic potion
Happiness Potion

<figure><img src="image_211.png" /></figure>
Evaluation d'une requête SELECT

<figure><img src="image_209.png" /></figure>
Evaluation d'une requête SELECT

<figure><img src="image_212.png" /></figure>
La clause SELECT

Que retourne la requête

• Attributs

• Expressions

Les expressions peuvent être des noms d'attributs : `idPotion`, `poName`, ...
ou le résultat de fonctions : `sum`, `average`, ...

Syntaxe

```
SELECT DISTINCT] expr1 [AS nom1], expr2 [AS nom2], ...
```

```
SELECT [DISTINCT] *
```

Syntaxe :

SQL est un langage informatique
La clause SELECT

Que retourne la requête

* Attributs

* Expressions

Les expressions peuvent être des noms d'attributs : `idPotion`, `poName`, ... ou le résultat de fonctions : `sum`, `average`, ...

Syntaxe

```
SELECT DISTINCT] expr1 [AS nom1], expr2 [AS nom2], ...
```

```
SELECT [DISTINCT] *
```

Syntaxe :

SQL est un langage informatique
La clause SELECT

Mot réservé DISTINCT : élimination des doublons.
La clause SELECT

Mot réservé DISTINCT : élimination des doublons.
La clause SELECT : DISTINCT

<figure><img src="image_210.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

SELECT ingLocation FROM ingredient

ingLocation

anywhere

tree

Apple tree

hostel

forest

Lemon tree

Garden

Garden

ingLocation

anywhere

tree

Apple tree

hostel

forest

Lemon tree

Garden

SELECT DISTINCT ingLocation FROM ingredient
La clause SELECT : DISTINCT

<figure><img src="image_213.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

SELECT ingLocation FROM ingredient

ingLocation

anywhere
tree
Apple tree
hostel
forest
Lemon tree
Garden
Garden

SELECT DISTINCT ingLocation FROM ingredient

ingLocation

anywhere
tree
Apple tree
hostel
forest
Lemon tree
Garden
La clause FROM

Permet :

* d'indiquer quelles tables ou requêtes sont utilisées par la requête,

* de définir une table qui est le produit cartésien des tables décrites,

* de décrire les jointures de tables.

Syntaxe

FROM table1 [AS nom1], table2 [AS nom2], ...
La clause FROM

Permet :

* d'indiquer quelles tables ou requêtes sont utilisées par la requête,

* de définir une table qui est le produit cartésien des tables décrites,

* de décrire les jointures de tables.

<figure><img src="image_214.png" /></figure>

FROM table1 [AS nom1], table2 [AS nom2], ...
## La clause WHERE

Permet :

de spécifier les t-uplets à sélectionner dans une table ou dans le produit cartésien de plusieurs tables,

de définir le critère de sélection : un prédicat qui est évalué pour chaque t-uplet.

<figure><img src="image_211.png" /></figure>

WHERE critère de sélection (expr. booléenne)
## La clause WHERE

Permet :

de spécifier les t-uplets à sélectionner dans une table ou dans le produit cartésien de plusieurs tables,

de définir le critère de sélection : un prédicat qui est évalué pour chaque t-uplet.

<figure><img src="image_215.png" /></figure>

WHERE critère de sélection (expr. booléenne)
## Critères de sélection

`Op. comparaison : <, >, >=, <=, =, <>`

`Opérateurs logiques : AND, OR, NOT`

`Prédicats servant à définir des ensembles : IN, BETWEEN ... AND ..., LIKE`

`Comparaison avec la valeur NULL : IS NULL, IS NOT NULL`

`Utilisation de caractères génériques :`

* `"_"` (remplace 1 car),

* `"%"` (remplace une chaîne de car.)
## Critères de sélection

`Op. comparaison : <, >, >=, <=, =, <>`

`Opérateurs logiques : AND, OR, NOT`

`Prédicats servant à définir des ensembles : IN, BETWEEN ... AND ..., LIKE`

`Comparaison avec la valeur NULL : IS NULL, IS NOT NULL`

`Utilisation de caractères génériques :`

* `"_"` (remplace 1 car),

* `"%"` (remplace une chaîne de car.)
## Identifiant des potions qui ont dans leur composition l'ingrédient d'id 2

<figure><img src="image_212.png" /></figure>

Les informations qui nous intéressent

<figure><img src="image_213.png" /></figure>

<figure><img src="image_214.png" /></figure>

<figure><img src="image_215.png" /></figure>
## Identifiant des potions qui ont dans leur composition l'ingrédient d'id 2

<figure><img src="image_216.png" /></figure>

Les informations qui nous intéressent

<figure><img src="image_217.png" /></figure>

<figure><img src="image_218.png" /></figure>

<figure><img src="image_219.png" /></figure>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_216.png" /></figure>

Les informations qui nous intéressent → En
entrée

<figure><img src="image_217.png" /></figure>

<figure><img src="image_218.png" /></figure>

<figure><img src="image_219.png" /></figure>

idIngredient = 2
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_220.png" /></figure>

Les informations qui nous intéressent → En
entrée

<figure><img src="image_221.png" /></figure>

<figure><img src="image_222.png" /></figure>

<figure><img src="image_223.png" /></figure>

idIngredient = 2
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_220.png" /></figure>

Les informations qui nous intéressent → En
résultat

<figure><img src="image_221.png" /></figure>

<figure><img src="image_222.png" /></figure>

<figure><img src="image_223.png" /></figure>

idPotion
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_224.png" /></figure>

Les informations qui nous intéressent → En
résultat

<figure><img src="image_225.png" /></figure>

<figure><img src="image_226.png" /></figure>

<figure><img src="image_227.png" /></figure>

idPotion
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_224.png" /></figure>

Les informations qui nous intéressent → Table
composition

<figure><img src="image_225.png" /></figure>

<figure><img src="image_226.png" /></figure>

<figure><img src="image_227.png" /></figure>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_228.png" /></figure>

Les informations qui nous intéressent → Table
composition

<figure><img src="image_229.png" /></figure>

<figure><img src="image_230.png" /></figure>

<figure><img src="image_231.png" /></figure>
# Identifiant des potions qui ont dans leur composition l'ingrédient d'id 2

<figure><img src="image_228.png" /></figure>

Les informations qui nous intéressent → Table composition

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<figure><img src="image_229.png" /></figure>

<table><tr><td>idPotion</td></tr><tr><td>1</td></tr></table>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_232.png" /></figure>

Les informations qui nous intéressent → Table
composition

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<figure><img src="image_233.png" /></figure>

<table><tr><td>idPotion</td></tr><tr><td>1</td></tr></table>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_230.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

SELECT idPotion
FROM composition
WHERE idIngredient = 2

<figure><img src="image_231.png" /></figure>

<table><tr><td>idPotion</td><td>1</td></tr></table>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_234.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

SELECT idPotion
FROM composition
WHERE idIngredient = 2

<figure><img src="image_235.png" /></figure>

<table><tr><td>idPotion</td><td>1</td></tr></table>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_232.png" /></figure>

<figure><img src="image_233.png" /></figure>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_236.png" /></figure>

<figure><img src="image_237.png" /></figure>
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_234.png" /></figure>

<figure><img src="image_235.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause WHERE teste la condition ligne par ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_238.png" /></figure>

<figure><img src="image_239.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause
WHERE teste la
condition
ligne par
ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_236.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause WHERE teste la condition ligne par ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_240.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause WHERE teste la condition ligne par ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_237.png" /></figure>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause
WHERE teste la
condition
ligne par
ligne

idIngredient = 2
on garde la ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_241.png" /></figure>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause
WHERE teste la
condition
ligne par
ligne

idIngredient = 2
on garde la ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_238.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause WHERE teste la condition ligne par ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_242.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause WHERE teste la condition ligne par ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_239.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause WHERE teste la condition ligne par ligne

idIngredient <> 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_243.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

La clause
WHERE teste la
condition
ligne par
ligne

idIngredient < 2
on ne garde pas la
ligne
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_240.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

SELECT idPotion
FROM composition
WHERE idIngredient = 2

<figure><img src="image_241.png" /></figure>

idPotion

1
Identifiant des potions qui ont dans leur
composition l'ingrédient d'id 2

<figure><img src="image_244.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>1</td><td>2</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

SELECT idPotion
FROM composition
WHERE idIngredient = ?

<figure><img src="image_245.png" /></figure>

<table><tr><td>idPotion</td><td>1</td></tr></table>
## Clause WHERE : exemples

```sql
SELECT *
FROM composition
WHERE idPotion = 1
```

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

```sql
SELECT *
FROM composition
WHERE idPotion = 1
AND comQuantity = 1
```

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>
## Clause WHERE : exemples

```sql
SELECT *
FROM composition
WHERE idPotion = 1
```

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

```sql
SELECT *
FROM composition
WHERE idPotion = 1
AND comQuantity = 1
```

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>
## Clause WHERE : exemples

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

```sql
SELECT *
FROM ingredient
WHERE ingLocation =
'Garden'
```
## Clause WHERE : exemples

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

```sql
SELECT *
FROM ingredient
WHERE ingLocation =
    'Garden'
```
## Clause WHERE : exemples

```sql
SELECT *
FROM ingredient
WHERE ingLocation =
'Garden'
OR ingLocation = 'tree'
```

```sql
SELECT *
FROM ingredient
WHERE ingLocation IN
('Garden', 'tree')
```

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
## Clause WHERE : exemples

```sql
SELECT *
FROM ingredient
WHERE ingLocation =
'Garden'
OR ingLocation = 'tree'
```

```sql
SELECT *
FROM ingredient
WHERE ingLocation IN
('Garden', 'tree')
```

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>
## Clause WHERE : exemples

```sql
SELECT idIngredient,
       ingLocation
FROM ingredient
WHERE ingLocation Like 'a%'
```

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>anywhere</td></tr><tr><td>3</td><td>Apple tree</td></tr></tbody></table>
## Clause WHERE : exemples

```sql
SELECT idIngredient,
       ingLocation
FROM ingredient
WHERE ingLocation Like 'a%'
```

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>anywhere</td></tr><tr><td>3</td><td>Apple tree</td></tr></tbody></table>
## Clause WHERE : exemples

```sql
SELECT idIngredient, ingName
FROM ingredient
WHERE ingLocation IS NULL
```

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td></tr></thead><tbody><tr><td>9</td><td>Strawberry</td></tr></tbody></table>
## Clause WHERE : exemples

```sql
SELECT idIngredient, ingName
FROM ingredient
WHERE ingLocation IS NULL
```

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>ingName</td></tr></thead><tbody><tr><td>9</td><td>Strawberry</td></tr></tbody></table>
<figure><img src="image_242.png" /></figure>

Pouvez-vous me donner le nom de ces potions ?
<figure><img src="image_246.png" /></figure>

Pouvez-vous me donner le nom de ces potions ?
<figure><img src="image_243.png" /></figure>

Où sont les informations qui nous intéressent ?

<figure><img src="image_244.png" /></figure>

<figure><img src="image_245.png" /></figure>

sdamy **potion**

idPotion : int(11)

poName : varchar(50)

poEffect : varchar(50)

# poDuration : int(11)

<figure><img src="image_246.png" /></figure>

<figure><img src="image_247.png" /></figure>

sdamy **composition**

idIngredient : int(11)

idPotion : int(11)

# comQuantity : int(11)

<figure><img src="image_248.png" /></figure>

<figure><img src="image_249.png" /></figure>

sdamy **ingredient**

idIngredient : int(11)

ingName : varchar(50)

ingLocation : varchar(30)
<figure><img src="image_247.png" /></figure>

Où sont les informations qui nous intéressent ?

<figure><img src="image_248.png" /></figure>

sdamy **potion**

idPotion : int(11)

poName : varchar(50)

poEffect : varchar(50)

# poDuration : int(11)

<figure><img src="image_249.png" /></figure>

sdamy **composition**

idIngredient : int(11)

idPotion : int(11)

# comQuantity : int(11)

<figure><img src="image_250.png" /></figure>

sdamy **ingredient**

idIngredient : int(11)

ingName : varchar(50)

ingLocation : varchar(30)
Noms des potions qui utilisent l'ingrédient d'id

<figure><img src="image_250.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>
Noms des potions qui utilisent l'ingrédient d'id

<figure><img src="image_251.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>
Noms des potions qui utilisent l'ingrédient d'id

<figure><img src="image_251.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>
Noms des potions qui utilisent l'ingrédient d'id

<figure><img src="image_252.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>
Noms des potions qui utilisent l'ingrédient d'id

<figure><img src="image_252.png" /></figure>

<table><thead><tr><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

poName

Magic potion

<figure><img src="image_253.png" /></figure>

Comment obtenez-vous ce résultat ?
Noms des potions qui utilisent l'ingrédient d'id

<figure><img src="image_253.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

poName

Magic potion

<figure><img src="image_254.png" /></figure>

Comment obtenez-vous ce résultat ?
<figure><img src="image_254.png" /></figure>

Comment avez-vous fait ?

Vous avez « jointuré » les deux tables
<figure><img src="image_255.png" /></figure>

Comment avez-vous fait ?

Vous avez « jointuré » les deux tables
# Requêtes avec plusieurs tables

## Modèle relationnel : plusieurs tables

### Extraire des données d'une BD

→ extraire des données dans différentes tables

→ il faut recomposer l'information

→ Opérateur de jointure
# Requêtes avec plusieurs tables

## Modèle relationnel : plusieurs tables

### Extraire des données d'une BD

→ extraire des données dans différentes tables

→ il faut recomposer l'information

→ Opérateur de jointure
La jointure en SQL

Un modèle relationnel est constitué de plusieurs tables et pour extraire des données d'une BD il est très souvent nécessaire d'extraire des données provenant de différentes tables.

La jointure permet de travailler avec
plusieurs tables

Une jointure met en relation deux tables en
utilisant une clause de jointure
La jointure en SQL

Un modèle relationnel est constitué de plusieurs tables et pour extraire des données d'une BD il est très souvent nécessaire d'extraire des données provenant de différentes tables.

La jointure permet de travailler avec
plusieurs tables

Une jointure met en relation deux tables en
utilisant une clause de jointure
La jointure en SQL

Les jointures indiquent comment on lie les t-uplets d'une
table avec les t-uplets d'une autre table.

Une condition de jointure définit la manière dont deux
tables sont liées dans une requête :

* en spécifiant la colonne de chaque table à utiliser pour la jointure.

* en spécifiant un opérateur de comparaison des valeurs des colonnes.
La jointure en SQL

Les jointures indiquent comment on lie les t-uplets d'une
table avec les t-uplets d'une autre table.

Une condition de jointure définit la manière dont deux
tables sont liées dans une requête :

* en spécifiant la colonne de chaque table à utiliser pour la jointure.

* en spécifiant un opérateur de comparaison des valeurs des colonnes.
La jointure en SQL

Différentes versions de SQL : différentes
expressions de cet opérateur

* Dans la clause WHERE

• L'ordre JOIN dans la clause FROM
La jointure en SQL

Différentes versions de SQL : différentes
expressions de cet opérateur

* Dans la clause WHERE

• L'ordre JOIN dans la clause FROM
## Jointure dans la clause WHERE

Permet de réaliser une jointure interne, mais pas externe

<figure><img src="image_255.png" /></figure>

SELECT ...
FROM R, S
WHERE condition de
jointure
## Jointure dans la clause WHERE

Permet de réaliser une jointure interne, mais pas externe

Syntaxe

```
SELECT ...
FROM R1, S
WHERE condition de
jointure
```
Noms des potions qui utilisent
l'ingrédient d'id

<figure><img src="image_256.png" /></figure>

SELECT poName
FROM composition, potion
WHERE idIngredient = 1
AND composition.idPotion = 
  potion.idPotion

Condition de jointure

poName

Magic potion
Noms des potions qui utilisent
l'ingrédient d'id

<figure><img src="image_256.png" /></figure>

SELECT poName
FROM composition, potion
WHERE idIngredient = 1
AND composition.idPotion =
  potion.idPotion

Condition de jointure

poName

Magic potion
# Noms des acteurs jouant dans le film de numéro 1

<figure><img src="image_257.png" /></figure>

## Jointure

composition.idPotion=potion.idPot

<figure><img src="image_258.png" /></figure>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>4</td><td>4</td><td>10</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>1</td><td>1</td><td>2</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>2</td><td>1</td><td>1</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>4</td><td>4</td><td>10</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>5</td><td>1</td><td>1</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>1</td><td>1</td><td>2</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>2</td><td>1</td><td>1</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>4</td><td>10</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>1</td><td>1</td><td>2</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>2</td><td>1</td><td>1</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>4</td><td>4</td><td>10</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>1</td><td>1</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

## Produit cartésien

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>4</td><td>4</td><td>10</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_259.png" /></figure>

## Sélection

idIngredient=1

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr></tbody></table>

<figure><img src="image_260.png" /></figure>

## Projection

SELECT poName

poName

Magic potion
# Noms des acteurs jouant dans le film de numéro 1

<figure><img src="image_257.png" /></figure>

## Jointure

composition.idPotion=potion.idPot

<figure><img src="image_258.png" /></figure>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>4</td><td>4</td><td>10</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>1</td><td>1</td><td>2</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>2</td><td>1</td><td>1</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>4</td><td>4</td><td>10</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>5</td><td>1</td><td>1</td><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>1</td><td>1</td><td>2</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>2</td><td>1</td><td>1</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>4</td><td>10</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>1</td><td>1</td><td>2</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>2</td><td>1</td><td>1</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>4</td><td>4</td><td>10</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>5</td><td>1</td><td>1</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

## Produit cartésien

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>4</td><td>4</td><td>10</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_259.png" /></figure>

## Sélection

idIngredient=1

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr></tbody></table>

<figure><img src="image_260.png" /></figure>

## Projection

SELECT poName

poName

Magic potion
# Jointure avec l'opérateur JOIN

Permet de réaliser une jointure interne, ou externe

<figure><img src="image_261.png" /></figure>

```sql
SELECT ...
FROM R Op jointure S
ON condition de
jointure
```

Jointure interne : INNER JOIN ou JOIN

Jointure externe : OUTER JOIN

* LEFT OUTER JOIN

* RIGHT OUTER JOIN
# Jointure avec l'opérateur JOIN

Permet de réaliser une jointure interne, ou externe

<figure><img src="image_261.png" /></figure>

```sql
SELECT ...
FROM R Op jointure S
ON condition de
jointure
```

Jointure interne : INNER JOIN ou JOIN

Jointure externe : OUTER JOIN

* LEFT OUTER JOIN

* RIGHT OUTER JOIN
<figure><img src="image_262.png" /></figure>

SELECT poName
FROM composition JOIN potion ON
  composition.idPotion =
  potion.idPotion
WHERE idIngredient = 1
  Condition de jointure

<figure><img src="image_263.png" /></figure>
<figure><img src="image_262.png" /></figure>

SELECT poName
FROM composition JOIN potion ON
  composition.idPotion =
  potion.idPotion
WHERE idIngredient = 1
  Condition de jointure

<figure><img src="image_263.png" /></figure>
# Noms des acteurs jouant dans le film de numéro 1

<figure><img src="image_264.png" /></figure>

## Jointure

composition.idPotion=potion.idPot

<figure><img src="image_265.png" /></figure>

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>4</td><td>4</td><td>10</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_266.png" /></figure>

## Sélection

idIngredient=1

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr></tbody></table>

<figure><img src="image_267.png" /></figure>

## Projection

SELECT poName

poName

Magic potion
# Noms des acteurs jouant dans le film de numéro 1

<figure><img src="image_264.png" /></figure>

## Jointure

composition.idPotion=potion.idPot

<figure><img src="image_265.png" /></figure>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>5</td><td>1</td><td>1</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>4</td><td>4</td><td>10</td><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<table><thead><tr><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_266.png" /></figure>

## Sélection

idIngredient=1

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th><th>idPotion</th><th>poName</th><th>poEffect</th><th>poDuration</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr></tbody></table>

<table><thead><tr><th>idIngredient</th><th>idPotion</th><th>comQuantity</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<figure><img src="image_267.png" /></figure>

## Projection

SELECT poName

poName

Magic potion
## Jointure externe

La jointure externe permet de récupérer toutes les données des tables, même si certaines données n'ont pas de correspondance dans l'autre table.

* Jointure interne : JOIN

* Jointure externe :

* LEFT JOIN

* RIGHT JOIN
## Jointure externe

La jointure externe permet de récupérer toutes les données des tables, même si certaines données n'ont pas de correspondance dans l'autre table.

* Jointure interne : JOIN

* Jointure externe :

* LEFT JOIN

* RIGHT JOIN
## Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_268.png" /></figure>

Utilisation de 2 tables → Jointure

<figure><img src="image_269.png" /></figure>

<figure><img src="image_270.png" /></figure>

<figure><img src="image_271.png" /></figure>
<figure><img src="image_268.png" /></figure>

Utilisation de 2 tables → Jointure

<figure><img src="image_269.png" /></figure>

<figure><img src="image_270.png" /></figure>

<figure><img src="image_271.png" /></figure>
<figure><img src="image_272.png" /></figure>

Utilisation de 2 tables → Jointure

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>V</strong> sdamy <strong>potion</strong></td><td>idPotion : int(11)</td></tr><tr><td>poName</td><td>poName : varchar(50)</td></tr><tr><td>poEffect</td><td>poEffect : varchar(50)</td></tr><tr><td>poDuration</td><td># poDuration : int(11)</td></tr></tbody></table>

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>V</strong> sdamy <strong>composition</strong></td><td>idIngredient : int(11)</td></tr><tr><td>idPotion</td><td>idPotion : int(11)</td></tr><tr><td># comQuantity</td><td># comQuantity : int(11)</td></tr></tbody></table>

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>V</strong> sdamy <strong>ingredient</strong></td><td>idIngredient : int(11)</td></tr><tr><td>ingName</td><td>ingName : varchar(50)</td></tr><tr><td>ingLocation</td><td>ingLocation : varchar(30)</td></tr></tbody></table>

composition.idIngredient = ingredient.idIngredient
<figure><img src="image_272.png" /></figure>

Utilisation de 2 tables → Jointure

<figure><img src="image_273.png" /></figure>

composition.idIngredient = ingredient.idIngredient
## Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_273.png" /></figure>

### composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

### ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

Jointure interne :

`composition.idIngredient = ingredient.idIngredient`
## Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_274.png" /></figure>

### composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

### ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

Jointure interne :

`composition.idIngredient = ingredient.idIngredient`
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_274.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient

<figure><img src="image_275.png" /></figure>

<table><thead><tr><td>ingName</td><td>idPotion</td></tr></thead><tbody><tr><td>water</td><td>1</td></tr><tr><td>mistletoe</td><td>1</td></tr><tr><td>Honey</td><td>1</td></tr><tr><td>Beer</td><td>4</td></tr></tbody></table>
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_275.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient

<figure><img src="image_276.png" /></figure>

<table><thead><tr><td>ingName</td><td>idPotion</td></tr></thead><tbody><tr><td>water</td><td>1</td></tr><tr><td>mistletoe</td><td>1</td></tr><tr><td>Honey</td><td>1</td></tr><tr><td>Beer</td><td>4</td></tr></tbody></table>
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_276.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

Ces ingrédients n'apparaissent pas dans le résultat

SELECT ingName, idPotion
FROM composition JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient

<figure><img src="image_277.png" /></figure>

<table><thead><tr><td>ingName</td><td>idPotion</td></tr></thead><tbody><tr><td>water</td><td>1</td></tr><tr><td>mistletoe</td><td>1</td></tr><tr><td>Honey</td><td>1</td></tr><tr><td>Beer</td><td>4</td></tr></tbody></table>
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_277.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

Ces ingrédients n'apparaissent pas dans le résultat

SELECT ingName, idPotion
FROM composition JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient

<figure><img src="image_278.png" /></figure>

<table><thead><tr><td>ingName</td><td>idPotion</td></tr></thead><tbody><tr><td>water</td><td>1</td></tr><tr><td>mistletoe</td><td>1</td></tr><tr><td>Honey</td><td>1</td></tr><tr><td>Beer</td><td>4</td></tr></tbody></table>
## Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_278.png" /></figure>

### composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

### ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition RIGHT JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_279.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition RIGHT JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient
## Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_279.png" /></figure>

### composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

### ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition RIGHT JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_280.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition RIGHT JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient
Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_280.png" /></figure>

composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

<table><thead><tr><td>ingName</td><td>idPotion</td></tr></thead><tbody><tr><td>water</td><td>1</td></tr><tr><td>mistletoe</td><td>1</td></tr><tr><td>Apple</td><td>NULL</td></tr><tr><td>Beer</td><td>4</td></tr><tr><td>Honey</td><td>1</td></tr><tr><td>Lemon</td><td>NULL</td></tr><tr><td>Raspberry</td><td>NULL</td></tr><tr><td>green salad</td><td>NULL</td></tr><tr><td>Strawberry</td><td>NULL</td></tr></tbody></table>

SELECT ingName, idPotion

FROM composition RIGHT JOIN ingredient

ON composition.idIngredient=ingredient.idIngredient
## Nom des ingrédients et id des potions qui les utilisent

<figure><img src="image_281.png" /></figure>

### composition

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

### ingredient

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

<table><thead><tr><td>ingName</td><td>idPotion</td></tr></thead><tbody><tr><td>water</td><td>1</td></tr><tr><td>mistletoe</td><td>1</td></tr><tr><td>Apple</td><td>NULL</td></tr><tr><td>Beer</td><td>4</td></tr><tr><td>Honey</td><td>1</td></tr><tr><td>Lemon</td><td>NULL</td></tr><tr><td>Raspberry</td><td>NULL</td></tr><tr><td>green salad</td><td>NULL</td></tr><tr><td>Strawberry</td><td>NULL</td></tr></tbody></table>

```sql
SELECT ingName, idPotion
FROM composition RIGHT JOIN ingredient
ON composition.idIngredient=ingredient.idIngredient
```
Jointure externe

LEFT              RIGHT
FROM table1 ???. JOIN table2

LEFT : jointure externe par rapport à table1

RIGHT : jointure externe par rapport à table2
Jointure externe

LEFT              RIGHT
FROM table1 ???. JOIN table2

LEFT : jointure externe par rapport à table1

RIGHT : jointure externe par rapport à table2
Lieux de récolte des ingrédients de la
potion 1

<figure><img src="image_281.png" /></figure>

A vous de faire

<figure><img src="image_282.png" /></figure>

<figure><img src="image_283.png" /></figure>

<figure><img src="image_284.png" /></figure>
Lieux de récolte des ingrédients de la
potion 1

<figure><img src="image_282.png" /></figure>

A vous de faire

<figure><img src="image_283.png" /></figure>

<figure><img src="image_284.png" /></figure>

<figure><img src="image_285.png" /></figure>
# Les fonctions de groupe

## Fonctions d'agrégation :
permettent d'obtenir des informations sur un ensemble de t-uplets dans une table

On travaille sur les colonnes et non sur les lignes

Syntaxe

nom-de-la-fonction(paramètre)

<table><thead><tr><td></td><td>Nom</td></tr></thead><tbody><tr><td>Valeur moyenne</td><td>AVG</td></tr><tr><td>Somme</td><td>SUM</td></tr><tr><td>Plus petite valeur</td><td>MIN</td></tr><tr><td>Plus grande valeur</td><td>MAX</td></tr><tr><td>Variance</td><td>VARIANCE</td></tr><tr><td>Ecart type de</td><td>STDDEV</td></tr><tr><td></td><td>COUNT</td></tr></tbody></table>
# Les fonctions de groupe

## Fonctions d'agrégation :
permettent d'obtenir des informations sur un ensemble de t-uplets dans une table

On travaille sur les colonnes et non sur les lignes

Syntaxe

nom-de-la-fonction(paramètre)

<table><thead><tr><td></td><td>Nom</td></tr></thead><tbody><tr><td>Valeur moyenne</td><td>AVG</td></tr><tr><td>Somme</td><td>SUM</td></tr><tr><td>Plus petite valeur</td><td>MIN</td></tr><tr><td>Plus grande valeur</td><td>MAX</td></tr><tr><td>Variance</td><td>VARIANCE</td></tr><tr><td>Ecart type de</td><td>STDDEV</td></tr><tr><td></td><td>COUNT</td></tr></tbody></table>
# Durée la plus longue des potions

<figure><img src="image_285.png" /></figure>

```sql
SELECT MAX poDuration
FROM potion
```

`max poDuration)`

120

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

```sql
SELECT MAX poDuration AS MaxDuration
FROM potion
```

`MaxDuration`

120
# Durée la plus longue des potions

<figure><img src="image_286.png" /></figure>

```sql
SELECT MAX poDuration
FROM potion
```

`max(poDuration)`

120

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

```sql
SELECT MAX(poDuration) AS MaxDuration
FROM potion
```

`MaxDuration`

120
## Dernier nom de potion par ordre alphabétique

<figure><img src="image_286.png" /></figure>

```sql
SELECT MAX(poName)
FROM potion
```

max poName
Magic potion

## Premier et dernier nom de potion par ordre alphabétique

```sql
SELECT MIN(poName), MAX(poName)
FROM potion
```

MIN poName MAX poName
Anger potion Magic potion
Dernier nom de potion par ordre alphabétique

<figure><img src="image_287.png" /></figure>

SELECT MAX(poName)
FROM potion

max(poName)
Magic potion

Premier et dernier nom de potion par ordre alphabétique

SELECT MIN(poName), MAX(poName)
FROM potion

| MIN(poName) | MAX(poName) |
|---|---|
| Anger potion | Magic potion |
<figure><img src="image_287.png" /></figure>

SELECT COUNT(*) AS Nbre_Potions
FROM potion

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_288.png" /></figure>

Nbre_Potions

4
<figure><img src="image_288.png" /></figure>

SELECT COUNT(*) AS Nbre_Potions
FROM potion

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr></tbody></table>

<figure><img src="image_289.png" /></figure>

Nbre_Potions

4
Nombre d'ingrédients récoltés dans le jardin
(garden)

<figure><img src="image_289.png" /></figure>

SELECT COUNT(idIngredient)
FROM ingredient
WHERE ingLocation = 'garden'

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

COUNT(idIngredient)

2
Nombre d'ingrédients récoltés dans le jardin
(garden)

<figure><img src="image_290.png" /></figure>

SELECT COUNT(idIngredient)
FROM ingredient
WHERE ingLocation = 'garden'

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr></tbody></table>

COUNT(idIngredient)

2
## Particularités de la fonction COUNT

* `COUNT(*)`: compte le nombre de t-uplets obtenus dans la requête (lignes)

* `COUNT attribut`: compte le nombre de valeurs de l'attribut différentes de NULL

* `COUNT(DISTINCT attribut)`: compte le nombre de valeurs différentes de l'attribut

`COUNT(DISTINCT attribut)` n'existe pas dans tous les SGBD