sql >> Database >  >> RDS >> Mysql

Wat is het verschil tussen Is Not Null en Not Is Null?

Er is geen verschil.

Alle belangrijke engines (dat is MySQL , SQL Server , Oracle en PostgreSQL ) zal deze predikaten samenvoegen in de parseerfase en er identieke plannen van maken.

Het omgaan met deze voorwaarden is ingewikkelder dan het toepassen van operators in een of andere volgorde.

Bijvoorbeeld in Oracle , een IS NOT NULL (of NOT IS NULL ) voorwaarde impliceert een mogelijkheid om een ​​index te gebruiken, dus een zoekopdracht als deze:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

zal hoogstwaarschijnlijk worden uitgevoerd met een index fast full scan , zonder extra controles tijdens runtime (sinds de NULL waarden komen gewoon niet in de index, dus het heeft geen zin om ze te controleren).

Zelfs als elk record zou moeten worden gecontroleerd, wordt de volgorde van controles bepaald door de optimizer (en niet door de volgorde waarin de predikaten en operators verschijnen in de WHERE clausule).

Hier is bijvoorbeeld een plan voor een Oracle vraag:

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)

Zoals je kunt zien, is het filter werd intern vertaald in een IS NOT NULL (die Oracle samen met de meeste commentatoren lijkt te geloven dat dit een meer geschikte vorm is)

Bijwerken:

Zoals Jonathan Leffler opmerkte, zijn dit verschillen bij het evalueren van tuples (in tegenstelling tot enkele kolommen).

Een tuple bestaande uit gemengde NULL en niet-NULL waarden is geen NULL noch een NOT NULL .

In PostgreSQL (die dit predikaat tegen tupels ondersteunt), beide uitdrukkingen:

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

evalueren naar onwaar.



  1. Records van de afgelopen 7 dagen ophalen in MySQL

  2. PHP MYSQL - Invoegen in zonder kolomnamen te gebruiken, maar met autoincrement-veld

  3. Mysql.h ontbreekt en probeert mysql-devel te vinden

  4. Selecteer de dichtstbijzijnde numerieke waarde met MySQL-query