T-SQL에서 같지 않기 위해! = 또는 <>를 사용해야합니까?


800

내가 본 SQL용도가 모두 있다는 !=및 <>위해 동일하지 . 선호하는 구문은 무엇이며 왜 그렇습니까?

내가 생각 !=나기 때문에 좋아한다 .<>Visual Basic



코드 이식성. 요구 사항이 ANSI SQL로 쉽게 충족되면 사용하는 것이 좋습니다. 모든 DB에서 동일한 코드를 사용할 수 있습니다. 예 : 샘플 코드를 사용하여 기본 SQL을 설명하려는 SQL 서적 저자.
— Steam

1
ANSI SQL 코드 만 문제가 될 수있는 예제를 추가하고 싶습니다. 표준 SQL은 NULL 정렬 방법을 제어하기 위해 NULLS FIRST 및 NULLS LAST 옵션을 지원하지만 T-SQL 은이 옵션을 지원하지 않습니다.
— Steam

다시 열 필요가 없습니다. 표시된 질문은 중복 된 것으로 추가 옵션으로 확장되었습니다 NOT (A = B).
— TLama

@Steam, 정확히 참조하는 ansi sql 버전을 지정해야합니다. 이러한 버전 중 일부는 레벨 호환성 또는 표준의 정확한 부분을 지정해야합니다. 그 중 어느 것이 NULLS FIRST와 NULLS LAST를 도입 했습니까?
— Gherman

답변:


539

SQL Server AKA T-SQL을 사용하는 경우 기술적으로 동일하게 작동합니다. 저장 프로 시저에서 사용하는 경우 다른 것을 사용하는 성능상의 이유가 없습니다. 그런 다음 개인 취향으로 내려갑니다. ANSI 호환이기 때문에 <>를 사용하는 것을 선호합니다.

다양한 ANSI 표준에 대한 링크를 찾을 수 있습니다 ...

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


41
필자가 사용한 !=모든 C- 영향 언어에 존재하기 때문에 파이썬 문서 는 항상 다음과 같이 사용하는 것을 선호했습니다 . 파이썬 문서 는 " C와 일관성을 유지하기 위해 양식 <>과 !=동등하며 !=선호됩니다. !=아래 <>에 언급 된 부분도 허용됩니다. <>맞춤법은 시대에 뒤 떨어진 것으로 간주됩니다. " 그러나 SQL은 파이썬이 아닙니다!
— Iain Samuel McLean Elder

24
XML을 생각 나게하기 때문에 <>를 사용하고 싶습니다. 그러나 SQL은 XML이 아닙니다!
— Rob Grant

32
예; 마이크로 소프트는 자체 사용하는 것이 좋습니다 <>를 통해 !="T-SQL은 두 가지를 지원하는 표준 양식을 선택하는 경우의 예를 들어"없습니다 "쿼리 마이크로 소프트 SQL 서버는"그들이 말하는 특히 70-461 시험 Microsoft Press에서 교육 키트 예를 들어, ANSI 준수를위한 "연산자 : <> 및! =와 같습니다. 전자는 표준이고 후자는 그렇지 않습니다.이 경우는 참신해야합니다. 표준으로 가십시오!"
— 매트 깁슨

10
입력하기 쉽기 때문에 <>이 마음에 듭니다.
— user2023861 2016 년

731

대부분의 데이터베이스는 !=(인기 프로그래밍 언어) 및 <>(ANSI)를 지원합니다.

데이터베이스가 모두 지원 !=과 <>:

  • MySQL 5.1 : !=및<>
  • PostgreSQL 8.3 : !=및<>
  • SQLite : !=및<>
  • Oracle 10g : !=및<>
  • Microsoft SQL Server 2000/2005/2008/2012/2016 : !=및<>
  • IBM Informix Dynamic Server 10 : !=및<>
  • 인터베이스 / 파이어 버드 : !=및<>
  • Apache Derby 10.6 : !=및<>
  • Sybase Adaptive Server Enterprise 11.0 : !=및<>

독점적으로 ANSI 표준 연산자를 지원하는 데이터베이스 :

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

Django ORM 쿼리 NOT (a = b)는 (a <> b)또는 대신에 매핑됩니다 (a != b). 내부적으로 동일합니까?
— 사용자

7
@buffer는 논리적으로 동일합니다. 즉, 동일한 행 집합과 일치하거나 제외합니다. 그러나 특정 RDBMS 브랜드가이를 최적화하는지 여부는 구현에 따라 다릅니다. 즉, 브랜드 데이터베이스간에 차이가 있으면 놀랍습니다.
— Bill Karwin

! 보조 노트 : C #에서 LINQ는 사용이 =
— 톰 Stickel

! =는 IBM DB2 LUW 10.5 이상에서 지원됩니다.
— Cristi S.

10
C #의 @TomStickel LINQ는 SQL이 아닙니다.
— Craig

109

'<>'로부터 인 SQL-92 표준 과 '!='A는 고유 T-SQL 연산자. 다른 데이터베이스에서도 사용할 수 있지만 표준이 아니기 때문에 사례별로 가져와야합니다.

대부분의 경우 어떤 데이터베이스에 연결하고 있는지 알기 때문에 이것이 실제로 문제가되지는 않습니다. 최악의 경우 SQL에서 검색하고 교체해야 할 수도 있습니다.


나는 mysql SQL도 그것을 사용하는 것을 보았습니다
— Bob The Janitor

3
우리는 표준 언어에 대한 광범위한 확장을 독점 언어라고 계속 부를 수 있습니까 ? 이 시점에서 표준을 업데이트하거나 적어도 두 구문을 모두 허용하도록 업데이트해야합니다.
— Johan Boulé

3
@JohanBoule 글쎄, SQL에 대한 서면 표준이 있으며 내 지식으로 !=는 그 일부가 아닙니다. 모든 실질적인 목적을 위해 사실상 표준이지만 표준 기능과 혼동하지 말아야합니다.
— Adam Lassek



24

그것은 SQL Server에 따라 다릅니다. 그는 SQL Server에 대해 묻는 것을 인정하지만 ANSI 사양 참조를 통해 그러한 종류의 것을 알고 싶어하는 사람들에게 이식성이 보장되는지 확인할 수 있습니까?
— Joel Coehoorn

6
@Joel Coehoorn, T-SQL 코드 "<>"와 "! ="를 매우 포팅하면 걱정할 필요가 없습니다 !!
— KM.

1
포팅은 문제가되지 않습니다. 개발자로서 환경 사이를 오가야 할 때입니다. 일관성이 좋습니다.
— Mark Ransom

20

마이크로 소프트 자신이 선호하는 것 같습니다 <>에 !=자신의 테이블 제약에서 입증. 개인적으로 사용 !=하는 것이 "같지 않음"으로 명확하게 읽었 기 때문에 사용하는 것을 선호 하지만 [field1 != field2], 다음에 쿼리 할 때이를 constrait로 입력 하고 저장하면 다음과 같이 표시됩니다 [field1 <> field2]. 이것이 올바른 방법은 나에게 말한다 <>.


15

!=ANSI가 아니더라도 읽기 쉬운 언어로서 SQL의 진정한 정신에 더 가깝습니다. 비명을 지르지 않습니다. <>그것은 나에게 (보다 작거나 큼) 이상하다고 말합니다. 나는 그것이 동등하지 않은 것보다 작거나 크다는 의도를 알고 있지만, 그것은 정말 간단한 것을 말하는 정말 복잡한 방법입니다.

방금 긴 SQL 쿼리를 가져 와서 들어 가지 않을 어리석은 여러 가지 이유로 XML 파일에 사랑스럽게 배치해야했습니다.

XML이 전혀 다운되지 않았다고 말하면 충분하며 , 조작이 난파되기 전에 <>이를 변경 !=하고 확인해야했습니다.


6
왜 CDATA가 아닌가? 쿼리에 XML이 포함되면 어떻게됩니까?
— Janus Troelsen

12

T-SQL에서 원하는 것을 사용할 수 있습니다. 설명서 에는 둘 다 동일한 방식으로 작동한다고 나와 있습니다. 필자는 !=(C / C ++ / C # 기반) 마음과 "같지 않음"을 읽었으므로 데이터베이스 전문가가 선호하는 것 같습니다 <>.


10

C 구문 !=은 Unix 유산 (Microsoft SQL Server 6.5 이전 Sybase SQL Server 시절)으로 인해 SQL Server에 있음을 이해합니다 .


7

한 가지 대안은 Microsoft Docs에서 두 인수가 NULLIF 인 경우 NULLIF 연산자를 사용 <>하거나 !=NULL을 반환하는 것 입니다. 내가 믿는 그래서 절은 수정할 수 있습니다 WHERE 와 같은 다음과 같습니다 :<>!=

NULLIF(arg1, arg2) IS NOT NULL

내가 알았 듯이 어떤 경우에는 날짜를 사용 <>하고 !=작동하지 않습니다. 따라서 위의 표현을 사용하면 필요합니다.


6
이 기능이 <>모든 경우에서 인덱스 사용과 관련하여 잘 수행되는지 확실하지 않습니다 . 게다가, 가독성은 확실히 더 나쁘다 ...
— Lukas Eder

내가 대답에서 언급했듯이, 이것은 2014 년의 날짜 필드에서 나를 위해 일했습니다. 조항 / 조건이 다른 답변을 제한 한 것이 확실하지 않지만 일부 공감대를 살펴보면 다른 사람들에게도 도움이되는 것 같습니다.
— jitendrapurohit

1

때로는 구문을 사용하여 SQL 명령을 작성 하기 때문에 !=대신 대신 사용 하는 것이 좋습니다 . 이 경우 구문 오류를 피하기 위해 사용하는 것이 더 편리합니다.<><s></s>!=


-6

둘 다 T-SQL에서 허용됩니다. 그러나 사용 <>하는 것보다 훨씬 빠르게 작동하는!= 것 같습니다 . 방금을 사용하는 복잡한 쿼리 !=를 실행했으며 평균 16 초가 걸렸습니다. 나는 그것들을 변경 <>했고 쿼리는 이제 평균 4 초가 걸립니다. 대단한 개선입니다!


20
SQL Server에서 두 개의 유사한 쿼리를 차례로 실행하면 데이터가 메모리에 캐시되어 유사한 쿼리에 최적화 될 수 있습니다. 역순으로 수행 한 경우 반대 결과가 나타날 수 있습니다!
— codemonkey

2
이것도 잘못되었습니다. 정확히 같은 기능을하는 두 개의 연산자가없고 하나는 "원인"이 느려졌습니다. 동일한 쿼리가 다른 실행 시간을 생성하는 이유에 대한 많은 기여 요인이 있습니다.
— Elliot Chance

-11

그것들은 같은 방식으로 작동하지만 !=정확히 "같지 않음"을 의미하지만<> 의미 저장된 값보다 크거나 작음 의미합니다.

고려 >=하거나 <=, 쿼리에 인덱스 감안하면이 이해가됩니다 ...<> 가 있습니다. 일부 경우 (올바른 인덱스 사용) 더 빨리 실행되지만 다른 경우에는 (인덱스 사용 안함) 동일하게 실행됩니다.

이것은 또한 데이터베이스 시스템이 값을 읽는 방법에 따라 달라집니다 !=및 <>. 데이터베이스 공급자는 바로 가기를 바로 사용하고 기능을 동일하게 만들 수 있으므로 어떤 식 으로든 이점이 없습니다 .PostgreSQL과 SQL Server는 바로 가기를 사용하지 않습니다. 위에 표시된대로 읽습니다.


3
당신의 진술에 대한 근거가 있습니까? PostgreSQL , Oracle 및 MySQL 에서는 두 연산자가 모두 동일한 것으로 보입니다 .
— GhostGambler

8
이것은 완전히 잘못되었습니다. 마음 속에 해당 문자를 결합 할 때 "저장된 값보다 크거나 작음"처럼 보일 수 있지만 어휘 분석기는 토큰을 나타내는 또 다른 방법 일뿐입니다.
— Elliot 기회

관련 리소스 부족!
— mostafa8026
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.