Rumah >pangkalan data >tutorial mysql >Mengapa Nilai NULL Menyebabkan Keputusan Tidak Dijangka dengan SQL's NOT IN Klausa?
Memahami Gelagat Tidak Dijangka Nilai NULL dan Klausa NOT IN
dalam SQL
Pertanyaan SQL selalunya menghasilkan hasil yang mengejutkan apabila nilai NULL
berinteraksi dengan pengendali NOT IN
. Percanggahan ini menjadi jelas apabila membandingkan pertanyaan NOT IN
dengan pertanyaan setara menggunakan LEFT JOIN
.
Pertimbangkan pertanyaan ini:
<code class="language-sql">A: select 'true' where 3 in (1, 2, 3, null) B: select 'true' where 3 not in (1, 2, null)</code>
Pertanyaan A mengembalikan hasil, manakala Pertanyaan B tidak. Punca utama terletak pada cara pangkalan data SQL yang berbeza mengendalikan nilai NULL
.
Dengan ANSI_NULLS
didayakan (lalai dalam banyak sistem seperti SQL Server 2005), sebarang perbandingan yang melibatkan NULL
, seperti 3 = NULL
, dinilai kepada UNKNOWN
. Ketidakpastian ini berpunca daripada ketidakpastian yang wujud NULL
.
Dalam Pertanyaan B, pengendali NOT IN
menemui NULL
dalam subkueri, menghasilkan penilaian UNKNOWN
. Oleh kerana tiada nilai lain sepadan, keseluruhan predikat menjadi UNKNOWN
, menghasilkan set hasil kosong.
Sebaliknya, melumpuhkan ANSI_NULLS
mengubah tingkah laku. Dengan ANSI_NULLS
dimatikan, 3 = NULL
menilai kepada TRUE
. SQL mentafsirkan NULL
sebagai berpotensi sama dengan segala-galanya, termasuk dirinya sendiri. Akibatnya, predikat Pertanyaan B menilai kepada TRUE
, mengembalikan hasil.
Ringkasnya, hasil yang tidak konsisten berpunca daripada perlakuan yang berbeza-beza bagi nilai NULL
yang ditentukan oleh tetapan ANSI_NULLS
. Apabila ANSI_NULLS
dihidupkan, perbandingan dengan NULL
menghasilkan UNKNOWN
, membawa kepada hasil yang tidak dijangka dalam pertanyaan yang menggunakan nilai NOT IN
dan NULL
. Ini menyerlahkan kepentingan memahami NULL
pengendalian dalam SQL untuk hasil pertanyaan yang tepat.
Atas ialah kandungan terperinci Mengapa Nilai NULL Menyebabkan Keputusan Tidak Dijangka dengan SQL's NOT IN Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!