<style>
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6,
.reveal p
{
text-align: left;
}
.reveal img{
width: auto;
max-height: 50vh;
}
.reveal h1{
font-size: 8rem;
}
.reveal h2{
font-size: 4rem;
text-transform: initial;
}
.reveal h3{
font-size: 3.5rem;
text-transform: initial;
}
.reveal h4{
font-size: 3rem;
text-transform: initial;
}
.reveal h5{
font-size: 2.9rem;
text-transform: initial;
}
.reveal p {
font-size: 3.2rem;
color: rgba(0,0,0,.8);
}
.reveal p strong {
color: rgba(0,0,0,1) !important;
}
.reveal ul, .reveal ol {
display: block;
}
.reveal li {
font-size: 2.5rem;
margin-bottom: 1rem;
}
.reveal pre {
font-size: 1.5rem;
}
.reveal code {
padding: 0 0.5rem;
border-radius: 5px;
font-weight: 900;
opacity: 0.8;
background-color: rgba(0,0,0,0.05);
color: darkcyan;
}
.reveal .slides table {
width: 100%;
font-size: 18px;
}
.reveal .slides table th {
background: #2196F3;
color: #ffffff;
font-weight: 600;
}
.reveal blockquote {
margin: initial;
width: initial;
text-align: left;
padding-left: 16px;
padding-right: 16px;
}
.mermaid p {
font-size: 16px;
}
</style>
<!--
Cours SQL / MySQL - Présentation
-->
# SQL & MySQL<br>Bases de données relationnelles
---
## Plan de la présentation
<!-- 50 mots max -->
```mermaid
timeline
title Structure du cours
section Fondamentaux
Histoire : SQL, MySQL, MariaDB
section Environnement
Installation : Serveur local, phpMyAdmin
section Pratique
CRUD : CREATE, SELECT, UPDATE, DELETE
section Avancé
Relations : Jointures, Contraintes, Fonctions
```
---
## Introduction au SQL
<!-- 50 mots max -->
**SQL** = Structured Query Language
- Langage standard pour communiquer avec les bases de données relationnelles
- Permet de gérer et manipuler les données stockées
- Syntaxe simple et puissante
- Essentiel pour développeurs et analystes de données
---
## Histoire : Thèse de Codd (1970)
<!-- 50 mots max -->
**Edgar Frank Codd** publie chez IBM : "A Relational Model of Data for Large Shared Data Banks"
- Modèle relationnel basé sur la théorie des ensembles
- Structure en tables pour représenter les données
- Fondation des bases de données modernes
---
## Histoire : MySQL (années 1990)
<!-- 50 mots max -->
**Michael Widenius** et **David Axmark** créent MySQL
- SGBDR open source le plus populaire
- Rapide, fiable et facile d'utilisation
- Racheté par Sun Microsystems (2008) puis Oracle (2010)
---
## Histoire : MariaDB (2009)
<!-- 50 mots max -->
**Michael Widenius** lance MariaDB suite au rachat par Oracle
- Fork de MySQL, 100% libre et open source
- Alternative directe, compatible avec MySQL
- Utilisé par de grandes entreprises
---
## Histoire : MySQL 8.0 (2018)
<!-- 50 mots max -->
Version majeure avec nouvelles fonctionnalités :
- Support amélioré Unicode (utf8mb4)
- Index invisibles pour tests de performance
- Persistance de la configuration système
- Optimisations de performances
---
## Chronologie
<!-- 50 mots max -->
```mermaid
timeline
title Évolution de MySQL
1970 : Thèse de Codd (IBM)
1995 : Création MySQL
2008 : Rachat Sun Microsystems
2009 : Fork MariaDB
2010 : Rachat Oracle
2018 : MySQL 8.0
```
---
## Principaux SGBD
<!-- 50 mots max -->
| SGBD | Type | Caractéristique |
|------------|-------------|------------------------------|
| Oracle | Commercial | Grandes entreprises |
| SQL Server | Commercial | Écosystème Microsoft |
| MySQL | Open Source | Applications web + PHP |
| PostgreSQL | Open Source | Conformité standards, PostGIS|
| SQLite | Open Source | Embarqué, léger |
---
## Autres SGBD
<!-- 50 mots max -->
| SGBD | Type | Caractéristique |
|----------|-------------|----------------------------|
| IBM DB2 | Commercial | Mainframes IBM |
| MariaDB | Open Source | Fork MySQL, 100% libre |
| SAP HANA | Commercial | Base en mémoire, très rapide|
---
## Panorama des SGBD
<!-- 50 mots max -->
```mermaid
graph TD
SQL[SQL] --> OS[Open Source]
SQL --> COM[Commercial]
OS --> MySQL
OS --> PostgreSQL
OS --> SQLite
OS --> MariaDB
COM --> Oracle
COM --> MSSQL[SQL Server]
COM --> DB2[IBM DB2]
COM --> HANA[SAP HANA]
```
---
## Installer un serveur local
<!-- 50 mots max -->
Les langages web (PHP, MySQL) ont besoin d'un serveur.
- **Windows** : Laragon, WAMP
- **Mac** : MAMP
- **Linux** : XAMPP
---
## phpMyAdmin
<!-- 50 mots max -->
Application web gratuite en PHP pour gérer MySQL via interface graphique.
- Gestion des bases, tables, colonnes, relations, index
- Gestion des utilisateurs et permissions
- Sans avoir à utiliser la ligne de commande
Téléchargement : [phpmyadmin.net](https://www.phpmyadmin.net/)
---
## Architecture
<!-- 50 mots max -->
```mermaid
graph LR
A[Application PHP] --> C[Serveur MySQL]
E[phpMyAdmin] --> C
F[Terminal] --> C
C --> D[(Base de données)]
```
---
## Afficher les bases de données
<!-- 50 mots max -->
```sql
SHOW DATABASES;
```
Affiche toutes les bases de données disponibles sur le serveur.
---
## Créer une base de données
<!-- 50 mots max -->
```sql
CREATE DATABASE cinema;
```
- Noms en **minuscules**
- Éviter les espaces (utiliser underscores `_`)
---
## Sélectionner une base
<!-- 50 mots max -->
```sql
USE cinema;
```
Toutes les requêtes suivantes s'appliqueront à cette base, sauf si vous changez avec un autre `USE`.
---
## Créer une table
<!-- 50 mots max -->
```sql
CREATE TABLE movie (
movie_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
release_year YEAR(4),
duration INT,
rating VARCHAR(50)
);
```
:::info
`AUTO_INCREMENT` avec `PRIMARY KEY` génère automatiquement un ID unique. La base refuse tout doublon sur cette colonne.
:::
---
## Explication de la table
<!-- 50 mots max -->
- `movie_id` : clé primaire, auto-incrémentée
- `title` : chaîne de caractères, obligatoire (`NOT NULL`)
- `description` : texte long
- `release_year` : année sur 4 chiffres
- `duration` : durée en minutes
- `rating` : classification du film
---
## Moteurs de stockage
<!-- 50 mots max -->
| Moteur | Caractéristiques |
|------------|------------------------------------------|
| **InnoDB** | Transactions, clés étrangères (défaut) |
| **MyISAM** | Rapide en lecture, pas de transactions |
| **MEMORY** | Données en RAM, très rapide |
Le choix se fait à la création de la table.
---
## Insérer des données
<!-- 50 mots max -->
```sql
INSERT INTO movie (title, description, release_year, duration, rating)
VALUES
('The Godfather', 'Saga mafieuse à New York', 1972, 175, 'R'),
('Pulp Fiction', 'Crime à Los Angeles', 1994, 154, 'R'),
('Forrest Gump', 'Vie extraordinaire', 1994, 142, 'PG-13');
```
---
## INSERT : Explication
<!-- 50 mots max -->
- `INSERT INTO movie` : table cible
- `(colonnes)` : colonnes à remplir
- `VALUES` : ensembles de valeurs
- Guillemets simples pour les textes
- Antislash `\` pour échapper les apostrophes
---
## SELECT : Tout afficher
<!-- 50 mots max -->
```sql
-- Tous les champs
SELECT * FROM movie;
-- Champs spécifiques
SELECT title, release_year FROM movie;
```
---
## SELECT : Filtrer avec WHERE
<!-- 50 mots max -->
```sql
-- Films sortis à partir de 1994
SELECT * FROM movie WHERE release_year >= 1994;
-- Films d'une classification
SELECT title FROM movie WHERE rating = 'PG-13';
```
---
## SELECT : Compter
<!-- 50 mots max -->
```sql
-- Nombre total de films
SELECT COUNT(*) FROM movie;
-- Nombre par classification
SELECT rating, COUNT(*) FROM movie GROUP BY rating;
```
---
## SELECT : BETWEEN et LIKE
<!-- 50 mots max -->
```sql
-- Durée entre 140 et 160 minutes
SELECT title, duration FROM movie
WHERE duration BETWEEN 140 AND 160;
-- Recherche partielle
SELECT * FROM movie WHERE title LIKE '%Pulp%';
```
---
## SELECT : Trier et limiter
<!-- 50 mots max -->
```sql
-- Trier par année (décroissant)
SELECT title, release_year FROM movie
ORDER BY release_year DESC;
-- Limiter à 3 résultats
SELECT * FROM movie LIMIT 3;
```
---
## UPDATE : Modifier
<!-- 50 mots max -->
```sql
UPDATE movie
SET
title = 'Inception',
description = 'Vol dans les rêves',
release_year = 2010,
duration = 148,
rating = 'PG-13'
WHERE movie_id = 5;
```
Toujours utiliser `WHERE` pour cibler les lignes.
---
## DELETE : Supprimer
<!-- 50 mots max -->
```sql
DELETE FROM movie WHERE movie_id = 6;
```
:::warning
Action irréversible ! Toujours vérifier la condition WHERE avant d'exécuter.
:::
---
## Alias de colonnes
<!-- 50 mots max -->
Renommer les colonnes dans les résultats avec `AS` :
```sql
SELECT title AS Titre, release_year AS Année
FROM movie;
```
Améliore la lisibilité des résultats.
---
## Introduction aux jointures
<!-- 50 mots max -->
Les jointures combinent des colonnes de plusieurs tables basées sur une relation (clés primaires et étrangères).
```mermaid
graph LR
D[director] -->|director_id| M[movie]
```
---
## Créer une table liée
<!-- 50 mots max -->
```sql
CREATE TABLE director (
director_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
birth_year YEAR(4)
);
INSERT INTO director (name, birth_year) VALUES
('Francis Ford Coppola', 1939),
('Quentin Tarantino', 1963);
```
---
## ALTER TABLE
<!-- 50 mots max -->
Ajouter une colonne pour lier les tables :
```sql
ALTER TABLE movie ADD COLUMN director_id INT;
UPDATE movie SET director_id = 1 WHERE title = 'The Godfather';
UPDATE movie SET director_id = 2 WHERE title = 'Pulp Fiction';
```
---
## INNER JOIN
<!-- 50 mots max -->
Afficher les films avec leur réalisateur :
```sql
SELECT m.title AS Titre, d.name AS Réalisateur
FROM movie m
INNER JOIN director d ON m.director_id = d.director_id;
```
Récupère uniquement les films ayant un réalisateur associé.
---
## Les contraintes de données
<!-- 50 mots max -->
Contraintes pour assurer l'intégrité des données :
| Contrainte | Rôle |
|---------------|------------------------|
| `PRIMARY KEY` | Identifiant unique |
| `FOREIGN KEY` | Lien entre tables |
| `UNIQUE` | Valeur unique |
| `NOT NULL` | Valeur obligatoire |
| `CHECK` | Condition sur valeur |
| `DEFAULT` | Valeur par défaut |
---
## PRIMARY KEY
<!-- 50 mots max -->
Assure que chaque valeur est unique et non NULL :
```sql
CREATE TABLE exemple (
exemple_id INT AUTO_INCREMENT,
PRIMARY KEY (exemple_id)
);
```
Chaque table doit avoir une seule clé primaire.
---
## FOREIGN KEY
<!-- 50 mots max -->
Crée une relation entre deux tables :
```sql
CREATE TABLE movie (
...
director_id INT,
FOREIGN KEY (director_id) REFERENCES director(director_id)
ON DELETE CASCADE
ON UPDATE NO ACTION
);
```
---
## UNIQUE
<!-- 50 mots max -->
Garantit que toutes les valeurs sont différentes :
```sql
CREATE TABLE user (
user_id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255),
UNIQUE (email)
);
```
Peut être utilisé sur des colonnes non clé primaire.
---
## NOT NULL, CHECK, DEFAULT
<!-- 50 mots max -->
```sql
CREATE TABLE user (
user_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT CHECK (age >= 18),
status VARCHAR(50) DEFAULT 'actif'
);
```
- `NOT NULL` : valeur obligatoire
- `CHECK` : condition (MySQL 8.0.16+)
- `DEFAULT` : valeur par défaut
---
## Contraintes : Vue d'ensemble
<!-- 50 mots max -->
```mermaid
graph TD
C[Contraintes] --> I[Intégrité]
C --> V[Validation]
I --> PK[PRIMARY KEY]
I --> FK[FOREIGN KEY]
I --> U[UNIQUE]
V --> NN[NOT NULL]
V --> CH[CHECK]
V --> D[DEFAULT]
```
---
## Contraintes de clés étrangères
<!-- 50 mots max -->
| Action | Comportement |
|---------------|--------------------------------|
| `CASCADE` | Supprime/modifie en cascade |
| `SET NULL` | Met à NULL |
| `NO ACTION` | Bloque si référence existe |
| `RESTRICT` | Empêche immédiatement |
| `SET DEFAULT` | Valeur par défaut |
---
## Syntaxe clé étrangère
<!-- 50 mots max -->
```sql
ALTER TABLE movie
ADD CONSTRAINT fk_director
FOREIGN KEY (director_id) REFERENCES director(director_id)
ON DELETE CASCADE
ON UPDATE NO ACTION;
```
---
## Les fonctions MySQL
<!-- 50 mots max -->
MySQL propose des fonctions intégrées pour :
- Agrégation de données
- Manipulation de chaînes
- Calculs sur dates
- Opérations mathématiques
- Contrôle de flux
---
## Fonctions d'agrégation
<!-- 50 mots max -->
```sql
SELECT
COUNT(*) AS total,
SUM(duration) AS duree_totale,
AVG(duration) AS duree_moyenne,
MAX(release_year) AS plus_recent,
MIN(release_year) AS plus_ancien
FROM movie;
```
---
## Fonctions de chaînes
<!-- 50 mots max -->
| Fonction | Usage |
|---------------|----------------------------|
| `CONCAT()` | Concaténer textes |
| `LENGTH()` | Longueur chaîne |
| `SUBSTRING()` | Extraire portion |
| `UPPER()` | Majuscules |
| `LOWER()` | Minuscules |
| `TRIM()` | Supprimer espaces |
---
## Fonctions de dates
<!-- 50 mots max -->
```sql
-- Date/heure actuelles
SELECT NOW(), CURDATE(), CURTIME();
-- Ajouter un intervalle
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY);
-- Différence entre dates
SELECT DATEDIFF('2024-12-31', CURDATE());
```
---
## Fonctions mathématiques
<!-- 50 mots max -->
| Fonction | Usage |
|-------------|-------------------------------|
| `ROUND()` | Arrondir |
| `FLOOR()` | Entier inférieur |
| `CEIL()` | Entier supérieur |
| `ABS()` | Valeur absolue |
| `RAND()` | Nombre aléatoire (0-1) |
---
## Fonctions de contrôle de flux
<!-- 50 mots max -->
```sql
SELECT title,
IF(duration > 150, 'Long', 'Court') AS categorie,
CASE rating
WHEN 'R' THEN 'Adulte'
WHEN 'PG-13' THEN 'Ado'
ELSE 'Tout public'
END AS public,
COALESCE(description, 'N/A') AS desc
FROM movie;
```
---
## Schéma relationnel final
<!-- 50 mots max -->
```mermaid
erDiagram
DIRECTOR ||--o{ MOVIE : realise
DIRECTOR {
int director_id PK
string name
year birth_year
}
MOVIE {
int movie_id PK
string title
int director_id FK
int duration
}
```
---
## Bonnes pratiques
<!-- 50 mots max -->
- Noms en minuscules avec underscores
- Toujours définir une clé primaire
- Utiliser `WHERE` avec UPDATE/DELETE
- Choisir InnoDB pour les clés étrangères
- Sauvegarder régulièrement
---
## Conclusion
<!-- 50 mots max -->
SQL est fondamental pour tout développeur web.
- Maîtriser les opérations CRUD
- Comprendre les jointures et relations
- Utiliser les contraintes pour l'intégrité
- Pratiquer avec phpMyAdmin
---
## Ressources
<!-- 50 mots max -->
- Documentation MySQL : [dev.mysql.com/doc](https://dev.mysql.com/doc/)
- W3Schools SQL : [w3schools.com/sql](https://www.w3schools.com/sql/)
- phpMyAdmin : [phpmyadmin.net](https://www.phpmyadmin.net/)
- MariaDB : [mariadb.org](https://mariadb.org/)
{"lang":"fr","robots":"noindex, nofollow","GA":"UA-68715119-9","title":"SQL","description":"Apprenez à maîtriser le SQL : installation, création et gestion de bases de données, requêtes SELECT, INSERT, UPDATE, DELETE, jointures, contraintes et fonctions, pour manipuler efficacement vos données.","slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\"}","contributors":"[{\"id\":\"aead9b81-25d4-420a-be1e-6a4cbe4f3a32\",\"add\":188272,\"del\":172703,\"latestUpdatedAt\":1768765695627}]"}