Belajar database untuk pemula paling efektif dengan satu contoh nyata. Pahami dulu tabel dan relasi, lalu kuasai empat jenis query: mengambil data (SELECT), menggabungkan tabel (JOIN), merangkum (GROUP BY), dan mengubah data (INSERT, UPDATE, DELETE). Contoh di bawah memakai data toko online sederhana dan berlaku untuk MySQL, MariaDB, maupun PostgreSQL.

Konsep Dasar Belajar Database

IstilahArtinyaContoh
TabelKumpulan data sejeniscustomers, orders
BarisSatu dataSatu pelanggan
KolomSatu atribut dengan tipe dataname VARCHAR, total INT
Primary keyPenanda unik setiap barisid
Foreign keyKolom yang merujuk ke tabel lainorders.customer_id

Membuat Tabel

CREATE TABLE customers (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  city VARCHAR(50) NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  customer_id INT NOT NULL,
  total INT NOT NULL,              -- simpan rupiah sebagai bilangan bulat
  status VARCHAR(20) NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (customer_id) REFERENCES customers(id)
);

Simpan nilai uang sebagai bilangan bulat (rupiah) atau DECIMAL, bukan FLOAT, karena tipe pecahan bisa menghasilkan selisih pembulatan.

Mengisi dan Mengubah Data

INSERT INTO customers (name, city) VALUES ('Sari', 'Bandung'), ('Budi', 'Medan');
INSERT INTO orders (customer_id, total, status) VALUES (1, 150000, 'dibayar'), (1, 85000, 'menunggu'), (2, 230000, 'dibayar');

UPDATE orders SET status = 'dibayar' WHERE id = 2;
DELETE FROM orders WHERE status = 'batal' AND created_at < '2026-01-01';

Selalu tulis WHERE pada UPDATE dan DELETE. Tanpa WHERE, seluruh baris di tabel ikut berubah atau terhapus.

Mengambil Data dengan SELECT

SELECT name, city FROM customers WHERE city = 'Bandung' ORDER BY name;

SELECT * FROM orders WHERE total >= 100000 AND status = 'dibayar' LIMIT 10;

Menggabungkan Tabel dengan JOIN

-- pesanan beserta nama pelanggannya
SELECT o.id, c.name, o.total, o.status
FROM orders o
JOIN customers c ON c.id = o.customer_id;

-- semua pelanggan, termasuk yang belum pernah pesan
SELECT c.name, o.id AS order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

JOIN (inner join) hanya menampilkan baris yang cocok di kedua tabel. LEFT JOIN menampilkan semua baris tabel kiri, dengan kolom kanan bernilai NULL bila tidak ada pasangannya.

Merangkum dengan GROUP BY

SELECT c.city, COUNT(o.id) AS jumlah_pesanan, SUM(o.total) AS omzet
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.status = 'dibayar'
GROUP BY c.city
HAVING SUM(o.total) > 100000
ORDER BY omzet DESC;

WHERE menyaring baris sebelum dikelompokkan, sedangkan HAVING menyaring hasil setelah dikelompokkan.

Index: Kenapa Query Bisa Lambat

Tanpa index, database membaca seluruh tabel untuk mencari data. Index bekerja seperti daftar isi buku:

CREATE INDEX orders_customer_status ON orders (customer_id, status);

Tambahkan index pada kolom yang sering dipakai di WHERE, JOIN, dan ORDER BY. Pembahasan lanjutnya ada di MySQL performance tuning.

Transaksi: Semua atau Tidak Sama Sekali

START TRANSACTION;
UPDATE products SET stock = stock - 1 WHERE id = 7 AND stock > 0;
INSERT INTO order_items (order_id, product_id, qty) VALUES (10, 7, 1);
COMMIT;   -- atau ROLLBACK bila ada yang gagal

Transaksi memastikan stok berkurang hanya kalau item pesanan berhasil dicatat. Di Laravel, gunakan DB::transaction().

Normalisasi Singkat

  • Jangan simpan data yang sama di banyak tempat. Nama pelanggan cukup di tabel customers, pesanan cukup menyimpan customer_id.
  • Satu kolom satu nilai. Jangan menyimpan "Kaos, Topi, Tas" di satu kolom; buat tabel order_items.
  • Pengecualian yang wajar: menyimpan harga saat transaksi di order_items, karena harga produk bisa berubah setelahnya.

Kesalahan yang Sering Terjadi

  • UPDATE atau DELETE tanpa WHERE. Biasakan menjalankan SELECT dengan kondisi yang sama dulu untuk melihat baris yang akan terkena.
  • Menyusun query dari string input pengguna, yang membuka celah SQL injection. Gunakan parameter binding, seperti dijelaskan di OWASP Top 10 untuk Laravel.
  • Tidak memakai foreign key, sehingga muncul pesanan milik pelanggan yang sudah tidak ada.

Langkah Berikutnya

Latih query di atas dengan data sendiri, misalnya data penjualan dari spreadsheet. Kalau datamu masih di Excel atau Google Sheets, pelajari juga analisis data dengan AI. Untuk jalur belajar coding secara keseluruhan, lihat roadmap belajar coding dari nol.