<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}]"}
    350 views