Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist der Unterschied zwischen Is Not Null und Not Is Null?

Es gibt keinen Unterschied.

Alle wichtigen Engines (also MySQL , SQL Server , Oracle und PostgreSQL ) werden diese Prädikate in der Parsing-Phase zusammenführen und daraus identische Pläne erstellen.

Die Handhabung dieser Bedingungen ist komplexer als die bloße Anwendung von Operatoren in der einen oder anderen Reihenfolge.

Zum Beispiel in Oracle , ein IS NOT NULL (oder NOT IS NULL ) Bedingung impliziert die Möglichkeit, einen Index zu verwenden, also eine Abfrage wie diese:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

wird höchstwahrscheinlich mit einem index fast full scan ausgeführt , ohne zusätzliche Prüfungen zur Laufzeit (da der NULL Werte schaffen es einfach nicht in den Index, also ist es sinnlos, sie zu überprüfen).

Selbst wenn jeder Datensatz geprüft werden müsste, wird die Reihenfolge der Prüfungen durch den Optimierer definiert (und nicht durch die Reihenfolge, in der die Prädikate und Operatoren in WHERE erscheinen Klausel).

Hier ist zum Beispiel ein Plan für ein Oracle Abfrage:

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)

Wie Sie sehen können, ist der filter wurde intern in ein IS NOT NULL übersetzt (welche Oracle zusammen mit den meisten Kommentatoren für eine angemessenere Form zu halten)

Aktualisierung:

Wie Jonathan Leffler betonte, ist dies ein Unterschied bei der Auswertung von Tupeln (im Gegensatz zu einzelnen Spalten).

Ein Tupel bestehend aus gemischtem NULL und nicht-NULL values ​​ist weder ein NULL noch ein NOT NULL .

In PostgreSQL (was dieses Prädikat gegen Tupel unterstützt), diese beiden Ausdrücke:

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

als falsch auswerten.