Pelajari Basis data & SQL dari nol
1Apa itu basis data relasional
Basis data relasional menyimpan data dalam tabel. Tabel terlihat seperti lembar kerja: setiap baris adalah satu rekaman, setiap kolom adalah satu properti.
Sebuah toko mungkin memiliki tabel customers dengan kolom id, name, dan city, serta tabel orders dengan kolom id, customer_id, dan total.
Kunci primer adalah kolom, atau sekumpulan kolom, yang mengidentifikasi setiap baris secara unik. Nilainya tidak boleh berulang dan tidak boleh kosong. Di sini itu adalah id setiap tabel.
Kunci asing adalah kolom yang merujuk ke kunci primer tabel lain. Pada orders, customer_id menyatakan pelanggan mana yang membuat pesanan.
Begitulah tabel-tabel dihubungkan: satu pelanggan dapat memiliki banyak pesanan, tetapi setiap pesanan milik satu pelanggan. Itu adalah relasi satu-ke-banyak.
SQL (Structured Query Language) adalah bahasa untuk membuat tabel, mengubah data, dan mengajukan pertanyaan tentangnya.
Tes mandiri Apa itu kunci primer?
- Indeks yang membuat pencarian lebih cepat
- Kolom atau sekumpulan kolom yang mengidentifikasi setiap baris secara unik
- Kolom pertama setiap tabel
- Kolom yang merujuk ke baris di tabel lain
Jawaban: Kolom atau sekumpulan kolom yang mengidentifikasi setiap baris secara unik. Kunci primer bersifat unik dan tidak pernah NULL, jadi ia menunjuk tepat satu baris. Kolom yang merujuk ke tabel lain adalah kunci asing.
2Membaca data dengan SELECT
Sebagian besar pertanyaan menyangkut pernyataan SELECT. Pernyataan ini disusun dari klausa, selalu ditulis dalam urutan ini:
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
- SELECT mendaftar kolom yang Anda inginkan. DISTINCT menghapus baris duplikat.
- FROM menyebut tabel, atau tabel-tabel yang digabungkan.
- WHERE hanya mempertahankan baris yang memenuhi suatu syarat, misalnya WHERE total > 20.
- GROUP BY menaruh baris bernilai sama ke dalam satu kelompok, sehingga Anda dapat menghitung atau menjumlahkan per kelompok.
- HAVING hanya mempertahankan kelompok yang memenuhi suatu syarat. Ia boleh memakai agregat, yang tidak boleh dipakai WHERE.
- ORDER BY mengurutkan hasil, menaik secara bawaan; tambahkan DESC untuk yang tertinggi lebih dulu.
Fungsi agregat meringkas banyak baris menjadi satu nilai: COUNT, SUM, AVG, MIN, dan MAX.
Basis data tidak menjalankan klausa sesuai urutan penulisan Anda. Ia menjalankan FROM lebih dulu, lalu WHERE, GROUP BY, HAVING, SELECT, dan terakhir ORDER BY.
Pernyataan lain mengubah data: INSERT menambah baris, UPDATE mengubah baris, dan DELETE menghapus baris. CREATE, ALTER, dan DROP mengubah tabelnya sendiri.
Tes mandiri Anda hanya menginginkan pelanggan dengan lebih dari 5 pesanan. Klausa mana yang memfilter COUNT(*) > 5?
- DISTINCT
- HAVING
- ORDER BY
- WHERE
Jawaban: HAVING. Hitungan baru ada setelah baris dikelompokkan, dan HAVING memfilter kelompok. WHERE berjalan sebelum pengelompokan, sehingga tidak dapat memakai agregat seperti COUNT.
3Join, normalisasi, dan transaksi
Join menggabungkan baris dua tabel dengan suatu syarat, biasanya kunci asing = kunci primer:
FROM customers c JOIN orders o ON o.customer_id = c.id
- INNER JOIN (atau JOIN) hanya mempertahankan baris yang memiliki pasangan di kedua tabel.
- LEFT JOIN mempertahankan setiap baris tabel kiri. Bila tidak ada pasangan, kolom tabel kanan bernilai NULL.
- NULL berarti nilai hilang atau tidak diketahui. Ujilah dengan IS NULL, jangan pernah dengan = NULL.
Normalisasi memecah tabel sehingga setiap fakta disimpan sekali. Ini menghindari pembaruan fakta yang sama di beberapa tempat.
- 1NF: setiap sel berisi satu nilai atomik, tanpa kelompok berulang.
- 2NF: 1NF, dan setiap kolom non-kunci bergantung pada seluruh kunci, bukan sebagian kunci komposit.
- 3NF: 2NF, dan tidak ada kolom non-kunci yang bergantung pada kolom non-kunci lain.
Transaksi mengelompokkan pernyataan menjadi satu kesatuan. COMMIT membuatnya permanen dan ROLLBACK membatalkannya. Transaksi mengikuti ACID: atomisitas (semua atau tidak sama sekali), konsistensi, isolasi, dan durabilitas.
Tes mandiri Seorang pelanggan belum pernah memesan. Apa yang terjadi pada pelanggan itu dalam customers LEFT JOIN orders?
- Kueri gagal dengan galat
- Pelanggan muncul satu kali, dengan NULL pada kolom pesanan
- Pelanggan muncul sebanyak jumlah pesanan di tabel
- Pelanggan tidak ada dalam hasil
Jawaban: Pelanggan muncul satu kali, dengan NULL pada kolom pesanan. LEFT JOIN mempertahankan setiap baris tabel kiri dan mengisi sisi kanan yang hilang dengan NULL. Menghilangkan pelanggan adalah yang dilakukan INNER JOIN.
4Metode ini selangkah demi selangkah
Untuk menulis kueri, atau mencari tahu apa yang dikembalikan suatu kueri:
- Temukan tabel yang menyimpan data, dan bagaimana tabel-tabel itu dihubungkan oleh kunci.
- Tulis FROM dengan join-nya. Pilih LEFT JOIN bila baris tanpa pasangan harus tetap ada.
- Tambahkan WHERE untuk syarat pada satu baris.
- Jika soal menyebut “per” atau “untuk setiap”, tambahkan GROUP BY dan agregatnya.
- Tambahkan HAVING untuk syarat pada agregat, lalu ORDER BY bila urutan penting.
- Periksa hasil pada contoh kecil: daftarkan baris setelah setiap klausa, dalam urutan yang dijalankan basis data.
Untuk soal teori, sebutkan dulu konsepnya (kunci, jenis join, bentuk normal, sifat ACID), lalu pilih opsi yang sesuai definisinya.
5Contoh soal lengkap
Ikuti setiap langkah. Cobalah menebak langkah berikutnya sebelum membukanya.
Contoh soalTabel customers memiliki baris (1, Ana), (2, Ben), dan (3, Cas). Tabel orders memiliki baris (id, customer_id) = (10, 1), (11, 1), (12, 2), dan (13, 1). Apa yang dikembalikan kueri 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 cocok dengan pesanan 10, 11, dan 13. Ben cocok dengan pesanan 12.
Cas tidak memiliki pesanan. Karena ini LEFT JOIN, Cas tetap ada dalam hasil, 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 kelompok: Ana dengan 3 baris, Ben dengan 1 baris, dan Cas dengan 1 baris.
4COUNT(o.id) hanya menghitung nilai yang bukan NULL. Ana mendapat 3 dan Ben mendapat 1.
Cas punya satu baris, tetapi o.id-nya NULL, jadi Cas mendapat 0.
5Ana, Ben, dan Cas bersama-sama memiliki 3 + 1 + 0 = 4 pesanan, sama dengan jumlah baris di orders. Dengan COUNT(*), Cas keliru mendapat 1, karena COUNT(*) menghitung barisnya sendiri.
Jawaban Ana 3, Ben 1, Cas 0.
6Kesalahan umum
- Memakai agregat di WHERE. Syarat pada COUNT, SUM, atau AVG termasuk dalam HAVING.
- Menulis = NULL. Setiap perbandingan dengan NULL tidak diketahui hasilnya; pakai IS NULL atau IS NOT NULL.
- Memakai INNER JOIN ketika baris tanpa pasangan harus tetap ada. Pakai LEFT JOIN.
- Lupa syarat join. Tanpa ON, setiap baris dipasangkan dengan setiap baris (cross join).
- Memilih kolom yang tidak ada di GROUP BY dan tidak berada di dalam agregat.
- Mencampuradukkan DELETE (menghapus baris) dan DROP TABLE (menghapus seluruh tabel).
- Menjalankan UPDATE atau DELETE tanpa WHERE. Itu mengubah setiap baris dalam tabel.
Tes mandiri Sebuah tabel memiliki 10 baris, dan kolom col bernilai NULL di setiap baris. Apa yang dikembalikan SELECT COUNT(col)?
- 0
- 10
- 1
- NULL
Jawaban: 0. COUNT(col) hanya menghitung nilai yang bukan NULL, jadi hasilnya 0. COUNT(*) menghitung baris dan akan mengembalikan 10.
7Seperti apa soal ujiannya
- Mudah: istilah dan fakta kunci. Apa yang dilakukan SELECT, WHERE, ORDER BY, atau DELETE, kunci primer dan kunci asing, apa arti NULL.
- Sedang: menerapkan konsep. Kueri yang tepat untuk suatu tugas, WHERE versus HAVING, join dalam versus luar, bentuk normal, ACID.
- Sulit: kasus dan analisis. Subkueri, tingkat isolasi dan anomalinya, BCNF, fungsi jendela, indeks dan kinerja kueri, injeksi SQL.
Bila diberi kueri, telusuri pada beberapa baris dalam urutan FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Sebagian besar jebakan terlihat dalam tiga baris.
Pelajari selangkah demi selangkah di aplikasiPelajari selangkah demi selangkah di aplikasi