SQL JOIN: y a-t-il une différence entre Utiliser, ON ou où?

je me demandais s'il y avait une différence dans la façon dont SQL fonctionne sur ces déclarations de jointure:

SELECT * FROM a,b WHERE a.ID = b.ID

SELECT * FROM a JOIN b ON a.ID = b.ID

SELECT * FROM a JOIN b USING(ID)

y a-t-il une différence de performance? Ou différence algorithmique?

ou est-ce juste du sucre syntaxique?

34
demandé sur halfdan 2011-04-13 23:08:55

5 réponses

il n'y a pas de différence de performances.

cependant, le premier style est ANSI-89 et vous obtiendrez les jambes cassées dans certains magasins. Y compris la mienne. Le second style est ANSI-92 et est beaucoup plus clair.

exemples:

Qu'est-ce que L'assemblage, qu'est-ce que le filtre?

FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
     T1.foo = 'bar' AND T2.fish = 42 AND
     T1.ID = T3.ID

FROM T1 
   INNER JOIN T2 ON T1.ID = T2.ID
   INNER JOIN T3 ON T1.ID = T3.ID
WHERE
   T1.foo = 'bar' AND T2.fish = 42

si vous avez des jointures externes ( =* , *= ) alors le 2ème style fonctionnera comme annoncé. Le premier ne le fera probablement pas et est également déprécié dans SQL Server 2005+

le style ANSI-92 est aussi plus difficile à bollix. Avec l'ancien style, vous pouvez facilement finir avec un produit cartésien (jointure croisée) si vous manquez une condition. Vous obtiendrez une erreur de syntaxe avec ANSI-92.

Edit: un peu plus de clarification

  • la raison pour ne pas utiliser "join the where" (implicite) est les résultats douteux avec jointures externes.
  • si vous utilisez les jointures externes explicites + les jointures internes implicites vous obtiendrez toujours des résultats douteux + vous avez une incohérence dans l'utilisation

il n'est pas seulement syntaxe : il s'agit d'avoir un sémantiquement correct requête

Édition, Décembre 2011

SQL Server logique traitement de la requête de l'ordre est à PARTIR, SUR, de REJOINDRE OÙ...

Donc, si vous mélangez "implicite où les jointures internes" et "explicite des jointures externes", vous n'obtiendrez probablement pas les résultats attendus parce que la requête est ambiguë...

43
répondu gbn 2011-12-20 21:13:29

la différence est la lisibilité et la maintenabilité. SELECT * FROM a JOIN b ON a.ID = b.ID traduit votre intention exacte, Tous au même endroit.

Je ne dirai pas définitivement depuis que je n'ai pas obtenu sous le capot du dernier Optimizer de requête, mais je suis assez sûr que vous êtes à la recherche d'une différence insignifiante dans la performance, s'il y en a.

4
répondu Pete M 2011-04-13 19:19:41

je méprise quand vous forcez une jointure en utilisant WHERE . Pour moi, ça n'a pas l'air bien, un sale piratage. La jointure ANSI correcte est à utiliser sur:

SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID

préfère utiliser ON lors de l'assemblage et WHERE pour filtrer les résultats. Rappelez-vous où est l'une des dernières choses que vous utiliserez en dehors du groupement et de l'ordre Par où vous voulez filtrer vos résultats. Donc vous ne devriez pas rejoindre vos tables en utilisant WHERE car il est très difficile à lire.

SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID
WHERE
    o.Category = 'IT'

à la fin vous (le développeur) pourrait ne pas être autour dans le futur donc lisibilité et maintenabilité aidera l'âme de pour qui doit prendre en charge votre code :).

quand je vois des développeurs utiliser WHERE pour rejoindre leurs tables, c'est généralement une indication qu'ils ne savent pas assez de T-SQL. C'est mon opinion personnelle.

2
répondu JonH 2011-04-13 19:27:02
0
répondu Jason 2017-05-23 12:34:41

c'est une copie de cette question SO: SQL explicite vs implicite rejoint . En général, je pense que l'implicite (où la version) est mauvaise et pas aussi clair que l'explicite (sur la version). Je pense également que l'implicite est déprécié, mais pas à 100% sur celui-ci. Le plan d'exécution est le même pour les deux.

0
répondu scrappedcola 2017-05-23 12:10:26