Pelajari Pangkalan data & SQL dari awal
1Apakah pangkalan data hubungan
Pangkalan data hubungan menyimpan data dalam jadual. Jadual kelihatan seperti hamparan: setiap baris ialah satu rekod, setiap lajur ialah satu sifat.
Sebuah kedai mungkin mempunyai jadual customers dengan lajur id, name dan city, dan jadual orders dengan lajur id, customer_id dan total.
Kunci utama ialah lajur, atau set lajur, yang mengenal pasti setiap baris secara unik. Ia tidak boleh diulang dan tidak boleh kosong. Di sini itu ialah id setiap jadual.
Kunci asing ialah lajur yang merujuk kunci utama jadual lain. Dalam orders, customer_id menyatakan pelanggan mana yang membuat pesanan.
Beginilah jadual dipautkan: seorang pelanggan boleh mempunyai banyak pesanan, tetapi setiap pesanan tergolong dalam seorang pelanggan. Itulah hubungan satu-ke-banyak.
SQL (Structured Query Language) ialah bahasa yang anda gunakan untuk mencipta jadual, mengubah data dan mengemukakan soalan tentangnya.
Semakan kendiri Apakah kunci utama?
- Indeks yang menjadikan carian lebih pantas
- Lajur atau set lajur yang mengenal pasti setiap baris secara unik
- Lajur pertama setiap jadual
- Lajur yang merujuk baris dalam jadual lain
Jawapan: Lajur atau set lajur yang mengenal pasti setiap baris secara unik. Kunci utama adalah unik dan tidak pernah NULL, maka ia memilih tepat satu baris. Lajur yang merujuk jadual lain ialah kunci asing.
2Membaca data dengan SELECT
Kebanyakan soalan mengenai penyataan SELECT. Ia dibina daripada klausa, sentiasa ditulis dalam turutan ini:
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
- SELECT menyenaraikan lajur yang anda mahu. DISTINCT membuang baris pendua.
- FROM menamakan jadual, atau jadual yang digabungkan.
- WHERE mengekalkan hanya baris yang memenuhi syarat, contohnya WHERE total > 20.
- GROUP BY meletakkan baris yang mempunyai nilai sama ke dalam satu kumpulan, supaya anda boleh mengira atau menambah bagi setiap kumpulan.
- HAVING mengekalkan hanya kumpulan yang memenuhi syarat. Ia boleh menggunakan agregat, yang tidak boleh digunakan oleh WHERE.
- ORDER BY mengisih keputusan, menaik secara lalai; tambah DESC untuk yang tertinggi dahulu.
Fungsi agregat meringkaskan banyak baris kepada satu nilai: COUNT, SUM, AVG, MIN dan MAX.
Pangkalan data tidak menjalankan klausa mengikut turutan yang anda tulis. Ia menjalankan FROM dahulu, kemudian WHERE, GROUP BY, HAVING, SELECT dan akhirnya ORDER BY.
Penyataan lain mengubah data: INSERT menambah baris, UPDATE mengubah baris dan DELETE membuang baris. CREATE, ALTER dan DROP mengubah jadual itu sendiri.
Semakan kendiri Anda hanya mahu pelanggan dengan lebih daripada 5 pesanan. Klausa manakah yang menapis pada COUNT(*) > 5?
- DISTINCT
- HAVING
- ORDER BY
- WHERE
Jawapan: HAVING. Kiraan hanya wujud selepas baris dikumpulkan, dan HAVING menapis kumpulan. WHERE berjalan sebelum pengumpulan, maka ia tidak boleh menggunakan agregat seperti COUNT.
3Gabungan, penormalan dan transaksi
Gabungan (join) menggabungkan baris dua jadual menggunakan syarat, biasanya kunci asing = kunci utama:
FROM customers c JOIN orders o ON o.customer_id = c.id
- INNER JOIN (atau JOIN) mengekalkan hanya baris yang mempunyai padanan dalam kedua-dua jadual.
- LEFT JOIN mengekalkan setiap baris jadual kiri. Di mana tiada padanan, lajur jadual kanan ialah NULL.
- NULL bermakna nilai hilang atau tidak diketahui. Ujinya dengan IS NULL, jangan sekali-kali dengan = NULL.
Penormalan memecahkan jadual supaya setiap fakta disimpan sekali. Ini mengelakkan pengemaskinian fakta yang sama di beberapa tempat.
- 1NF: setiap sel mengandungi satu nilai atom, tanpa kumpulan berulang.
- 2NF: 1NF, dan setiap lajur bukan kunci bergantung pada keseluruhan kunci, bukan sebahagian kunci komposit.
- 3NF: 2NF, dan tiada lajur bukan kunci bergantung pada lajur bukan kunci yang lain.
Transaksi mengumpulkan penyataan menjadi satu unit. COMMIT menjadikannya kekal dan ROLLBACK membatalkannya. Transaksi mengikut ACID: atomik (semua atau tiada), konsistensi, pengasingan dan ketahanan.
Semakan kendiri Seorang pelanggan tidak membuat sebarang pesanan. Apakah yang berlaku kepada pelanggan itu dalam customers LEFT JOIN orders?
- Pelanggan itu ditinggalkan daripada keputusan
- Pelanggan itu muncul sekali bagi setiap pesanan dalam jadual
- Pelanggan itu muncul sekali, dengan NULL dalam lajur pesanan
- Pertanyaan gagal dengan ralat
Jawapan: Pelanggan itu muncul sekali, dengan NULL dalam lajur pesanan. LEFT JOIN mengekalkan setiap baris jadual kiri dan mengisi bahagian kanan yang hilang dengan NULL. Meninggalkan pelanggan itu ialah apa yang dilakukan oleh INNER JOIN.
4Kaedah langkah demi langkah
Untuk menulis pertanyaan, atau mengetahui apa yang dipulangkan oleh pertanyaan tertentu:
- Cari jadual yang menyimpan data, dan bagaimana ia dipautkan oleh kunci.
- Tulis FROM dengan gabungan. Pilih LEFT JOIN apabila baris tanpa padanan mesti kekal.
- Tambah WHERE untuk syarat pada baris tunggal.
- Jika soalan menyebut “setiap” atau “bagi setiap”, tambah GROUP BY dan agregat.
- Tambah HAVING untuk syarat pada agregat, kemudian ORDER BY jika susunan penting.
- Semak keputusan pada contoh kecil: senaraikan baris selepas setiap klausa, mengikut turutan pangkalan data menjalankannya.
Untuk soalan teori, namakan konsep dahulu (kunci, jenis gabungan, bentuk normal, sifat ACID), kemudian pilih pilihan yang sepadan dengan takrifannya.
5Contoh terselesai
Ikuti setiap langkah. Cuba ramalkan langkah seterusnya sebelum anda membukanya.
Contoh terselesaiJadual customers mempunyai baris (1, Ana), (2, Ben) dan (3, Cas). Jadual orders mempunyai baris (id, customer_id) = (10, 1), (11, 1), (12, 2) dan (13, 1). Apakah yang dipulangkan oleh pertanyaan ini? SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name
1Setiap pelanggan dipasangkan dengan pesanan yang membawa id-nya. Ana sepadan dengan pesanan 10, 11 dan 13. Ben sepadan dengan pesanan 12.
Cas tiada pesanan. Oleh kerana ia LEFT JOIN, Cas kekal dalam keputusan, dengan NULL untuk o.id.
2- Ana, 10
- Ana, 11
- Ana, 13
- Ben, 12
- Cas, NULL
Itu 5 baris.
3GROUP BY c.name membuat tiga kumpulan: Ana dengan 3 baris, Ben dengan 1 baris dan Cas dengan 1 baris.
4COUNT(o.id) hanya mengira nilai yang bukan NULL. Ana mendapat 3 dan Ben mendapat 1.
Cas mempunyai satu baris, tetapi o.id-nya NULL, maka Cas mendapat 0.
5Ana, Ben dan Cas bersama mempunyai 3 + 1 + 0 = 4 pesanan, sama dengan bilangan baris dalam orders. Dengan COUNT(*) sebaliknya, Cas akan tersilap mendapat 1, kerana COUNT(*) mengira baris itu sendiri.
Jawapan Ana 3, Ben 1, Cas 0.
6Kesilapan lazim
- Menggunakan agregat dalam WHERE. Syarat pada COUNT, SUM atau AVG tergolong dalam HAVING.
- Menulis = NULL. Sebarang perbandingan dengan NULL tidak diketahui; gunakan IS NULL atau IS NOT NULL.
- Menggunakan INNER JOIN apabila baris tanpa padanan mesti kekal. Gunakan LEFT JOIN.
- Terlupa syarat gabungan. Tanpa ON, setiap baris dipasangkan dengan setiap baris (gabungan silang).
- Memilih lajur yang tidak dalam GROUP BY dan tidak dalam agregat.
- Mengelirukan DELETE (membuang baris) dengan DROP TABLE (membuang keseluruhan jadual).
- Menjalankan UPDATE atau DELETE tanpa WHERE. Ia mengubah setiap baris dalam jadual.
Semakan kendiri Jadual mempunyai 10 baris, dan lajur col ialah NULL dalam setiap baris. Apakah yang dipulangkan oleh SELECT COUNT(col)?
- 0
- 10
- 1
- NULL
Jawapan: 0. COUNT(col) hanya mengira nilai yang bukan NULL, maka ia memulangkan 0. COUNT(*) mengira baris dan akan memulangkan 10.
7Rupa soalan peperiksaan
- Mudah: istilah dan fakta utama. Apa yang dilakukan oleh SELECT, WHERE, ORDER BY atau DELETE, kunci utama dan kunci asing, apa maksud NULL.
- Sederhana: menerapkan konsep. Pertanyaan yang betul untuk sesuatu tugas, WHERE berbanding HAVING, gabungan dalam berbanding luar, bentuk normal, ACID.
- Sukar: kes dan analisis. Subpertanyaan, aras pengasingan dan anomalinya, BCNF, fungsi tetingkap, indeks dan prestasi pertanyaan, suntikan SQL.
Apabila pertanyaan diberi, jejakinya pada beberapa baris mengikut turutan FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Kebanyakan perangkap muncul dalam tiga baris.
Belajar langkah demi langkah dalam aplikasiBelajar langkah demi langkah dalam aplikasi