참고 : 누군가 Sushant Butta의 답변 에서 외부 링크가 죽었다고 주장했기 때문에 여기에 별도의 답변으로 콘텐츠를 게시했습니다.
NULLS에 주의하십시오 .
오늘 저는 IN과 NOT IN
연산자 를 사용하는 동안 매우 이상한 쿼리 동작을 발견했습니다 . 실제로 두 테이블을 비교하여 값이 table b
존재 하는지 여부를 table a
확인하고 열에 null
값이 포함 된 경우 그 동작을 확인하고 싶었습니다 . 그래서 방금이 동작을 테스트하기위한 환경을 만들었습니다.
테이블을 생성합니다 table_a
.
SQL> create table table_a ( a number);
Table created.
테이블을 생성합니다 table_b
.
SQL> create table table_b ( b number);
Table created.
일부 값을 table_a
.
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
일부 값을 table_b
.
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
이제 연산자 table_a
를 table_b
사용하여 값을 확인하여 값 의 존재를 확인하는 쿼리를 실행합니다 IN
.
SQL> select * from table_a where a in (select * from table_b);
A
3
아래 쿼리를 실행하여 존재하지 않는지 확인하십시오.
SQL> select * from table_a where a not in (select * from table_b);
A
1
2
예상대로 출력되었습니다. 이제 null
테이블에 값을 삽입 table_b
하고 위의 두 쿼리가 어떻게 작동하는지 살펴 보겠습니다.
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
첫 번째 쿼리는 예상대로 작동했지만 두 번째 쿼리는 어떻게 되었습니까? 출력이 나오지 않은 이유는 무엇입니까? 쿼리에 차이가 있습니까? 아니 .
변경 사항은 테이블의 데이터에 table_b
있습니다. 우리는 null
표에 값을 도입했습니다 . 하지만 어떻게 이런 식으로 작동합니까? 두 쿼리를 "AND"
and "OR"
연산자 로 나눕니다 .
첫 번째 쿼리 :
첫 번째 쿼리는 다음과 같이 내부적으로 처리됩니다. A는 그래서 null
여기에 문제를 만들지 않습니다 처음 두 개의 피연산자 중 하나를에 평가합니다으로 true
나 false
. 그러나 세 번째 피연산자 a = null
에 둘을 평가하지 않습니다 true
아니다 false
. null
로만 평가 됩니다.
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
두 번째 쿼리 :
두 번째 쿼리는 다음과 같이 처리됩니다. 우리는 "AND"
연산자를 사용하고 있기 때문에 true
피연산자 이외의 다른 것은 나에게 출력을 제공하지 않습니다.
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
그럼 어떻게 처리할까요? 연산자 를 사용하는 동안 not null
테이블에서 모든 값을 선택합니다 .table_b
NOT IN
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
1
2
따라서 연산자 NULL
를 사용하는 동안 항상 열의 값에 주의 하십시오 NOT IN
.
NULL을 조심하세요 !!
in
문은 동일하게 해석됩니다field=val1 or field=val2 or field=val3
. 거기에 null을 넣으면field=null
작동하지 않을 것입니다.