F2 · SQL dan Data dari Nol
Bertanya pada data dengan SQL: dari kueri pertama sampai merancang basis data sendiri dan membuat laporan yang dipakai orang.
- 15 modul
- 123 latihan
- 90 istilah
Daftar modul
- 01Data, tabel, dan basis data8 latihan
- 02SELECT, WHERE, dan ORDER BY8 latihan
- 03NULL, CASE, dan fungsi bawaan8 latihan
- 04Agregasi8 latihan
- 05JOIN8 latihan
- 06Subquery dan CTE8 latihan
- 07Window function8 latihan
- 08Mengubah data9 latihan
- 09Membuat tabel dan menjaga data9 latihan
- 10Desain skema9 latihan
- 11Indeks dan kinerja dasar8 latihan
- 12Dari SQLite ke PostgreSQL8 latihan
- 13Transaksi dan konkurensi8 latihan
- 14SQL dari Python8 latihan
- 15Proyek akhir: Laporan Warung Makmur8 latihan
Ada contoh atau latihan bertanda “Kerjakan di laptop”? Paket dan data F2 untuk menjalankannya di komputermu ada di panduan menjalankan kode di komputermu.
Tentang course ini
Bertanya pada data dengan SQL: dari kueri pertama sampai merancang basis data sendiri dan membuat laporan yang dipakai orang.
Course fondasi gratis Coding Studio. Setiap modul bisa dibaca langsung sebagai Markdown; di Coding Studio, setiap kueri contoh dan latihan dijalankan di peramban (SQLite di dalam Python Pyodide) dan latihan diperiksa otomatis.
Untuk siapa
- Siapa pun yang bekerja dengan data dalam tabel: pelajar, mahasiswa, admin kantor, pemilik UMKM, calon analis data, calon developer.
- Tanpa prasyarat. F2 tidak membutuhkan F1, kecuali latihan Python di
Modul 13 (dua koneksi) dan Modul 14 (SQL dari Python), yang memakai F1
Modul 01–11.
sys.argv(F1 Modul 13) dijelaskan singkat di Modul 14. - Calon peserta F5 Rilis, C1 Data Science, C3 AI Engineering, dan C4 Data Engineering: F2 adalah prasyaratnya.
Yang kamu butuhkan: peramban modern dan internet. Modul 01–11 dan 14 seluruhnya di peramban; Modul 13 sebagian di peramban. Modul 12 (PostgreSQL) dan lab dua sesi di Modul 13 memakai GitHub Codespaces atau PostgreSQL di komputermu.
Setelah F2 kamu bisa
- Membaca skema basis data relasional dan menjelaskan isi setiap tabel.
- Menulis kueri
SELECTdengan saringan, pengurutan, ekspresi,NULL, danCASE. - Merangkum data dengan agregasi,
GROUP BY, danHAVING. - Menggabungkan tabel dengan
JOINtanpa terjebak baris berlipat. - Memecah pertanyaan sulit dengan subquery dan CTE; memakai window function untuk peringkat, total berjalan, dan perbandingan antarperiode.
- Mengubah data dengan aman (
INSERT/UPDATE/DELETEdalam transaksi). - Merancang skema yang menjaga kebenaran data (kunci, constraint, normalisasi) dan membuat indeks yang tepat.
- Memindahkan basis data dari SQLite ke PostgreSQL.
- Menjalankan SQL dari Python dengan parameter (kebal SQL injection).
- Memakai asisten AI untuk menulis dan menjelaskan kueri, lalu membuktikan kuerinya benar sebelum dipakai.
Dataset: Warung Makmur
Semua modul memakai satu dataset fiktif yang akrab: warung kelontong
Warung Makmur selama 1–30 September 2026 (data/warung.sql, dibuat
deterministik oleh data/buat_warung.py).
erDiagram
kategori ||--o{ produk : "punya"
produk ||--o{ transaksi_item : "terjual di"
transaksi ||--|{ transaksi_item : "berisi"
kasir ||--o{ transaksi : "melayani"
pelanggan |o--o{ transaksi : "berbelanja (boleh kosong)"
pemasok ||--o{ pembelian : "memasok"
produk ||--o{ pembelian : "dibeli ulang"
| Tabel | Baris | Isi |
|---|---|---|
kategori | 7 | Kategori produk (Alat tulis sengaja belum punya produk) |
produk | 32 | Nama, kategori, harga_jual dan harga_beli sekarang (rupiah), satuan, stok, aktif (0/1) |
pemasok | 4 | Pemasok dan kotanya (satu belum pernah dipesan bulan ini) |
pembelian | 45 | Belanja stok ke pemasok |
kasir | 3 | Kasir dan tanggal mulai kerja |
pelanggan | 15 | Pelanggan langganan; rt boleh NULL; dua belum pernah belanja |
transaksi | 816 | Waktu ('YYYY-MM-DD HH:MM:SS'), kasir, pelanggan (NULL = pembeli umum), metode bayar (tunai/qris/transfer) |
transaksi_item | 1.516 | Isi tiap transaksi: produk, jumlah, harga_satuan saat itu |
Detail yang sengaja ditanam untuk latihan: dua produk tidak pernah terjual;
satu produk berhenti dijual 8 September (aktif = 0); harga minyak goreng
naik 15 September dan gula pasir 22 September (jadi harga_satuan di
transaksi lama berbeda dari harga_jual sekarang); sebagian besar transaksi
tanpa pelanggan (NULL); jam ramai pagi dan sore; QRIS makin sering di akhir
bulan.
Mulai Modul 10 tersedia juga data/kasbon.sql (dimuat sesudah warung.sql):
rancangan rujukan fitur kasbon (utang belanja pelanggan) beserta
pembayarannya.
Semua angka fiktif. Harga dibuat masuk akal untuk warung di Jawa pada 2026, bukan data resmi.
Cara belajar di course ini
- Tebak dulu, baru jalankan. Sebelum menjalankan kueri, tebak berapa baris dan kolom hasilnya. Hasil yang mengejutkan adalah tanda kamu belum paham datanya, atau kuerinya salah.
- Latihan diperiksa otomatis: hasil kuerimu dibandingkan dengan hasil yang benar (jumlah kolom, jumlah baris, isi, dan urutan bila diminta). Petunjuk bertingkat dulu, solusi paling akhir.
- Kueri yang jalan belum tentu benar. Setiap modul punya bagian
Kesalahan umum: kueri yang tidak galat tetapi menjawab pertanyaan yang
salah (baris berlipat karena JOIN,
NULLyang hilang diam-diam, pembagian bilangan bulat). - AI sebagai rekan, kamu sebagai pemeriksa (lihat bagian berikut).
- Inti dulu, pendalaman belakangan. Setiap modul dibuka dengan kotak Intinya. Bagian bertanda Di balik layar (opsional) atau Pendalaman boleh dilewati di bacaan pertama; latihan dan kuis inti tidak bergantung padanya.
Waktu: ±2–6 jam per modul (tertulis di awal setiap modul), total ±45–50 jam.
Belajar bersama AI
Setiap modul punya bagian Belajar bersama AI dengan metode yang sama; modulnya hanya menambahkan contoh khas topiknya.
- Bertanya dengan konteks. Sebut basis data dan versinya (SQLite 3.45,
PostgreSQL 16), tempel skema (
pragma_table_info) atau pesan galat yang sebenarnya, dan minta penjelasan, bukan sekadar kueri jadi. - Memeriksa, bukan memercayai. Jalankan setiap kueri dari AI. Tebak dulu jumlah baris dan kolomnya, tulis kueri kedua dengan cara lain yang seharusnya memberi angka sama, hitung satu baris dengan tangan, dan pastikan bagian-bagian berjumlah sama dengan keseluruhan.
- Tiga langkah tugas. Tugas tanpa AI melatih penalaran dengan kertas dan pensil; Tugas dengan AI memberi perintah yang realistis lalu memeriksa hasilnya dengan mesin; Bandingkan mencatat kesalahan khas AI untuk topik itu dan pemahaman yang menangkapnya.
Silabus (15 modul)
| # | Modul | Hasil utama | Langkah proyek |
|---|---|---|---|
| 01 | Data, tabel, dan basis data | Tabel/baris/kolom, kunci primer, relasi, SQLite vs PostgreSQL, kueri pertama | Mengenal skema Warung Makmur |
| 02 | SELECT, WHERE, dan ORDER BY | Memilih kolom, alias, ekspresi, saringan (AND/OR/IN/BETWEEN/LIKE), DISTINCT, urut, LIMIT | Daftar produk untuk dicek ulang stoknya |
| 03 | NULL, CASE, dan fungsi bawaan | Logika NULL, COALESCE, CASE WHEN, fungsi teks dan angka, pembagian bilangan bulat, fungsi tanggal (satu tabel padanan SQLite dan PostgreSQL) | Label stok dan margin per produk |
| 04 | Agregasi | COUNT/SUM/AVG/MIN/MAX, GROUP BY, HAVING, WHERE vs HAVING, mengelompokkan per hari/jam | Laporan 1: omzet harian dan jam ramai |
| 05 | JOIN | Kunci asing, INNER JOIN, LEFT JOIN, anti-join, baris berlipat (fan-out), self-join singkat | Laporan 2: produk terlaris dan yang tidak laku |
| 06 | Subquery dan CTE | Subquery skalar, IN, EXISTS, berkorelasi, WITH untuk kueri bertahap | Laporan 3: margin per kategori dan pelanggan setia |
| 07 | Window function | ROW_NUMBER/RANK/DENSE_RANK, PARTITION BY, total berjalan, LAG/LEAD, rata-rata bergerak, top-N per kelompok | Laporan 4: tren harian dan juara per kategori |
| 08 | Mengubah data | INSERT, UPDATE, DELETE, BEGIN/COMMIT/ROLLBACK, upsert ON CONFLICT, kebiasaan aman | Mencatat restok dan koreksi harga |
| 09 | Membuat tabel dan menjaga data | CREATE TABLE, tipe data (afinitas SQLite), NOT NULL/UNIQUE/CHECK/DEFAULT, kunci asing dan PRAGMA foreign_keys, ALTER TABLE | Tabel kasbon pertama |
| 10 | Desain skema | Entitas dan relasi, 1-N dan N-N, normalisasi (1NF–3NF) dengan contoh, kapan denormalisasi, ERD, penamaan | Merancang kasbon dengan benar (rancangan rujukan kasbon.sql) |
| 11 | Indeks dan kinerja dasar | Cara kerja indeks (intuisi B-tree), EXPLAIN QUERY PLAN, indeks gabungan, kapan indeks tidak terpakai, biaya indeks | Indeks untuk laporan |
| 12 | Dari SQLite ke PostgreSQL | Perbedaan tipe dan fungsi tanggal, IDENTITY, BOOLEAN, TIMESTAMP, psql, memindahkan Warung Makmur | Laporan berjalan di PostgreSQL |
| 13 | Transaksi dan konkurensi | ACID, pembaruan yang hilang, pembaruan atomik, SELECT … FOR UPDATE, deadlock, BEGIN IMMEDIATE di SQLite, mencoba ulang transaksi; pendalaman: tingkat isolasi, write skew, MVCC | Dua kasir menulis bersamaan tanpa merusak stok |
| 14 | SQL dari Python | sqlite3, parameter ?, SQL injection, mengambil baris, transaksi dari Python, menulis CSV/Markdown | Skrip laporan bulanan otomatis |
| 15 | Proyek akhir: Laporan Warung Makmur | Menyatukan laporan, skema kasbon, indeks, versi PostgreSQL, README dengan temuan dan rekomendasi; lencana Tayang ringan (repo publik, GitHub Actions, GitHub Pages) | Proyek utuh |
Detail proyek: proyek-warung.md.
Yang sengaja tidak dibahas di F2: stored procedure dan trigger lanjutan, replikasi, partisi, tuning server, ORM, gudang data dan skema bintang (ada di C4). Menayangkan aplikasi dan API (Docker, CI/CD) ada di F5 Rilis.
Kerangka setiap modul
Sama dengan F1 (lihat ../f1-python/README.md, "Kerangka setiap modul"),
dengan penyesuaian:
- Tambahkan
<!-- data-contoh: warung -->di bawah blockquote agar setiap contohsqldijalankan di dataset Warung Makmur (Modul 10 ke atas bolehwarung,kasbon). - Intinya (3–5 butir pendek) tepat sebelum bagian 1.
- 2. Konsep: setiap contoh
sqldiikutitext hasilyang dicetak alat pemeriksa, tidak diketik tangan. Sebelum hasil, minta pembaca menebak jumlah baris. - 3. Latihan: format latihan SQL standar Coding Studio; minimal 8
latihan per modul (3 dasar, 3 menengah, 2 tantangan, ditandai
**Tingkat:**). Latihan hanya memakai konsep yang sudah diajarkan. - 2. Konsep, "Di balik layar (opsional)": pendalaman di akhir bagian 2 (aljabar relasional, rencana kueri, B-tree, jurnal/WAL, MVCC), dibuka dengan catatan "boleh dilewati". Latihan dan kuis inti tidak bergantung padanya; soal yang memakainya ditandai pendalaman. Satu konsep punya satu rumah (misalnya fungsi tanggal di Modul 03, ACID di Modul 13, algoritma join dan jendela di C4); modul lain menautkan, tidak mengajarkan ulang.
- 4. Kesalahan umum: utamakan kesalahan yang tidak memunculkan galat
(hasil salah diam-diam), lalu galat yang sering muncul (
sql galat+text galat). - 5. Belajar bersama AI: rujuk metode bersama di README ini, lalu tiga contoh pertanyaan, satu jawaban AI yang terdengar benar tetapi salah, dan tugas tanpa/dengan AI yang ringkas.
- 7. Di dunia kerja: skenario generik yang realistis (toko daring, aplikasi kasir, aplikasi belajar, bank). Jangan merujuk repo, berkas, jalur kode, keputusan, atau insiden internal perusahaan mana pun.
Pedoman bahasa dan istilah
Sapaan "kamu" dan istilah baku sama dengan F1, ditambah:
| Inggris | Dipakai |
|---|---|
| query | kueri |
| table / row / column | tabel / baris / kolom |
| primary key / foreign key | kunci primer / kunci asing |
| constraint | constraint (batasan) |
| index | indeks |
| join | JOIN (menggabungkan tabel) |
| aggregate | agregasi |
| subquery, CTE, window function | subquery, CTE, window function |
| schema | skema |
| transaction | transaksi basis data (bedakan dari tabel transaksi warung: sebut "transaksi basis data" atau BEGIN…COMMIT) |
Kata kunci SQL ditulis HURUF BESAR, nama tabel/kolom huruf kecil
(snake_case), satu klausa utama per baris untuk kueri lebih dari satu
baris.
Aturan mutu (untuk penulis dan reviewer)
- Semua kueri diperiksa mesin. Pemeriksa latihan Coding Studio harus melaporkan 0 galat untuk course ini. Hasil tidak pernah diketik dari ingatan; angka di prosa (misalnya "omzet tertinggi Rp…") diambil dari kueri yang dijalankan.
- SQLite ≥ 3.45 untuk semua latihan dan contoh yang dijalankan.
Kueri khusus PostgreSQL ditandai
sql postgresdan diuji manual di PostgreSQL 16. - Jawaban pasti. Setiap
ORDER BYyang dinilai atau dipotongLIMITpunya pemecah seri; pemeriksa menolak jawaban yang bergantung pada urutan fisik baris. - Dataset tidak disunting tangan. Ubah
buat_warung.py, jalankan ulang, lalu jalankan pemeriksa untuk semua modul (hasil contoh bisa berubah). - Tanpa data pribadi, fakta dicek, kuota gratis bertanggal (sama dengan F1).