TheRec
jeudi 1 mars 2007 à 09:25
Bonjour,
CODE
SELECT nom, prenom,ville,description FROM membres INNER JOIN villes ON membres.ville=ville.nom;
Premièrement, cette requête (et l'autre également) révèle probablement une erreur lors de la modélisation de ta base de données. Les tables sur lesquelles tu veux faire des jointures doivent avoir une clé primaire (unique) et une ou des clés étrangères, sous la forme d'"INTEGER" (nombre entier), chaque table aura un
id et éventuellement une ou plusieurs clés étrangères. Dans ton cas la table
membres aura une clé étrangère nommée par exemple
ville_id qui fera référence à la table
ville qui aura un champ id (unique pour chaque enregistrement).
Les jointures se font sur ces champs et non sur des champs de type "VARCHAR" (comme je suppose
ville.nom et
membres.ville) et pour au moins deux raisons, lier des tables sur un champs entier est beaucoup plus sûr (pas besoin de s'inquiéter de la collation, l'encodage, etc. car ce sont des entiers) et car sur ces champs il est nécessaire de définir un INDEX (c'est d'ailleurs ainsi qu'il sont "différenciés" des autres) et c'est sur ce point que tu gagnes énormément en performances. Les moteurs de bases de données favorisent un accès rapide aux données qui sont "indexées".
Concernant la deuxième syntaxe qui fonctionne mais dont le but n'est pas tout à fait équivalent et pour citer un bon article sur les types de jointures, dont je te conseille la lecture :
CITATION
Dans la mesure du possible, utilisez toujours un opérateur de jointure normalisé Sql2 (mot clef JOIN).
En effet :
- Les jointures faites dans la clause WHERE (ancienne syntaxe de 1986 !) ne permettent pas de faire la distinction de prime abord entre ce qui relève du filtrage et ce qui relève de la jointure.
- Il est à priori absurde de vouloir filtrer dans le WHERE (ce qui restreint les données du résultat) et de voiloir "élargir" ce résultat par une jointure dans la même clause WHERE de filtrage.
- La lisibilité des requêtes est plus grande en utilisant la syntaxe à base de JOIN, en isolant ce qui est du filtrage et de la jointure, mais aussi en isolant avec clarté chaque condition de jointures entre chaque couples de table.
- L'optimisation d'exécution de la requête est souvent plus pointue du fait de l'utilisation du JOIN.
- Lorsque l'on utilise l'ancienne syntaxe et que l'on supprime la clause WHERE a des fins de tests, le moteur SQL réalise le produit cartésiens des tables ce qui revient la plupart du temps à mettre à genoux le serveur !
Source :
Le SQL de A à Z - le SELECT sur plusieurs tablesBonne continuation.