Dois-je utiliser! = Ou <> pour différent de T-SQL?

801

J'ai vu SQLque ça utilise à la fois !=et <>pour pas égal . Quelle est la syntaxe préférée et pourquoi?

J'aime !=, car <>ça me rappelle Visual Basic.

Bob le concierge
la source
Portabilité du code. Si vos exigences sont facilement satisfaites par ANSI SQL, il est préférable de l'utiliser. Vous pouvez utiliser le même code dans toutes les bases de données. Par exemple. Un auteur de livre SQL qui souhaite illustrer le SQL de base à l'aide d'un exemple de code.
Steam
1
Je voudrais ajouter un exemple où avoir uniquement du code SQL ANSI peut être un problème - SQL standard prend en charge les options NULLS FIRST et NULLS LAST pour contrôler le tri des NULL, mais T-SQL ne prend pas en charge cette option.
Steam
Pas besoin de rouvrir. La question est marquée d' un double, vient de prolonger encore par une option supplémentaire , NOT (A = B).
TLama
@Steam, vous devez spécifier à quelle version de ansi sql vous vous référez exactement. Certaines de ces versions nécessitent même de spécifier le niveau de compatibilité ou les parties exactes du standart. Lequel d'entre eux a présenté NULLS FIRST et NULLS LAST?
Gherman

Réponses:

539

Techniquement, ils fonctionnent de la même manière si vous utilisez SQL Server AKA T-SQL. Si vous l'utilisez dans des procédures stockées, il n'y a aucune raison de performance à utiliser l'un sur l'autre. Cela revient alors à la préférence personnelle. Je préfère utiliser <> car il est conforme ANSI.

Vous pouvez trouver des liens vers les différentes normes ANSI à ...

http://en.wikipedia.org/wiki/SQL

DBAndrew
la source
41
J'avais toujours préféré utiliser en !=raison de son existence dans tous les langages influencés par C que j'ai utilisés, et parce que la documentation Python dit: "Les formes <>et !=sont équivalentes; pour la cohérence avec C, !=est préférable; où !=mentionné ci-dessous <>est également accepté. L' <>orthographe est considérée comme obsolète. " Mais SQL n'est pas Python!
Iain Samuel McLean Elder
24
J'aime utiliser <> car cela me rappelle XML. Mais SQL n'est pas XML!
Rob Grant
32
Oui; Microsoft se recommandons d' utiliser <>plus !=spécifiquement pour la conformité ANSI, par exemple dans le kit de formation Microsoft Press pour examen 70-461, « Interrogation Microsoft SQL Server », disent - ils « À titre d'exemple quand choisir la forme standard, T-SQL prend en charge les deux « non égal à "opérateurs: <> et! =. Le premier est standard et le second ne l'est pas. Ce cas devrait être un nobrainer: optez pour le standard!"
Matt Gibson du
10
J'aime <> parce que c'est plus facile à taper.
user2023861
731

La plupart des bases de données prennent en charge != (langages de programmation populaires) et<> (ANSI).

Bases de données qui prennent en charge à la fois !=et <>:

Bases de données qui prennent en charge l'opérateur standard ANSI, exclusivement :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>
Bill Karwin
la source
La requête Django ORM correspond à NOT (a = b)au lieu de (a <> b)ou (a != b). Est-ce la même chose en interne?
utilisateur
7
@buffer, ils sont logiquement les mêmes, c'est-à-dire qu'ils correspondraient ou excluraient le même ensemble de lignes. Mais si une marque de SGBDR particulière l'optimise, cela dépend de la mise en œuvre. Cela dit, je serais surpris s'il y avait des différences entre les marques de base de données.
Bill Karwin
note complémentaire: LINQ en C # que vous devez utiliser! =
Tom Stickel
! = est pris en charge par IBM DB2 LUW 10.5+
Cristi S.
10
@TomStickel LINQ en C # n'est pas SQL.
Craig
109

'<>'est issu de la norme SQL-92 et '!='est un opérateur T-SQL propriétaire . Il est également disponible dans d'autres bases de données, mais comme il n'est pas standard, vous devez le prendre au cas par cas.

Dans la plupart des cas, vous saurez à quelle base de données vous vous connectez donc ce n'est pas vraiment un problème. Au pire, vous devrez peut-être faire une recherche et remplacer dans votre SQL.

Adam Lassek
la source
J'ai vu mysql sql l'utiliser aussi
Bob The Janitor
3
Pouvons-nous continuer à appeler une extension aussi répandue du langage standard un langage propriétaire ? À ce stade, il semble simplement que la norme devrait être mise à jour pour exiger ou au moins autoriser les deux syntaxes.
Johan Boulé
3
@JohanBoule bien, il existe une norme écrite pour SQL et à ma connaissance !=n'en fait pas partie. Même si, à toutes fins pratiques, il s'agit d'une norme de facto, nous ne devons pas confondre ce qui sont et ne sont pas des fonctionnalités standard.
Adam Lassek
24

Ils sont à la fois valides et identiques par rapport à SQL Server ,

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation

madcolor
la source
C'est spécifique à SQL Server. Certes, il pose des questions sur SQL Server, mais pouvez-vous trouver une référence de spécification ANSI pour voir si elle est garantie d'être portable pour ceux d'entre nous qui aiment savoir ce genre de chose?
Joel Coehoorn
6
@Joel Coehoorn, si vous portez très votre code T-SQL "<>" et "! =" Sera le moindre de vos soucis !!
KM.
1
Le portage n'est pas le problème - c'est quand, en tant que développeur, vous devez faire des allers-retours entre les environnements. La cohérence est bonne.
Mark Ransom
20

Il semble que Microsoft préfère <>lui-même !=comme en témoignent leurs contraintes de table. Personnellement, je préfère utiliser !=car je lis clairement que "pas égal", mais si vous le saisissez [field1 != field2]et l'enregistrez en tant que constrait, la prochaine fois que vous l'interrogerez, il s'affichera comme [field1 <> field2]. Cela me dit que la bonne façon de procéder est <>.

Kyle
la source
15

!=, bien qu'il ne soit pas ANSI, est davantage dans le véritable esprit de SQL en tant que langage lisible. Ça crie pas égal. <>dit que c'est pour moi (moins que, plus grand que) ce qui est juste bizarre. Je sais que l'intention est que ce soit inférieur ou supérieur à donc pas égal, mais c'est une façon très compliquée de dire quelque chose de vraiment simple.

Je viens de devoir prendre de longues requêtes SQL et les placer avec amour dans un fichier XML pour tout un tas de raisons stupides dans lesquelles je ne vais pas entrer.

Qu'il suffise de dire que XML n'est pas en panne <>du tout et j'ai dû les changer !=et me vérifier avant de me ruiner.

Fat Albert
la source
6
pourquoi pas simplement CDATA? que se passe-t-il lorsque votre requête contient du XML?
Janus Troelsen du
12

Vous pouvez utiliser celui que vous aimez dans T-SQL. La documentation indique qu'ils fonctionnent tous les deux de la même manière. Je préfère !=, car il se lit "pas égal" à mon esprit (basé sur C / C ++ / C #), mais les gourous de la base de données semblent préférer <>.

Steve
la source
10

Je comprends que la syntaxe C !=est dans SQL Server en raison de son héritage Unix (à l'époque Sybase SQL Server, avant Microsoft SQL Server 6.5).

Karl
la source
7

Une alternative serait d'utiliser l'opérateur NULLIF autre que <>ou !=qui renvoie NULL si les deux arguments sont NULLIF égaux dans Microsoft Docs . Je pense donc que la clause WHERE peut être modifiée pour <>et !=comme suit:

NULLIF(arg1, arg2) IS NOT NULL

Comme je l'ai constaté, l'utilisation <>et !=ne fonctionne pas pour la date dans certains cas. Par conséquent, l'utilisation de l'expression ci-dessus fait le nécessaire.

jitendrapurohit
la source
6
Je ne sais pas si cette fonction fonctionnerait aussi bien qu'en ce <>qui concerne l'utilisation de l'index dans tous les cas d'angle. D'ailleurs, la lisibilité est certainement bien pire ...
Lukas Eder
Comme je l'ai mentionné dans la réponse, cela a fonctionné pour moi sur les champs de date là-bas en 2014. Je ne sais pas quelle était la clause / condition qui restreignait les autres réponses, mais en regardant certaines des notes positives, cela semble aider les autres aussi.
jitendrapurohit
1

J'ai préféré utiliser !=plutôt que <>parce que j'utilise parfois la <s></s>syntaxe pour écrire des commandes SQL. L'utilisation !=est plus pratique pour éviter les erreurs de syntaxe dans ce cas.

Andrea Antonangeli
la source
-6

Ils sont tous les deux acceptés en T-SQL. Cependant, il semble que l'utilisation <>fonctionne beaucoup plus rapidement que!= . Je viens !=d'exécuter une requête complexe qui était en cours d'utilisation et il a fallu environ 16 secondes en moyenne pour s'exécuter. J'ai changé ceux-ci en <>et la requête prend maintenant environ 4 secondes en moyenne pour s'exécuter. C'est une énorme amélioration!

Hamlet Javier
la source
20
Si vous exécutez deux requêtes similaires l'une après l'autre dans SQL Server, il aura probablement des données mises en cache en mémoire et optimisées pour des requêtes similaires. Si vous l'avez fait dans l'ordre inverse, vous pourriez trouver le résultat inverse!
codemonkey
2
C'est également faux, ils n'auraient pas deux opérateurs qui fonctionneraient exactement de la même manière et l'un serait plus lent "juste à cause". De nombreux facteurs contribuent à expliquer pourquoi une même requête produira des temps d'exécution différents.
Elliot Chance
-11

Bien qu'ils fonctionnent de la même manière, !=signifie exactement "différent de", tandis que<> signifie supérieur et inférieur à la valeur stockée.

Considérez >=ou <=, et cela aura du sens lorsque la prise en compte de vos index dans les requêtes ... <>s'exécutera plus rapidement dans certains cas (avec le bon index), mais dans d'autres cas (sans index), ils fonctionneront de la même manière.

Cela dépend également de la façon dont votre système de bases de données lit les valeurs !=et <>. Le fournisseur de base de données peut simplement le raccourcir et le faire fonctionner de la même manière, il n'y a donc aucun avantage dans les deux cas. PostgreSQL et SQL Server ne le raccourcissent pas; il est lu tel qu'il apparaît ci-dessus.

Kevin Kinchen
la source
3
Avez-vous une référence à l'appui de votre déclaration? Les deux opérateurs semblent être exactement les mêmes dans PostgreSQL , Oracle et MySQL .
GhostGambler
8
C'est complètement faux, cela peut vous sembler "supérieur et inférieur à la valeur stockée" lorsque vous combinez ces caractères dans votre esprit, mais pour le lexer, c'est juste une autre façon de représenter le jeton.
Elliot Chance
Manque de ressources connexes!
mostafa8026