sql >> Databáze >  >> RDS >> Mysql

Jaký je rozdíl mezi Is Not Null a Not Is Null

Není v tom žádný rozdíl.

Všechny hlavní motory (to je MySQL , SQL Server , Oracle a PostgreSQL ) sloučí tyto predikáty ve fázi analýzy a vytvoří z nich identické plány.

Manipulace s těmito podmínkami je složitější než pouhé použití operátorů v té či oné objednávce.

Například v Oracle , IS NOT NULL (nebo NOT IS NULL ) podmínka implikuje možnost použít index, takže dotaz jako tento:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

bude s největší pravděpodobností spuštěn pomocí index fast full scan bez dalších kontrol prováděných za běhu (od NULL hodnoty se do indexu prostě nedostanou, takže je zbytečné je kontrolovat).

I když by bylo nutné zkontrolovat každý záznam, pořadí kontrol bude definováno optimalizátorem (a nikoli pořadím, v jakém se predikáty a operátory objeví v WHERE doložka).

Zde je například plán pro Oracle dotaz:

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)

Jak můžete vidět, filter byl interně přeložen do IS NOT NULL (který Oracle spolu s většinou komentujících se zdá být vhodnější formou)

Aktualizace:

Jak zdůraznil Jonathan Leffler, toto je rozdíl při hodnocení n-tic (na rozdíl od jednotlivých sloupců).

N-tice sestávající ze smíšených NULL a jiné než NULL Hodnoty nejsou ani NULL ani NOT NULL .

V PostgreSQL (který podporuje tento predikát proti n-ticím), oba tyto výrazy:

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

vyhodnotit jako nepravdivé.



  1. Jak přidám odkaz na konektor MySQL pro .NET?

  2. Jak získat aktuální datum v PostgreSQL

  3. alter table add ... před `code`?

  4. SQL Server převést řetězec na datum a čas