Rumah > pangkalan data > tutorial mysql > Mengapa Gunakan NOT EXISTS atau Explicit Joins Daripada NOT IN dalam Pertanyaan SQL?

Mengapa Gunakan NOT EXISTS atau Explicit Joins Daripada NOT IN dalam Pertanyaan SQL?

Susan Sarandon
Lepaskan: 2025-01-03 21:15:08
asal
309 orang telah melayarinya

Why Use NOT EXISTS or Explicit Joins Instead of NOT IN in SQL Queries?

Bahaya "TIDAK MASUK" dalam Pertanyaan SQL

Apabila mencuba pertanyaan yang menyemak sama ada data dari satu jadual tidak wujud dalam yang lain , pengendali "TIDAK MASUK" boleh membawa kepada hasil yang tidak dijangka, terutamanya apabila mengendalikan null nilai.

Masalah dengan "TIDAK MASUK"

Dalam pertanyaan yang disediakan, klausa "TIDAK MASUK" membandingkan hasil subkueri dengan lajur "ID_Courses" dalam jadual "Gred":

Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)
Salin selepas log masuk

Jika subquery mengembalikan sebarang nilai nol, "NOT Klausa IN" akan dinilai kepada palsu, walaupun rekod "JOHN" yang ditentukan dengan "Tahun" 1 wujud dalam jadual "Gred". Ini kerana logik tiga nilai dalam SQL mentafsir null sebagai "tidak diketahui," yang membawa kepada penilaian yang salah.

Alternatif kepada "TIDAK MASUK"

Untuk mengelakkan masalah ini , adalah disyorkan untuk menggunakan kaedah alternatif seperti TIDAK WUJUD atau gabungan eksplisit:

TIDAK WUJUD

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses
    LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR
    WHERE 
    Grade.NAME='JOHN' and 
    Evaluation.NAME IS NULL
    GROUP BY Grade.ID_Courses
Salin selepas log masuk

Gabungan Eksplisit

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses
    LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR
    WHERE 
    Grade.NAME='JOHN' and 
    NOT (Evaluation.NAME IS NOT NULL)
    GROUP BY Grade.ID_Courses
Salin selepas log masuk

Dengan menggunakan alternatif ini, anda boleh memastikan bahawa pertanyaan mengenal pasti rekod dengan tepat di mana data yang dinyatakan tidak wujud dalam jadual lain, tanpa mengira kehadiran nilai nol.

Atas ialah kandungan terperinci Mengapa Gunakan NOT EXISTS atau Explicit Joins Daripada NOT IN dalam Pertanyaan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan