programing

"Is Not Null"과 "Not Is Null"의 차이점은 무엇입니까?

css3 2023. 10. 7. 12:06

"Is Not Null"과 "Not Is Null"의 차이점은 무엇입니까?

SELECT id FROM customers WHERE type IS NOT Null;

대:

SELECT id FROM customers WHERE NOT type IS NULL;

위의 데이터 중 하나가 반환되는 데이터는 정확히 동일합니다.

그 차이는 무엇이고 왜 그 중 하나가 더 나을까요?

:
제가 보기에는 실적에 있어서는 차이가 있을 것 같습니다.이것에 대해 자세히 설명하고 싶은 사람?

차이가 없습니다.

제가 보기에는 실적에 있어서는 차이가 있을 것 같습니다.이것에 대해 자세히 설명하고 싶은 사람?

모든 , )(,MySQL,SQL Server,Oracle그리고.PostgreSQL는 구문 이이 는 구문 분석 단계에서 이 술어들을 병합하여 이 술어들과 동일한 계획을 수립합니다.

이러한 조건의 처리는 단순히 하나 또는 다른 순서로 연산자를 적용하는 것보다 더 복잡합니다.

를 들어 Oracle, IS NOT NULL(또는NOT IS NULL 합니다와 를 사용합니다.

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

index fast full scan , ).NULL값은 인덱스에 들어가지 않으므로 확인해봐야 소용이 없습니다.

가 에 되지 않습니다.WHERE조항).

를 들어, 에 .Oracle리:

SQL> EXPLAIN PLAN FOR
  2  
  2  SELECT *
  3  FROM   t_test
  4  WHERE  NOT column IS NULL
  5  /

Explained

SQL> SELECT  *
  2  FROM    TABLE(DBMS_XPLAN.display())
  3  /

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 958699830
----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |    30 |  1260 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T_TEST |    30 |  1260 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("COLUMN" IS NOT NULL)

것처럼.filter되었습니다.IS NOT NULL(어떤 것을Oracle대부분의 논평가들과 함께 더 적절한 양식이라고 믿는 것 같습니다.)

업데이트:

Jonathan Leffler가 지적했듯이, 튜플을 평가할 때는 (단일 열이 아닌) 차이점이 있습니다.

된 로 NULLNULL은다가 .NULL도 아닌NOT NULL.

PostgreSQL에 대해 이 두 식 함),다.

SELECT  (1, NULL) IS NULL
SELECT  (1, NULL) IS NOT NULL

거짓으로 평가합니다

IS NOT NULL비교 연산자입니다. 마치 다음과 같습니다.IS NULL아니면=,>,<.

NOT는 나머지 조건에 대해 동작하는 논리 연산자입니다.이렇게 말씀하시면 됩니다.NOT type = 5,NOT type IS NULL, 또는 심지어NOT type IS NOT NULL.

여기서 제 요점은 그들이 비록 결과는 같지만 매우 다른개의 연산자라는 것을 지적하는 것입니다.물론, 부울 논리에서는 다음과 같은 것들 사이에 차이가 없습니다.NOT (column IS NULL)그리고.column IS NOT NULL

에 관해서는 는.IS NOT NULL도 있습니다.NOT ... IS NULL두 개의 연산자 대신 단일 연산자를 사용하지만, 쿼리를 실행하기 전에 모든 합리적인 최적화자가 동일한 것을 알 수 있기 때문입니다.

LHS 항이 단순 변수 또는 식인 경우에는 다음과 같은 차이가 없습니다.NOT x IS NULL그리고.x IS NOT NULL. 옵티마이저는 두 가지를 동일하게 취급합니다.

그러나, 완전한 SQL에서, LHS 용어는 단순한 변수 또는 표현으로 제한되지 않습니다; 공식 문법에서, LHS는<row value predicand>:

SQL/Foundation - ISO/IEC 9075-2:2003

§8.7<null predicate>(p395)

null 값에 대한 검정을 지정합니다.

<null predicate> ::= <row value predicand> <null predicate part 2>

<null predicate part 2> ::= IS [ NOT ] NULL

문법을 따라가다 보면 다음과 같은 것을 알 수 있습니다.

§7.2<row value expression>(p296)

행 값을 지정합니다.

[...]

<row value predicand>  ::=
       <row value special case>
 |     <row value constructor predicand>

<row value special case> ::= <nonparenthesized value expression primary> 

그리고:

§7.1<row value constructor>(p293)

행 또는 부분 행으로 구성할 값 또는 값 목록을 지정합니다.

<row value constructor> ::=
       <common value expression>
 |     <boolean value expression>
 |     <explicit row value constructor>

[...]

<row value constructor predicand> ::=
       <common value expression>
 |     <boolean predicand>
 |     <explicit row value constructor>

(SQL 표준을 통해 무엇이든 추구하는 것은 힘든 일입니다.)표준의 하이퍼링크 버전은 http://savage.net.au/SQL/ 에서 확인할 수 있습니다.)

그러나 '행 값'에 대한 언급에서 짐작할 수 있듯이, LHS에서 여러 개의 간단한 식을 조합하여 '행 값 생성자 술어'를 구성할 수 있습니다.그리고 두 형태 사이에 차이가 있습니다.

개념적으로 다음과 같은 것이 있습니다.

(val1, val2, val3) IS NOT NULL

NOT (val1, val2, val3) IS NULL

첫 번째 경우 val1, val2, val3가 NULL이 아니면 TRUE가 되고, 두 번째 경우 val1, val2, val3 중 어느 하나라도 NULL이 아니면 TRUE가 됩니다. 따라서 두 작업이 동일하지 않은 경우가 있습니다.

하지만 앞에서 말씀드린 것처럼 단순한 열이나 표현의 경우에는 둘 사이에 차이가 없습니다.

언급URL : https://stackoverflow.com/questions/4070207/what-is-the-difference-between-is-not-null-and-not-is-null