Les langages SQL Plusieurs tables
Relier deux tables
Ranger les cartes dans la table clients obligerait à prévoir carte_1,
carte_2, carte_3... et à tout casser au quatrième. On crée donc une
seconde table :
CREATE TABLE cartes (
id INTEGER PRIMARY KEY,
titulaire_id INTEGER REFERENCES clients(id),
type TEXT NOT NULL,
numero TEXT NOT NULL,
plafond INTEGER NOT NULL
);
titulaire_id contient l'id d'un client : c'est une clé étrangère.
| id | titulaire_id | type | numero | plafond |
|---|---|---|---|---|
| 1 | 1 | Visa Premier | 4970-1123 | 3200 |
| 2 | 1 | Carte virtuelle | 4970-8821 | 1200 |
| 3 | 3 | Visa Infinite | 4970-4410 | 9500 |
| 4 | 5 | Carte suspendue | 4970-0007 | 0 |
| 5 | 6 | Visa Classic | 4970-1120 | 1800 |
| 6 | 2 | Carte jeune | 4970-0099 | 90 |
| 7 | (vide) | Carte non attribuée | 4970-0000 | 0 |
La jointure
SELECT clients.prenom, cartes.type
FROM clients
JOIN cartes ON cartes.titulaire_id = clients.id;
ON dit à quelle condition deux lignes vont ensemble. Alice a deux
cartes : elle apparaît sur deux lignes. Une jointure renvoie des couples.
Préfixer, et raccourcir
SELECT c.prenom, k.type, k.plafond
FROM clients AS c
JOIN cartes AS k ON k.titulaire_id = c.id
WHERE k.plafond > 1000
ORDER BY k.plafond DESC;
Quand une colonne existe dans les deux tables (id), le préfixe est
obligatoire, sinon la base répond ambiguous column name.
Ce que la jointure laisse de côté
Driss n'a aucune carte : il n'apparaît dans aucun couple. La carte non attribuée disparaît elle aussi. Une jointure ordinaire ne garde que ce qui correspond des deux côtés.
2 exercices pour cette lecon
Les exercices demandent un compte : il faut bien enregistrer votre progression quelque part. La lecture, elle, reste libre. Creer un compte
-
À qui est cette carte moyen lecon a valider
-
Les gros plafonds moyen lecon a valider