sql >> Databasteknik >  >> RDS >> Mysql

Vad är skillnaden mellan Is Not Null och Not Is Null

Det är ingen skillnad.

Alla större motorer (det vill säga MySQL , SQL Server , Oracle och PostgreSQL ) kommer att slå samman dessa predikat på parsningsstadiet och göra identiska planer från dem.

Hantering av dessa villkor är mer komplicerad än att bara använda operatörer i en eller annan ordning.

Till exempel i Oracle , en IS NOT NULL (eller NOT IS NULL ) condition innebär en möjlighet att använda ett index, så en fråga som denna:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

kommer med största sannolikhet att köras med en index fast full scan , utan ytterligare kontroller gjorda under körning (eftersom NULL värden kommer helt enkelt inte in i indexet, så det är ingen idé att kontrollera dem).

Även om varje post skulle behöva kontrolleras, kommer kontrollordningen att definieras av optimeraren (och inte av den ordning som predikaten och operatorerna visas i WHERE klausul).

Här är till exempel en plan för ett Oracle fråga:

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 är filter översattes internt till en IS NOT NULL (vilket Oracle tillsammans med de flesta kommentatorer verkar det vara en lämpligare form)

Uppdatering:

Som Jonathan Leffler påpekade är dessa skillnader vid utvärdering av tupler (i motsats till enstaka kolumner).

En tuppel som består av blandad NULL och icke-NULL värden är varken en NULL inte heller en NOT NULL .

I PostgreSQL (som stöder detta predikat mot tupler), båda dessa uttryck:

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

utvärdera till falskt.



  1. Hur infogas multidimensionella arrayer i en MySQL-tabell?

  2. Hur kontrollerar jag om en begränsning finns i SQL-servern?

  3. MySQL:fel i din SQL-syntax ... nära nyckel ...?

  4. Hur UNHEX()-funktionen fungerar i MySQL