sql >> Database teknologi >  >> RDS >> Mysql

Hvad er forskellen mellem Is Not Null og Not Is Null

Der er ingen forskel.

Alle større motorer (det vil sige MySQL , SQL Server , Oracle og PostgreSQL ) vil flette disse prædikater på parsing-stadiet og lave identiske planer ud fra dem.

Håndtering af disse forhold er mere kompleks end blot at anvende operatører i en eller anden rækkefølge.

For eksempel i Oracle , en IS NOT NULL (eller NOT IS NULL ) betingelse indebærer en mulighed for at bruge et indeks, så en forespørgsel som denne:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

vil højst sandsynligt blive udført med en index fast full scan , uden yderligere kontrol foretaget i runtime (siden NULL værdier kommer bare ikke ind i indekset, så det nytter ikke at tjekke dem).

Selvom hver post skulle kontrolleres, vil kontrolrækkefølgen blive defineret af optimeringsværktøjet (og ikke af den rækkefølge, prædikaterne og operatorerne vises i WHERE) klausul).

For eksempel er her en plan for en Oracle forespørgsel:

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)

Som du kan se, er filter blev internt oversat til en IS NOT NULL (hvilket Oracle sammen med de fleste kommentatorer synes at være en mere passende form)

Opdatering:

Som Jonathan Leffler påpegede, er disse forskelle ved evaluering af tupler (i modsætning til enkelte kolonner).

En tuple bestående af blandet NULL og ikke-NULL værdier er hverken en NULL heller ikke en NOT NULL .

I PostgreSQL (som understøtter dette prædikat mod tupler), begge disse udtryk:

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

evaluer til falsk.



  1. Understøtter PostgreSQL gennemsigtig komprimering af tabeller (fragmenter)?

  2. Opret en databasemail-profil i SQL Server (T-SQL)

  3. EF:Forkert brug af rumligt/fuldtekst/hash-indeks og eksplicit indeksrækkefølge

  4. Udfør erklæring med genvej i MySQLWorkbench