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 , OracleMySQL 에서는 두 연산자가 모두 동일한 것으로 보입니다 .
GhostGambler

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

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