Exemple : Pokémon
Contents
Exemple : Pokémon#
Diagramme de la base de donnée :
Voici une commande pour afficher le schéma de chaque table :
.schema
Les clés primaires sont indiquées avec PRIMARY KEY
.
Dans la table evolue_en
, FOREIGN KEY(pokemon_evol_id) REFERENCES pokemons(id)
indique que pokemon_evol_id
est une clé étrangère de evolue_en
et qu’elle fait référence à la clé primaire id
de la table pokemons
.
Opérations ensemblistes#
Union : UNION#
Pour obtenir une table contenant les pokémons et les dresseurs :
SELECT * FROM pokemons UNION SELECT * FROM dresseurs
Intersection : INTERSECT#
Il n’y a aucun pokémon qui est aussi un dresseur :
SELECT * FROM pokemons INTERSECT SELECT * FROM dresseurs
Différence : EXCEPT#
Comme aucun pokémon n’est un dresseur, prendre la différence renvoie la même table que pokemons
:
SELECT * FROM pokemons EXCEPT SELECT * FROM dresseurs
Produit cartésien#
Un produit cartésien de deux tables R1 et R2 donne toutes les façons de combiner un enregistrement de R1 et un enregistrement de R2 :
SELECT * FROM types, dresseurs
Remarque : La requête ci-dessus n’a aucun intérêt, c’est juste un exemple de produit cartésien…
Ambigüité#
Si la même colonne est présente dans plusieurs tables, il faut lever l’ambigüité en préfixant par le nom de la table :
SELECT nom FROM pokemons, dresseurs -- nom est un attribut des 2 tables
SELECT pokemons.nom FROM pokemons, dresseurs -- ok
Jointure simple#
Exercice
Écrire une requête SQL pour afficher le nom de chaque pokémon avec son niveau d’évolution.
Renommage#
Il est possible de renommer un attribut avec AS
:
SELECT libelle as nom, pp as point_de_pouvoir
FROM attaques
Remarque : Le as
est facultatif.
Si on renomme une colonne, il faut ensuite y faire référence avec le nouveau nom :
SELECT libelle nom, pp point_de_pouvoir
FROM attaques
WHERE pp > 35
On peut aussi renommer une table :
SELECT d.niveau FROM detient_pokemons d
Exercice
Écrire une requête SQL pour afficher le nom de chaque attaque avec son type.
Jointures multiples#
Si on a besoin de \(3\) tables (ou plus), on peut enchaîner plusieurs JOIN
:
FROM ...
JOIN ... ON ... = ...
JOIN ... ON ... = ...
Exercice
Afficher chaque dresseur avec chacun de ses pokémons.
Auto-jointure#
Parfois, il est nécessaire d’utiliser plusieurs fois la même table, donc de joindre une table avec elle-même.
Exercice
Afficher chaque pokémon avec son évolution et son niveau d’évolution.
LEFT JOIN#
Exercice
Écrire une requête SQL pour afficher chaque pokémon avec son évolution. S’il n’a pas d’évolution, on affichera null
.
GROUP BY#
Exercice
Afficher chaque dresseurs avec son nombre de pokémons et leur niveau moyen
Exercice
Afficher chaque pokémon avec son dresseur et le nombre de pokémons de ce dresseur
Exercice
Afficher les dresseurs qui possèdent au moins 4 pokémons de niveau au moins 30