FAQ MySQLConsultez toutes les FAQ

Nombre d'auteurs : 16, 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.


SommaireSyntaxe SQL et structure des donnéesJointures (2)
précédent sommaire suivant
 

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 ;
ou bien cela :

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).

Mis à jour le 14 février 2006 pcaboche

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);
Avant, le SELECT était valide car "t1,t2" était vu implicitement comme (t1,t2). Maintenant le JOIN a la priorité, donc les opérandes de la clause ON sont t2 et t3. Comme t1.i1 n'appartient à aucune des opérandes, on obtient une erreur "Unknown column 't1.i1' in 'on clause'".
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);
Vous pouvez aussi préférer l'utilisation de JOIN à celle de l'opérateur virgule :

Code sql : Sélectionner tout
SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

Mis à jour le 21 juin 2006 pcaboche

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2017 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.

 
Contacter le responsable de la rubrique MySQL