Y a-t-il une différence d'efficacité entre une jointure interne explicite et implicite ? Par exemple :
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
vs.
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
Y a-t-il une différence d'efficacité entre une jointure interne explicite et implicite ? Par exemple :
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
vs.
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
Sur le plan des performances, elles sont exactement les mêmes (du moins dans SQL Server).
PS : Sachez que le IMPLICIT OUTER JOIN
est dépréciée depuis SQL Server 2005. (La IMPLICIT INNER JOIN
la syntaxe utilisée dans la question est toujours supportée)
Dépréciation de la syntaxe JOIN "ancien style" : Une chose partielle seulement
@lomaxx, par souci de clarté, pourriez-vous préciser dont la syntaxe des 2 dans la question est dépréciée ?
La syntaxe de jointure implicite est prise en charge d'emblée par SQL Server 2005, mais oui, c'est une mauvaise idée.
Bien que je préfère la syntaxe explicite, pouvez-vous expliquer comment ils peuvent déprécier les jointures implicites ? L'idée qu'elles puissent être dépréciées semble étrange et la suggestion qu'elles ne sont pas supportées par SQL 2K5 n'est pas correcte.
Personnellement, je préfère la syntaxe de jointure car elle indique plus clairement que les tables sont jointes et comment elles sont jointes. Essayez de comparer des requêtes SQL plus importantes où vous sélectionnez 8 tables différentes et où vous avez beaucoup de filtrage dans le where. En utilisant la syntaxe de jointure, vous séparez les parties où les tables sont jointes, de la partie où vous filtrez les lignes.
Sur MySQL 5.1.51, les deux requêtes ont des plans d'exécution identiques :
mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| 1 | SIMPLE | b | ALL | PRIMARY | NULL | NULL | NULL | 986 | |
| 1 | SIMPLE | a | ref | pid | pid | 4 | schema.b.pid | 70 | |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)
mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| 1 | SIMPLE | b | ALL | PRIMARY | NULL | NULL | NULL | 986 | |
| 1 | SIMPLE | a | ref | pid | pid | 4 | schema.b.pid | 70 | |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)
table1
a 166208 lignes ; table2
a environ 1000 lignes.
Il s'agit d'un cas très simple ; cela ne prouve en aucun cas que l'optimiseur de requêtes ne s'embrouillerait pas et ne générerait pas des plans différents dans un cas plus compliqué.
Que se passe-t-il si les noms des tables dans la clause from sont générés à partir des tables utilisées dans la clause where ?
Vous pouvez également effectuer une jointure croisée avec la syntaxe JOIN explicite( stackoverflow.com/a/44438026/929164 ), vous avez probablement voulu dire qu'elle est moins stricte, donc plus sujette aux erreurs de l'utilisateur.
La première réponse que vous avez donnée utilise ce que l'on appelle la syntaxe de jointure ANSI, l'autre est valide et fonctionnera dans toute base de données relationnelle.
Je suis d'accord avec grom pour dire que vous devriez utiliser la syntaxe de jointure ANSI. Comme ils l'ont dit, la raison principale est la clarté. Plutôt que d'avoir une clause where avec de nombreux prédicats, dont certains rejoignent des tables et d'autres restreignent les lignes renvoyées, avec la syntaxe de jointure ANSI, vous faites apparaître clairement les conditions utilisées pour joindre vos tables et celles utilisées pour restreindre les résultats.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
12 votes
Bonne question. Je suis curieux de savoir pourquoi la jointure explicite est utilisée. N'est-il pas possible d'effectuer toutes les requêtes sans elle ?
6 votes
Utilisez le mot-clé EXPLAIN pour connaître la différence entre les deux requêtes... Utilisez JOIN et voyez la différence... Si vous essayez dans une table de plus de 100k enregistrements vous pouvez voir la différence....
0 votes
@andrew Ma question était en fait de savoir si la jointure implicite était une forme de "hack" (comme dans "Une requête impliquant plus d'une table, sans utiliser de jointure ? C'est un hack, n'est-ce pas ?")
3 votes
Ils sont différents, la jonction implicite vous surprendra de temps en temps lorsque vous traiterez des valeurs nulles ; utilisez la jonction explicite et évitez les bogues qui surviennent lorsque "rien n'a changé !".
4 votes
Il n'y a pas de différence.
,
esCROSS JOIN
avec une reliure plus lâche &INNER JOIN
esCROSS JOIN
avecON
commeWHERE
mais une liaison plus étroite. Ce qui importe pour l'exécution, c'est la manière dont le SGBD optimise les requêtes.0 votes
La question devrait donc être de savoir comment chaque SGBD traite ce problème. Par exemple, j'ai lu qu'Oracle recommande d'utiliser les jointures explicites depuis la version 10, mais la documentation ne mentionne pas s'il y a une différence au niveau des performances.
0 votes
@EAmez Cet Oracle explicite vs implicite a pour but d'éviter le vieux style de jointure gauche non-ANSI.
(+)
et non de la virgule comme jointure interne. L'ancienne syntaxe de jointure gauche ne peut pas gérer tous les cas de jointure gauche par mot-clé.0 votes
@philipxy ce que j'essayais de dire était : ok, s'il n'y a pas de différence entre la jointure implicite et explicite comme vous le dites (et comme je le savais déjà), la question est alors de savoir s'il y a une différence dans les performances. Je suppose qu'il n'y a pas de différence, ou qu'il ne devrait pas y en avoir, mais je n'en suis pas sûr. (N'hésitez pas à répondre à cette question implicite).
0 votes
@EAmez Un SGBD qui ne sait pas que ce sont des requêtes trivialement équivalentes a des problèmes de performance plus importants que la façon dont il les implémente. La justification est un chapitre de manuel sur l'implémentation/optimisation des requêtes logiques et physiques relationnelles ainsi que le manuel et/ou la documentation d'implémentation d'une version spécifique d'un SGBD spécifique.
0 votes
J'ai travaillé sur les problèmes SQL de Leetcode ; leur environnement semble fonctionner avec MySQL. Et il n'accepte pas les jointures explicites, préférant les jointures implicites pour les réponses "acceptées". Est-ce spécifique à leetcode, ou est-ce que MySQL ne supporte vraiment pas les jointures implicites ?
0 votes
Question connexe : stackoverflow.com/q/36348349/521799