Dans ce chapitre, nous allons voir le concept de table dérivée. La table dérivée est en réalité une table virtuelle. Elle n’existe pas dans la base de données. Elle est en effet stockée temporairement à l’aide d’un alias.
1. Table dérivée
Supposons que nous aimerions obtenir le nombre de likes et le nombre de commentaires qu’a chaque post (article).
SELECT P.ID, P.post_title, derivLikes.nbLikes, derivComm.nbComments
FROM Posts AS P
LEFT JOIN
( SELECT post_ID, COUNT(*) AS nbLikes
FROM Likes
GROUP BY post_ID ) AS derivLikes ON P.ID = derivLikes.post_ID
LEFT JOIN
( SELECT post_ID, COUNT(*) AS nbComments
FROM Comments
GROUP BY post_ID ) AS derivComm ON P.ID = derivComm.post_ID
On obtient le tableau suivant.
{{h}} |
---|
{{r}} |
Explicitons comment fonctionne la construction d’une table dérivée. Ici deux tables dérivées ont été construites. La première contient le nombre de likes qu’a chaque post et la seconde le nombre de commentaires qu’a chaque post. On assigne un nom à ces tables dérivées avec un alias. Dans le cas présent, derivLikes
et derivComm
. Finalement, on fait des jointures externes pour agréger les données de la table Posts et des deux tables dérivées.
2. Nettoyage
Maintenant on veut juste afficher un 0
lorsqu’aucune correspondance n’a été trouvée dans les jointures externes. On peut utiliser la fonction IFNULL
pour ça.
SELECT P.ID, P.post_title, IFNULL(derivLikes.nbLikes,0) AS Likes, IFNULL(derivComm.nbComments,0) AS Comments
FROM Posts AS P
LEFT JOIN
( SELECT post_ID, COUNT(*) AS nbLikes
FROM Likes
GROUP BY post_ID ) AS derivLikes ON P.ID = derivLikes.post_ID
LEFT JOIN
( SELECT post_ID, COUNT(*) AS nbComments
FROM Comments
GROUP BY post_ID ) AS derivComm ON P.ID = derivComm.post_ID
On obtient le tableau suivant.
{{h}} |
---|
{{r}} |
Récap
Une table dévivée est le résultat d’une requête SQL qui est temporairement stocké à l’aide d’un alias.
Tout comme pour les sous-requêtes, les tables dérivées sont utilisées lorsqu’un résultat intermédiaire est nécessaire pour accomplir une certaine principale.
La fonction IFNULL
mentionnée ci-dessus est la manière de faire avec MySQL et MariaDB uniquement. Les autres SGDBR‘s ont une façon de faire qui diffère légèrement.