Database: In-Memory (Online)

Rumus Kueri SQL (Cheat Sheet)

Kumpulan panduan sintaks, formula, dan contoh nyata kueri SQL. Anda bisa menyalin sintaks atau mencobanya langsung ke playground.

Visualisasi JOIN Relasional

Pelajari cara kerja penggabungan data antar tabel (tabel pelanggan dan pesanan) menggunakan diagram Venn interaktif.

INNER JOIN

Hanya mencocokkan data yang ada di tabel pelanggan DAN tabel transaksi.

LEFT JOIN

Ambil semua pelanggan, serta detail pesanan mereka (jika ada pesanan).

RIGHT JOIN

Ambil seluruh data transaksi pesanan, beserta data pelanggan (jika ada pelanggan).

FULL JOIN

Gabung total. Ambil semua baris dari kedua tabel, isi NULL jika tidak berjodoh.

Pelanggan (customers) Pesanan (orders)
Kueri SQL Terkait
-- Pilih opsi Join di samping kiri
Simulasi Hasil Baris Yang Cocok

Katalog Tipe Data SQL

Kamus tipe data relasional yang paling umum digunakan beserta jangkauan penyimpanan dan contoh penggunaannya.

πŸ’‘

Teks vs Angka: Memahami Perbedaan antara '1' dan 1

Penting!

Dalam dunia basis data, tipe data menentukan bagaimana nilai disimpan, diproses, dan dioptimalkan. Perbedaan antara karakter teks '1' dan angka numerik 1 sangat mendasar:

Teks / String
'1'
  • Tipe SQL: VARCHAR, CHAR, TEXT
  • Penulisan: Wajib dibungkus tanda kutip tunggal '1'
  • Operasi Gabung: '1' + '1' menghasilkan '11'
  • Guna: Nilai non-matematis (ID, No. HP, Kode Pos)
VS
Angka / Numeric
1
  • Tipe SQL: INT, DECIMAL, FLOAT
  • Penulisan: Ditulis langsung tanpa tanda kutip 1
  • Operasi Hitung: 1 + 1 menghasilkan 2
  • Guna: Nilai hitung (Harga, Stok, Kuantitas)
Dampak Performa di SQL (Implicit Conversion): Jika Anda mencari data integer menggunakan tanda kutip (misal: WHERE id = '1') atau sebaliknya mencari teks nomor HP tanpa kutip (misal: WHERE phone = 08123), database akan melakukan konversi tipe data otomatis (*implicit casting*). Hal ini mengakibatkan database tidak dapat menggunakan Index secara optimal, memaksa pencarian penuh (*table scan*) yang membuat kueri melambat drastis!
⚑

Tipe Data Primitif vs Non-Primitif

Teori SQL

Dalam sistem basis data relasional, tipe data dibagi menjadi kategori primitif (dasar/tunggal) dan non-primitif (komposit/kompleks) untuk mempermudah penyimpanan nilai:

Tipe Primitif (Atomic)
INT, VARCHAR, DATE
  • Tipe SQL: INT, VARCHAR, DATE, BOOLEAN
  • 1NF (Normalisasi): Memenuhi standar Bentuk Normal Pertama secara alami karena bersifat atomik.
  • Penyimpanan: Menyimpan satu nilai tunggal yang tidak dapat dibagi lagi dalam satu sel data.
  • Guna: Kolom utama untuk penyaringan (WHERE), pengurutan (ORDER BY), dan kunci relasi.
VS
Tipe Non-Primitif (Complex)
JSON, ARRAY, ENUM
  • Tipe SQL: JSON, JSONB, ARRAY, ENUM
  • 1NF (Normalisasi): Sangat fleksibel, namun jika tidak hati-hati bisa melanggar normalisasi 1NF.
  • Penyimpanan: Menyimpan sekumpulan data terstruktur, bersarang (nested), atau koleksi nilai dalam satu sel.
  • Guna: Data metadata opsional, spesifikasi dinamis, atau daftar pilihan terstandar.
Tips Desain Skema Database: Pilihlah tipe data Primitif untuk kolom yang sering dilibatkan dalam relasi database (Primary/Foreign Key) atau sering disaring dengan indeks. Tipe data Non-Primitif (seperti JSONB di PostgreSQL) sangat berguna untuk fleksibilitas skema dinamis (tanpa perlu melakukan ALTER TABLE), namun memiliki beban performa query yang lebih besar dibandingkan data primitif.

Desain & Logika Basis Data (Paling Mudah)

Belajar konsep dasar perancangan database, aturan logika matematika SQL, kunci relasi, dan cara menyusun tabel yang rapi dari awal tanpa pusing.

Logika Matematika

1. Aturan Logika di SQL (Mudah Dipahami)

Saat menyaring data menggunakan perintah WHERE, SQL menggunakan aturan logika matematika. Bedanya dengan logika biasa, SQL punya 3 hasil akhir (bukan cuma Benar/Salah) karena ada nilai misterius bernama NULL.

AND (Wajib Dua-duanya)

Contoh Nyata: "Mencari pesanan dari pelanggan Mugi (customer_id = 1) AND status pengirimannya 'Completed'."
Jika statusnya masih 'Pending' atau bukan pesanan Mugi, maka data tidak akan terpilih (FALSE). KEDUA syarat wajib terpenuhi sekaligus agar bernilai TRUE.

OR (Pilih Salah Satu Boleh)

Contoh Nyata: "Mencari produk dengan kategori 'Electronics' OR stoknya > 100."
Cukup produk tersebut termasuk barang elektronik saja, ia sudah terpilih (TRUE). Cukup stoknya melimpah di atas 100 saja, ia juga terpilih (TRUE). Data hanya ditolak (FALSE) jika kategorinya bukan elektronik DAN stoknya tidak di atas 100.

NOT (Membantah / Kebalikan)

Contoh Nyata: "Mencari pesanan dengan status NOT 'Completed'."
Artinya, pesanan dengan status 'Pending' atau 'Shipped' bernilai TRUE (lolos saringan), sedangkan pesanan yang sudah selesai ('Completed') bernilai FALSE (dikecualikan).

NULL (Misteri / Rahasia)

NULL artinya "Tidak Diketahui/Misteri" (bukan 0, bukan spasi kosong).
Contoh: Nilai tanggal pengiriman di suatu pesanan belum diisi (NULL). Jika ditanya "Apakah tanggal pengiriman > 2026-06-01?", kita tidak bisa menjawab Benar atau Salah. Hasilnya adalah UNKNOWN (Misteri)!

Kalkulator Logika Tiga-Nilai (3VL)
A AND B TRUE
A OR B TRUE
NOT A FALSE
A → B (Implikasi) TRUE
Matriks Kebenaran 3VL (Rangkuman)
A B AND OR NOT A A → B
TRUE TRUE TRUE TRUE FALSE TRUE
TRUE FALSE FALSE TRUE FALSE FALSE
TRUE UNKNOWN UNKNOWN TRUE FALSE UNKNOWN
FALSE FALSE FALSE FALSE TRUE TRUE
FALSE UNKNOWN FALSE UNKNOWN TRUE TRUE
UNKNOWN UNKNOWN UNKNOWN UNKNOWN UNKNOWN UNKNOWN

πŸ” Konsep Logika Tambahan di SQL

Selain tiga logika dasar di atas, ada konsep logika matematika lain yang sangat sering Anda temui di SQL secara langsung atau tidak langsung:

⚑ XOR (Disjungsi Eksklusif)

Hanya bernilai TRUE jika salah satu saja yang benar, bukan keduanya. Di SQL (PostgreSQL), operator ini dilambangkan dengan # atau ditulis menggunakan logika: (A OR B) AND NOT (A AND B).

β†ͺ️ Implikasi (Jika P, Maka Q)

Dalam matematika ditulis P => Q. Di SQL, implikasi diwakili oleh perintah CASE WHEN. Contoh: CASE WHEN stok = 0 THEN 'Habis' ELSE 'Tersedia' END.

πŸ”„ Tautologi & Kontradiksi

β€’ Tautologi (Selalu Benar): Di SQL sering ditulis WHERE 1=1. Ini trik populer agar kueri dinamis tidak error saat ditambahi filter AND tambahan. β€’ Kontradiksi (Selalu Salah): Di SQL ditulis WHERE 1=0. Trik ini dipakai saat ingin menduplikasi struktur tabel kosong tanpa menyalin data.

Penghubung Tabel

2. Cara Menghubungkan Tabel: Primary Key (PK) & Foreign Key (FK)

Bagaimana cara komputer tahu kalau suatu data di tabel A tersambung dengan data di tabel B? Jawabannya adalah lewat **kunci penghubung (Key)**. Mari kita pahami dengan analogi super sederhana di bawah ini!

πŸ”‘ Primary Key (Kunci Utama - Seperti ID Pelanggan)

Bayangkan sistem keanggotaan toko. Setiap pembeli baru wajib memiliki ID Pelanggan yang unik. Tidak boleh ada dua pelanggan dengan ID yang sama, dan ID ini tidak boleh kosong.

  • Peran di Database: Menjadi tanda pengenal unik untuk setiap baris data di tabel utama agar tidak tertukar.
  • Aturan Wajib: Datanya **tidak boleh kembar** dan **tidak boleh kosong** (NOT NULL).
  • Contoh Nyata: Kolom customer_id di tabel pelanggan.

πŸ”— Foreign Key (Kunci Tamu/Asing - Seperti ID Pelanggan di Nota Pesanan)

Bayangkan ketika seorang pelanggan membuat pesanan belanja, kasir mencatat ID Pelanggan tersebut di dalam nota pesanan. Dengan melihat ID Pelanggan di nota pesanan, kita bisa mengetahui siapa nama pelanggan dan profil lengkapnya dari tabel pelanggan utama.

  • Peran di Database: Kunci perwakilan di tabel anak yang mencatat Primary Key tabel induk untuk menghubungkan kedua tabel.
  • Aturan Wajib: Nilai yang dimasukkan harus sudah ada di daftar Primary Key tabel induk.
  • Contoh Nyata: Kolom customer_id di tabel pesanan belanja.
Simulasi Hubungan PK-FK (Sentuh/Hover untuk Menguji Relasi)

Arahkan kursor Anda ke kolom Foreign Key di tabel Pesanan untuk melihat pendaran relasinya ke tabel Pelanggan.

customers (Pelanggan / Induk)
customer_id (PK) first_name
πŸ”‘ 1 Mugi
πŸ”‘ 2 Sarah
πŸ”‘ 4 Elena
orders (Pesanan / Anak)
order_id customer_id (FK)
1001 πŸ”— 1
1002 πŸ”— 2
1006 πŸ”— 2
1004 πŸ”— 4
Merapikan Berkas

3. Normalisasi Database: Seni Merapikan Berkas Transaksi (1NF, 2NF, 3NF)

Normalisasi itu seperti **merapikan lemari berkas transaksi pelanggan & pesanan yang berantakan**. Jika semua jenis informasi (profil pelanggan, daftar produk, detail pesanan) ditumpuk di satu lembar berkas besar, kamu pasti kesulitan melacak transaksi tertentu, dan lemari berkas cepat penuh dengan data duplikat (redundant). Dengan memisahkan data ke laci-laci tabel khusus yang teratur, database kita menjadi rapi, cepat diakses, dan bebas eror.

πŸ—„οΈ 1NF (Bentuk Normal Pertama) - Satu Baris Hanya Boleh Satu Produk

Aturan Gampang: Setiap kolom di tabel database hanya boleh menyimpan **satu nilai saja**. Tidak boleh ada data yang digabung dalam satu kolom menggunakan tanda koma (seperti daftar belanjaan dalam satu sel).

❌ Belum 1NF (Banyak Nilai)
customer_id first_name purchased_products
1 Mugi iPhone, Laptop, Kopi

Eror/Masalah: Komputer akan kesulitan mencari siapa saja yang membeli 'Laptop', karena namanya menumpuk jadi satu kalimat dengan 'iPhone' dan 'Kopi'.

βœ… Sudah 1NF (Rapi Satu-Satu)
customer_id first_name product_name
1 Mugi iPhone
1 Mugi Laptop
1 Mugi Kopi

Sekarang, setiap produk ditulis di barisnya masing-masing. Komputer bisa dengan cepat memfilter dan mencari barang tertentu.

πŸ’‘ Hubungan Array dengan SQL & 1NF

Di pemrograman (seperti JavaScript/Python), kita biasa menyimpan daftar item dalam satu variabel bernama Array (contoh: ['iPhone', 'Laptop', 'Kopi']).

Namun di SQL / Database Relasional, menyimpan Array langsung di dalam satu kolom/sel tabel melanggar aturan 1NF (Bentuk Normal Pertama). Database didesain agar setiap kolom hanya menyimpan satu nilai tunggal (atomik) untuk memudahkan pencarian, penyaringan (WHERE), dan pengindeksan secara cepat.

Solusinya: Kita harus membongkar array tersebut menjadi baris-baris terpisah (seperti tabel di atas kanan) atau memisahkannya ke tabel relasi tersendiri.

πŸ—„οΈ 2NF (Bentuk Normal Kedua) - Pisahkan Tabel Pelanggan dari Transaksi

Aturan Gampang: Tabel harus sudah memenuhi syarat 1NF, lalu **pisahkan kolom data yang tidak nyambung dengan kunci utama**. Jangan mencampur informasi profil pelanggan (nama & negara) langsung di dalam tabel transaksi pesanan belanja, karena profil mereka akan tertulis berulang-ulang untuk setiap transaksi baru.

❌ Belum 2NF (Redundansi Profil)
order_id customer_id customer_name customer_country quantity
1001 1 Mugi Indonesia 1
1003 1 Mugi Indonesia 3

Eror/Masalah (Duplikat Boros): Jika Mugi belanja 100 kali, nama 'Mugi' dan negara 'Indonesia' akan diketik ulang 100 kali. Jika Mugi pindah ke Jepang, kita harus mengedit 100 baris. Kalau ada yang terlewat, datanya jadi rusak!

βœ… Sudah 2NF (Tabel Dipisah Rapi)
Tabel: customers
customer_id (PK) customer_name customer_country
1 Mugi Indonesia
Tabel: orders
order_id (PK) customer_id (FK) quantity
1001 1 1
1003 1 3

Profil Mugi cukup dicatat **1 kali** saja di tabel khusus pelanggan. Di tabel transaksi pesanan, kita cukup menulis angka customer_id = 1 sebagai penghubung (Foreign Key). Hemat tempat dan aman!

πŸ—„οΈ 3NF (Bentuk Normal Ketiga) - Hapus Hubungan Alamat Berantai

Aturan Gampang: Tabel harus sudah memenuhi syarat 2NF, lalu **pastikan semua kolom bergantung langsung pada kunci utamanya, bukan bergantung secara berantai melalui kolom lain**. Contoh berantai: ID Pelanggan menentukan Kode Pos, lalu Kode Pos menentukan Nama Kota. Hubungan Kode Pos ke Kota harus dipisah ke tabel tersendiri.

❌ Belum 3NF (Ketergantungan Transitif)
customer_id (PK) first_name zip_code city
1 Mugi 60111 Surabaya
5 Dian 60111 Surabaya

Eror/Masalah: Nama kota 'Surabaya' ditulis berulang kali untuk setiap orang yang tinggal di kode pos yang sama. Sangat membuang-buang memori database.

βœ… Sudah 3NF (Bebas Duplikat Berantai)
Tabel: customers
customer_id (PK) first_name zip_code (FK)
1 Mugi 60111
5 Dian 60111
Tabel: zip_codes
zip_code (PK) city
60111 Surabaya

Nama kota diikat rapi ke data kode pos di tabel terpisah. Jika ada perubahan nama kota, kita cukup mengeditnya sekali saja di tabel kode pos.

Cetak Biru DB

4. Entity Relationship Diagram (ERD) - Cetak Biru Rumah Database

Sebelum membangun rumah, arsitek butuh **gambar denah**. Di database, denah ini disebut **ERD (Entity Relationship Diagram)**. Diagram ini memetakan bagaimana tabel-tabel e-commerce mock kita saling mengobrol dan terhubung.

πŸ’‘ Cara Membaca Kardinalitas & Logika Hubungan:
β€’ Logika Penghubung (Identitas): Agar data antar tabel tersambung, identitas utama (PK - Primary Key) dari tabel induk disematkan ke tabel anak (sebagai FK - Foreign Key).
  - Identitas Pelanggan (customer_id dari tabel customers) ada di tabel orders.
  - Identitas Produk (product_id dari tabel products) ada di tabel orders.
β€’ Hubungan 1 ke N (One-to-Many): Satu Pelanggan (1) dapat membuat Banyak transaksi Pesanan (N) seiring waktu.
β€’ Arahkan kursor (hover) pada tabel di bawah ini untuk melihat bagaimana jalur hubungan antar kunci (PK/FK) menyala dengan efek neon glow!
customers Parent
PK customer_id INT
first_name VARCHAR
last_name VARCHAR
email VARCHAR
country VARCHAR
status VARCHAR
1
N
orders Child / Transaction
PK order_id INT
FK customer_id INT
FK product_id INT
order_date DATE
quantity INT
status VARCHAR
1
N
products Parent
PK product_id INT
product_name VARCHAR
category VARCHAR
price DECIMAL
stock INT
Optimasi Kecepatan

5. Pengindeksan (Indexing): Cluster vs Non-Cluster Index di PostgreSQL

Indeks (Index) seperti **daftar indeks alfabetis atau daftar isi di bagian belakang buku tebal**. Tanpa indeks, database harus membaca seluruh isi tabel lembar demi lembar (*Table Scan*) untuk mencari satu data. Dengan indeks, database bisa langsung meloncat ke halaman yang tepat dalam hitungan milidetik!

πŸ“š Clustered Index (Indeks Terkluster)

Mengatur dan mengurutkan baris data fisik di dalam harddisk secara berurutan berdasarkan kolom indeks tersebut.

  • Urutan Fisik: Baris data di tabel disusun fisik di harddisk sesuai urutan indeks.
  • Batasan: Hanya boleh ada **satu** clustered index per tabel (karena data fisik hanya bisa diurutkan dalam satu cara).
  • Keunikan PostgreSQL: PostgreSQL tidak memiliki clustered index otomatis/dinamis. PostgreSQL menyediakan perintah CLUSTER table USING index; yang melakukan **pengurutan fisik satu kali**. Jika ada data baru (INSERT), data tersebut tidak otomatis terurut fisik, sehingga perintah CLUSTER harus dijalankan ulang secara berkala.

πŸ“– Non-Clustered Index (Indeks Biasa)

Membuat struktur indeks penunjuk terpisah dari tabel data utama. Baris data fisik di harddisk dibiarkan acak/tidak teratur.

  • Urutan Fisik: Baris data fisik bebas acak. Struktur indeks menyimpan kunci pencarian dan *pointer* (alamat baris/TID) ke data aslinya.
  • Jumlah: Kita bisa membuat **banyak** non-clustered index pada satu tabel untuk berbagai kolom query.
  • Keuntungan: Sangat fleksibel untuk mempercepat berbagai kueri pencarian kolom yang berbeda tanpa merombak tatanan data fisik tabel.

⚑ Linear Scan (Pencarian Linear / Table Scan)

Metode pencarian data paling dasar tanpa indeks. Database memindai baris satu demi satu secara linear (berurutan) dari awal hingga akhir.

  • Kompleksitas O(N): Waktu pencarian berbanding lurus dengan jumlah baris data. Jika tabel memiliki 1 juta baris, database harus melakukan 1 juta kali pembacaan.
  • Kapan Terjadi: Terjadi secara otomatis saat kolom yang dicari di klausa WHERE tidak memiliki indeks, atau ketika database menganggap membaca seluruh tabel (sequential scan) lebih cepat daripada menggunakan indeks (pada tabel yang sangat kecil).
  • Solusi Indeks: Menggunakan indeks memangkas kompleksitas menjadi O(log N) (seperti mencari kata di kamus lewat tab huruf pertama, bukan membaca halaman per halaman).
Perbandingan Cepat di PostgreSQL
Fitur Cluster Index Non-Cluster Index
Urutan Data Fisik Terurut secara fisik di disk Acak / Tidak teratur di disk
Jumlah Maksimal Hanya 1 per tabel Bisa banyak per tabel
Penyimpanan Menyatu dengan tabel data Terpisah sebagai objek indeks
Kecepatan Kueri Urutan Sangat cepat (Range & ORDER BY) Lebih lambat karena butuh lookup
Biaya Pembaruan (DML) Lebih berat saat CLUSTER dijalankan Sedang (memperbarui index pointer)
Sifat Otomatis Manual (perlu kueri CLUSTER berkala) Otomatis diupdate saat data masuk
πŸ’‘ Sintaks Penting di PostgreSQL: -- 1. Buat indeks biasa (non-cluster) terlebih dahulu CREATE INDEX idx_pesanan_tgl ON orders (order_date); -- 2. Urutkan fisik tabel berdasarkan indeks tersebut (Clustering) CLUSTER orders USING idx_pesanan_tgl;
Cara Membaca Kueri:
β€œBuat objek indeks bernama idx_pesanan_tgl pada tabel orders berdasarkan kolom order_date, lalu susun ulang tata letak fisik baris data di tabel orders agar mengalir terurut mengikuti susunan indeks tersebut.”
Visualisasi Dashboard

6. Dimensi vs Metrik: Logika Sumbu X & Y di SQL & Dashboard

Konsep Dimensi dan Metrik di dashboard bekerja menggunakan prinsip koordinat matematika Sumbu X & Y yang diimplementasikan melalui perintah GROUP BY di SQL. Dimensi membagi data menjadi kategori (label pada sumbu X), sedangkan Metrik menghitung nilai kuantitatifnya (tinggi batang pada sumbu Y).

πŸ“ˆ Dimensi (Sumbu X) β€” Kategori & Label

Dimensi menjawab pertanyaan 'Siapa, Apa, Kapan, Di mana'. Ini adalah atribut berjenis teks, tanggal, lokasi, atau kategori yang memotong data Anda. Di grafik, dimensi berfungsi sebagai label pada Sumbu X (horisontal).

  • Contoh di Dashboard: Nama Produk, Negara Pelanggan, Kategori, Status Order.
  • Padanan di SQL: Kolom biasa yang Anda tulis di SELECT dan wajib diletakkan di dalam GROUP BY.

πŸ“Š Metrik (Sumbu Y) β€” Angka & Hasil Hitung

Metrik menjawab pertanyaan 'Berapa banyak'. Ini adalah nilai kuantitatif atau angka hasil perhitungan yang ingin Anda ukur. Di grafik, metrik berfungsi sebagai tinggi/besar batang pada Sumbu Y (vertikal).

  • Contoh di Dashboard: Total Penjualan, Jumlah Transaksi, Rata-rata Kuantitas.
  • Padanan di SQL: Fungsi agregasi matematika seperti COUNT(), SUM(), AVG(), MIN(), MAX().

πŸ“„ Perbedaan Kolom/Baris vs Dimensi/Metrik

Kolom (Columns) & Baris (Rows) adalah bentuk fisik/struktur penyimpanan data Anda. Sedangkan Dimensi & Metrik adalah peran/klasifikasi kolom tersebut saat kita menganalisis data.
β€’ Kolom kategori (teks/tanggal) berperan sebagai Dimensi.
β€’ Kolom angka (yang dihitung/agregasi) berperan sebagai Metrik.
β€’ Setelah data dikelompokkan dengan GROUP BY, setiap nilai unik dari Dimensi akan menjadi Baris (Row) baru di hasil analisis Anda.

πŸ“ˆ Regresi Linear & Trendline (Garis Tren) di SQL

Menghubungkan Sumbu X (Dimensi) dan Sumbu Y (Metrik) dalam korelasi tren garis lurus ($y = mx + c$). Berguna untuk memprediksi perubahan nilai metrik berdasarkan dimensinya.

  • Garis Tren di Dashboard: Saat Anda mencentang opsi 'Trendline' di chart dashboard, sistem sebenarnya menghitung formula regresi linear untuk menggambar garis lurus di antara titik-titik data Anda.
  • Fungsi Regresi di SQL: Database modern (seperti PostgreSQL) menyediakan fungsi statistik bawaan untuk menghitung nilai ini secara langsung tanpa perlu ekspor data.
  • regr_slope(Y, X) menghitung kemiringan garis ($m$), sedangkan regr_intercept(Y, X) menghitung titik potong sumbu Y ($c$).
πŸ’‘ Kueri PostgreSQL untuk Regresi Linear (Tren Penjualan): SELECT regr_slope(o.quantity, o.order_id) AS trend_slope, regr_intercept(o.quantity, o.order_id) AS trend_intercept FROM orders o;
Cara Membaca Kueri:
Simulasi Visual: Sumbu X & Y di Grafik Dashboard
100 50 0
Kueri SQL Terkait (GROUP BY)
-- Pilih opsi di samping kiri
Hubungan Logika SQL & Dashboard:
--
Data Tabular Hasil Kueri
Keamanan DB

7. Keamanan Basis Data & SQL Injection

Keamanan adalah aspek krusial dalam pengelolaan database. Salah satu ancaman terbesar bagi aplikasi database adalah serangan SQL Injection (SQLi), di mana penyusup memanfaatkan celah pada input kueri yang tidak disaring untuk memanipulasi atau mencuri data.

πŸ›‘οΈ CIA Triad: Pilar Utama Keamanan Basis Data

Tujuan utama dari keamanan basis data adalah untuk menjaga CIA Triad (Kerahasiaan, integritas, dan ketersediaan data):
β€’ Confidentiality (Kerahasiaan): Menjamin data tidak bocor ke pihak yang tidak sah.
β€’ Integrity (Integritas): Menjaga keaslian, keakuratan, dan mencegah perubahan data yang tidak sah.
β€’ Availability (Ketersediaan): Menjamin data selalu dapat diakses saat dibutuhkan oleh pengguna yang sah.

πŸ’₯ Memahami SQL Injection (SQLi)

Analogi Sederhana: Bayangkan Anda mengirim paket lewat kurir. Di alamat penerima, Anda menulis: "Antar ke Kamar 5. DAN setelah masuk, curi kunci brankas di meja." Kurir yang lugu akan membaca seluruh instruksi tersebut dan mematuhinya secara buta. Begitu pula database: jika input teks dari pengguna langsung digabungkan ke query SQL tanpa disaring, database akan menjalankan perintah berbahaya tersebut!

Simulasi Serangan SQL Injection (Uji Kerentanan)
Coba ketik Mugi (Aman) atau ketik ' OR '1'='1 (Bahaya!).
Kueri SQL yang Terbentuk di Backend:
SELECT * FROM customers WHERE first_name = 'Mugi' AND status = 'Active';
Status Keamanan:
βœ… AMAN (Kueri disaring secara normal)

πŸ›‘οΈ Solusi: Prepared Statements (Kueri Berparameter)

Untuk mencegah SQL Injection, kita tidak boleh menggabungkan teks input secara langsung (concatenation). Gunakan Prepared Statements, di mana database memisahkan struktur query dengan datanya terlebih dahulu menggunakan tanda tanya/placeholder (? atau $1). Input berbahaya seperti ' OR '1'='1 akan diperlakukan murni sebagai teks username biasa, bukan perintah SQL. Hasilnya kueri akan mencari nama pengguna bernama ' OR '1'='1 (dan tidak menemukan apa-apa), sehingga data aman!

Contoh Pencegahan di Backend (Node.js/pg): // AMAN: Nilai diinput terpisah sebagai array parameter db.query('SELECT * FROM customers WHERE first_name = $1', [userInput]);
Cara Membaca Kueri:

πŸ”‘ Pengelolaan Hak Akses & Peran (DCL & CREATE ROLE)

Mengapa membatasi hak akses itu penting?
Melalui konsep DCL (GRANT / REVOKE), kita menerapkan Prinsip Hak Akses Terendah (Least Privilege) dan membuat peran (role) di PostgreSQL dengan CREATE ROLE.

πŸ”’ Keamanan Lanjutan & Audit PostgreSQL

Mengamankan server PostgreSQL memerlukan konfigurasi hak akses yang ketat dan pencatatan riwayat (audit trail) aktivitas database.

πŸ“‹ Ringkasan Konsep & Istilah Keamanan Basis Data

Untuk memperkuat pemahaman Anda mengenai materi keamanan basis data, berikut adalah poin-poin materi penting:
β€’ Tujuan Utama & CIA Triad: Tujuan utama keamanan basis data adalah untuk menjaga kerahasiaan, integritas, dan ketersediaan data (yang membentuk konsep CIA Triad: Confidentiality, Integrity, Availability).
β€’ Hak Akses (SELECT): Pemberian hak akses untuk membaca data tabel dilakukan dengan perintah GRANT SELECT.
β€’ Mencabut Hak Akses: Untuk menarik atau membatalkan kembali hak akses pengguna, digunakan perintah REVOKE.
β€’ Pembuatan Role di PostgreSQL: Perintah resmi untuk membuat role atau peran baru di PostgreSQL adalah CREATE ROLE.

Data yang Berhasil Diambil Database:

Kuis Evaluasi SQL & Database

Uji pemahaman Anda tentang semua materi query SQL, JOIN, normalisasi database, pengindeksan, dan pilar keamanan basis data yang ada di website ini.

Pilih Mode Kuis

Pilih format tantangan yang ingin Anda mainkan di bawah ini:

Mode Pilihan Ganda

Uji pemahaman teori & dasar database dengan 50 soal pilihan ganda dari yang termudah hingga tersulit.

Mode Tulis Kueri SQL

Tantangan menulis 50 kueri SQL interaktif langsung di database mockup dari yang termudah hingga tersulit.