Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apa perbedaan antara Is Not Null dan Not Is Null?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP/MySQL - BEGIN...COMMIT Tidak Bekerja

  2. Optimalkan kueri django untuk menarik kunci asing dan hubungan django-taggit

  3. Cara memasukkan ke MySQL menggunakan pernyataan yang disiapkan dengan PHP

  4. Jalankan kueri MySQL pada mesin jarak jauh melalui ssh di baris perintah

  5. Ubah skema MySQL ke Github Wiki?