Cours : le SQL
La représentation des données
Tableau basique
Titre | Année | Réalisateur |
|---|---|---|
Alien, le 8ème passager | 1979 | Ridley Scott |
Aliens, le retour | 1986 | James Cameron |
Aliens 3 | 1992 | David Fincher |
Alien, la résurrection | 1997 | Jean-Pierre Jeunet |
Titanic | 1997 | James Cameron |
Gladiator | 2000 | Ridley Scott |
Un tableau simple, chaque ligne représente un film, chaque colonne une caractéristique du film.
Tableau avec un identifiant unique
ID | Titre | Année | Réalisateur |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | Ridley Scott |
2 | Aliens, le retour | 1986 | James Cameron |
3 | Aliens 3 | 1992 | David Fincher |
4 | Aliens, la résurrection | 1997 | Jean-Pierre Jeunet |
5 | Titanic | 1997 | James Cameron |
6 | Gladiator | 2000 | Ridley Scott |
On ajoute un identifiant unique à chaque film et sa valeur augmente pour chacun des films.
Ajoutons-en un :
ID | Titre | Année | Réalisateur |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | Ridley Scott |
2 | Aliens, le retour | 1986 | James Cameron |
3 | Aliens 3 | 1992 | David Fincher |
4 | Aliens, la résurrection | 1997 | Jean-Pierre Jeunet |
5 | Titanic | 1997 | James Cameron |
6 | Gladiator | 2000 | Ridley Scott |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | Jean-Pierre Jeunet |
Base de données
Si je veux préciser des choses sur les réalisateurs, plutôt que de me répéter dans le tableau des films, je vais créer un autre tableau, qui lui concerne les réalisateurs. Il aura aussi son propre identifiant unique qui ne concerne que ce tableau.
Films
ID | Titre | Année | Réalisateur |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | Ridley Scott |
2 | Aliens, le retour | 1986 | James Cameron |
3 | Aliens 3 | 1992 | David Fincher |
4 | Aliens, la résurrection | 1997 | Jean-Pierre Jeunet |
5 | Titanic | 1997 | James Cameron |
6 | Gladiator | 2000 | Ridley Scott |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | Jean-Pierre Jeunet |
Réalisateurs
ID | Nom | Pays |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
Base de données relationnelle
Maintenant que nous avons deux tableaux avec des identifiants uniques, nous allons pouvoir utiliser ces identifiants pour créer des relations entre nos tableaux :
Films
ID | Titre | Année | Réalisateur |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | 1 |
2 | Aliens, le retour | 1986 | 2 |
3 | Aliens 3 | 1992 | 3 |
4 | Aliens, la résurrection | 1997 | 4 |
5 | Titanic | 1997 | 2 |
6 | Gladiator | 2000 | 1 |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | 4 |
Réalisateurs
ID | Nom | Pays |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
Une base de données c'est donc ça : une série de tableaux, qu'on appelle tables, et les relations qui les lient.
SQL et MySQL
Il existe de nombreux moyens de gérer des bases de données, nous allons utiliser MySQL.
MySQL
MySQL est un SGBD ( Système de Gestion de Base de Données), plus exactement même c'est un SGBDR (Système de Gestion de Bases de Données Relationnelles).
Pourquoi on utilise celui-ci ? C'est le plus connu et le plus courant, tout bêtement.
SQL
Le SQL (Structured Query Language) est un language qui nous permet de discuter avec MySQL.
CRUD
Nous allons utiliser MySQL pour faire 4 grands types d'actions :
Create
Pour créer des entrées dans les tables.
Read
Pour lire des entrées dans les tables
Update
Pour modifier des entrées dans les tables
Delete
Pour supprimer des entrées dans les tables
SELECT : lire des données
Nos tables d'exemple
movies
id | title | year | director |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | 1 |
2 | Aliens, le retour | 1986 | 2 |
3 | Aliens 3 | 1992 | 3 |
4 | Aliens, la résurrection | 1997 | 4 |
5 | Titanic | 1997 | 2 |
6 | Gladiator | 2000 | 1 |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | 4 |
directors
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
SELECT
Sélectionner une colonne
C'est la version la plus simple possible d'un SELECT.
Nous enverra chacun des titres de la table movies.
Sélectionner plusieurs champs
Il suffit de lister les colonnes, séparées par une virgule.
Sélectionner toutes les colonnes
On utilise le raccourci *.
WHERE
Si on veut sélectionner des colonnes sous certaines conditions, il faut utiliser une clause WHERE dans notre SELECT.
Nous renverra toutes les colonnes des films du réalisateur 2.
Nous renverra toutes les colonnes des films après 1999 (Gladiator).
Si vous avez besoin de conditions multiples, vous pouvez utiliser AND et OR.
nous renverra Le fabuleux destin d'Amélie Poulain.
ORDER BY
Par défaut les entrées seront retournées du plus petit id au plus grand mais nous pouvons modifier ce comportement avec ORDER BY.
Soit en changeant la colonne qui sert d'ordre :
soit en modifiant l'ordre avec ASC (du plus petit au plus grand) ou DESC (du plus grand au plus petit) :
LIMIT
En cas de besoin nous pouvons limiter le nombre de résultats retournés (par exemple pour économiser les ressources ou mettre en place une pagination) :
retournera :
id | title | year | director |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | 1 |
2 | Aliens, le retour | 1986 | 2 |
3 | Aliens 3 | 1992 | 3 |
Et toutes ces commandes peuvent être mélangées :
id | title | year | director |
|---|---|---|---|
7 | Le fabuleux destin d'Amélie Poulain | 2001 | 4 |
6 | Gladiator | 2000 | 1 |
Exercices SELECT
INSERT : Ajouter des données
Notre table d'exemple
directors
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
Si je veux ajouter une entrée à la table directors, je dois utiliser INSERT
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
5 | Céline Sciamma | France |
Et si je veux ajouter plusieurs entrées :
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
5 | Céline Sciamma | France |
6 | Lana Wachowski | USA |
7 | Lilly Wachowsky | USA |
Exercices INSERT
UPDATE : Modifier les données
Notre table d'exemple
directors
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
5 | Céline Sciamma | France |
6 | Lana Wachowski | USA |
7 | Lilly Wachowsky | USA |
Une erreur s'est glissée dans la table. Lilly Wachowski qui est la soeur de Lana prend un i et pas un y à la fin de son nom de famille.
Nous allons corriger ceci avec un UPDATE:
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
5 | Céline Sciamma | France |
6 | Lana Wachowski | USA |
7 | Lilly Wachowski | USA |
Si vous voulez faire le même update sur plusieurs champs, c'est votre clause WHERE qui va devoir être plus générique. Attention ce pendant, plus elle est générale, plus vous risquez de faire des bêtises.
id | name | country |
|---|---|---|
1 | Ridley Scott | États-Unis |
2 | James Cameron | Canada |
3 | David Fincher | États-Unis |
4 | Jean-Pierre Jeunet | France |
5 | Céline Sciamma | France |
6 | Lana Wachowski | États-Unis |
7 | Lilly Wachowski | États-Unis |
Exercices UPDATE
DELETE Supprimer des données
Notre table d'exemple
movies
id | title | year | director |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | 1 |
2 | Aliens, le retour | 1986 | 2 |
3 | Aliens 3 | 1992 | 3 |
4 | Aliens, la résurrection | 1997 | 4 |
5 | Titanic | 1997 | 2 |
6 | Gladiator | 2000 | 1 |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | 4 |
Si nous voulons supprimer une entrée, nous allons utiliser DELETE:
id | title | year | director |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | 1 |
2 | Aliens, le retour | 1986 | 2 |
4 | Aliens, la résurrection | 1997 | 4 |
5 | Titanic | 1997 | 2 |
6 | Gladiator | 2000 | 1 |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | 4 |
Encore une fois il faudra se méfier de la clause WHERE si elle est trop générale, vous allez effacer plus d'entrées que ce que vous vouliez, et il n'y a pas de Ctrl+Z sur une base de données.
Exercices DELETE
JOIN Utiliser les relations
Nos tables d'exemple
movies
id | title | year | director |
|---|---|---|---|
1 | Alien, le 8ème passager | 1979 | 1 |
2 | Aliens, le retour | 1986 | 2 |
3 | Aliens 3 | 1992 | 3 |
4 | Aliens, la résurrection | 1997 | 4 |
5 | Titanic | 1997 | 2 |
6 | Gladiator | 2000 | 1 |
7 | Le fabuleux destin d'Amélie Poulain | 2001 | 4 |
directors
id | name | country |
|---|---|---|
1 | Ridley Scott | USA |
2 | James Cameron | Canada |
3 | David Fincher | USA |
4 | Jean-Pierre Jeunet | France |
Nous avons donc deux tables dont la relation est établie entre les directors et les movies.
En effet, dans la table movies, la colonne director contient l' id du director correspondant.
Dans nos requêtes pour utiliser cette relation, nous allons joindre les tables en utilisant JOIN.
title | name |
|---|---|
Alien, le 8ème passager | Ridley Scott |
Aliens, le retour | James Cameron |
Aliens 3 | David Fincher |
Aliens, la résurrection | Jean-Pierre Jeunet |
Titanic | James Cameron |
Gladiator | Ridley Scott |
Le fabuleux destin d'Amélie Poulain | Jean-Pierre Jeunet |
Vous pouvez utiliser ce que vous avec appris pour les SELECT avec des jointures. Par exemple, une clause WHERE:
title | name |
|---|---|
Aliens, la résurrection | Jean-Pierre Jeunet |
Le fabuleux destin d'Amélie Poulain | Jean-Pierre Jeunet |