2012-06-29 5 views
1

다음은 MySQL에서 어떻게 작동하는지 혼란 스럽습니다. 아래 쿼리에서 첫 번째 SELECTtable2에서 모든 행을 반환하고 두 번째 SELECT은 행을 반환하지 않습니다. NULLNOT IN 연산자와 함께 작동하는 방식에 대한 설명이 있습니까? 이것을 설명하는 문서가 있습니까?하위 쿼리가 NULL 값으로 작동하지 않는 이유는 무엇입니까?

CREATE TABLE table1 (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (id) 
); 

CREATE TABLE table2 (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    table1_id INT UNSIGNED, 
    PRIMARY KEY (id) 
); 

INSERT INTO table2 (id, table1_id) VALUES (1, NULL); 

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT id FROM table1); 
+----------+ 
| COUNT(*) | 
+----------+ 
|  1 | 
+----------+ 

INSERT INTO table1 (id) VALUES (1); 

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT id FROM table1); 
+----------+ 
| COUNT(*) | 
+----------+ 
|  0 | 
+----------+ 

답변

5

이유는 SQL 사양에 따르면,이 Foo IN(A,B,C)(Foo = A Or Foo = B Or Foo = C)로 변환한다는 것이다. 따라서 우리가 Foo In(Null, 1, 2) 인 경우 Foo = Null Or Foo = 1 Or Foo = 2이됩니다. Foo = Null은 항상 UNKNOWN이고 필터링 목적으로 False으로 평가되므로 IN 식의 Null은 결과를 반환하지 않습니다.

+0

하위 쿼리에'id is not null '을 추가하여 작동하게 할 수 있습니다. – Bohemian

+0

@ 보헤미안 - 물론. 그러나 OP는 특히 IN 절의 NULL이 결과를 반환하지 않는 이유를 묻고 있습니다. – Thomas

관련 문제