FAQ MySQLConsultez toutes les FAQ
Nombre d'auteurs : 15, nombre de questions : 155, dernière mise à jour : 22 avril 2014 Ajouter une question
Cette FAQ a été conçue à partir des questions fréquemment posées sur le forum MySQL de Developpez.com. Elle ne prétend pas à être exhaustive et peut contenir des erreurs occasionnelles. Si vous relevez une coquille, n'hésitez pas à nous le faire savoir.
Pour participer à cette FAQ, veuillez envoyer vos réponses sur le forum.
Pour faire une jointure entre 2 tables, est-il préférable de faire ceci :
Code sql : | Sélectionner tout |
1 2 3 | SELECT * FROM tableA, tableB WHERE tableA.refB = tableB.id ; |
Code sql : | Sélectionner tout |
1 2 3 4 | SELECT * FROM tableA INNER JOIN tableB ON tableA.refB = tableB.id ; |
De nombreuses personnes choisiront la solution avec le WHERE parce que "c'est moins long à écrire". Ceci n'est pas une raison suffisante !
Il vaut mieux utiliser le INNER JOIN pour les raisons suivantes :
- C'est une jointure que vous souhaitez faire, pas un produit
cartésien - Avec le INNER JOIN, on voit très clairement comment sont
faites les jointures - Le type de jointure (INNER, LEFT OUTER...) apparait de
manière explicite - Le INNER JOIN est beaucoup plus propre: on fait très
clairement la différence entre les conditions de jointures (dans le
ON) et les conditions de restriction (dans le WHERE) - Cette clarté permet une meilleure localisation des bugs (en particulier sur des requêtes faisant intervenir
plusieurs jointures) - Pour effectuer certaines optimisations, le
SGBD se base sur les jointures. Si à la place vous utilisez un produit
cartésien, aucune optimisation ne sera effectuée
Il faut donc utiliser le INNER JOIN et adopter une indentation permettant une lecture facile de la requête SQL (nombreux sauts de lignes).
Avant MySQL 5, l'opérateur virgule (,) et JOIN avaient la même priorité, donc la jointure "t1, t2 JOIN t3" était interprétée comme "((t1, t2) JOIN t3)". Dans les nouvelles versions, JOIN est prioritaire et l'expression est interprétée comme "(t1, (t2 JOIN t3))".
Ce changement affecte les requêtes utilisant une clause ON, parce que cette clause peut uniquement faire référence aux colonnes des opérandes du JOIN, et le changement de priorité modifie ce qui est considérécomme opérande.
Exemple:
Code sql : | Sélectionner tout |
1 2 3 4 5 6 7 | CREATE TABLE t1 (i1 INT, j1 INT); CREATE TABLE t2 (i2 INT, j2 INT); CREATE TABLE t3 (i3 INT, j3 INT); INSERT INTO t1 VALUES(1,1); INSERT INTO t2 VALUES(1,1); INSERT INTO t3 VALUES(1,1); SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3); |
Pour contourner cela, regroupez les deux premières tables explicitement avec des parenthèses pour que les opérandes de la clause ON soient (t1,t2) et t3:
Code sql : | Sélectionner tout |
SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
Code sql : | Sélectionner tout |
SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.