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.
| id | title | genre | year |
|---|---|---|---|
| 1 | Dune | SciFi | 1965 |
| 2 | Nova | Fantasy | 2019 |
| 3 | Orbit | SciFi | 2021 |
| 4 | Ember | Fantasy | 2010 |
| 5 | Drift | Mystery | 2022 |
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
- Tulis soalan sebagai satu ayat dan garis bawahi kumpulannya.
- Tulis pertanyaan dengan kurungan pada setiap kumpulan.
- Ambil lima baris contoh dan tanda baris yang layak dengan tangan.
- 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 answer
Drift (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 answer
Nova 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.