T-SQL'de eşit olmayanlar için! = Veya <> kullanmalı mıyım?


800

Gördüğüm SQLkullanımları hem o !=ve <>için eşit değildir . Tercih edilen sözdizimi nedir ve neden?

Seviyorum !=, çünkü <>bana hatırlatıyor Visual Basic.



Kodun taşınabilirliği. Gereksinimleriniz ANSI SQL tarafından kolayca karşılanıyorsa, kullanmak daha iyidir. Tüm DB'lerde aynı kodu kullanabilirsiniz. Örneğin. Temel SQL'i örnek kod kullanarak göstermek isteyen bir SQL kitap yazarı.
Buhar

1
Yalnızca ANSI SQL koduna sahip olmanın bir sorun olabileceği bir örnek eklemek istiyorum - Standart SQL, NULL'ların sıralanmasını kontrol etmek için NULLS FIRST ve NULLS LAST seçeneklerini destekler, ancak T-SQL bu seçeneği desteklemez.
Buhar

Tekrar açmaya gerek yoktur. İşaretli soru yineleniyor, sadece bir seçenek daha genişletildi NOT (A = B).
TLama

@Steam, ansi sql'ın hangi yılın sürümünü tam olarak bahsettiğinizi belirtmelisiniz. Bu versiyonlardan bazıları seviye uyumluluğunu veya standardın tam bölümlerini belirtmenizi gerektirir. Bunlardan hangisi NULLS FIRST ve NULLS LAST'ı tanıttı?
Gherman

Yanıtlar:


539

SQL Server AKA T-SQL kullanıyorsanız teknik olarak aynı işlevi görürler. Saklı yordamlarda kullanıyorsanız, birini diğerinin üzerinde kullanmak için performans nedeni yoktur. Daha sonra kişisel tercihlere iner. ANSI uyumlu olduğu için <> kullanmayı tercih ediyorum.

Çeşitli ANSI standartlarına bağlantılar bulabilirsiniz ...

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


41
!=Kullandığım C'den etkilenen her dilde olması nedeniyle her zaman kullanmayı tercih etmiştim ve Python belgeleri şöyle diyor: “Formlar <>ve !=eşdeğerdir; C ile tutarlılık !=tercih edilir; !=aşağıda belirtilen yerler <>de kabul edilir. <>yazım eskimiş olarak kabul edilir." Ama SQL Python değil!
Iain Samuel McLean

24
Ben <> kullanmayı seviyorum çünkü bana XML hatırlatıyor. Ancak SQL XML değildir!
Rob Grant

32
Evet; Microsoft kendilerini ANSI uyumluluğu için özellikle <>üzerinde kullanmanızı öneririz !=, örneğin 70-461 sınavı için Microsoft Press eğitim seti, "Microsoft SQL Server Sorgulama", diyorlar "Standart formu ne zaman bir örnek olarak, T-SQL iki destekler" eşittir ”operatörler: <> ve! =. Birincisi standart, ikincisi değil.
Matt Gibson

10
<> Hoşuma gidiyor çünkü yazmak daha kolay.
user2023861

731

Çoğu veritabanı !=(popüler programlama dilleri) ve <>(ANSI) desteği sunar.

Her ikisini de destekleyen veritabanları !=ve <>:

  • MySQL 5.1: !=ve<>
  • PostgreSQL 8.3: !=ve<>
  • SQLite: !=ve<>
  • Oracle 10g: !=ve<>
  • Microsoft SQL Server 2000/2005/2008/2012/2016: !=ve<>
  • IBM Informix Dynamic Server 10: !=ve<>
  • InterBase / Firebird: !=ve<>
  • Apache Derby 10.6: !=ve<>
  • Sybase Adaptive Server Enterprise 11.0: !=ve<>

ANSI standart operatörünü destekleyen veritabanları, yalnızca :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>

Django ORM sorgusu veya NOT (a = b)yerine eşlenir . Dahili olarak aynı mı? (a <> b)(a != b)
kullanıcı

7
@buffer, mantıksal olarak aynıdır, yani aynı satır kümesiyle eşleşir veya hariç tutulur . Ancak belirli bir RDBMS markasının bunu optimize edip etmediği uygulamaya bağlıdır. Bununla birlikte, veritabanı markaları arasında herhangi bir fark olsaydı şaşırırdım.
Bill Karwin

yan not: C # içindeki LINQ kullanmalısınız! =
Tom Stickel

! = IBM DB2 LUW 10.5+
Cristi S.

10
C # içindeki @TomStickel LINQ SQL değildir.
Craig

109

'<>'dan SQL-92 standardı ve '!='a, özel bir T-SQL operatörü. Diğer veritabanlarında da kullanılabilir, ancak standart olmadığından, duruma göre almanız gerekir.

Çoğu durumda, hangi veritabanına bağlandığınızı bilirsiniz, bu gerçekten bir sorun değildir. En kötüsü SQL'de bir arama yapmanız ve değiştirmeniz gerekebilir.


Ben mysql sql de kullanmak görmek var
Bob Janitor

3
Standart dile bu kadar yaygın bir uzantıyı özel bir dil olarak adlandırmaya devam edebilir miyiz ? Bu noktada, standardın her iki sözdizimini gerektirecek veya en azından her iki sözdizimine izin verecek şekilde güncellenmesi gerektiği görülmektedir.
Johan Boulé

3
@JohanBoule iyi, SQL için yazılı bir standart var ve bence !=bunun bir parçası değil. Tüm pratik amaçlar için bir defacto standardı olmasına rağmen, standart özellikler olan ve olmayan şeyleri karıştırmamalıyız.
Adam Lassek



24

Bu SQL Server'a özgüdür. SQL Server'ı soruyor, ancak bu tür şeyleri bilmek isteyenler için taşınabilir olması garanti edilip edilmediğini görmek için bir ANSI spesifik referansı bulabilir misiniz?
Joel Coehoorn

6
@Joel Coehoorn, eğer T-SQL kodunuzu çok taşırsanız "<>" ve "! =" Endişelerinizden en azı olacaktır !!
KM.

1
Taşıma sorunu değil - bir geliştirici olarak ortamlar arasında gidip gelmeniz gerektiğinde. Tutarlılık iyidir.
Mark Ransom

20

Microsoft kendilerinin tercih ettiği görülüyor <>için !=kendi masa kısıtlamaları içinde kanıtladığı gibi. Ben şahsen kullanmayı tercih ediyorum, !=çünkü bunu açıkça "eşit değil" olarak okudum, ama [field1 != field2]bir constrait olarak girip kaydederseniz, bir dahaki sefere sorguladığınızda, olarak görünecektir [field1 <> field2]. Bu bana bunu yapmanın doğru yolunun olduğunu söylüyor <>.


15

!=ANSI olmamasına rağmen, okunabilir bir dil olarak gerçek SQL ruhundadır. Eşit değil bağırır. <>bana göre (daha az, daha büyük) ki bu sadece garip. Niyetinin bu yüzden eşit olmadığından daha az veya daha büyük olduğunu biliyorum, ama bu gerçekten basit bir şey söylemenin gerçekten karmaşık bir yolu.

Ben sadece bazı uzun SQL sorguları almak ve sevgisiz bir XML dosyasına içine içine gitmek olmaz aptal nedenleri bir sürü yerleştirmek zorunda kaldı.

XML'in hiç <>de !=başarısız olmadığını ve kendimi harap olmadan önce onları değiştirmek ve kendimi kontrol etmek zorunda olduğumu söylemek yeterli.


6
neden sadece CDATA değil? sorgunuz XML içeriyorsa ne olur?
Janus Troelsen

12

T-SQL'de istediğinizi kullanabilirsiniz. Belgeler her ikisinin de aynı şekilde çalıştığını söylüyor. Tercih ederim !=, çünkü benim (C / C ++ / C # tabanlı) zihnime "eşit değil" okuyor, ancak veritabanı gurusu tercih ediyor gibi görünüyor <>.


10

C sözdiziminin !=Unix mirası (Sybase SQL Server günlerinde, Microsoft SQL Server 6.5 öncesi) nedeniyle SQL Server'da olduğunu anlıyorum .


7

Alternatiflerden biri , iki bağımsız değişken Microsoft Docs uygulamasında eşit NULLIF ise NULL döndüren <>veya !=NULL döndüren başka bir NULLIF işleci kullanmak olacaktır . Bu yüzden WHERE maddesinin aşağıdaki gibi ve aşağıdaki şekilde değiştirilebileceğine inanıyorum :<>!=

NULLIF(arg1, arg2) IS NOT NULL

Bulduğum gibi, bazı durumlarda kullanmak <>ve !=bugüne kadar çalışmıyor. Dolayısıyla yukarıdaki ifadeyi kullanmak gerekeni yapar.


6
Bu işlevin <>, tüm köşe durumlarında dizin kullanımı ile ilgili olarak performans gösterip göstermeyeceğinden emin değilim . Ayrıca, okunabilirlik kesinlikle çok daha kötü ...
Lukas Eder

Yanıtta da belirttiğim gibi, bu benim için 2014'te oradaki tarih alanlarında benim için çalıştı.
jitendrapurohit

1

Bunun !=yerine kullanmayı tercih ettim <>çünkü bazen <s></s>SQL komutlarını yazmak için sözdizimini kullanıyorum . !=Bu durumda sözdizimi hatalarını önlemek için kullanmak daha kullanışlıdır.


-6

Her ikisi de T-SQL'de kabul edilir. Ancak, kullanım <>daha hızlı çalışıyor!= gibi görünüyor . Ben sadece kullanarak karmaşık bir sorgu koştu !=ve çalıştırmak için ortalama 16 saniye sürdü. Bunları değiştirdim <>ve şimdi sorgu çalıştırmak ortalama 4 saniye sürüyor. Bu büyük bir gelişme!


20
SQL Server'da arka arkaya iki benzer sorgu çalıştırırsanız, büyük olasılıkla bellekte veri önbelleğe alınmış ve benzer sorgular için optimize edilmiş olacaktır. Ters sırayla yaptıysanız, ters sonucu bulabilirsiniz!
codemonkey

2
Bu da yanlış, tam olarak aynı şekilde çalışan iki operatörleri olmayacaktı ve biri daha yavaştı, “sadece”. Aynı sorgunun neden farklı yürütme süreleri üreteceğine katkıda bulunan birçok faktör vardır.
Elliot Chance

-11

Aynı şekilde işlev görseler de, !=tam olarak "eşit değil" anlamına gelir.<> anlamına , depolanan değerden daha büyük ve daha küçük anlamına gelir.

Düşünün >=ya da <=, dizinlerinizdeki sorguları çarpanlarına ayırırken bu mantıklı olacaktır ...<> olacaktır bazı durumlarda (doğru dizinle) daha hızlı çalışacaktır, ancak diğer bazı durumlarda (dizinsiz) aynı şekilde çalışacaktır.

Bu aynı zamanda veri tabanı sisteminizin değerleri !=ve değerlerini nasıl okuduğuna da bağlıdır <>. Veritabanı sağlayıcısı sadece kısayol yapabilir ve aynı şekilde çalışmasını sağlayabilir, bu nedenle her iki şekilde de bir faydası yoktur.PostgreSQL ve SQL Server bunu kısayol yapmaz; yukarıda göründüğü gibi okunur.


3
İfadeniz için destekleyici referansınız var mı? Her iki operatörler tam olarak aynı görünüyor PostgreSQL , Oracle ve MySQL .
Mart'ta GhostGambler

8
Bu tamamen yanlıştır, zihninizdeki bu karakterleri birleştirdiğinizde "depolanan değerden daha büyük ve daha az" gibi görünebilir, ancak lexer için jetonu temsil etmenin başka bir yoludur.
Elliot Chance

İlgili kaynak eksikliği!
mostafa8026
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.