Terus ke kandungan
IGCSE·Tuition
Sains Komputer · Bantuan untuk kesukaran biasa

Pertanyaan SQL saya menggabungkan syarat dengan salah

Pertanyaan itu berjalan tanpa ralat, tetapi baris yang dipulangkan bukan baris yang anda maksudkan.

Dalam halaman ini
  1. Mengapa pengumpulan yang salah berlaku?
  2. Contoh penyelesaian
  3. Kesilapan yang perlu dielakkan
  4. Rutin yang menangkap ralat ini setiap kali
  5. Semakan kendiri
  6. Langkah seterusnya

Apabila klausa WHERE mencampurkan AND dengan OR, pertanyaan mengikut peraturan pengumpulannya sendiri, bukan bunyi ayat dalam bahasa biasa. Dalam SQL piawai, AND dikira sebelum OR. Kurungan membolehkan anda menentukan sendiri pengumpulannya.

Membaca dan menulis pertanyaan dengan penapis terletak dalam pangkalan data dan penaakulan pertanyaan. Pelajaran tulis penapis SELECT yang mudah dan gabungkan syarat dengan pengumpulan Boolean yang betul membina kemahiran ini langkah demi langkah.

Mengapa pengumpulan yang salah berlaku?

Dalam bahasa biasa kita berkata “buku fiksyen sains atau fantasi yang terbit selepas 2015” dan otak kita mengumpulkannya sebagai (fiksyen sains atau fantasi) dan selepas 2015. SQL tidak membaca bahasa biasa. Ia melihat tiga syarat yang disambung dengan OR dan AND, lalu menggunakan keutamaannya: AND dahulu, kemudian OR.

Maknanya, perkataan yang sama boleh menjadi dua pertanyaan berbeza. Hanya kurungan yang memastikan maknanya.

Contoh penyelesaian

Jadual bernama Books mempunyai lima baris.

idtitlegenreyear
1DuneSciFi1965
2NovaFantasy2019
3OrbitSciFi2021
4EmberFantasy2010
5DriftMystery2022

Matlamat: senaraikan tajuk buku SciFi atau Fantasy yang terbit selepas 2015.

Percubaan A, tanpa kurungan:

SELECT title
FROM Books
WHERE genre = 'SciFi' OR genre = 'Fantasy' AND year > 2015;

Langkah 1. AND terikat dahulu, jadi pertanyaan dibaca sebagai: genre = ‘SciFi’ OR (genre = ‘Fantasy’ AND year > 2015).

Langkah 2. Setiap baris SciFi layak, apa pun tahunnya: Dune (1965) dan Orbit (2021).

Langkah 3. Baris Fantasy layak hanya jika tahun selepas 2015: Nova (2019) ya, Ember (2010) tidak.

Hasil A: Dune, Nova, Orbit. Itu tiga baris, dan Dune bukan selepas 2015.

Percubaan B, dengan kurungan:

SELECT title
FROM Books
WHERE (genre = 'SciFi' OR genre = 'Fantasy') AND year > 2015;

Langkah 1. Kurungan dahulu: baris 1 hingga 4 ialah SciFi atau Fantasy (Drift ialah Mystery, jadi tersingkir).

Langkah 2. Kemudian year > 2015 dikenakan pada baris itu: Nova (2019) dan Orbit (2021) kekal. Dune (1965) dan Ember (2010) gugur.

Hasil B: Nova, Orbit. Dua baris, iaitu yang diminta oleh matlamat.

Kesilapan yang perlu dielakkan

Kesilapan 1: tiada kurungan. Seperti percubaan A, pertanyaan berjalan tetapi menjawab soalan yang lain. Tiada amaran kerana pertanyaan itu sah.

Kesilapan 2: AND di tempat bahasa biasa berkata “atau”. Menulis genre = 'SciFi' AND genre = 'Fantasy' meminta buku yang kedua-dua genre dalam satu medan. Tiada baris boleh begitu, jadi sifar baris dipulangkan.

Pembetulan: sebut syarat itu dengan kuat dalam perkataan, tentukan kumpulannya, kemudian tulis kurungan. Jika anda maksudkan “salah satu daripada ini”, guna OR di dalam kurungan.

Rutin yang menangkap ralat ini setiap kali

  1. Tulis soalan sebagai satu ayat dan garis bawahi kumpulannya.
  2. Tulis pertanyaan dengan kurungan pada setiap kumpulan.
  3. Ambil lima baris contoh dan tanda baris yang layak dengan tangan.
  4. Jalankan atau jejak pertanyaan itu dan bandingkan dengan tanda anda.

Tabiat menjejak dengan tangan inilah yang dilatih oleh pelatih jejak pseudokod dan kotak pasir penaakulan Python pada algoritma kecil.

Semakan kendiri

Gunakan jadual Books di atas.

1. Apakah hasil SELECT title FROM Books WHERE genre = 'Mystery' OR year < 2000;?

Show answerDrift (Mystery) dan Dune (1965, sebelum 2000). Kedua-dua syarat disambung dengan OR, jadi baris hanya perlu satu daripadanya. Hasilnya Dune dan Drift.

2. Tulis pertanyaan untuk buku SciFi selepas 2000 yang id-nya lebih besar daripada 1.

Show answer`SELECT title FROM Books WHERE genre = 'SciFi' AND year > 2000 AND id > 1;` Hanya Orbit yang layak. Ketiga-tiga syarat menggunakan AND, jadi kurungan tidak diperlukan, tetapi baris mesti lulus semuanya.

3. Pertanyaan memerlukan buku Fantasy, atau mana-mana buku selepas 2020. Baris mana yang dipulangkan oleh WHERE genre = 'Fantasy' OR year > 2020?

Show answerNova dan Ember (Fantasy), serta Orbit (2021) dan Drift (2022). Dune bukan Fantasy dan bukan selepas 2020. Hasilnya empat baris.

Langkah seterusnya

Latih kemahiran pengumpulan dalam terangkan mengapa pertanyaan memulangkan sifar baris, dan jika operator logik sendiri terasa licin, ulang kaji nilaikan ungkapan logik dengan kurungan.

Bagi pelajar yang boleh menulis SQL tetapi sering ragu akan hasilnya, tuisyen Computer Science dalam talian satu-lawan-satu boleh bermula daripada pertanyaan anda sendiri dalam kelas percubaan berbayar dari RM80.

Soalan lazim

Mengapa pertanyaan saya memulangkan baris yang tidak saya mahu?

Biasanya AND dan OR digabungkan tanpa kurungan. Dalam SQL piawai, AND dinilai sebelum OR, jadi syarat dikumpulkan secara berbeza daripada cara anda membacanya dalam bahasa biasa. Tambah kurungan pada syarat yang anda mahu dianggap satu kumpulan.

Mengapa WHERE genre = 'SciFi' AND genre = 'Fantasy' tidak memulangkan apa-apa?

Satu medan hanya menyimpan satu nilai dalam sesuatu baris, jadi ia tidak boleh sama dengan dua nilai berbeza serentak. Untuk menerima salah satu nilai, guna OR di antara dua syarat, dan tambah kurungan jika ada syarat lain selepasnya.

Patutkah saya sentiasa guna kurungan?

Apabila klausa WHERE mencampurkan AND dengan OR, ya. Kurungan tidak merugikan, menjelaskan niat anda kepada pembaca dan menghapuskan keraguan tentang kumpulan yang berkuat kuasa.

Bagaimana saya menyemak pertanyaan sebelum menjalankannya?

Tulis lima hingga lapan baris contoh, terapkan setiap syarat dengan tangan dan tandakan baris yang layak. Bandingkan senarai itu dengan jangkaan anda. Jika berbeza, semak dahulu pengumpulan dalam pertanyaan.

Dikemas kini:

Langkah seterusnya

Jika pertanyaan anda berjalan tetapi terus memulangkan baris yang salah, guru satu-lawan-satu boleh melihat anda membaca pertanyaan itu dengan kuat dan menunjukkan di mana makna dan susunan perkataan mula berbeza.

Kelas percubaan berbayar satu jam pada kadar guru yang disahkan, bermula RM80. Yuran lain, jadual dan susunan seterusnya disahkan terus bersama guru selepas kelas percubaan.

Tuisyen diatur bersama ibu bapa atau penjaga. Hantar halaman ini kepada mereka melalui WhatsApp supaya mereka boleh bertanya bagi pihak anda.

Ibu bapa atau penjaga? Tanya di sini

9,000+ pelajar telah dibantu melalui perkhidmatan kami