MySQL adalah sistem manajemen database relasional paling banyak dipakai untuk aplikasi web, mulai dari toko online kecil hingga layanan berskala raksasa. Pada Course ini, kita akan mempelajari MySQL secara utuh: menulis SQL, merancang tabel, mengoptimalkan query, mengelola user dan keamanan, melakukan backup, sampai mereplikasi data ke server lain.

Seluruh contoh kode pada Course ini diuji menggunakan MySQL 8.4 (Community Server) — versi Long-Term Support yang dirilis Oracle dan menjadi standar produksi saat ini. Apabila Anda memakai versi MySQL yang berbeda, sebagian perilaku contoh dapat berbeda, terutama pada fitur terbaru atau fitur yang telah dihapus.

Bab 2 Persiapan Lingkungan

# Instalasi MySQL

Pasang MySQL 8.4 Community di Windows, macOS, dan Linux dengan metode resmi, verifikasi hasil instalasi lewat mysql --version dan SELECT VERSION(), serta kenali MySQL sebagai service dan daemon di latar belakang.

Buka →
# Konfigurasi MySQL Server

Pelajari file my.cnf/my.ini, section [mysqld], variabel server yang paling sering disesuaikan, cara membaca konfigurasi aktif dengan SHOW VARIABLES, serta perbedaan SET GLOBAL, SET SESSION, dan SET PERSIST.

Buka →
# Menggunakan MySQL Client

Kuasai mysql client baris perintah: opsi koneksi -h, -P, -u, -p, pola sesi interaktif, perintah backslash seperti \G, \c, dan \q, hingga mode batch dengan --execute dan file SQL.

Buka →
# Menggunakan MySQL Workbench

Kenali MySQL Workbench sebagai GUI resmi Oracle: membuat koneksi baru, bekerja di SQL editor dengan hasil visual, memakai panel administrasi, dan menentukan kapan GUI lebih produktif daripada terminal.

Buka →
# Mengakses MySQL melalui Terminal

Susuri alur lengkap bekerja dengan MySQL dari terminal: membuka sesi, membaca arti berbagai prompt mysql> dan ->, menjalankan statement, lalu menutup sesi dengan benar dan berulang.

Buka →
# Membuat Koneksi Database

Bedah lima parameter koneksi (host, port, user, password, database), perbedaan jalur TCP dan Unix socket, cara menguji koneksi, user khusus untuk aplikasi, serta tiga galat koneksi yang paling sering muncul.

Buka →
# Struktur Folder dan File Proyek

Rapikan latihan MySQL menjadi proyek kecil yang bisa dijalankan ulang: konvensi folder sql/, data/, dan tests/, anatomi file .sql beserta header komentar, serta cara menjalankan seluruh skema lewat mode batch dan SOURCE dari terminal.

Buka →

Bab 4 Tipe Data

# INTEGER

Pelajari lima ukuran tipe INTEGER di MySQL — TINYINT hingga BIGINT — beserta rentang nilainya, perilaku galat out-of-range pada strict mode, mitos INT(11), dan penggunaan UNSIGNED.

Buka →
# DECIMAL dan Floating POINT

Pelajari DECIMAL(M,D) untuk angka pecahan yang persis seperti harga dan uang, bandingkan dengan FLOAT/DOUBLE yang menyimpan nilai biner perkiraan, dan pahami kapan masing-masing wajib dipakai.

Buka →
# STRING

Pelajari perbedaan CHAR dan VARCHAR, keluarga TEXT untuk teks panjang, ENUM untuk daftar nilai tetap, serta perilaku spasi belakang yang sering menjebak pemula.

Buka →
# DATE dan TIME

Pelajari tipe tanggal dan waktu di MySQL — DATE, TIME, DATETIME, TIMESTAMP, dan YEAR — format literal ISO, operasi DATEDIFF dan DATE_ADD, serta perbedaan mendasar DATETIME vs TIMESTAMP dan jebakan tahun 2038.

Buka →
# BOOLEAN dan Nilai Logika

Pelajari tipe BOOLEAN di MySQL yang sebenarnya alias TINYINT(1), makna TRUE dan FALSE sebagai angka 1 dan 0, kebenaran nilai selain nol, serta trik penyimpanan data ya/tidak.

Buka →
# JSON

Pelajari tipe JSON di MySQL 8.4: validasi otomatis saat INSERT, pemeriksaan JSON_VALID dan JSON_TYPE, pembacaan nilai dengan JSON_EXTRACT, serta fakta bahwa JSON disimpan dalam format biner internal.

Buka →
# BINARY Data

Pelajari tipe data biner MySQL — BINARY, VARBINARY, dan keluarga BLOB — perilaku padding byte nol, fungsi HEX dan UNHEX untuk membaca byte, serta contoh menyimpan hash dan token.

Buka →
# Memilih Tipe Data

Rangkum seluruh section menjadi kerangka keputusan: matriks kasus nyata ke tipe data yang tepat, aturan praktis yang teruji, dan satu contoh skema toko kecil lengkap dari CREATE TABLE sampai query JOIN.

Buka →
# SIGNED dan UNSIGNED

Pelajari atribut SIGNED dan UNSIGNED pada tipe integer MySQL: perbedaan rentangnya, cara membacanya di DESC, galat ERROR 1690 pada pengurangan kolom UNSIGNED, dan kesalahan umum saat migrasi data.

Buka →

Bab 5 Table Design

# Membuat Struktur Tabel

Pelajari cara merancang kolom tabel secara utuh — nama, tipe data, dan aturan NULL — menuliskan CREATE TABLE yang bersih dengan konvensi penamaan snake_case, lalu memeriksa strukturnya melalui DESC.

Buka →
# PRIMARY KEY

Pelajari konsep primary key sebagai identitas baris: PK satu kolom, perbandingan kunci sintetis dengan natural key, penolakan INSERT duplikat dan NULL, sampai perilaku tabel tanpa PK.

Buka →
# FOREIGN KEY

Pelajari cara mendefinisikan FOREIGN KEY dengan REFERENCES dan aksi ON DELETE CASCADE, RESTRICT, serta SET NULL — disertai uji nyata penolakan baris yatim, index otomatis, dan pemeriksaan lewat SHOW CREATE TABLE.

Buka →
# UNIQUE Constraint

Pelajari UNIQUE constraint untuk menjaga keunikan nilai kolom seperti email: unique satu kolom, unique multi kolom, perilaku NULL yang boleh ganda, serta perbandingannya dengan PRIMARY KEY.

Buka →
# NOT NULL Constraint

Pelajari NOT NULL constraint secara mendalam: penolakan INSERT NULL dan kolom wajib yang terlewat, bedah perbedaan NULL dengan string kosong, serta konsep COUNT(*) dan COUNT(kolom).

Buka →
# DEFAULT Value

Pelajari cara menetapkan nilai bawaan kolom dengan klausa DEFAULT: nilai literal yang deterministik, kata kunci DEFAULT di INSERT, DEFAULT pada kolom NOT NULL, sampai CURRENT_TIMESTAMP.

Buka →
# AUTO INCREMENT

Pelajari AUTO_INCREMENT sebagai pengisi primary key otomatis: pasangan id dan PK, LAST_INSERT_ID, celah nilai saat insert gagal, nilai manual, dan mengapa id tidak dijamin berurutan rapat.

Buka →
# CHECK Constraint

Pelajari CHECK constraint untuk memvalidasi isi kolom langsung di database: aturan harga dan stok non-negatif, CHECK di level kolom vs level tabel, galat 3819, serta batasan fungsi nondeterministik dan subquery.

Buka →
# COMPOSITE KEY

Pelajari composite primary key pada tabel junction many-to-many: keunikan pasangan pesanan-produk, penolakan duplikat pasangan, keabsahan kecocokan sebagian, serta kapan memilih composite key atau surrogate key.

Buka →
# Mengubah Struktur Tabel

Pelajari ALTER TABLE untuk mengubah tabel yang sudah berisi data: ADD, MODIFY, CHANGE, dan DROP COLUMN, RENAME TO, penambahan PRIMARY KEY, UNIQUE, dan FOREIGN KEY belakangan, serta urutan aman migrasi skema.

Buka →

Bab 6 Manipulasi Data

# INSERT

Pelajari cara menambah baris data ke tabel dengan INSERT ... VALUES: bentuk lengkap dengan daftar kolom eksplisit, berbagai jenis nilai seperti string, angka, tanggal, dan NULL, hingga menyalin data lewat INSERT ... SELECT.

Buka →
# SELECT

Pelajari cara membaca data dengan SELECT: memilih kolom tertentu, memakai SELECT dari seluruh kolom, memberi alias kolom dengan AS, menghitung ekspresi seperti harga * 0.9, memfilter dengan WHERE, dan membatasi hasil dengan LIMIT.

Buka →
# UPDATE

Pelajari cara mengubah data yang sudah tersimpan dengan UPDATE SET: memperbarui satu atau beberapa kolom dengan WHERE, membaca arti Rows matched versus Changed, serta bahaya lupa WHERE yang memperbarui seluruh baris tabel.

Buka →
# DELETE

Pelajari cara menghapus baris dari tabel dengan DELETE WHERE, menghapus beberapa baris sekaligus, interaksi DELETE dengan foreign key ON DELETE CASCADE, bahaya DELETE tanpa WHERE, serta perilaku AUTO_INCREMENT yang tidak ikut ter-reset.

Buka →
# INSERT Multiple Rows

Pelajari cara menambahkan banyak baris sekaligus dengan INSERT VALUES multi-baris: membaca output N rows affected, urutan baris dan penomoran AUTO_INCREMENT pada batch, sifat atomik statement, INSERT ... SELECT multi-baris, hingga batas max_allowed_packet.

Buka →
# INSERT On Duplicate KEY UPDATE

Pelajari pola upsert INSERT ... ON DUPLICATE KEY UPDATE: sisipkan baris baru atau perbarui baris yang sudah ada dalam satu statement, baca arti output 1, 2, dan 0 rows affected, gunakan alias baris AS untuk merujuk nilai baru, dan terapkan upsert multi-baris untuk sinkronisasi data.

Buka →
# REPLACE Into

Pelajari REPLACE INTO sebagai alternatif upsert yang bekerja dengan hapus-lalu-sisip: lihat bukti nyata kolom yang tidak disebut kembali ke nilai default, id AUTO_INCREMENT baru, perbandingan dengan ON DUPLICATE KEY UPDATE, dan alasan menghindari REPLACE saat tabel di-referensikan foreign key.

Buka →
# TRUNCATE TABLE

Pelajari cara mengosongkan seluruh isi tabel dengan TRUNCATE TABLE: bukti nyata AUTO_INCREMENT di-reset ke 1, sifat DDL tanpa WHERE yang tidak bisa dibatalkan dengan ROLLBACK, galat ERROR 1701 saat tabel di-referensikan foreign key, serta perbandingan DELETE, TRUNCATE, dan DROP.

Buka →

Bab 7 Filtering dan Sorting

# WHERE

Pelajari klausa WHERE untuk menyaring baris pada SELECT: pola dasar kondisi, menyaring kolom angka, teks, dan tanggal dengan nilai literal, serta membandingkan hasil SELECT * dengan hasil yang telah tersaring.

Buka →
# Operator Perbandingan

Bedah enam operator perbandingan MySQL (=, <>, !=, <, <=, >, >=) pada angka, teks case-insensitive akibat collation bawaan, tanggal literal, serta perilaku khusus NULL yang menghasilkan hasil kosong alih-alih error.

Buka →
# Operator Logika

Perkenalkan operator logika AND, OR, dan NOT untuk merangkai beberapa kondisi di klausa WHERE, lengkap dengan tabel kebenaran ringkas dan perilaku khusus NULL pada operasi logika.

Buka →
# AND OR NOT

Latih kombinasi AND, OR, dan NOT pada kondisi majemuk: bukti nyata prioritas operator AND di atas OR yang mengubah hasil, kekuatan tanda kurung, serta jebakan NOT IN saat daftar berisi NULL.

Buka →
# IN dan NOT IN

Saring baris terhadap daftar nilai dengan IN dan NOT IN: daftar teks dan angka, perbandingan keterbacaan IN versus OR berantai, hingga gotcha NULL di daftar NOT IN yang mengosongkan hasil.

Buka →
# BETWEEN

Saring rentang nilai dengan BETWEEN dan NOT BETWEEN pada angka dan tanggal, bukti nyata bahwa nilai batas bersifat inklusif, padanan BETWEEN dengan >= AND <=, serta jebakan rentang terbalik.

Buka →
# LIKE dan Wildcards

Cocokkan pola teks dengan LIKE dan wildcard % serta _: pola awalan, akhiran, dan mengandung kata, perilaku case-insensitive bawaan, karakter escape, dan catatan performa pola berawalan wildcard.

Buka →
# Is NULL

Saring baris yang nilainya NULL atau tidak dengan IS NULL dan IS NOT NULL: perbedaan NULL dari string kosong dan nol, alasan kondisi = NULL tidak pernah mengembalikan baris, fungsi ISNULL(), hingga pengantar perilaku COUNT yang mengabaikan NULL.

Buka →
# ORDER BY

Urutkan hasil query dengan ORDER BY: arah ASC dan DESC beserta nilai default, pengurutan multi kolom, kolom alias dan ekspresi, urutan teks case-insensitive, posisi NULL dalam ASC dan DESC, serta aturan ORDER BY bersama GROUP BY.

Buka →
# LIMIT dan OFFSET

Batasi jumlah baris hasil query dengan LIMIT dan OFFSET: pola LIMIT n, dua bentuk sintaks offset, paging halaman deterministik dengan ORDER BY eksplisit, kasus tepi LIMIT 0 dan offset melebihi jumlah baris, hingga kombinasi lengkap WHERE-ORDER-LIMIT.

Buka →
# DISTINCT

Hilangkan baris kembar dari hasil query dengan DISTINCT: penyaringan satu kolom, keunikan kombinasi pada multi kolom, perlakuan NULL yang dihitung sebagai satu nilai, gotcha DISTINCT yang berlaku pada seluruh baris, hingga penghitungan nilai unik dengan COUNT(DISTINCT).

Buka →

Bab 8 Fungsi SQL

# Fungsi STRING

Olah teks langsung di dalam query: UPPER dan LOWER, LENGTH vs CHAR_LENGTH, CONCAT dan CONCAT_WS, SUBSTRING, TRIM, REPLACE, LEFT dan RIGHT, LPAD dan RPAD, serta LOCATE.

Buka →
# Fungsi Numerik

Hitung langsung di dalam query: ROUND dan TRUNCATE, CEIL dan FLOOR, ABS, MOD, POWER, perilaku pembagian dengan slash dan DIV, serta RAND beserta seed-nya untuk hasil yang dapat direproduksi.

Buka →
# Fungsi DATE dan TIME

Olah tanggal dan waktu di dalam query: YEAR, MONTH, DAY, dan HOUR, DAYNAME dan MONTHNAME, DATE_FORMAT dengan lc_time_names untuk format Indonesia, DATEDIFF, TIMESTAMPDIFF, serta DATE_ADD dan DATE_SUB dengan INTERVAL.

Buka →
# Fungsi Konversi Tipe Data

Ubah tipe data di dalam query dengan CAST dan CONVERT: konversi teks ke angka dan tanggal, konversi character set dengan USING, konversi implisit string ke angka, serta STR_TO_DATE untuk teks tanggal non-baku.

Buka →
# Fungsi NULL

Pahami dan kendalikan NULL di dalam query: propagasi NULL pada operasi, pembanding IS NULL dan IS NOT NULL, IFNULL, COALESCE untuk rantai nilai pengganti, NULLIF, serta perbedaan COUNT(*) dan COUNT(kolom).

Buka →
# Fungsi Kondisional

Ambil keputusan di dalam query: fungsi IF dengan tiga argumen, dua bentuk CASE WHEN (searched dan simple), CASE di SELECT dengan alias, CASE di ORDER BY untuk urutan prioritas, serta perbandingan IF, IFNULL, dan NULLIF.

Buka →
# Fungsi Agregat

Ringkas seluruh tabel menjadi satu baris angka dengan SUM, AVG, MIN, MAX, dan COUNT; hitung nilai unik dengan COUNT(DISTINCT), pahami cara agregat memperlakukan NULL, dan lihat pola GROUP BY sebagai pengantar section agregasi-data.

Buka →
# Ekspresi dan Alias

Bangun kolom hasil di dalam query: alias kolom dengan dan tanpa AS, alias bertanda kutip, alias di ORDER BY yang sah versus alias di WHERE yang memicu ERROR 1054, alias tabel, prioritas operator aritmetika, dan praktik derived column.

Buka →

Bab 9 Agregasi Data

# COUNT

Bedah fungsi agregasi COUNT di MySQL: perbedaan COUNT(*), COUNT(kolom), dan COUNT(DISTINCT kolom), perlakuan NULL pada tiap varian, serta perilaku COUNT pada hasil kosong yang selalu menghasilkan 0.

Buka →
# SUM

Bedah fungsi agregasi SUM di MySQL: menjumlahkan kolom angka, menjumlahkan hasil ekspresi seperti jumlah * harga, perilaku SUM ketika tidak ada baris cocok yang menghasilkan NULL, penggunaan COALESCE, dan konsep SUM(DISTINCT).

Buka →
# AVG

Bedah fungsi agregasi AVG di MySQL: menghitung nilai rata-rata, aturan skala hasil DECIMAL yang menampilkan empat hingga enam angka desimal, perilaku AVG yang mengabaikan NULL, perbandingan dengan SUM/COUNT manual, dan pembulatan tampilan dengan ROUND.

Buka →
# MIN dan MAX

Bedah fungsi agregasi MIN dan MAX di MySQL: nilai terkecil dan terbesar untuk angka, tanggal, dan teks, urutan perbandingan collation pada data string, perilaku terhadap NULL, serta pola subquery untuk menemukan baris yang memuat nilai ekstrem.

Buka →
# GROUP BY

Bedah klausa GROUP BY di MySQL: membagi tabel menjadi kelompok untuk COUNT dan SUM per grup, aturan kolom non-agregat yang wajib ikut GROUP BY beserta error sql_mode only_full_group_by, perilaku urutan hasil pada MySQL 8, pengelompokan berdasarkan ekspresi seperti DATE(), dan perlakuan NULL yang membentuk kelompok tersendiri.

Buka →
# HAVING

Bedah klausa HAVING untuk menyaring hasil agregat: perbedaan dengan WHERE, urutan eksekusi logis klausa SELECT, penyaringan SUM dan COUNT, penggunaan alias agregat yang dimungkinkan MySQL, hingga kombinasi lengkap WHERE-GROUP BY-HAVING-ORDER BY.

Buka →
# Agregasi dengan Kondisi

Hitung agregat secara selektif dalam satu query dengan SUM(CASE WHEN ...), COUNT(IF(...)), dan pola pivot sederhana; bandingkan pendekatan kolom kondisional melawan GROUP BY beserta kapan masing-masing lebih tepat dipakai.

Buka →
# WITH ROLLUP

Tambahkan baris subtotal dan total keseluruhan otomatis dengan WITH ROLLUP: pengelompokan bertingkat dua kolom, membedakan NULL penanda rollup dari NULL data asli lewat fungsi GROUPING(), serta batasan kombinasi dengan ORDER BY dan LIMIT.

Buka →

Bab 10 Joins

# Konsep Relasi Antartabel

Mengapa data database relasional dipecah ke banyak tabel, bagaimana relasi satu-ke-banyak dibangun lewat foreign key pada kolom kunci, serta cara menggabungkan kembali data terpisah dari dua tabel sebelum mengenal JOIN.

Buka →
# INNER JOIN

Bedah INNER JOIN di MySQL: menggabungkan pelanggan dan pesanan lewat klausa ON, memakai alias tabel pendek, membuktikan bahwa baris tanpa pasangan tidak ikut tampil, varian USING untuk kolom bernama sama, serta kombinasi JOIN dengan WHERE dan ORDER BY.

Buka →
# LEFT JOIN

Bedah LEFT JOIN di MySQL: mempertahankan seluruh baris sisi kiri dengan pengisi NULL untuk baris tanpa pasangan, pola anti-join LEFT JOIN + IS NULL untuk mencari pelanggan yang belum pernah memesan, serta jebakan COUNT(*) versus COUNT kolom kanan saat menghitung pesanan per pelanggan.

Buka →
# RIGHT JOIN

Bedah RIGHT JOIN di MySQL: mempertahankan seluruh baris sisi kanan dengan pengisi NULL di sisi kiri, mengapa desain foreign key membuat hasilnya bisa terlihat sama dengan INNER JOIN, serta kebiasaan menulis ulang RIGHT JOIN sebagai LEFT JOIN terbalik demi portabilitas.

Buka →
# CROSS JOIN

Bedah CROSS JOIN di MySQL: hasil perkalian Cartesian baris a×b, perbandingan sintaks CROSS JOIN eksplisit dengan koma lama, kombinasi ukuran×warna produk sebagai kasus nyata, bahaya lupa klausa ON yang diam-diam memicu Cartesian product, serta penyaringan hasil dengan WHERE.

Buka →
# SELF JOIN

Bedah self join di MySQL: meng-join satu tabel dengan dirinya sendiri memakai dua alias — pegawai dipasangkan dengan manajernya lewat kolom manajer_id, pegawai ber-induk NULL ditangani LEFT JOIN, serta pola rekan satu atasan dengan kondisi tambahan di ON.

Buka →
# Multiple Joins

Bedah join bertingkat tiga tabel di MySQL: merangkai pelanggan, pesanan, dan detail pesanan dalam satu query, membuktikan urutan join bebas asalkan rantai kunci tersambung, lalu menggabungkan tiga tabel dengan agregat SUM dan COUNT(DISTINCT) per pelanggan.

Buka →
# JOIN dengan Kondisi

Bedah kondisi tambahan pada klausa ON join MySQL: memfilter pesanan langsung dari ON, perbedaan mendasar kondisi di ON versus WHERE pada LEFT JOIN yang bisa diam-diam merosot menjadi INNER JOIN, serta non-equi join dengan kondisi pertidaksamaan seperti total pesanan terhadap syarat promo.

Buka →
# Menghindari Duplikasi Hasil JOIN

Bedah duplikasi baris hasil join 1-N di MySQL: satu pelanggan tiga pesanan menjadi tiga baris, jebakan klasik SUM yang melonjong saat pesanan digandakan detailnya, solusi agregat di subquery sebelum join, penggunaan DISTINCT yang sah dan yang menutup masalah, serta teaser EXISTS dari section subqueries.

Buka →

Bab 11 Subqueries

# Pengenalan Subquery

Kenalan dengan subquery di MySQL: query di dalam query yang ditulis dalam tanda kurung, logika evaluasinya yang berjalan lebih dulu sebelum dipakai query luarnya, tiga posisi utama di WHERE, SELECT, dan FROM, serta contoh pertama menyaring produk dengan harga di atas rata-rata.

Buka →
# Scalar Subquery

Bedah scalar subquery di MySQL: subquery yang mengembalikan tepat satu baris satu kolom sehingga bisa dipakai di tempat nilai biasa berada, perilaku subquery kosong yang diam-diam menjadi NULL, dan error 1242 yang muncul saat subquery mengembalikan lebih dari satu baris.

Buka →
# Subquery dalam WHERE

Pakai subquery di klausa WHERE MySQL: IN dan = ANY untuk keanggotaan dari hasil query lain, bedah ALL versus ANY dengan angka konkret, agregat sebagai ambang penyaringan, gotcha NOT IN yang menghasilkan kosong karena NULL, hingga pengantar subquery berkorelasi.

Buka →
# Subquery dalam FROM

Pakai subquery setelah klausa FROM MySQL sebagai derived table: kewajiban alias yang menimbulkan error 1248 bila dilanggar, pola klasik agregat dulu lalu join untuk nama pelanggan, serta trik memfilter hasil agregat yang tidak bisa dilakukan WHERE biasa.

Buka →
# Subquery dalam SELECT

Selipkan subquery di daftar SELECT MySQL sebagai kolom kalkulasi: hitung jumlah transaksi per produk dari tabel lain, tangani baris tanpa pasangan dengan IFNULL, pakai subquery di ORDER BY, dan timbang keterbacaan melawan performa pola ini.

Buka →
# EXISTS dan NOT EXISTS

Bedah operator EXISTS dan NOT EXISTS di MySQL: konvensi SELECT 1, perilaku berhenti di baris pertama yang ditemukan, NOT EXISTS sebagai anti-join untuk mencari yang belum punya pasangan, dan perbandingan nyatanya melawan NOT IN yang gagal diam-diam karena NULL.

Buka →
# Correlated Subquery

Bedah correlated subquery di MySQL: subquery yang merujuk kolom tabel query luar sehingga dievaluasi ulang untuk setiap baris, contoh produk dengan harga di atas rata-rata kategorinya sendiri, EXISTS berkorelasi, dan biaya per baris di tabel besar.

Buka →
# Subquery vs JOIN

Bandingkan subquery dan JOIN di MySQL pada soal yang sama: pelanggan dengan pesanan lewat JOIN+DISTINCT versus EXISTS, total belanja per pelanggan lewat join versus derived table, tabel keputusan keterbacaan performa dan semantik, serta situasi yang menuntut salah satunya.

Buka →

Bab 12 Set Operations dan CTE

# UNION

Bedah operator UNION di MySQL: menggabungkan hasil dua query atau lebih secara vertikal berdasarkan posisi kolom, aturan tipe yang harus kompatibel, perilaku penghapusan baris duplikat sehingga jumlah baris hasil dihitung ulang, penempatan ORDER BY untuk hasil gabungan, serta cara membatasi tiap sumber dengan tanda kurung dan LIMIT.

Buka →
# UNION ALL

Bedah operator UNION ALL di MySQL: menggabungkan hasil query tanpa penghapusan duplikat sehingga semua baris dipertahankan dan eksekusi lebih cepat, perbandingan UNION vs UNION ALL dari sisi jumlah baris dan performa, penandaan asal baris dengan kolom literal seperti 'Q1' dan 'Q2', serta rekap jumlah baris per sumber memakai kolom penanda dan GROUP BY.

Buka →
# Common TABLE Expressions

Bedah Common Table Expressions di MySQL: klausa WITH yang memberi nama pada subquery, kesetaraan CTE dengan derived table, penulisan beberapa CTE beruntun dalam satu statement, pemakaian CTE yang sama berulang kali, penulisan ulang subquery bersarang menjadi langkah bertingkat yang terbaca atas ke bawah, serta bukti bahwa CTE hanya hidup selama satu statement.

Buka →
# RECURSIVE CTE

Bedah WITH RECURSIVE di MySQL: anatomi bagian anchor, bagian rekursif, dan terminator yang wajib dipahami; pembuktian batas kedalaman default cte_max_recursion_depth beserta error 3636; pembangkitan deret tanggal 7 hari dengan DATE_ADD untuk kerangka anggaran; dan penelusuran hierarki manajer-pegawai dari tabel yang mereferensikan dirinya sendiri.

Buka →
# Kapan Menggunakan CTE

Menimbang kapan CTE benar-benar membantu — query bertingkat, definisi yang dipakai berulang, pipeline transformasi — dan kapan justru menambah ribut pada query sederhana; perbandingan CTE dengan VIEW dari sisi persistensi dan dengan subquery dari sisi keterbacaan; konsep materialisasi otomatis oleh optimizer; gaya pipeline bertahap dari tabel mentah ke laporan top-N; serta batasan penulisan seperti nama kolom eksplisit.

Buka →

Bab 13 Relational Database Design

# Entitas dan Atribut

Mengubah kebutuhan dunia nyata menjadi struktur tabel MySQL: mengenali entitas dari deskripsi masalah, menurunkan atribut menjadi kolom, memilih tipe data, dan membedakan entitas kuat dari entitas lemah.

Buka →
# Relasi One-to-One

Memecah satu entitas menjadi dua tabel berelasi satu-ke-satu: alasan pemisahan, pola primary key yang sekaligus foreign key, alternatif foreign key UNIQUE, serta praktik CREATE, INSERT, dan JOIN.

Buka →
# Relasi One-to-Many

Membangun relasi satu-ke-banyak antara pelanggan dan pesanan: foreign key selalu ditempatkan di tabel anak, anti-pattern kolom pesanan1/pesanan2 dibedah lalu diperbaiki, plus JOIN, LEFT JOIN, dan agregasi.

Buka →
# Relasi Many-to-Many

Mengenali relasi banyak-ke-banyak seperti mahasiswa dan kursus, membuktikan mengapa satu foreign key tidak pernah cukup, lalu memetakan solusi tabel perantara sebagai dua relasi satu-ke-banyak.

Buka →
# Junction Table

Implementasi penuh relasi banyak-ke-banyak lewat tabel enrollment: composite primary key, dua foreign key, atribut milik relasi seperti nilai dan tanggal daftar, penolakan pasangan ganda, dan query join tiga tabel.

Buka →
# Normalisasi Database

Tujuan normalisasi lewat demonstrasi anomali insert, update, dan delete pada tabel buruk, pengantar ringan functional dependency, trade-offnya, serta peta jalan 1NF, 2NF, dan 3NF.

Buka →
# First Normal Form

Bedah pelanggaran 1NF: kolom yang memuat daftar produk terpisah koma dan kelompok kolom telepon_1/telepon_2/telepon_3, diperbaiki menjadi baris terpisah pada tabel anak, beserta alasan kenapa atomicity menentukan kemampuan query.

Buka →
# Second Normal Form

Bedah 2NF: ketergantungan parsial pada composite primary key ditunjukkan lewat tabel enrollment yang menyimpan nama mahasiswa dobel, anomali update dua baris, lalu perbaikan sebelum/sesudah menjadi tiga tabel bersih.

Buka →
# Third Normal Form

Bedah 3NF: ketergantungan transitif ditunjukkan lewat kolom kota yang mengikuti kode pos, anomali konsistensi pada dua baris berkode pos sama, dan perbaikan pemisahan tabel wilayah sebelum/sesudah.

Buka →
# Denormalisasi

Melanggar normalisasi dengan sengaja untuk kecepatan baca: kolom cache jumlah_pesanan dan total_belanja di tabel pelanggan, pola UPDATE manual, risiko data basi yang dibuktikan nyata, serta aturan main denormalisasi terukur.

Buka →
# Merancang Skema Database

Studi kasus sintesis utuh: merancang skema aplikasi manajemen tugas dari paragraf kebutuhan menjadi entitas, relasi, CREATE TABLE lengkap dengan foreign key dan constraint, data contoh, query verifikasi, checklist perancangan, dan review desain.

Buka →

Bab 14 Indexes

# Konsep INDEX

Pahami index MySQL sebagai struktur data terpisah yang mempercepat pencarian baris: analogi indeks buku beserta batasnya, konsep B-tree terurut, hubungan index dengan baris data, dan trade-off antara kecepatan baca dan biaya tulis.

Buka →
# Membuat dan Menghapus INDEX

Kuasai perintah DDL untuk mengelola index di MySQL: CREATE INDEX pada tabel yang sudah ada, deklarasi KEY dan INDEX langsung di CREATE TABLE, DROP INDEX, membaca keluaran SHOW INDEX kolom per kolom, konvensi penamaan idx_kolom, serta index yang otomatis dibuat oleh PRIMARY KEY, UNIQUE, dan FOREIGN KEY.

Buka →
# UNIQUE INDEX

Bedah CREATE UNIQUE INDEX di MySQL: menolak duplikat sekaligus mempercepat lookup, error 1062 saat data kembar masuk atau sudah ada, perilaku NULL yang tetap boleh ganda pada kolom unik, perbandingan dengan PRIMARY KEY, dan unique index gabungan multi kolom.

Buka →
# COMPOSITE INDEX

Bedah composite index multi kolom di MySQL: membuat index (nama_depan, nama_belakang), aturan leftmost prefix yang membuat kolom kedua tak terpakai sendirian, bukti EXPLAIN key NULL versus index terpakai, perbandingan index gabungan dengan dua index terpisah, dan aturan memilih urutan kolom.

Buka →
# INDEX Prefix

Pelajari index prefix MySQL untuk kolom VARCHAR panjang: membuat INDEX (email(10)), membaca kolom Sub_part pada SHOW INDEX, hemat ruang dibanding index kolom penuh, serta batasannya pada covering index dan ORDER BY.

Buka →
# INDEX pada FOREIGN KEY

Buktikan index otomatis pada kolom FOREIGN KEY InnoDB: dibuat sendiri saat tabel anak lahir, dipakai untuk join dan pemeriksaan penghapusan parent, di-reuse bila index sudah ada, dan dilindungi dari DROP INDEX lewat error 1553.

Buka →
# Cara MySQL Menggunakan INDEX

Baca rencana eksekusi EXPLAIN untuk memahami kapan MySQL memakai index: equality lookup bertipe ref dan const, range scan untuk BETWEEN, pembanding lebih besar, dan LIKE berawalan, index yang melayani ORDER BY tanpa filesort, hingga GROUP BY yang berjalan lewat index terurut.

Buka →
# INDEX yang Tidak Efektif

Kenali pola query yang mematikan index di MySQL: fungsi pada kolom seperti YEAR(tanggal) = 2026 dengan solusi range tanggal, wildcard awalan LIKE '%x', konversi tipe implisit saat kolom VARCHAR dicari angka, OR antar kolom berbeda index, serta perilaku operator != dan NULL.

Buka →
# Biaya Pemeliharaan INDEX

Hitung biaya memiliki index di MySQL: setiap INSERT, UPDATE, dan DELETE ikut memelihara seluruh index tabel, update kolom terindeks paling mahal, audit index tak terpakai dengan SHOW INDEX, uji coba aman lewat invisible index, dan aturan praktis menentukan index mana yang layak dipertahankan.

Buka →

Bab 15 Views

# Membuat VIEW

Pelajari cara membuat VIEW di MySQL dengan CREATE VIEW ... AS SELECT, menggunakannya seperti tabel biasa melalui SELECT, membuktikan bahwa view selalu menampilkan data segar dari tabel dasar, membangun view laporan dengan filter WHERE, kolom terhitung, dan GROUP BY, serta memeriksa definisi view melalui SHOW CREATE VIEW dan information_schema.

Buka →
# Mengubah VIEW

Pelajari cara mengubah definisi VIEW di MySQL dengan CREATE OR REPLACE VIEW dan ALTER VIEW, memahami bahwa pengubahan definisi berarti mengganti total query yang tersimpan, mengamati efek perubahan struktur tabel dasar terhadap view — kolom baru yang tidak muncul hingga view yang rusak dengan ERROR 1356 — serta urutan aman ketika skema tabel berubah.

Buka →
# Menghapus VIEW

Pelajari cara menghapus VIEW di MySQL dengan DROP VIEW, menangani error ERROR 1051 ketika view tidak ada serta pola idempoten DROP VIEW IF EXISTS, menghapus banyak view sekaligus dalam satu statement, dan mengamati risiko view bertingkat — ketika view induk dihapus, view anak yang menunjuknya rusak dengan ERROR 1356.

Buka →
# VIEW dan Keamanan Data

Pelajari cara memakai VIEW sebagai lapisan keamanan data di MySQL: menyembunyikan kolom sensitif seperti gaji dari view publik, menjaga konsistensi baris dengan WITH CHECK OPTION yang menolak INSERT dan UPDATE pelanggar filter dengan ERROR 1369, menghindari baris hantu pada view tanpa CHECK OPTION, serta memberi akses granular ke user lain melalui CREATE USER dan GRANT SELECT pada view.

Buka →
# Batasan VIEW

Pelajari batasan VIEW di MySQL terkait kemampuan menerima perubahan data: view sederhana bisa di-UPDATE hingga berdampak ke tabel dasar, view beragregat ditolak dengan ERROR 1288, view dengan JOIN hanya boleh mengubah kolom dari satu tabel, kolom terhitung ditolak dengan ERROR 1348, serta perbedaan CHECK OPTION LOCAL dan CASCADED pada view bertingkat.

Buka →

Bab 16 Transactions

# Konsep Transaksi

Pahami mengapa pembaruan data multi-langkah membutuhkan transaksi: masalah transfer uang yang gagal di tengah jalan, definisi transaksi sebagai unit kerja all-or-nothing, serta perilaku autocommit MySQL yang menjalankan setiap statement sebagai transaksi tersendiri.

Buka →
# START TRANSACTION

Bedah cara membuka transaksi eksplisit di MySQL: START TRANSACTION, sinonim BEGIN dan BEGIN WORK, mode SET autocommit = 0 dengan transaksi implisit yang berkelanjutan, akibat koneksi terputus tanpa COMMIT, serta bukti nyata bahwa statement DDL menyebabkan implicit commit yang menggagalkan ROLLBACK.

Buka →
# COMMIT dan ROLLBACK

Bedah dua penutup transaksi MySQL: COMMIT yang mengukuhkan seluruh perubahan secara permanen, ROLLBACK yang membatalkannya kembali, aturan visibilitas antar-koneksi yang hanya menampilkan data setelah COMMIT, perilaku error di tengah transaksi yang tidak membatalkan statement sebelumnya, dan preview ROLLBACK TO SAVEPOINT.

Buka →
# SAVEPOINT

Kuasai pembatalan parsial transaksi dengan SAVEPOINT: membuat penanda bernama di tengah transaksi, ROLLBACK TO SAVEPOINT yang membatalkan hanya sebagian langkah sambil menjaga transaksi tetap hidup, RELEASE SAVEPOINT untuk melepas penanda, savepoint bertingkat, use case wizard multi-langkah, dan error 1305 saat savepoint tidak dikenal.

Buka →
# ACID Properties

Bedah empat jaminan transaksi InnoDB: Atomicity yang dibuktikan lewat ROLLBACK total, Consistency yang diuji dengan pelanggaran foreign key di tengah transaksi, Isolation yang menjelaskan dirty read antar-koneksi, serta Durability yang dijamin redo log, dirangkum dalam tabel A-C-I-D beserta mekanisme MySQL di balik tiap huruf.

Buka →
# Isolation Levels

Bedah empat isolation level InnoDB — READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, dan SERIALIZABLE — beserta anomali dirty read, nonrepeatable read, dan phantom read milik tiap level, pengujian SET SESSION TRANSACTION ISOLATION LEVEL dengan bukti nilai @@transaction_isolation, snapshot konsisten, dan skenario dua koneksi berbasis tabel waktu.

Buka →
# Locking

Bedah mekanisme kunci InnoDB: row lock yang dipasang statement DML di dalam transaksi, SELECT FOR UPDATE dan FOR SHARE untuk mengunci baris sebelum dibaca, LOCK TABLES beserta mode READ dan WRITE yang dibuktikan dengan error 1099, gap lock sebagai penjaga rentang, serta perbandingan shared lock dan exclusive lock.

Buka →
# Deadlocks

Bedah kebuntuan InnoDB: skenario klasik dua transaksi yang saling menunggu kunci, simulasi waktu t1 sampai t6 dengan diagram sequence dua koneksi, deteksi otomatis InnoDB yang membatalkan satu korban dengan ERROR 1213, pembacaan LATEST DETECTED DEADLOCK pada SHOW ENGINE INNODB STATUS, serta pola pencegahan lewat urutan akses konsisten, transaksi pendek, dan index yang tepat.

Buka →
# Penanganan Konkurensi

Rangkai pola praktis mengelola akses bersamaan: masalah lost update pada pembacaan-then-tulisan dua sesi, pessimistic locking dengan SELECT FOR UPDATE untuk pola ambil-transfer-unggah, optimistic locking dengan kolom versi yang terbukti lewat 0 rows affected, idempotency key yang menjadikan retry aman, serta checklist urutan kerja konkurensi yang aman.

Buka →

Bab 17 Stored Programs

# Stored Procedures

Pelajari stored procedure MySQL: program yang tersimpan di server database, cara mengubah DELIMITER agar tubuh CREATE PROCEDURE berisi banyak statement, pemanggilan dengan CALL, pola idempoten DROP PROCEDURE IF EXISTS, serta cara memeriksa prosedur lewat SHOW PROCEDURE STATUS dan information_schema.ROUTINES.

Buka →
# Parameter Procedure

Bedah tiga mode parameter stored procedure MySQL — IN, OUT, dan INOUT — beserta prosedur dengan beberapa parameter, validasi input dengan SIGNAL SQLSTATE, dan kewajiban mengisi seluruh argumen saat CALL.

Buka →
# Variables dan Assignments

Bedah variabel dalam stored program MySQL: DECLARE untuk variabel lokal beserta clause DEFAULT, SET @var untuk variabel sesi, SELECT ... INTO untuk menampung hasil query, urutan deklarasi yang wajib di awal blok, perbedaan scope keduanya, dan konvensi penamaan.

Buka →
# Kondisi dan Perulangan

Bedah control flow pada stored program MySQL: IF THEN ELSEIF ELSE, CASE statement beserta error saat tidak ada cabang yang cocok, LOOP dengan LEAVE, WHILE DO, REPEAT UNTIL, ITERATE, label loop, serta contoh akumulasi faktorial dan penjumlahan deret.

Buka →
# Cursors

Bedah cursor MySQL di dalam stored procedure: DECLARE CURSOR FOR SELECT, OPEN, FETCH INTO, CLOSE, handler NOT FOUND SQLSTATE 02000 sebagai penanda akhir data, urutan deklarasi wajib, cursor dengan ORDER BY deterministik, akumulasi nilai per baris, dan nested BEGIN untuk mempersempit scope handler.

Buka →
# Error Handling

Bedah penanganan error di stored program MySQL: DECLARE handler untuk kode error tertentu, SQLEXCEPTION, dan NOT FOUND, perbedaan CONTINUE vs EXIT, membaca pesan error dengan GET DIAGNOSTICS, melempar error kustom dengan SIGNAL SQLSTATE 45000, meneruskan error dengan RESIGNAL, serta tabel kode error yang sering dijumpai.

Buka →
# Stored Functions

Bedah stored function MySQL: struktur CREATE FUNCTION dengan RETURNS dan RETURN, pemakaian function di dalam SELECT dan ekspresi, attribute DETERMINISTIC dan NO SQL beserta hasil uji nyata pada server tanpa binary log, larangan mengembalikan result set, dan tabel perbandingan function vs procedure.

Buka →
# Kapan Menggunakan Stored Programs

Panduan keputusan penggunaan stored program MySQL: situasi yang diuntungkan (logika bersama lintas aplikasi, batch berat data, validasi terpusat), biaya yang menyertainya (bisnis logic menyebar, pengujian sulit, keterikatan vendor), tabel keputusan, daftar pro dan kontra, serta panduan praktis modern untuk menjaga lapisan database tetap tipis.

Buka →

Bab 18 Triggers dan Events

# Konsep Trigger

Pengenalan trigger MySQL: kode yang menyala otomatis saat INSERT, UPDATE, atau DELETE menimpa tabel, pembuatan trigger pertama dengan CREATE TRIGGER dan DELIMITER, pembuktian audit_log yang terisi tanpa perintah manual, pemeriksaan dengan SHOW TRIGGERS, penghapusan dengan DROP TRIGGER, serta alasan trigger tidak bisa dipanggil seperti stored procedure.

Buka →
# Trigger BEFORE dan AFTER

Perbedaan trigger BEFORE dan AFTER di MySQL: BEFORE INSERT yang mengubah NEW.nama dan NEW.harga sebelum baris tersimpan, AFTER INSERT yang mereaksi data final, urutan eksekusi kedua waktu tersebut, penolakan MySQL atas perubahan NEW di trigger AFTER, serta tabel panduan kapan memakai BEFORE untuk validasi dan AFTER untuk audit.

Buka →
# Trigger INSERT, UPDATE, dan DELETE

Bedah trigger untuk ketiga kejadian DML di MySQL: AFTER INSERT yang membaca NEW, AFTER UPDATE yang membandingkan OLD dengan NEW sehingga harga lama dan harga baru tampil bersama di audit log, AFTER DELETE yang menyimpan baris terhapus lewat OLD, BEFORE UPDATE dengan SIGNAL untuk memblokir perubahan, aturan ketersediaan OLD dan NEW, serta beberapa trigger pada kejadian yang sama dengan FOLLOWS.

Buka →
# Trigger dan Integritas Data

Peran trigger dalam menjaga integritas data MySQL: validasi lintas tabel dengan query di dalam trigger yang tidak bisa dilakukan CHECK constraint, penolakan INSERT lewat SIGNAL SQLSTATE 45000 dengan ERROR 1644, audit trail berisi pengguna dan waktu lewat CURRENT_USER dan CURRENT_TIMESTAMP, pemeliharaan counter denormalisasi di tabel induk, serta alasan trigger bukan pengganti foreign key.

Buka →
# Debugging Trigger

Teknik men-debug trigger MySQL yang berjalan senyap: tabel debug_log khusus untuk melihat nilai OLD dan NEW di dalam trigger, pemeriksaan metadata lewat information_schema.TRIGGERS, isolasi masalah dengan DROP TRIGGER sementara, uji nyata trigger rekursif yang memicu ERROR 1442 beserta pembatalan statementnya, dan keterbatasan handler SQLSTATE dalam trigger.

Buka →
# Event Scheduler

Penggunaan event scheduler MySQL: memeriksa variabel event_scheduler, menyalakan scheduler dengan SET GLOBAL, membuat event berkala dengan ON SCHEDULE EVERY dan event sekali jalan dengan AT, memeriksa jadwal serta status lewat SHOW EVENTS dan information_schema.EVENTS, menonaktifkan serta menghapus event, dan kebiasaan mengembalikan nilai scheduler ke kondisi awal.

Buka →
# Keterbatasan Triggers dan Events

Rangkuman batasan trigger dan event MySQL yang sudah teruji: trigger tidak boleh mengembalikan result set termasuk lewat CALL procedure, trigger hanya bisa menempel pada tabel dasar bukan view, transaksi eksplisit COMMIT ditolak dengan ERROR 1422, larangan rekursi tabel yang sama, eksekusi per baris yang berimplikasi performa, serta batasan event scheduler dan panduan menjaga desain tetap sederhana.

Buka →

Bab 19 Window Functions

# Konsep Window Function

Bedah konsep window function di MySQL: perbedaan agregat biasa yang merangkum N baris menjadi satu baris dengan window function yang menjaga setiap baris tetap tampil namun membawa konteks lintas baris, bentuk paling sederhana OVER(), anatomi sintaks fungsi OVER, serta daftar kebutuhan analisis yang paling cocok diselesaikan window function.

Buka →
# OVER dan PARTITION BY

Bedah klausa OVER dan PARTITION BY pada window function MySQL: membagi jendela per kelompok tanpa meruntuhkan baris, partisi multi kolom, peran ORDER BY di dalam jendela untuk fungsi ranking, kombinasi PARTITION BY dan ORDER BY, serta perbandingan langsung dengan GROUP BY.

Buka →
# ROW_NUMBER

Bedah fungsi ROW_NUMBER di MySQL: nomor urut 1 sampai n untuk seluruh hasil maupun per kelompok dengan PARTITION BY, pola top-N per grup memakai CTE dan subquery, deduplikasi baris dengan nomor 1, serta perbedaan penomoran query dengan AUTO_INCREMENT.

Buka →
# RANK dan DENSE_RANK

Perbandingan RANK, DENSE_RANK, dan ROW_NUMBER pada data dengan nilai seri: RANK meninggalkan celah setelah nilai yang sama, DENSE_RANK merapatkan celah, ROW_NUMBER selalu unik — lengkap dengan use case peringkat juara, filter tiga besar, dan peringkat teratas per grup.

Buka →
# LAG dan LEAD

Bedah fungsi LAG dan LEAD di MySQL: mengambil nilai baris sebelum dan sesudah baris saat ini, menghitung selisih pertumbuhan hari ke hari, mengelola NULL di tepi jendela dengan argumen default, offset lebih dari satu, serta PARTITION BY yang mencegah nilai bocor antar kelompok kota.

Buka →
# Running Total

Membangun akumulasi berjalan dengan SUM OVER (ORDER BY ...) di MySQL: total yang tumbuh baris demi baris, perbedaan perilaku saat ORDER BY dihilangkan sehingga seluruh jendela terlihat dari tiap baris, reset akumulasi per partisi kota, bentuk eksplisit ROWS UNBOUNDED PRECEDING, serta penerapan saldo rekening tabungan dari mutasi harian.

Buka →
# Moving Average

Membangun moving average dengan AVG OVER dan frame ROWS BETWEEN 2 PRECEDING AND CURRENT ROW di MySQL: rata-rata bergerak tiga periode per baris, penghalusan tren dari data zigzag harian, jendela bergerak per kota dengan PARTITION BY, perbandingan lebar jendela dua dan tiga periode, serta perilaku desimal deterministik AVG.

Buka →
# Window Frame

Bedah window frame di MySQL: perbedaan ROWS yang menghitung baris fisik dengan RANGE yang menghitung nilai logis dan memperlakukan baris sekembar sebagai peers, bukti nyata lewat ORDER BY dengan nilai duplikat, RANGE bersatuan nilai, keluarga bentuk BETWEEN UNBOUNDED PRECEDING hingga FOLLOWING, frame di dalam partisi, frame default RANGE, serta status EXCLUDE di MySQL 8.4.

Buka →

Bab 20 JSON dan Data Semi Terstruktur

# Menyimpan Data JSON

Simpan dokumen semi terstruktur pada kolom JSON MySQL 8.4: validasi otomatis yang menolak teks cacat dengan error 3140, format internal biner yang menormalisasi urutan kunci dan spasi, perbedaan JSON versus TEXT, serta pemeriksaan JSON_VALID dan JSON_TYPE.

Buka →
# Membaca Nilai JSON

Baca bagian dalam dokumen JSON dengan operator path -> dan ->> di MySQL 8.4: perbedaan hasil JSON berkutip versus teks polos, padanan JSON_EXTRACT dan JSON_UNQUOTE, penjangkauan nilai bersarang serta elemen array lewat indeks, NULL saat path tidak ditemukan, dan pengantar karakter pengganti [*].

Buka →
# JSON Path

Bedah lengkap sintaks JSON Path di MySQL 8.4: akar $, akses anggota dan indeks, wildcard $[*] dan $.*, array bersarang, perilaku autowrap, kenyataan bahwa filter path $?(@.harga > 100) tidak didukung, serta pencarian nilai dengan JSON_SEARCH, MEMBER OF, dan JSON_CONTAINS_PATH.

Buka →
# Mengubah Data JSON

Ubah isi dokumen JSON di MySQL 8.4 dengan empat fungsi modifikasi: JSON_SET, JSON_INSERT, JSON_REPLACE, dan JSON_REMOVE — dibedah berdampingan pada dokumen yang sama, plus pola UPDATE untuk menyimpan hasil perubahan serta JSON_ARRAY_APPEND dan JSON_ARRAY_INSERT untuk array.

Buka →
# JSON Functions

Kotak perkakas fungsi JSON MySQL 8.4: mengukur dokumen dengan JSON_LENGTH, JSON_DEPTH, dan JSON_KEYS, menguji keanggotaan dengan JSON_CONTAINS, membedah perbedaan JSON_MERGE_PATCH versus JSON_MERGE_PRESERVE, membangun dokumen dengan JSON_OBJECT dan JSON_ARRAY, menampilkan rapi dengan JSON_PRETTY, serta pengantar JSON_TABLE.

Buka →
# GENERATED COLUMNS dari JSON

Tarik nilai JSON ke kolom generated MySQL 8.4 — VIRTUAL atau STORED — lalu buat index padanya agar filter seperti harga di atas ambang tertentu berjalan lewat index range, bukan parsing dokumen per baris; termasuk bukti optimizer yang memakai index tersebut bahkan saat query masih menulis path JSON mentah.

Buka →
# Memilih JSON Vs Relational COLUMNS

Panduan keputusan memilih kolom JSON atau kolom relasional di MySQL 8.4: kapan JSON unggul karena skema bervariasi dan data passthrough, kapan kolom relasional wajib karena relasi, integritas tipe, dan agregasi, contoh skema hibrida yang menggabungkan keduanya, serta anti-pattern JSON untuk segalanya.

Buka →

Bab 21 Full-Text Search

# Konsep Full-Text Search

Mengapa LIKE '%kata%' memaksa pemindaian seluruh tabel dan bagaimana FULLTEXT index bertipe index terbalik menggantinya: pemetaan istilah ke baris, konsep skor relevansi, tabel keputusan kapan memakai full-text search, serta panjang kata minimum innodb_ft_min_token_size.

Buka →
# Membuat Full-Text Index

Tiga cara membuat FULLTEXT index — langsung di CREATE TABLE, CREATE FULLTEXT INDEX setelah data dimuat, dan ALTER TABLE — memverifikasinya lewat SHOW INDEX, galat ERROR 1191 saat MATCH tanpa index atau daftar kolom yang tidak cocok, serta perbedaan InnoDB dan MyISAM dalam perawatan index.

Buka →
# Natural Language Search

Mode pencarian bawaan MATCH...AGAINST: hasil terurut relevansi, baris berskor 0 tidak ditampilkan, skor relevansi desimal yang nyata, pencarian multi kata yang menjumlahkan kontribusi tiap kata, serta stopword yang diam-diam diabaikan.

Buka →
# Boolean Search

Kendali presisi dengan IN BOOLEAN MODE: operator + wajib, - larang, * truncation pencarian prefiks, frasa persis dalam kutip dua, pengelompokan kurung, penyesuaian bobot, tabel operator lengkap, dan kenyataan bahwa skor relevansi tetap dihitung.

Buka →
# Query Expansion

Perluas hasil pencarian full-text secara otomatis dengan WITH QUERY EXPANSION: mekanisme dua fase yang mengambil istilah terkait dari hasil awal, contoh nyata hasil yang meluas, serta risiko relevansi yang menurun.

Buka →
# Batasan Full-Text Search

Rangkuman batasan full-text search MySQL: stopword bawaan, panjang kata minimum, dukungan bahasa non-Latin dan parser ngram, perbedaan dengan exact match, biaya index, serta indikasi kapan beralih ke mesin pencarian khusus.

Buka →

Bab 22 Query Optimization

# Membaca Query Execution Plan

Pahami apa itu query execution plan di MySQL: keputusan optimizer memilih index, join order, dan access type, posisi plan dalam alur parser-optimizer-executor, serta kolom EXPLAIN yang dibaca lebih dulu (type, key, rows, Extra).

Buka →
# EXPLAIN

Bedah perintah EXPLAIN di MySQL 8.4 kolom per kolom: id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, dan Extra; plus SHOW WARNINGS untuk melihat rewritten query, EXPLAIN FORMAT=JSON dengan rincian biaya, id lebih dari 1 untuk subquery dan UNION, serta EXPLAIN untuk INSERT, UPDATE, dan DELETE.

Buka →
# EXPLAIN ANALYZE

Gunakan EXPLAIN ANALYZE di MySQL 8.4 untuk menjalankan query sungguhan dan mengukur waktu aktual per langkah dalam format tree: actual time, rows, dan loops — dibandingkan dengan estimasi EXPLAIN, termasuk aturan aman pemakaiannya.

Buka →
# Access Types

Bedah kolom type pada EXPLAIN MySQL: hierarki access type dari system, const, eq_ref, ref, range, index, hingga ALL — masing-masing dengan contoh query nyata, tabel peringkat kecepatan, dan kapan full table scan masih wajar.

Buka →
# Join Optimization

Optimalkan join MySQL: pemilihan driving table oleh optimizer, memaksa urutan dengan STRAIGHT_JOIN, peran index pada kolom join versus hash join buffer, membaca kolom filtered, serta mengapa SELECT * merampas covering index.

Buka →
# Index Optimization

Strategi optimalisasi index di MySQL: memilih kolom dari WHERE, JOIN, dan ORDER BY, membangun covering index dengan bukti Using index, urutan kolom composite dan aturan leftmost, kombinasi equality dan range, biaya kelebihan index dengan audit SHOW INDEX, serta menjaga konsistensi tipe data dari sisi index.

Buka →
# Menghindari Full Table Scan

Kenali dan obati full table scan di MySQL: deteksi type ALL pada EXPLAIN, lima penyebab umum — kolom tanpa index, fungsi pada kolom, leading wildcard LIKE, type mismatch, dan OR lintas kolom — masing-masing dengan perbandingan plan sebelum dan sesudah perbaikan.

Buka →
# Pagination Optimization

Optimalkan paginasi MySQL: mengapa LIMIT dengan OFFSET besar lambat karena offset dibaca lalu dibuang, bukti lewat Handler counter, pola keyset atau seek dengan WHERE id > nilai terakhir, deferred join dengan subquery index, serta tabel perbandingan pola paginasi.

Buka →
# Query yang Lambat

Diagnosis sistematis query lambat MySQL: temukan lewat slow query log, bedah dengan EXPLAIN, hipotesis, perbaiki, ukur ulang — plus katalog pola penyakit umum: SELECT * raksasa, N+1 query, correlated subquery, fungsi pada kolom, join tanpa index, ORDER BY tanpa index, dan GROUP BY dengan temporary table.

Buka →
# Mengukur Performa Query

Metodologi mengukur performa query MySQL yang jujur: bahaya jam dinding satu run dan cache panas, status deprecated SHOW PROFILE, performance_schema statement events, Handler counter dengan FLUSH STATUS, fungsi BENCHMARK(), serta disiplin membandingkan sebelum-sesudah di data serupa.

Buka →

Bab 23 User Management dan Keamanan

# MySQL Users

Pelajari konsep user di MySQL sebagai akun koneksi berformat user@host: membaca daftar akun dari tabel mysql.user, memahami arti host localhost versus wildcard %, alasan aplikasi tidak boleh memakai root, perbedaan USER() dan CURRENT_USER(), serta memantau koneksi aktif dengan SHOW PROCESSLIST.

Buka →
# Membuat dan Menghapus User

Pelajari siklus hidup akun MySQL: membuat akun dengan CREATE USER dan kata sandi, menghadapi ERROR 1396 saat akun sudah ada, memakai IF NOT EXISTS agar skrip idempoten, mengubah nama akun dengan RENAME USER, mengganti kata sandi dengan ALTER USER, bahaya akun tanpa kata sandi, serta menghapus akun dengan DROP USER.

Buka →
# Privileges

Pelajari konsep privilege di MySQL: hierarki cakupan dari global, database, tabel, hingga kolom, daftar privilege populer seperti SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, dan ALTER, perbedaan privilege data dengan privilege administratif seperti RELOAD dan PROCESS, serta cara memeriksa hak akses melalui SHOW GRANTS dan information_schema.

Buka →
# GRANT dan REVOKE

Pelajari pemberian dan pencabutan hak akses di MySQL dengan GRANT dan REVOKE: kombinasi beberapa privilege sekaligus pada berbagai tingkat cakupan, ERROR 1410 saat memberi hak ke akun yang belum ada, ERROR 1147 saat mencabut hak yang tidak pernah diberikan, risiko GRANT ALL dan WITH GRANT OPTION, serta kapan FLUSH PRIVILEGES benar-benar diperlukan.

Buka →
# Roles

Pelajari role di MySQL sebagai wadah privilege yang bisa dibagikan: CREATE ROLE untuk mem bundle hak akses, GRANT role TO user untuk membagikannya, SET ROLE dan SET DEFAULT ROLE untuk mengaktifkannya dalam sesi, CURRENT_ROLE() dan SHOW GRANTS USING untuk memeriksanya, serta kapan role membuat pengelolaan hak tim jauh lebih rapi.

Buka →
# Authentication

Pelajari mekanisme authentication MySQL 8.4: plugin caching_sha2_password sebagai bawaan, realita mysql_native_password yang sudah dimatikan default dengan ERROR 1524, format hash kata sandi di authentication_string, alur pencocokan user dan host saat koneksi masuk, serta aturan host paling spesifik yang dibuktikan dengan dua akun bernama sama.

Buka →
# Password Policy

Pelajari kebijakan kata sandi di MySQL 8.4: memasang komponen validate_password dengan INSTALL COMPONENT, menolak kata sandi lemah melalui ERROR 1819, mengatur masa berlaku sandi dengan PASSWORD EXPIRE, sandi ganda dengan RETAIN CURRENT PASSWORD, serta mengunci akun otomatis lewat FAILED_LOGIN_ATTEMPTS dan PASSWORD_LOCK_TIME.

Buka →
# Least Privilege

Pelajari prinsip least privilege di MySQL: memberi akun aplikasi hanya hak CRUD pada satu database tanpa DROP dan DDL, akun analitik hanya SELECT, pemberian hak migrasi secara sementara dengan GRANT lalu REVOKE, audit hak akses dengan SHOW GRANTS, serta narasi bagaimana GRANT ALL menjadikan celah SQL injection menjadi bencana DROP DATABASE.

Buka →
# SQL Injection

Pelajari anatomi serangan SQL injection di MySQL: bagaimana input yang digabung langsung ke string SQL mengubah tanda kutip menjadi senjata, mengapa payload klasik ' OR '1'='1 mengembalikan seluruh baris, bagaimana payload destruktif DROP TABLE menyusup lewat komentar --, perbandingan kode aplikasi rentan dengan versi aman berbasis prepared statement, serta mitigasi berlapis bersama least privilege.

Buka →
# Prepared Statements

Pelajari prepared statement di MySQL: siklus PREPARE, EXECUTE USING, dan DEALLOCATE dengan parameter user variable, eksekusi berulang dengan nilai berbeda, bukti nyata bahwa payload SQL injection menjadi data biasa yang menghasilkan Empty set, prepared statement untuk DDL, ERROR 1295 untuk statement yang tidak didukung, serta padanan placeholder di PHP dan Python.

Buka →
# Secure Database Configuration

Kunci pengaturan server MySQL yang menyerang permukaan: membatasi jaringan bind-address, menutup akses jarak jauh root, memaksa TLS, meninjau variabel berisiko, dan menjalankan server dengan prinsip defense in depth.

Buka →

Bab 24 Administrasi MySQL

# Konfigurasi Server

Pelajari cara MySQL membaca konfigurasi dari file my.cnf/my.ini, memeriksa variabel server dengan SHOW VARIABLES, serta mengubahnya saat runtime dengan SET GLOBAL dan SET PERSIST beserta aturan scope global dan session.

Buka →
# Database Storage Engines

Kenali beragam storage engine MySQL melalui SHOW ENGINES, membandingkan InnoDB, MyISAM, CSV, MEMORY, dan Archive, membuat tabel dengan engine pilihan, hingga mengubah engine tabel dengan ALTER TABLE.

Buka →
# InnoDB

Bedah arsitektur InnoDB: buffer pool untuk cache data di memori, redo log untuk keamanan transaksi, tablespace .ibd per tabel, row format dynamic, dan mekanisme crash recovery yang menjadikannya engine default MySQL.

Buka →
# Connection Management

Pelajari bagaimana server MySQL menerima dan membatasi koneksi: max_connections, Threads_connected vs Threads_running, timeout koneksi idle dengan wait_timeout dan interactive_timeout, connection pooling, serta menghadapi error Too Many Connections.

Buka →
# Process List

Gunakan SHOW PROCESSLIST dan information_schema.PROCESSLIST untuk mengawasi koneksi yang sedang berjalan, membaca kolom Command, Time, dan State, lalu mengakhiri koneksi atau query bermasalah dengan KILL dan KILL QUERY.

Buka →
# Server Status

Baca statistik server MySQL dengan SHOW STATUS: bedakan scope SESSION dan GLOBAL, ukur counter Com_select dan Com_insert dalam satu sesi, reset counter dengan FLUSH STATUS, lalu gunakan Threads_connected, Questions, dan statistik InnoDB buffer pool untuk diagnosis cepat.

Buka →
# MySQL System Database

Kenali empat database sistem MySQL — mysql sebagai katalog dan grant tables, information_schema sebagai metadata virtual, performance_schema sebagai instrumen runtime, dan sys sebagai lapisan view kenyamanan — beserta aturan menjaga keempatnya tetap sehat.

Buka →
# Log Files

Kenali empat jenis log server MySQL — error log yang aktif secara default, general query log yang merekam semua statement, slow query log, dan binary log — lengkap dengan cara mengaktifkan general log ke tabel, membacanya dengan SELECT, dan merawat rotasi log.

Buka →
# Slow QUERY Log

Aktifkan dan baca slow query log MySQL: turunkan long_query_time untuk menangkap query lambat ke tabel mysql.slow_log, pahami isi kolom query_time dan rows_examined, kenali format file slow log beserta alat mysqldumpslow, lalu pulihkan seluruh pengaturan ke kondisi semula.

Buka →
# Pemeliharaan Database

Rawat tabel MySQL dengan perintah pemeliharaan ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, dan REPAIR TABLE, jalankan semuanya dari terminal lewat mysqlcheck, pahami kapan FLUSH TABLES dan FLUSH PRIVILEGES dibutuhkan, serta kenali perbedaan konsep vacuum antara PostgreSQL dan MySQL.

Buka →

Bab 25 Backup dan Recovery

# Konsep Backup

Pahami kerangka berpikir sebelum menyalin satu byte pun data: RPO dan RTO sebagai dua angka penentu keputusan, perbedaan logical vs physical backup, strategi full/incremental/differential, aturan 3-2-1, serta alasan backup bukan arsip.

Buka →
# Logical Backup

Bedah keluarga backup yang menghasilkan file SQL: cara kerja restore dengan memutar ulang statement, kelebihan portabilitas lintas versi, kelemahan pada data besar, alat mysqldump dan mysqlpump yang deprecated, serta realita SELECT INTO OUTFILE ketika secure_file_priv bernilai NULL.

Buka →
# Mysqldump

Kuasai mysqldump dari dump pertama hingga opsi produksi: membaca anatomi file dump baris demi baris, opsi --databases, --no-data, --single-transaction, gotcha stored procedure yang tidak ikut secara default, hingga kombinasi lengkap untuk backup harian.

Buka →
# Physical Backup

Bedah keluarga backup yang menyalin file data secara langsung: isi data directory dan file .ibd, syarat konsistensi dengan cold backup, FLUSH TABLES WITH READ LOCK, dan LVM snapshot, transportable tablespace, serta perbandingan menyeluruh logical vs physical untuk memilih strategi.

Buka →
# Restore Database

Praktik memulihkan database dari file dump secara utuh: menyiapkan cadangan dan sidik jari data dengan CHECKSUM TABLE, menjatuhkan database secara sengaja, memulihkannya dengan mode batch, lalu memverifikasi hasil restore hingga angka checksumnya cocok — ditutup perbandingan restore dengan dan tanpa opsi --databases.

Buka →
# Point-in-Time Recovery

Kunci cara mengejar data yang berubah setelah backup terakhir: kombinasi base backup plus replay binary log sampai titik waktu tepat sebelum insiden, dengan pilihan berhenti berdasar posisi event atau waktu, dipraktikkan lewat simulasi kehilangan tiga baris yang tidak tercadangkan.

Buka →
# Binary Logs

Bedah binary log dari dalam: apa saja yang dicatat (bukan SELECT), tiga format event ROW/STATEMENT/MIXED, retensi otomatis binlog_expire_logs_seconds, membaca event dan posisi end_log_pos dengan mysqlbinlog, serta pembedaan tuntas binary log versus redo log InnoDB yang kerap tertukar.

Buka →
# Backup Scheduling

Rakit strategi backup terjadwal dari seluruh ilmu section ini: full dump mingguan ditambah binary log harian sebagai rantai inkremental, cron sebagai penjadwalnya, skrip backup lengkap dengan gzip dan rotasi otomatis, kebijakan retensi, aturan 3-2-1 dalam praktik, serta pemantauan yang menjaga backup tetap segar.

Buka →
# Menguji Prosedur Recovery

Buktikan bahwa backup benar-benar bisa dipulihkan: drill restore lengkap dari database uji dengan verifikasi COUNT dan CHECKSUM, checklist drill untuk mengukur RTO aktual, temuan umum yang biasa terungkap, isi runbook pemulihan, dan verifikasi RTO/RPO terhadap target.

Buka →

Bab 26 Replication dan High Availability

# Konsep Replication

Pahami mengapa satu server MySQL menjadi titik lemah: SPOF, beban baca, dan pemulihan bencana. Kenali ide dasar replication yang menyalin setiap perubahan dari source ke replica melalui binary log, istilah source/replica yang menggantikan master/slave, daftar manfaat, serta apa yang ikut dan tidak ikut direplikasi.

Buka →
# Source dan Replica

Bangun topologi replikasi langkah demi langkah: peran source yang menulis binary log versus replica yang menarik dan menjalankan ulang event, pembuatan akun khusus replikasi dengan GRANT REPLICATION SLAVE, konfigurasi my.cnf kedua sisi, CHANGE REPLICATION SOURCE TO beserta bedah parameternya, sampai perintah START/STOP/RESET REPLICA dan cara membaca SHOW REPLICA STATUS.

Buka →
# Asynchronous Replication

Bedah mode bawaan MySQL: commit di source selesai tanpa menunggu replica menerima event. Telusuri alur transaksi dari aplikasi ke binary log, relay log, hingga diterapkan di replica lewat diagram sequence, pahami jendela kehilangan data saat crash, lalu kenali semi-synchronous replication dan pengantar group replication sebagai jalan tengahnya.

Buka →
# Replication Lag

Replica yang tertinggal bukan bug tetapi kenyataan operasional. Ukur lag lewat Seconds_Behind_Source, pahami penyebabnya dari single SQL thread hingga batch besar dan jaringan, kenali dampak baca basi dan masalah read-your-writes, lalu terapkan strategi mitigasi dari session routing sampai parallel applier.

Buka →
# Read Replicas

Susun pola skalabilitas baca yang paling banyak dipakai di dunia nyata: tulis ke source, sebar SELECT ke banyak read replica. Pelajari routing round-robin di aplikasi, topologi bercabang dan berantai, isolasi beban analitik, peran ProxySQL dan HAProxy, serta kapan read replica berhenti membantu dan waktunya scale-up atau sharding.

Buka →
# Failover Concepts

Hadapi skenario terburuk: source mati mendadak. Pahami arti failover dan perbandingan RTO-nya, peran read_only dan super_read_only dalam menjaga replica dari tulis liar, prosedur manual mempromosikan replica menjadi source baru, bahaya split-brain dan fencing, otomasi dengan MHA dan Orchestrator, sampai checklist keputusan failover.

Buka →
# Batasan Replication

Tutup section dengan kejujuran: replication bukan backup — DROP TABLE ikut direplikasi dengan setia; beban tulis tidak pernah turun; tulis ganda memicu tabrakan auto-increment yang tidak diselamatkan oleh server_id. Uji fungsi nondeterministik seperti RAND(), pahami format ROW, hitung biaya operasional, dan tentukan kapan replikasi cukup versus kapan saatnya group replication.

Buka →

Bab 27 Integrasi Aplikasi

# MySQL dan PHP

Sambungkan PHP ke MySQL melalui dua jalur resmi: ekstensi mysqli dan PDO, lengkap dengan tabel perbandingan, pola koneksi-query-fetch, prepared statement dengan bind_param, penanganan error lewat mysqli_report, dan kebiasaan penutupan koneksi yang rapi.

Buka →
# MySQL dan Go

Akses MySQL dari Go lewat antarmuka standar database/sql dan driver go-sql-driver/mysql: format DSN, perilaku sql.Open yang malas, pola Query-Scan-rows.Err, Exec untuk INSERT, prepared statement, serta idiom error handling khas Go.

Buka →
# MySQL dan Python

Akses MySQL dari Python dengan PyMySQL: koneksi dan cursor, fetchall, parameterized query dengan placeholder %s, context manager untuk tutup-otomatis, bedah kode baris-per-baris, serta perbandingan PyMySQL dan mysql-connector-python — dengan contoh yang benar-benar dieksekusi di lingkungan latihan.

Buka →
# MySQL dan Node.js

Akses MySQL dari Node.js dengan driver mysql2: koneksi promise API, await query, destructuring hasil [rows, fields], rows sebagai array objek, placeholder ?, perbandingan gaya promise dan callback, serta bedah kode baris-per-baris — contoh dieksekusi nyata di lingkungan latihan.

Buka →
# Database Connection Pooling

Kelola koneksi aplikasi ke MySQL dengan connection pooling: ukur biaya nyata handshake TCP dan autentikasi, gunakan createPool mysql2 yang dieksekusi nyata, pool DIY PyMySQL, ukuran pool versus max_connections server, anti-pattern satu koneksi per request, dan health check koneksi idle.

Buka →
# Prepared Statements dalam Aplikasi

Terapkan prepared statement dari sisi aplikasi: bukti nyata query rakit-rakit yang bocor versus placeholder yang aman dengan PyMySQL, tabel placeholder tiap driver (%s, ?, bind_param), eksekusi berulang dengan executemany, serta perbedaan prepared sisi server dan interpolasi sisi klien.

Buka →
# Database Migrations

Kelola perubahan skema antar environment dengan database migrations: file SQL bernomor plus tabel pelacak schema_migrations, runner Python yang dieksekusi nyata dan idempoten, tabel tooling populer (Flyway, Liquibase, Alembic, Prisma), arah maju versus rollback, dan disiplin tim saat me-review migration.

Buka →
# Database Seeding

Isi tabel dengan data awal lewat seeding: beda seeding dan migration, file seed.sql idempoten yang dieksekusi nyata lewat mode batch, INSERT IGNORE versus ON DUPLICATE KEY UPDATE, seeding dari aplikasi dengan PyMySQL, data fixture untuk testing, dan aturan keamanan lintas environment.

Buka →
# Menangani Database Errors

Tangani error MySQL dari sisi aplikasi: peta kode error umum (1045, 2003, 1049, 1062, 1451, 1452, 1213, 1205) beserta tindakannya, perbedaan error code dan SQLSTATE, demo nyata penanganan try/except PyMySQL untuk INSERT duplikat, pola retry untuk deadlock, serta aturan pesan ramah untuk pengguna dan detail untuk log.

Buka →

Bab 28 Advanced SQL

# Common Table Expressions Lanjutan

Teknik CTE tingkat lanjut di MySQL: CTE bersarang yang membaca CTE lain, daftar kolom eksplisit WITH x (a, b), satu CTE dipakai dua kali lewat self-join, kombinasi CTE dengan window function, penempatan WITH pada statement UPDATE dan DELETE, bentuk yang benar untuk INSERT, error kolom ambigu, dan pengingat batasan umur satu statement.

Buka →
# Window Functions Lanjutan

Fungsi jendela tingkat lanjut di MySQL: NTILE untuk membagi baris ke dalam bucket, FIRST_VALUE dan LAST_VALUE beserta jebakan frame default yang membuat LAST_VALUE tampak salah, NTH_VALUE, distribusi CUME_DIST dan PERCENT_RANK, window function di atas hasil agregasi, dua spesifikasi PARTITION berbeda dalam satu query, serta realita MySQL yang tidak memiliki klausa FILTER dan alternatifnya dengan CASE WHEN.

Buka →
# Recursive Queries

Penggunaan WITH RECURSIVE di luar dasarnya: penelusuran hierarki dengan penghitung kedalaman, agregasi jalur parent-child menjadi string path, pembangkitan rentang tanggal bulanan beserta jebakan akhir bulan, deret Fibonacci dengan dua kolom bergeser, penelusuran pohon dari daun naik ke akar, batas cte_max_recursion_depth, dan perbandingan rekursi di sisi SQL dengan rekursi di sisi aplikasi.

Buka →
# Derived Tables

Pembedahlian derived table di MySQL: aturan alias wajib pada subquery klausa FROM, alasan kolom terhitung bisa disaring di WHERE luar padahal tidak bisa di query datar, derived table bersarang untuk filter agregat bertingkat, bukti error derived table yang mencoba berkorelasi dengan tabel tetangga, perbandingan menyeluruh dengan CTE, materialisasi yang terlihat lewat EXPLAIN select_type DERIVED, dan pola inline view yang di-join dengan tabel dimensi.

Buka →
# Lateral Derived Tables

Kata kunci LATERAL pada MySQL 8.0.14 ke atas: izin bagi derived table untuk merujuk kolom tabel di sebelah kirinya, pembedahan penuh pola top-N per grup dengan CROSS JOIN LATERAL dan LIMIT, perbandingan menyeluruh dengan pendekatan window ROW_NUMBER dari sisi keterbacaan dan performa, agregat per baris induk, tiga bentuk penulisan join LATERAL, dan batasan sintaks yang dibuktikan dengan error nyata.

Buka →
# Upsert Patterns

Pola upsert lanjutan di MySQL: INSERT ON DUPLICATE KEY UPDATE multi-baris dengan alias baris dan referensi kolom terkualifikasi, ekspresi delta stok untuk penambahan stok, INSERT SELECT ON DUPLICATE KEY UPDATE untuk merge tabel sumber, idempotensi skrip migrasi dengan nilai absolut, INSERT IGNORE beserta batas keamanannya, bahaya REPLACE yang menghapus lalu menyisipkan ulang, pola cek-atau-insert yang tahan balapan antar-proses, dan makna angka affected rows 1, 2, dan 0.

Buka →
# Gap and Island Problems

Selesaikan masalah klasik kelompok berurut (gaps and islands): identifikasi pulau nilai berdekatan dan celahnya memakai window function ROW_NUMBER dan LAG, dibedah tahap demi tahap dengan CTE antara.

Buka →
# Analytical Queries

Rangkai CTE, window function, dan join menjadi query analitis utuh: perbandingan tahunan, kontribusi kumulatif, klasifikasi top-N plus kategori lainnya, serta analisis kohort sederhana dengan output bertahap.

Buka →

Bab 29 Proyek

# Proyek: Database Manajemen Perpustakaan

Bangun database perpustakaan sekolah utuh dari nol: rancang skema buku-anggota-peminjaman, kelola data master, operasikan alur pinjam-kembali dengan transaksi, lalu susun laporan buku terpopuler, anggota aktif, dan keterlambatan.

Lihat proyek →
# Proyek: Database Inventaris Barang

Bangun database gudang toko utuh dari nol: rancang skema barang dan transaksi mutasi, kelola master stok dengan batas minimum, operasikan alur masuk-keluar-retur dengan transaksi, lalu susun laporan nilai persediaan, kartu stok, dan ringkasan bulanan.

Lihat proyek →
# Proyek: Database Penjualan

Bangun database toko online kecil utuh dari nol: rancang skema pelanggan-produk-pesanan, kelola katalog dan pelanggan, operasikan alur pesanan multi-produk dengan transaksi dan snapshot harga, lalu susun analisis omzet, produk terlaris, dan pelanggan teratas.

Lihat proyek →
# Proyek: Database Keuangan Pribadi

Bangun pencatat keuangan pribadi yang utuh: skema transaksi dan kategori, pencatatan harian, anggaran bulanan dengan deteksi pelampauan, serta laporan arus kas dan saldo kumulatif.

Lihat proyek →
# Proyek: Database Analisis Penjualan

Bangun database analitik dari nol: bersihkan data penjualan mentah yang berduplikat lewat staging, agregasi omzet dengan GROUP BY, lalu angkat analisisnya dengan CTE, window function, dan laporan analitis periodik.

Lihat proyek →
# Proyek: Database Manajemen Tugas

Bangun database aplikasi manajemen tugas tim: skema pengguna, proyek, dan tugas dengan ENUM serta foreign key, alur perubahan status atomik dengan tabel riwayat, dan laporan produktivitas siap rapat.

Lihat proyek →