Mysql
 sql >> база данни >  >> RDS >> Mysql

Каква е разликата между Is Not Null и Not Is Null

Няма разлика.

Всички основни машини (това е MySQL , SQL Server , Oracle и PostgreSQL ) ще обедини тези предикати на етапа на синтактичен анализ, като направи идентични планове от тях.

Обработката на тези условия е по-сложна от простото прилагане на оператори в един или друг ред.

Например в Oracle , IS NOT NULL (или IS NOT 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 заедно с повечето коментиращи изглежда смятат, че е по-подходяща форма)

Актуализация:

Както Джонатан Лефлър посочи, това е разлика при оценката на кортежи (за разлика от единичните колони).

Кортеж, състоящ се от смесени NULL и не-NULL стойности не е нито NULL нито NOT NULL .

В PostgreSQL (което поддържа този предикат срещу кортежи), и двата израза:

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

оценка на false.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DAYNAME() Примери – MySQL

  2. Записване на рамката от данни в MySql DB таблица

  3. Какво представляват Resource#?

  4. Как мога да направя средна стойност от дати в MySQL?

  5. SQL брой - не работи