Différence entre table temporaire et vue

La table temporaire est une construction volatile, stockée dans la mémoire du serveur Mysql, cette dernière sera effacée dès le reboot du serveur. On a recours à ce type de création lors de requêtes complexes, cela permet de décomposer cette dernière en plusieurs requêtes simplifiée. La table temporaire, est obtenu via une requête, union, jointure d'autres tables de la base.

Contrairement à une table temporaire, la vue est un objet permanent dans la base. C'et objet est généralement en lecture seule, sauf preuve du contraire.
La vue est obtenue de la même façon que la table temporaire avec quelques différences syntaxiques.

Comment puis-je choisir entre les deux ?

C'est très simple, si vous désirez obtenir un résultat complexe et que ce dernier doit être décomposé opter pour la table temporaire.

Prenons un exemple (fantaisiste) pour illustrer l'utilité de la vue. La mairie de paris possède une très grande base de données avec tous les détails sur chaque personne la composant. Une société X experte  dans les données statistiques à besoin des données de la mairie pour classer toutes les mairies de France selon différents aspects. Développeurs de la mairie et développeurs de la société X sont amenés à se rencontrer. Dans un soucis de confidentialité, les développeurs de la mairie ne donnent accès seulement à certaine donnée qui  se  trouve souvent être le produit de multiples requêtes. Enfin le travail de la société X se trouve simplifiée puisqu'elle peut travailler uniquement sur ce qu'il la concerne.

Table temporaire*

 L'exemple qui suit n'est pas réellement justifié mais j'ai rien d'autre sous la main pour illustrer l'utilité des tables temporaires.

D'après la base de données  on souhaite obtenir le nom des projets avec plus de 4 employés. Evidemment dans notre cas l'utilisation de la table temporaire n'est pas indispensable, poursuivons quand même. 

Table temporaire

Voici la requête en 2 parties.
  1. CREATE TABLE projetCount AS SELECT count(nom) Compte, nomProjet FROM Employe A, Participation B, Projet C WHERE A.matricule = B.matricule AND B.codeProjet = C.codeProjet GROUP BY nomProjet
  2. SELECT nomProjet FROM projetCount WHERE Compte > 4

Un telle requête ne s'obtient pas instantanément, même si cette dernière reste assez simple.

SELECT count(nom) Compte, nomProjet FROM Employe A, Participation B, Projet C WHERE A.matricule = B.matricule AND B.codeProjet = C.codeProjet GROUP BY nomProjet

Cette requête nous permet de récupérer une sélection de  projet avec le nombre d'employés pour chaque  projet(utilisation de jointure). Pour pouvoir comptabiliser le nombre d'exmployé, l'utilisation du GROUP BY est indispensable. A l'aide de CREATE TABLE projetCount AS on stocke le résultat obtenu dans une nouvelle table. Et enfin avec la deuxième partie de la requête on récupère uniquement les projets  ayant plus de 4 employés.

Avec Clause HAVING

Plus simple et plus rapide on optera pour :

SELECT count(nom) Compte, nomProjet FROM Employe A, Participation B, Projet C WHERE
A.matricule = B.matricule AND B.codeProjet = C.codeProjet GROUP BY nomProjet HAVING (count(nom)>4)


A l'aide de la "condition" HAVING on s'acquitte de bien des manipulations.

Temps d'exécution

  • Par création de table intermédiaire : 0.0097 sec
  • Avec clause having : 0.0003 sec
Dois-je vraiment commenter le résultat ?


*A utiliser vraiment si c'est justifié

Vue

En cours de rédaction

http://dev.mysql.com/doc/refman/5.0/fr/create-view.html