Tidak ada perbedaan.
Semua mesin utama (yaitu MySQL
, SQL Server
, Oracle
dan PostgreSQL
) akan menggabungkan predikat ini pada tahap penguraian, membuat rencana yang identik darinya.
Penanganan kondisi ini lebih kompleks daripada hanya menerapkan operator dalam satu atau lain urutan.
Misalnya, di Oracle
, sebuah IS NOT NULL
(atau IS NOT NULL
) condition menyiratkan kemungkinan untuk menggunakan indeks, jadi kueri seperti ini:
SELECT column
FROM mytable
WHERE column IS NOT NULL
kemungkinan besar akan dieksekusi dengan index fast full scan
, tanpa pemeriksaan tambahan yang dilakukan saat runtime (sejak NULL
nilai tidak akan masuk ke dalam indeks, jadi tidak ada gunanya memeriksanya).
Bahkan jika setiap record perlu diperiksa, urutan pemeriksaan akan ditentukan oleh pengoptimal (dan bukan berdasarkan urutan predikat dan operator yang muncul di WHERE
klausa).
Misalnya, berikut adalah rencana untuk Oracle
permintaan:
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)
Seperti yang Anda lihat, filter
diterjemahkan secara internal menjadi IS NOT NULL
(yang Oracle
bersama dengan sebagian besar komentator tampaknya percaya sebagai bentuk yang lebih tepat)
Pembaruan:
Seperti yang ditunjukkan Jonathan Leffler, ini adalah perbedaan saat mengevaluasi tupel (sebagai lawan dari kolom tunggal).
Tuple yang terdiri dari campuran NULL
dan non-NULL
nilai bukan NULL
atau IS NOT NULL
.
Di PostgreSQL
(yang mendukung predikat ini terhadap tupel), kedua ekspresi ini:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
evaluasi ke salah.