9
votes

Différence SQL entre dans et ou dans où

Quelle est la différence entre les deux commandes suivantes? xxx

et xxx

lequel est plus rapide? Et sera-t-il différent si ID est un autre type?

sql

1 commentaires

Il serait également bon de savoir quelle implémentation SQL nous parlons ici.


5 Réponses :


-3
votes

Je pense que c'est plus rapide purement parce que vous donnez une requête plus facile que le serveur peut gérer. Juste ma pensée.

Voir le commentaire suivant de Fernando Giovanini dans cet article, il mentionne qu'en rend non seulement plus lisible, mais aussi plus rapide: http://www.ajaxline.com/32-tips-a-speed-up-your-mysql-queries#Comment-325677194


9 commentaires

Il n'est pas possible de dire que chose est plus rapide que toute autre chose que lorsque vous utilisez SECMatrix comme '% 8: 0%' ou SECMatrix comme '% 8: 0%' ou Secmatrix comme '% 4: 0%' ou SECMatrix comme '% 2: 0%' dans votre requête. Il a l'air au moins drôle (ou studiide) ;-)


Personnellement, je vous conseillerais de ne jamais faire référence à des inconnus avec des déclarations sans aucune preuve (surtout quand il est complètement faux)


Je n'ai jamais dit que ce qu'il a dit était vrai, je n'ai pas dit que ce que j'ai dit était vrai. Tout ce que j'ai fait était de donner mes pensées et de faire référence à un article. C'est pourquoi plusieurs personnes placent des réponses, tout le monde a sa propre opinion et / ou son expérience. Voir la vue d'ensemble et vous saurez de quel côté gagnent.


La programmation n'est pas une science sur les pensées aléatoires. Il y a une réponse à la question et il n'a rien à voir avec des suppositions aléatoires. "Je n'ai jamais déclaré que ce qu'il a dit était vrai" --- Toute raison de répondre si vous n'êtes pas sûr que vous soyez correct et que vous êtes sûr même un gars que vous parlez de corriger ??


Bien sûr, il y a une réponse à la question, je ne l'avais pas, mais j'ai eu quelque chose à dire sur le sujet. Ce n'est pas un crime que je crois? Heureusement, il y avait des gens qui connaissaient de meilleures réponses, si j'avais vu que je n'aurais rien dit. Tout ce que j'ai fait était au cas où il n'allait pas avoir de réponse de personne qu'il avait la pensée de quelqu'un sur le sujet.


"Au cas où il n'allait pas avoir une réponse de quiconque qu'il aurait eu la pensée de quelqu'un sur le sujet" - - mauvaises pensées pire que pas de pensées du tout. Il y a une zillion de terribles mentions et d'articles sur Internet, et il n'ya aucune raison de les faire référence simplement parce que personne n'a répondu.


Ahem, je suis désolé monsieur, mais je pense que vous essayez simplement de me frapper sur le fait que ma réponse était fausse. Comment saurais-je savoir que ma pensée et ma source était fausse? Nous ne le découvririons que lorsque d'autres personnes publient la bonne réponse, ce qui s'est passé. Pas besoin de faire un fluzzer.


"Comment saurais-je savoir que ma pensée et ma source était fausse" --- Il y a une grande règle - tu n'es pas sûre dans quelque chose - alors supposons que tu es tort. Il n'y a aucune preuve de mention / affirmation - supposons que ce soit aussi. C'est simple, n'est-ce pas? ;-) "Pas besoin de faire un fluzz sur celui-ci" --- J'essaie simplement de dire que faire référence à des pensées étranges qui pire aussi pire, tant que cela devient la source d'information non argumentative et sans confiance pour les développeurs


Je termine cette discussion comme je peux voir que cela nous prends nulle part: P NE PAS PAS D'accord sur quoi que ce soit alors allons-nous suivre :)



15
votes

ils sont sémantiquement identiques.

dans est juste un raccourci pour une chaîne de déclarations d'égalité comme dans votre deuxième exemple. La performance doit également être identique.

Le type n'aurait pas d'importance, il évaluera toujours à une chaîne de pales égalités.

Il y a une différence lorsque vous utilisez pas dans et des données pouvant être null , bien que - A null n'évaluera pas faux pour Un pas dans la comparaison , vous pouvez donc obtenir des lignes que vous ne vous attendiez pas dans le jeu de résultats.

Par exemple:

Sélectionnez "passé!" Où null pas dans ('foo', 'bar')

La requête ci-dessus ne retournera pas une ligne, même si à la valeur faciale null n'est ni 'foo' ou 'bar' - ceci est Parce que null est un état inconnu et SQL ne peut pas dire avec certitude que la valeur inconnue est pas l'une des valeurs répertoriées.


6 commentaires

Il y a une différence lorsque vous n'utilisez pas dans - comment? pas dans === f! = 1 et f! = 2 . Et les deux expressions à nouveau sont optimisées de la même manière (terrible)


@zerkms - pas avec null , au moins dans SQL Server. Sélectionnez 1 où NULL PAS IN ('FOO', 'BAR') - Vous ne recevrez pas de ligne, mais vous vous attendez depuis NULL N'EST. ou bar


Ah, je pensais que vous voulez dire qu'il existe 2 cas différents: lorsque vous utilisez pas dans et quand il y a un null à l'intérieur des parenthèses


@zerkms - non, lorsque vous comparez null à un pas dans - il n'évaluera pas vrai puisque SQL ne peut pas dire avec certitude que le null < / code> n'est définitivement pas une de ces valeurs


Hehe je sais que, je viens de dire que ce n'était pas évident (pour moi) de votre message - que vous avez dit ce que vous avez dit ;-)


@zerkms - Assez juste, a ajouté un exemple pour clarifier.



1
votes

Cela dépend de la mise en œuvre et du moteur d'optimiseur SMDM spécifiques.

Mais vous devriez avoir une bonne idée de penser qu'ils sont sémantiquement similaires et optimisés de la même manière.

L'optimisation ne dépendrait pas du type de champ


0 commentaires

1
votes

au moins dans SQLServer les deux donne le même plan d'exécution !!!


4 commentaires

Je pense que la question pose la question en termes de réglage et non d'opération.


@Brian est ma réponse complète? Dans tous les termes, les requêtes sont égales, sauf dans la lisibilité Sorcière est différente différente


@Brian l.: "Lequel est plus rapide?" --- C'est une question claire et cette réponse, pour être claire, la répète partiellement (même si je n'aime pas ça ;-) +1 De toute façon


@zerkms, merci. est parfois difficile pour les gars non anglais



0
votes

Chaque SGBD suffisamment de préformes suffisamment fiables dans l'opérateur beaucoup mieux en raison de la structure de données. De plus, lorsque la DB calcule un plan SQL, elle ne traduit pas nécessairement la forme ou la forme sous la forme, juste parce que l'opérateur pourrait combiner différentes conditions. De la perspective logique, ils sont toutaux identiques.


0 commentaires