MySQL에서이 연산자 <=>는 무엇입니까?


163

이전 개발자가 작성한 코드를 작성 중이며 쿼리에서 다음과 같이 말합니다.

WHERE p.name <=> NULL

<=>이 쿼리에서 무엇을 의미합니까? 그것은 동등한 것 =입니까? 아니면 구문 오류입니까?

그러나 오류나 예외는 표시되지 않습니다. 나는 이미 MySQL 에서 <>= !=를 알고있다 .


19
spaceship운영자
모하 전능하신 낙타

4
@ Mhd.Tahawi, 운영자를 위해 Google을 직접 운영 할 수있는 Google이 필요 합니다.
Pacerier

@Pacerier-약 5 년 전에 symbolhound.com을 찾았습니다 (더 나은 대안이 있다면 dunno)
Andrew

답변:


239

TL; DR

그것은의 NULL안전과 동일 연산자.

정규 =연산자 와 같이 두 값이 비교되고 결과는 0(같지 않음) 또는 1(같음)입니다. 다른 말로 'a' <=> 'b'하면 yields 0and 'a' <=> 'a'yields 1입니다.

정규 =연산자 와 달리 값은 NULL특별한 의미가 없으므로 NULL가능한 결과를 얻지 못합니다 . 그래서 : 'a' <=> NULL수율 0NULL <=> NULL수율 1.

유용성

이것은 두 피연산자 모두를 포함 할 수 있고 두 열간 NULL에 일관된 비교 결과가 필요할 때 유용 할 수 있습니다 .

또 다른 유스 케이스는 다음과 같이 준비된 명령문입니다.

... WHERE col_a <=> ? ...

여기서 자리 표시자는 스칼라 값이거나 NULL쿼리에 대한 내용을 변경할 필요가 없습니다.

관련 연산자

게다가 <=>에 대해 비교하는 데 사용할 수있는 두 개의 다른 연산자도있다 NULL, 즉,IS NULLIS NOT NULL; 그것들은 ANSI 표준의 일부이므로 <=>MySQL 과는 달리 다른 데이터베이스에서 지원됩니다 .

당신은 그것들을 MySQL의 전문화로 생각할 수 있습니다 <=>:

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

이를 바탕으로 특정 쿼리 (조각)를보다 이식성있게 변환 할 수 있습니다.

WHERE p.name IS NULL

지원하다

SQL : 2003 표준은 이것에 대한 술어를 도입했으며, 이는 MySQL의 <=>연산자 와 정확히 다음과 같은 형식으로 작동합니다.

IS [NOT] DISTINCT FROM 

다음은 보편적으로 지원되지만 상대적으로 복잡합니다.

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
차이가 없다는 것을 의미합니까? 그리고 이것은 <=>다소 쓸모없는 연산자입니까? 권리?
zzlalani 2012

16
@zzlalani 전혀; <=>두 개의 피연산자가 필요하지만 IS (NOT) NULL하나의 피연산자 가 필요합니다. 차이는 ... 그 측면에서만큼 유용합니다 =.
Ja͢ck

12
@zzlalani IS NULLIS NOT NULLSQL 표준에 있습니다. <=>MySQL 특정 확장명입니다.
Daniel Dinnyes

5
따라서 is not distinct from연산자 처럼 . MySQL은 ... 그에 인덱스를 사용할 수 있는지 알고 있어요
데니스 드 Bernardy에

3
@Pacerier 아니오,의 반대는 a <=> b입니다 NOT(a <=> b).
Ja͢ck

57

이다 <=> NULL-safe equal to operator

이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.

여기를 참조하십시오 설명서는

샘플 :

IS NOT NULL을 사용해야합니다. (비교 연산자 =와 <>는 둘 다 표현식의 양쪽에 UNKNOWN을 NULL로 제공합니다.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

널 안전 동등 연산자를 무시할 수도 있지만 이는 표준 SQL이 아닙니다.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

1
정정 : <=>호출해야 같음 연산자=는 IS NULL안전하지 않은 같음 연산자.
Pacerier

26

그것은 인 NULL 안전한 동등 연산자

<=> 연산자는 NULL 값을 필드와 비교하는 데 사용됩니다. 정상 = (같음) 인 경우 비교 값 중 하나가 NULL 인 경우 연산자는 NULL을 리턴합니다. <=> 연산자를 사용하면 true 또는 false가 반환됩니다. <=> 연산자는 IS NULL과 같습니다.

매뉴얼에서 :-

<=> = 연산자와 같은 항등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

편집 : - ( 매우 늦게 언급 한 가지 중요한 측면 메모를 추가 할 수 있지만 하지 <=> 뿐만 아니라 )

참고 사항 :-

NOT <=>

NOT <=>의 요점이 하나 더 있습니다필드와 NULL 값을 비교하는 데 사용되는 있습니다. 정상인 경우! = 또는 <> (같지 않음) 비교 값 중 하나가 NULL 인 경우 연산자는 NULL을 반환합니다. NOT을 <=>에 적용하면 연산자가 true 또는 false를 반환합니다. <=> 연산자에 적용되지 않음은 IS NOT NULL과 같습니다.

예:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

1
NOT <=>연산자가 아니며 NOT의 결과에 적용됩니다 op1 <=> op2.
Ja͢ck

@ 잭 :-네 맞습니다. 답변을 업데이트했습니다! 수 있도록하는 것이 포인트 : 할 것을 추가
라훌 Tripathi

그래서 나는 <!=>연산자 가 없다고 생각합니다
Kip

@ kip : 없습니다!
Rahul Tripathi

18

<=>MySQL의 null 안전 "같음"연산자입니다. 매뉴얼에서 :

NULL 안전 동등 이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

11

NULL 안전 동등 이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

의의 :

NULL 값과 NULL이 아닌 값을 비교하면 NULL이됩니다. 값이 널인지 확인하려는 경우.

Equal 연산자 (<=>)는 NULL을 일반 값으로 간주하므로 두 값이 모두 NULL이면 1 (NULL 아님)을 반환하고 값 중 하나가 NULL이면 0 (NULL 아님)을 반환합니다.

예 :

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>은 IS NULL 안전한 동등 연산자 . a <=> b쓰기와 동일합니다.

CASE
    WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
    WHEN a IS NULL OR  b IS NULL THEN 0 -- one operand is null then 0
    ELSE a = b                          -- else behave like normal = operator
END

죄송합니다 AND/OR IS (NOT) NULL. 이 연산자를 대신 사용해야하는 적절한 이유를 찾지 못했습니다 . 예를 들어, 예 WHERE p.name <=> NULLWHERE p.name IS NULL입니다.


9

로부터 MySQL의 문서 :

NULL 안전 동등 이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.

<=>연산자 를 사용하는 예 는 다음과 같습니다.

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

다음을 반환합니다.

1, 1, 0

정규 =연산자 의 예는 다음과 같습니다.

SELECT 1 = 1, NULL = NULL, 1 = NULL;

다음을 반환합니다.

1, NULL, NULL

<=>연산자는 매우 비슷합니다 =제외하고, 운영자 <=>반환하지 않습니다NULL



1
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
+----+------+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  3 | NULL |  3 | NULL |
|  4 | NULL |  3 | NULL |
|  3 | NULL |  4 | NULL |
|  4 | NULL |  4 | NULL |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.