"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가 지적했듯이, 튜플을 평가할 때는 (단일 열이 아닌) 차이점이 있습니다.
된 로 NULL
비NULL
은다가 .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
'programing' 카테고리의 다른 글
'@angular-devkit/core' 모듈을 찾을 수 없습니다. (0) | 2023.10.07 |
---|---|
PHP와 MySQL을 이용한 Quiz 웹 어플리케이션 개발을 위한 데이터베이스 설계 (0) | 2023.10.07 |
phpMyAdmin이 루트 사용자로 로그인했음에도 불구하고 데이터베이스를 만들 권한이 없다고 말합니다. (0) | 2023.10.07 |
타이머에 따라 자동으로 브라우저의 HTML 페이지 새로 고침 - 15분마다 (0) | 2023.10.07 |
"for=id"를 사용하지 않고 확인란에 레이블을 연결할 수 있습니까? (0) | 2023.10.07 |