diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..54a6ed0
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "Espace Formateur"]
+ path = Espace Formateur
+ url = git@github.com:Octocorn-Learning/SQL-Formateur.git
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 4c6280e..2d4cf53 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -8,5 +8,6 @@
+
\ No newline at end of file
diff --git a/Espace Formateur b/Espace Formateur
new file mode 160000
index 0000000..18ec4a8
--- /dev/null
+++ b/Espace Formateur
@@ -0,0 +1 @@
+Subproject commit 18ec4a80403835aa329b2093d4e23c8479d116b2
diff --git a/README.md b/README.md
index d049639..1ac72fc 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,8 @@ Pour chaque exercice, vous retrouverez trois niveaux de difficulté :
## Plan de cours 🗺️
-- [ ] [Présentation]()
-- [ ] [Création de BDD]()
+- [x] [Présentation]()
+- [x] [Création de BDD]()
- [ ] [Jointures]()
- [ ] [Fonctions]()
- [ ] [Sous requĂŞtes]()
diff --git a/cours/00_index.slides.md b/cours/00_index.slides.md
index b0731b8..40c1829 100644
--- a/cours/00_index.slides.md
+++ b/cours/00_index.slides.md
@@ -9,4 +9,5 @@ contributors:
# Index
-- [Présentation](01_presentation.slides.html)
\ No newline at end of file
+- [Présentation](01_presentation.slides.html)
+- [Création et commandes de base](02_creation_bdd.slides.html)
\ No newline at end of file
diff --git a/cours/01_presentation.slides.md b/cours/01_presentation.slides.md
index b7f54f2..568165e 100644
--- a/cours/01_presentation.slides.md
+++ b/cours/01_presentation.slides.md
@@ -382,7 +382,6 @@ volumes:
- Hostname : `127.0.0.1`
- User : `user`
- Password : `password`
- - Default Schema : `db`
> Si après avoir cliqué sur "Test Connection" tout est OK, validez !
diff --git a/cours/02_creation-BDD.slides.md b/cours/02_creation-BDD.slides.md
new file mode 100644
index 0000000..8a8a8f8
--- /dev/null
+++ b/cours/02_creation-BDD.slides.md
@@ -0,0 +1,644 @@
+---
+title: Commandes de base
+theme: solarized
+author: Alexandre Devos
+company: Octocorn
+contributors:
+ - Alexandre Devos
+---
+
+# Base de données
+
+## Création avec Workbench
+
+![SQL](./assets/sql.png)
+
+![MySQL](./assets/mysql.png)
+
+----
+
+## Création de tables
+
+### Définition de Schéma
+
+- **Schéma** : Structure de la base de données
+- MySQL Workbench permet la création de schéma graphiquement
+- On pourra y définir :
+ - Les tables
+ - Les colonnes
+ - Les types de données
+ - Les contraintes
+ - Les relations
+ - ...
+
+----
+
+## Création de tables
+
+### Exemple de schéma
+
+![Schéma Exemple](./assets/schema-exemple.png)
+
+> Nous allons le créer ensemble !
+
+----
+
+## Création de tables
+
+### La table élève
+
+DĂ©monstration !
+
+Note: ./Espace Formateur/01_Diagram.md
+
+----
+
+## Création de tables
+
+### Le code généré par Workbench
+
+```mysql
+SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
+SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;
+SET @OLD_SQL_MODE = @@SQL_MODE,
+ SQL_MODE =
+ 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
+
+CREATE SCHEMA IF NOT EXISTS `school` DEFAULT CHARACTER SET utf8mb4;
+USE `school`;
+
+CREATE TABLE IF NOT EXISTS `school`.`eleves`
+(
+ `ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `nom` VARCHAR(45) NOT NULL,
+ `prenom` VARCHAR(45) NOT NULL,
+ `date_naissance` DATE NOT NULL,
+ PRIMARY KEY (`ID`)
+)
+ ENGINE = InnoDB;
+
+
+SET SQL_MODE = @OLD_SQL_MODE;
+SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS;
+SET UNIQUE_CHECKS = @OLD_UNIQUE_CHECKS;
+```
+
+----
+
+## Création de tables
+
+### Les options des colonnes
+
+- `PK` : Primary Key - Indexe la colonne et la rend unique
+- `NN` : Not Null - EmpĂŞche la colonne d'ĂŞtre vide
+- `UQ` : Unique - EmpĂŞche la colonne d'avoir des doublons
+- `BIN` : Binary - Stocke les données en binaire (images, etc.)
+- `UN` : Unsigned - Empêche la colonne d'avoir des valeurs négatives
+
+----
+
+## Création de tables
+
+### Les options des colonnes
+
+- `ZF` : Zero Fill - Rempli les valeurs manquantes avec des zéros
+- `AI` : Auto Increment - Incrémente automatiquement la valeur
+- `G` : Generated Column - Génère la valeur automatiquement
+- `Default/Expression` : Valeur par défaut ou expression (fonction, calcul, etc.)
+
+----
+
+## Création de tables
+
+### Bonnes pratiques
+
+- Pas d'espace dans les noms de colonne : des `_`
+- Pas de majuscules dans les noms de colonne
+- Pas de mots réservés (ex : `date`, `order`, `group`, etc.)
+- Pas de caractères spéciaux (ex : `é`, `è`, `ç`, etc.)
+- Utiliser des noms de colonnes explicites (pas d'ab'Ă©viation)
+- Préférer le singulier au pluriel !
+
+---
+
+# Base de données
+
+## Commandes de base
+
+
+![SQL](./assets/sql.png)
+
+![MySQL](./assets/mysql.png)
+
+----
+
+## Commandes de base
+
+### Syntaxe des exemples
+
+Les exemples utiliseront la syntaxe suivante :
+
+- `[]` : Indique un paramètre facultatif
+- `<>` : Indique un paramètre obligatoire
+
+----
+
+## Commandes de base
+
+### Bonnes pratiques : syntaxe
+
+- Mots clefs en `MAJUSCULES`
+- Noms de tables et colonnes en `minuscules`
+- Les instructions se terminent par `;`
+- Les commandes peuvent être placées sur plusieurs lignes pour plus de lisibilité
+
+----
+
+## Commandes de base
+
+### Insérer un élément
+
+```mysql
+INSERT INTO [bdd].
(, , ...) VALUES (, , ...);
+```
+
+- Lorsque la BDD est sélectionnée, il n'est pas nécessaire de préciser le nom de la BDD.
+- Conservez toutefois cette bonne pratique !
+
+----
+
+## Commandes de base
+
+### Insérer un élément
+
+```mysql
+INSERT INTO school.eleves VALUES (1, 'David', 'Bowie', '1947-01-08');
+```
+
+- Cette syntaxe n'est pas pratique car elle oblige Ă respecter l'ordre des colonnes
+- Nous en verrons une autre plus tard
+
+----
+
+## Commandes de base
+
+### Selectionner des éléments
+
+```mysql
+SELECT , , ... FROM [bdd].;
+```
+
+> Taper `*` pour sélectionner toutes les colonnes.
+
+----
+
+## Commandes de base
+
+### Sélectionner des éléments
+
+```mysql
+SELECT * FROM school.eleves;
+```
+
+> Utiliser le `*` est utile, mais c'est une mauvaise pratique !
+
+----
+
+## Commandes de base
+
+### Sélectionner des éléments
+
+> Pourquoi '*' est-il une mauvaise pratique ?
+
+- Il est préférable de sélectionner uniquement les colonnes dont on a besoin
+- Cela permet de réduire la taille des données renvoyées
+- Cela permet de réduire le temps de traitement de la requête
+
+----
+
+## Commandes de base
+
+### A vous de jouer
+
+SĂ©lectionnez uniquement les colonnes `nom` et `prenom` de la table `eleves`
+
+```mysql
+SELECT , [colonne2]
+FROM [bdd].;
+```
+
+----
+
+## Commandes de base
+
+### A vous de jouer
+
+```mysql
+SELECT nom, prenom
+FROM school.eleves;
+```
+
+----
+
+## Commandes de base
+
+### Insérer un élément
+
+```mysql
+INSERT INTO school.eleves
+VALUES (1, 'Elton', 'John', '1947-03-25');
+```
+
+> Tapez cette commande et vous aurez une erreur. Pourquoi ?
+
+----
+
+## Commandes de base
+
+### Insérer un élément
+
+- L'ID `1` est déjà utilisé
+- S'agissant d'une clé primaire, elle doit être unique !
+- C'est pourquoi il est préférable de ne pas la renseigner
+
+----
+
+## Commandes de base
+
+### Insérer un élément
+
+```mysql
+INSERT INTO school.eleves (nom, prenom, date_naissance)
+VALUES ('Elton', 'John', '1947-03-25');
+```
+
+- On peut préciser les noms des colonnes pour ne pas avoir à respecter l'ordre !
+- On devra respecter l'ordre précisé entre parenthèses
+- On est pas obligé de préciser toutes les colonnes
+
+----
+
+## Commandes de base
+
+### Insérer plusieurs éléments
+
+Il est possible de séparer les éléments par des virgules :
+
+```mysql
+INSERT INTO school.eleves (nom, prenom, date_naissance)
+VALUES ('Elton', 'John', '1947-03-25'),
+ ('Norton', 'Edward', '1969-08-18'),
+ ('Hendrix', 'Jimi', '1942-11-27'),
+ ('Kilmister', 'Lemmy', '1945-12-24'),
+ ('Nicks', 'Stevie', '1948-05-26');
+```
+
+> Ajoutez ces élèves à votre base de donnés !
+
+---
+
+## Commandes de base
+
+### Modifier une table
+
+> Quelques erreurs se seont glissées, les avez vous vu ?
+
+----
+
+## Commandes de base
+
+### Modifier une table
+
+- Les prénoms et noms de `David Bowie` et `Elton John` sont inversés
+- Il y a une majuscule Ă `date_Naissance` au lieu de `date_naissance`
+
+----
+
+## Commandes de base
+
+### Obtenir les informations d'une table
+
+Cette commande permet d'obtenir les informations d'une table :
+
+```mysql
+DESCRIBE ;
+```
+
+> Tapez cette commande pour voir les informations de la table `eleves`
+
+----
+
+## Commandes de base
+
+### Modifier une table
+
+Syntaxe :
+```mysql
+ALTER TABLE [bdd].< table >
+CHANGE
+ ;
+```
+
+Exemple :
+```mysql
+ALTER TABLE school.eleves
+CHANGE COLUMN date_Naissance date_naissance DATE NULL;
+```
+
+> Changeons le nom de la colonne `date_Naissance` en `date_naissance`
+
+---
+
+## Commandes de base
+
+### Modifier un élément
+
+- Pour modifier un élément, nous devront d'abord filtrer les éléments à modifier
+- Pour cela, nous utiliserons la commande `WHERE`
+- On lui passera une condition
+
+----
+
+## Commandes de base
+
+### Opérateurs de comparaison
+
+En complément du mot cl
+
+- `=` : Egal Ă
+- `!=` : Différent de
+- `>` : SupĂ©rieur Ă
+- `<` : InfĂ©rieur Ă
+- `>=` : SupĂ©rieur ou Ă©gal Ă
+- `<=` : InfĂ©rieur ou Ă©gal Ă
+
+----
+
+## Commandes de base
+
+### Modifier un élément
+
+Le mot clef `SET` permet de modifier les valeurs d'une colonne :
+
+```mysql
+UPDATE [bdd].
+SET = , = , ...
+WHERE ;
+```
+
+- `SET` : Indique les colonnes Ă modifier
+- `=` : Indique la valeur Ă affecter Ă la colonne
+- `WHERE` : Indique les éléments à modifier
+
+----
+
+## Commandes de base
+
+### Modifier un élément
+
+> Qu'est-ce qu'il se passe si je ne précise pas de condition ?
+
+----
+
+## Commandes de base
+
+### Modifier un élément
+
+- Si on ne précise pas de condition, tous les éléments seront modifiés
+- C'est pourquoi il est important de préciser une condition !
+
+----
+
+## Commandes de base
+
+### Modifier un élément
+
+Remettons les prénoms et noms dans le bon ordre :
+
+```mysql
+UPDATE school.eleves
+SET prenom = 'David', nom = 'Bowie'
+WHERE ID = 1;
+```
+
+> Cette commande est pratique, mais implique de connaitre l'ID de l'élève ...
+
+---
+
+## Commandes de base
+
+### Filtrer avec LIKE
+
+- L'opérateur `LIKE` permet de filtrer les éléments en fonction d'un motif
+- Il est possible d'utiliser des caractères spéciaux, un peu comme des regex :
+ - `%` : N'importe quel caractère
+ - `_` : Un seul caractère
+
+----
+
+## Commandes de base
+
+### Filtrer avec LIKE
+
+```mysql
+SELECT * FROM school.eleves
+WHERE prenom LIKE 'D%';
+```
+
+> Ne sélectionne que les élèves dont le prénom commence par `D`
+
+----
+
+## Commandes de base
+
+### Filtrer avec LIKE
+
+- `%a%` : contient un `a`
+- `d_` : contient un `d` suivi d'un caractère
+- `d%` : commence par `d`
+- `%d` : finit par `d`
+- `b___e` : contient un `b` suivi de 3 caractères puis un `e`
+
+----
+
+## Commandes de base
+
+### Filtrer avec LIKE
+
+A vous de jouer !
+
+> Utilisez le filtre pour inverser nom et prénom d'Elton John.
+
+Rappel de la syntaxe :
+
+```mysql
+UPDATE [bdd].
+SET = , = , ...
+WHERE ;
+```
+
+----
+
+## Commandes de base
+
+### Filtrer avec LIKE
+
+```mysql
+UPDATE school.eleves
+SET prenom = 'John', nom = 'Elton'
+WHERE prenom LIKE 'Elton';
+```
+
+> Workbench nous retourne une erreur, pourquoi ?
+
+----
+
+## Commandes de base
+
+### Filtrer avec LIKE
+
+- Le `Safe mode` de Workbench empêche les modifications de données
+- Il est préférable de toujours utiliser des ID pour les modifications
+- En effet, rien ne nous garantit que le filtre ne renverra qu'un seul élément !
+
+> Nous allons le désactiver pour le moment, mais il est préférable de le laisser activé !
+
+----
+
+## Commandes de base
+
+### Filtrer sur plusieurs critères
+
+```mysql
+SELECT , , ... FROM [bdd].
+WHERE
+ AND
+ OR ...;
+```
+
+- `AND` : ET
+- `OR` : OU
+- `NOT` : NON
+- `XOR` : OU exclusif
+
+----
+
+## Commandes de base
+
+### Filtrer sur plusieurs critères
+
+On peut aussi utiliser des parenthèses pour grouper les conditions :
+
+```mysql
+SELECT *
+FROM
+WHERE colonne1 > 'valeur1'
+ OR (colonne2 = 'valeur2' AND colonne3 = 'valeur3');
+```
+
+> Pratique mais peu lisibles, Ă utiliser avec parcimonie !
+
+----
+
+## Commandes de base
+
+### A vous de jouer !
+
+```mysql
+SELECT * FROM
+WHERE AND
+ OR ( AND );
+```
+
+Filtrez les élèves :
+- Nés après 1945
+- Dont le nom ne contient pas de `e` **et** pas de `k`
+- Dont le prénom contient un `n`
+
+----
+
+## Commandes de base
+
+### A vous de jouer !
+
+```mysql
+SELECT nom, prenom, date_naissance
+FROM school.eleves
+WHERE date_naissance > '1945-12-31'
+ AND prenom NOT LIKE '%e%' AND prenom NOT LIKE '%k%'
+ AND prenom LIKE '%n%';
+```
+
+> RĂ©ponse : Elton John
+
+----
+
+## Commandes de base
+
+### A vous de jouer
+
+```mysql
+SELECT *
+FROM nom_table
+WHERE colonne BETWEEN 'valeur1' AND 'valeur2';
+```
+
+Affichez les élèves nés entre le 01/01/1945 et le 31/12/1947
+
+----
+
+## Commandes de base
+
+### A vous de jouer
+
+```mysql
+SELECT *
+FROM school.eleves
+WHERE date_naissance BETWEEN '1945-01-01' AND '1947-12-31';
+```
+
+----
+
+## Commandes de base
+
+### A vous de jouer
+
+RĂ©ponses :
+- David Bowie
+- Lemmy Kilmister
+- Elton John
+
+----
+
+## Commandes de base
+
+### Filtrer Ă partir d'une liste
+
+- PlutĂ´t que d'enchainer les `OR`, on peut utiliser `IN`
+
+```mysql
+SELECT *
+FROM nom_table
+WHERE colonne IN ('valeur1', 'valeur2', ...);
+```
+
+- `IN` : Dans la liste
+- `NOT IN` : Pas dans la liste
+
+----
+
+## Commandes de base
+
+### Filtrer Ă partir d'une liste
+
+```mysql
+SELECT *
+FROM school.eleves
+WHERE nom IN ('Bowie', 'Kilmister', 'John');
+```
+
+---
+
+# La suite !
+
+[Index](index.html)
\ No newline at end of file
diff --git a/cours/assets/schema-exemple.png b/cours/assets/schema-exemple.png
new file mode 100644
index 0000000..10ae2aa
Binary files /dev/null and b/cours/assets/schema-exemple.png differ
diff --git a/resources/docker-compose.yml b/resources/docker-compose.yml
index d6af750..a1af7f5 100644
--- a/resources/docker-compose.yml
+++ b/resources/docker-compose.yml
@@ -2,7 +2,7 @@ version: '3.9'
services:
db:
- image: mysql:5.7
+ image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root