Tutorial Belajar PostgreSQL dari Nol
Tutorial Belajar PostgreSQL dari Nol
Tutorial ini cocok untuk pemula sampai menengah. Kita akan belajar dari instalasi, dasar SQL, membuat tabel, mengisi data, query relasi, sampai optimasi sederhana.
1. Apa itu PostgreSQL?
PostgreSQL adalah sistem manajemen database relasional open-source yang kuat, stabil, dan banyak digunakan di aplikasi modern.
PostgreSQL cocok untuk:
- Aplikasi web/backend
- Sistem transaksi
- Analytics
- Data JSON
- Full text search
- GIS/PostGIS
- Aplikasi enterprise
2. Instalasi PostgreSQL
A. Windows
- Download installer dari situs resmi PostgreSQL.
- Jalankan installer.
- Pilih komponen:
- PostgreSQL Server
- pgAdmin
- Command Line Tools
- Atur password untuk user
postgres. - Biarkan port default:
5432. - Selesaikan instalasi.
Setelah itu buka pgAdmin atau SQL Shell (psql).
B. macOS dengan Homebrew
brew install postgresql@17
brew services start postgresql@17
Cek versi:
psql --version
Masuk ke PostgreSQL:
psql postgres
C. Ubuntu/Debian
sudo apt update
sudo apt install postgresql postgresql-contrib
Cek status service:
sudo systemctl status postgresql
Masuk sebagai user postgres:
sudo -u postgres psql
3. Masuk ke PostgreSQL dengan psql
Setelah instalasi, buka terminal/command prompt.
Jika menggunakan user default postgres:
psql -U postgres
Atau di Linux:
sudo -u postgres psql
Jika berhasil, prompt akan berubah menjadi:
postgres=#
4. Perintah Dasar psql
| Perintah | Fungsi |
|---|---|
\l | Lihat daftar database |
\c nama_database | Pindah ke database |
\dt | Lihat daftar tabel |
\du | Lihat daftar user/role |
\dn | Lihat daftar schema |
\di | Lihat daftar index |
\df | Lihat daftar function |
\q | Keluar dari psql |
\? | Bantuan perintah psql |
\h SELECT | Bantuan sintaks SQL |
Contoh:
\l
\c postgres
\dt
5. Membuat Database
Format dasar:
CREATE DATABASE nama_database;
Contoh:
CREATE DATABASE toko;
Pindah ke database tersebut:
\c toko
Melihat database yang ada:
\l
6. Membuat User dan Memberi Akses
Untuk keamanan, sebaiknya jangan selalu menggunakan user postgres.
Buat user baru:
CREATE USER belajar WITH PASSWORD 'ganti_password_ini';
Beri akses ke database:
GRANT ALL PRIVILEGES ON DATABASE toko TO belajar;
Jika ingin user tersebut menjadi owner database:
ALTER DATABASE toko OWNER TO belajar;
Keluar:
\q
Lalu coba login dengan user baru:
psql -U belajar -d toko -h localhost
7. Konsep Penting PostgreSQL
Sebelum masuk ke tabel, pahami dulu struktur dasarnya.
PostgreSQL Server
└── Database
└── Schema
├── Table
├── View
├── Function
├── Index
└── Sequence
PostgreSQL menggunakan schema sebagai namespace di dalam database.
Schema default adalah:
public
8. Tipe Data yang Sering Digunakan
| Tipe Data | Contoh Penggunaan |
|---|---|
INTEGER | Angka bulat |
BIGINT | Angka bulat besar |
NUMERIC(12,2) | Harga, uang |
VARCHAR(n) | Teks dengan panjang maksimal |
TEXT | Teks panjang |
BOOLEAN | true/false |
DATE | Tanggal saja |
TIMESTAMP | Tanggal dan waktu |
TIMESTAMPTZ | Timestamp dengan timezone |
JSONB | JSON biner |
UUID | UUID |
SERIAL | Auto increment integer |
BIGSERIAL | Auto increment bigint |
Contoh:
harga NUMERIC(12,2)
Artinya total 12 digit, 2 digit di belakang koma.
Contoh nilai:
150000.00
999999.99
9. Membuat Tabel
Kita akan membuat database toko sederhana dengan tabel berikut:
kategori
produk
pelanggan
pesanan
pesanan_item
10. Membuat Tabel Kategori
CREATE TABLE kategori (
id SERIAL PRIMARY KEY,
nama VARCHAR(50) NOT NULL UNIQUE,
dibuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Penjelasan:
id SERIAL PRIMARY KEY
Membuat kolom id otomatis bertambah.nama VARCHAR(50) NOT NULL UNIQUE
Nama kategori wajib diisi dan tidak boleh duplikat.dibuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Otomatis diisi waktu saat data dibuat.
11. Membuat Tabel Produk
CREATE TABLE produk (
id SERIAL PRIMARY KEY,
kategori_id INTEGER,
nama VARCHAR(100) NOT NULL,
harga NUMERIC(12,2) NOT NULL CHECK (harga >= 0),
stok INTEGER NOT NULL DEFAULT 0 CHECK (stok >= 0),
dibuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_produk_kategori
FOREIGN KEY (kategori_id)
REFERENCES kategori(id)
ON DELETE SET NULL
);
Penjelasan:
CHECK (harga >= 0)
Harga tidak boleh negatif.CHECK (stok >= 0)
Stok tidak boleh negatif.FOREIGN KEY
Menghubungkan produk ke kategori.ON DELETE SET NULL
Jika kategori dihapus,kategori_idmenjadi NULL, produk tidak ikut terhapus.
12. Membuat Tabel Pelanggan
CREATE TABLE pelanggan (
id SERIAL PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
kota VARCHAR(50),
telepon VARCHAR(20),
dibuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
13. Membuat Tabel Pesanan
CREATE TABLE pesanan (
id SERIAL PRIMARY KEY,
pelanggan_id INTEGER NOT NULL,
tanggal DATE NOT NULL DEFAULT CURRENT_DATE,
status VARCHAR(20) NOT NULL DEFAULT 'pending',
dibuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_pesanan_pelanggan
FOREIGN KEY (pelanggan_id)
REFERENCES pelanggan(id)
ON DELETE RESTRICT
);
Penjelasan:
ON DELETE RESTRICT
Pelanggan tidak boleh dihapus jika masih memiliki pesanan.
14. Membuat Tabel Detail Pesanan
CREATE TABLE pesanan_item (
id SERIAL PRIMARY KEY,
pesanan_id INTEGER NOT NULL,
produk_id INTEGER NOT NULL,
qty INTEGER NOT NULL CHECK (qty > 0),
harga_satuan NUMERIC(12,2) NOT NULL CHECK (harga_satuan >= 0),
CONSTRAINT fk_item_pesanan
FOREIGN KEY (pesanan_id)
REFERENCES pesanan(id)
ON DELETE CASCADE,
CONSTRAINT fk_item_produk
FOREIGN KEY (produk_id)
REFERENCES produk(id)
ON DELETE RESTRICT
);
Penjelasan:
ON DELETE CASCADE
Jika pesanan dihapus, item-itemnya ikut terhapus.qty > 0
Jumlah barang harus lebih dari 0.
15. Melihat Struktur Tabel
Melihat daftar tabel:
\dt
Melihat struktur tabel:
\d produk
Melihat isi tabel:
SELECT * FROM produk;
16. INSERT: Menambah Data
Insert satu data
INSERT INTO kategori (nama)
VALUES ('Elektronik');
Insert banyak data sekaligus
INSERT INTO kategori (nama)
VALUES
('Elektronik'),
('Alat Tulis'),
('Aksesoris');
Insert produk
INSERT INTO produk (kategori_id, nama, harga, stok)
VALUES
(1, 'Mouse Wireless', 150000, 20),
(1, 'Keyboard Mechanical', 450000, 10),
(2, 'Pulpen', 5000, 100),
(2, 'Buku Catatan', 15000, 50),
(3, 'Mousepad', 35000, 30);
Insert pelanggan
INSERT INTO pelanggan (nama, email, kota, telepon)
VALUES
('Budi Santoso', 'budi@example.com', 'Jakarta', '0811111111'),
('Siti Rahma', 'siti@example.com', 'Bandung', '0822222222'),
('Andi Wijaya', 'andi@example.com', 'Surabaya', '0833333333');
Insert pesanan
INSERT INTO pesanan (pelanggan_id, tanggal, status)
VALUES
(1, '2026-08-01', 'selesai'),
(2, '2026-08-05', 'selesai'),
(3, '2026-08-10', 'pending');
Insert detail pesanan
INSERT INTO pesanan_item (pesanan_id, produk_id, qty, harga_satuan)
VALUES
(1, 1, 2, 150000),
(1, 5, 1, 35000),
(2, 3, 5, 5000),
(2, 4, 2, 15000),
(3, 2, 1, 450000);
17. SELECT: Membaca Data
Melihat semua data
SELECT * FROM produk;
Memilih kolom tertentu
SELECT nama, harga
FROM produk;
Memberi alias
SELECT
nama AS nama_produk,
harga AS harga_produk
FROM produk;
18. WHERE: Filter Data
Produk dengan harga di atas 50.000
SELECT nama, harga
FROM produk
WHERE harga > 50000;
Produk dengan harga antara 10.000 sampai 100.000
SELECT nama, harga
FROM produk
WHERE harga BETWEEN 10000 AND 100000;
Produk dengan stok lebih dari 20
SELECT nama, stok
FROM produk
WHERE stok > 20;
Produk dengan kategori tertentu
SELECT nama
FROM produk
WHERE kategori_id = 1;
19. Operator Logika
AND
SELECT nama, harga, stok
FROM produk
WHERE harga > 30000 AND stok > 10;
OR
SELECT nama, harga
FROM produk
WHERE harga < 10000 OR harga > 400000;
NOT
SELECT nama, harga
FROM produk
WHERE NOT kategori_id = 2;
20. LIKE dan ILIKE
LIKE digunakan untuk pencarian pola.
%berarti karakter apa saja_berarti satu karakter
Contoh:
SELECT nama
FROM produk
WHERE nama LIKE 'Mouse%';
Akan mencari produk yang namanya diawali Mouse.
Contoh lain:
SELECT nama
FROM produk
WHERE nama LIKE '%pad';
Akan mencari produk yang namanya berakhiran pad.
Jika ingin case-insensitive, gunakan ILIKE:
SELECT nama
FROM produk
WHERE nama ILIKE '%mouse%';
21. IN dan NOT IN
SELECT nama, harga
FROM produk
WHERE kategori_id IN (1, 3);
Artinya ambil produk dengan kategori_id 1 atau 3.
SELECT nama, harga
FROM produk
WHERE kategori_id NOT IN (2);
22. ORDER BY: Mengurutkan Data
Urutkan produk berdasarkan harga dari termurah:
SELECT nama, harga
FROM produk
ORDER BY harga ASC;
Dari termahal:
SELECT nama, harga
FROM produk
ORDER BY harga DESC;
Urutkan berdasarkan nama:
SELECT nama, harga
FROM produk
ORDER BY nama ASC;
23. LIMIT dan OFFSET
Ambil 3 produk pertama:
SELECT nama, harga
FROM produk
LIMIT 3;
Lewati 2 data pertama, lalu ambil 3 data:
SELECT nama, harga
FROM produk
ORDER BY id
LIMIT 3 OFFSET 2;
Sering digunakan untuk pagination.
24. UPDATE: Mengubah Data
Ubah harga produk dengan id 1:
UPDATE produk
SET harga = 160000
WHERE id = 1;
Ubah stok beberapa produk:
UPDATE produk
SET stok = stok - 1
WHERE id IN (1, 5);
Ubah status pesanan:
UPDATE pesanan
SET status = 'selesai'
WHERE id = 3;
Penting: selalu gunakan WHERE saat UPDATE agar tidak mengubah semua baris.
25. DELETE: Menghapus Data
Hapus data produk dengan id tertentu:
DELETE FROM produk
WHERE id = 5;
Hapus kategori yang tidak dipakai:
DELETE FROM kategori
WHERE id = 3;
Penting: selalu gunakan WHERE saat DELETE.
26. Constraint
Constraint adalah aturan pada tabel.
PRIMARY KEY
Menentukan baris unik.
id SERIAL PRIMARY KEY
UNIQUE
Tidak boleh duplikat.
email VARCHAR(255) UNIQUE
NOT NULL
Wajib diisi.
nama VARCHAR(100) NOT NULL
CHECK
Validasi nilai.
harga NUMERIC(12,2) CHECK (harga >= 0)
FOREIGN KEY
Relasi antar tabel.
FOREIGN KEY (kategori_id) REFERENCES kategori(id)
27. ALTER TABLE: Mengubah Struktur Tabel
Menambah kolom
ALTER TABLE produk
ADD COLUMN deskripsi TEXT;
Menghapus kolom
ALTER TABLE produk
DROP COLUMN deskripsi;
Mengganti nama kolom
ALTER TABLE produk
RENAME COLUMN nama TO nama_produk;
Jika ingin mengembalikan:
ALTER TABLE produk
RENAME COLUMN nama_produk TO nama;
Mengubah tipe data
ALTER TABLE produk
ALTER COLUMN nama TYPE VARCHAR(150);
28. Agregasi: COUNT, SUM, AVG, MIN, MAX
Hitung jumlah produk
SELECT COUNT(*) AS total_produk
FROM produk;
Total stok semua produk
SELECT SUM(stok) AS total_stok
FROM produk;
Rata-rata harga
SELECT AVG(harga) AS rata_rata_harga
FROM produk;
Harga termahal
SELECT MAX(harga) AS harga_tertinggi
FROM produk;
Harga termurah
SELECT MIN(harga) AS harga_terendah
FROM produk;
29. GROUP BY
GROUP BY digunakan untuk mengelompokkan data.
Contoh: jumlah produk per kategori.
SELECT kategori_id, COUNT(*) AS jumlah_produk
FROM produk
GROUP BY kategori_id;
Total stok per kategori:
SELECT kategori_id, SUM(stok) AS total_stok
FROM produk
GROUP BY kategori_id;
Rata-rata harga per kategori:
SELECT kategori_id, AVG(harga) AS rata_rata_harga
FROM produk
GROUP BY kategori_id;
30. HAVING
HAVING digunakan untuk memfilter hasil GROUP BY.
Contoh: kategori yang memiliki lebih dari 1 produk.
SELECT kategori_id, COUNT(*) AS jumlah_produk
FROM produk
GROUP BY kategori_id
HAVING COUNT(*) > 1;
31. JOIN: Menggabungkan Tabel
Relasi antar tabel adalah inti database relasional.
Kita punya:
produk.kategori_id -> kategori.id
pesanan.pelanggan_id -> pelanggan.id
pesanan_item.pesanan_id -> pesanan.id
pesanan_item.produk_id -> produk.id
INNER JOIN
Menampilkan produk beserta nama kategorinya:
SELECT
p.nama AS produk,
k.nama AS kategori,
p.harga
FROM produk p
INNER JOIN kategori k ON k.id = p.kategori_id;
LEFT JOIN
Menampilkan semua kategori, termasuk kategori yang belum punya produk:
SELECT
k.nama AS kategori,
p.nama AS produk
FROM kategori k
LEFT JOIN produk p ON p.kategori_id = k.id;
JOIN beberapa tabel
Melihat detail pesanan:
SELECT
pe.id AS pesanan_id,
pe.tanggal,
pl.nama AS pelanggan,
pr.nama AS produk,
pi.qty,
pi.harga_satuan,
pi.qty * pi.harga_satuan AS subtotal
FROM pesanan_item pi
JOIN pesanan pe ON pe.id = pi.pesanan_id
JOIN pelanggan pl ON pl.id = pe.pelanggan_id
JOIN produk pr ON pr.id = pi.produk_id;
32. Studi Kasus: Laporan Penjualan
Total belanja per pesanan
SELECT
pe.id AS pesanan_id,
pe.tanggal,
pl.nama AS pelanggan,
SUM(pi.qty * pi.harga_satuan) AS total
FROM pesanan pe
JOIN pelanggan pl ON pl.id = pe.pelanggan_id
JOIN pesanan_item pi ON pi.pesanan_id = pe.id
GROUP BY pe.id, pe.tanggal, pl.nama
ORDER BY total DESC;
Produk paling banyak terjual
SELECT
pr.nama AS produk,
SUM(pi.qty) AS total_terjual
FROM pesanan_item pi
JOIN produk pr ON pr.id = pi.produk_id
GROUP BY pr.nama
ORDER BY total_terjual DESC;
Pelanggan dengan total belanja terbesar
SELECT
pl.nama AS pelanggan,
SUM(pi.qty * pi.harga_satuan) AS total_belanja
FROM pesanan pe
JOIN pelanggan pl ON pl.id = pe.pelanggan_id
JOIN pesanan_item pi ON pi.pesanan_id = pe.id
GROUP BY pl.nama
ORDER BY total_belanja DESC;
Pesanan yang masih pending
SELECT
id,
tanggal,
status
FROM pesanan
WHERE status = 'pending';
33. Subquery
Subquery adalah query di dalam query.
Contoh: ambil produk yang harganya lebih mahal dari rata-rata.
SELECT nama, harga
FROM produk
WHERE harga > (
SELECT AVG(harga)
FROM produk
);
Contoh: ambil kategori yang memiliki produk.
SELECT *
FROM kategori
WHERE id IN (
SELECT kategori_id
FROM produk
WHERE kategori_id IS NOT NULL
);
34. Common Table Expression (CTE)
CTE membuat query lebih mudah dibaca.
WITH total_penjualan AS (
SELECT
pi.pesanan_id,
SUM(pi.qty * pi.harga_satuan) AS total
FROM pesanan_item pi
GROUP BY pi.pesanan_id
)
SELECT
p.id,
p.tanggal,
t.total
FROM pesanan p
JOIN total_penjualan t ON t.pesanan_id = p.id
ORDER BY t.total DESC;
35. VIEW
View adalah query yang disimpan seperti tabel virtual.
Membuat view:
CREATE VIEW laporan_penjualan AS
SELECT
pe.id AS pesanan_id,
pe.tanggal,
pl.nama AS pelanggan,
pr.nama AS produk,
pi.qty,
pi.harga_satuan,
pi.qty * pi.harga_satuan AS subtotal
FROM pesanan_item pi
JOIN pesanan pe ON pe.id = pi.pesanan_id
JOIN pelanggan pl ON pl.id = pe.pelanggan_id
JOIN produk pr ON pr.id = pi.produk_id;
Menggunakan view:
SELECT * FROM laporan_penjualan;
Menghapus view:
DROP VIEW laporan_penjualan;
36. INDEX
Index membantu mempercepat pencarian data.
Contoh index pada kolom nama produk:
CREATE INDEX idx_produk_nama ON produk(nama);
Index pada kolom harga:
CREATE INDEX idx_produk_harga ON produk(harga);
Index pada foreign key:
CREATE INDEX idx_produk_kategori ON produk(kategori_id);
Melihat index:
\di
Menghapus index:
DROP INDEX idx_produk_nama;
Catatan: index mempercepat SELECT, tetapi bisa memperlambat INSERT, UPDATE, dan DELETE. Jadi gunakan secara bijak.
37. EXPLAIN dan EXPLAIN ANALYZE
Digunakan untuk melihat rencana eksekusi query.
EXPLAIN SELECT * FROM produk WHERE harga > 100000;
Lebih detail:
EXPLAIN ANALYZE
SELECT * FROM produk WHERE harga > 100000;
Jika query lambat, EXPLAIN ANALYZE membantu memahami apakah database menggunakan index, sequential scan, atau join yang mahal.
38. Transaction
Transaction digunakan untuk memastikan beberapa perubahan database berhasil semua atau dibatalkan semua.
Contoh:
BEGIN;
UPDATE produk
SET stok = stok - 1
WHERE id = 1;
INSERT INTO pesanan_item (pesanan_id, produk_id, qty, harga_satuan)
VALUES (3, 1, 1, 160000);
COMMIT;
Jika ada kesalahan, gunakan rollback:
BEGIN;
UPDATE produk
SET stok = stok - 1
WHERE id = 1;
ROLLBACK;
Dengan ROLLBACK, perubahan dibatalkan.
39. AUTO INCREMENT dan RETURNING
Ketika insert data, kadang kita ingin tahu id yang dibuat.
INSERT INTO kategori (nama)
VALUES ('Fashion')
RETURNING id, nama;
Contoh output:
id | nama
----+--------
4 | Fashion
Ini sangat berguna di aplikasi backend.
40. JSONB di PostgreSQL
PostgreSQL juga mendukung JSON dengan tipe JSONB.
Buat tabel:
CREATE TABLE log_aplikasi (
id SERIAL PRIMARY KEY,
event VARCHAR(50),
payload JSONB,
dibuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Insert data:
INSERT INTO log_aplikasi (event, payload)
VALUES
('login', '{"user": "budi", "ip": "192.168.1.10"}'),
('checkout', '{"user": "siti", "total": 55000}');
Query JSONB:
SELECT *
FROM log_aplikasi
WHERE payload->>'user' = 'budi';
Ambil field tertentu:
SELECT
event,
payload->>'user' AS user
FROM log_aplikasi;
JSONB cocok untuk data semi-terstruktur.
41. Function Sederhana
Membuat function untuk menghitung total pesanan:
CREATE OR REPLACE FUNCTION hitung_total_pesanan(p_pesanan_id INTEGER)
RETURNS NUMERIC AS $$
DECLARE
total NUMERIC;
BEGIN
SELECT SUM(qty * harga_satuan)
INTO total
FROM pesanan_item
WHERE pesanan_id = p_pesanan_id;
RETURN COALESCE(total, 0);
END;
$$ LANGUAGE plpgsql;
Cara pakai:
SELECT hitung_total_pesanan(1);
42. Trigger Sederhana
Trigger adalah proses otomatis yang dijalankan ketika ada event tertentu.
Contoh: update kolom updated_at.
Tambah kolom:
ALTER TABLE produk
ADD COLUMN updated_at TIMESTAMP;
Buat function:
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Buat trigger:
CREATE TRIGGER trg_produk_updated_at
BEFORE UPDATE ON produk
FOR EACH ROW
EXECUTE FUNCTION update_updated_at();
Coba update produk:
UPDATE produk
SET harga = 170000
WHERE id = 1;
Lalu cek:
SELECT id, nama, updated_at
FROM produk
WHERE id = 1;
43. Backup dan Restore
Backup database
Dari terminal, bukan dari dalam psql:
pg_dump -U belajar -d toko -f toko_backup.sql
Backup dalam format custom:
pg_dump -U belajar -d toko -Fc -f toko_backup.dump
Restore dari file SQL
psql -U belajar -d toko -f toko_backup.sql
Restore dari file dump custom
pg_restore -U belajar -d toko -c toko_backup.dump
Catatan: nama database toko harus sudah ada atau dibuat dulu.
Membuat database kosong:
CREATE DATABASE toko;
44. Export dan Import CSV
Export CSV dari psql
\copy produk TO 'produk.csv' WITH CSV HEADER;
Import CSV ke tabel
\copy produk FROM 'produk.csv' WITH CSV HEADER;
Jika struktur tabel berbeda, biasanya lebih aman membuat tabel staging terlebih dahulu.
45. Best Practice Desain Database
Berikut kebiasaan baik yang perlu dibiasakan.
1. Gunakan nama tabel dalam bentuk jamak atau konsisten
Contoh konsisten:
pelanggan
produk
pesanan
atau:
users
products
orders
Pilih satu gaya dan konsisten.
2. Gunakan primary key
Setiap tabel sebaiknya punya primary key.
id SERIAL PRIMARY KEY
atau:
id BIGSERIAL PRIMARY KEY
3. Gunakan foreign key untuk relasi
Jangan hanya mengandalkan aplikasi untuk menjaga relasi.
FOREIGN KEY (pelanggan_id) REFERENCES pelanggan(id)
4. Jangan simpan hasil perhitungan jika tidak perlu
Contoh: total pesanan lebih baik dihitung dari pesanan_item, kecuali ada alasan performa.
Jika perlu disimpan, pastikan konsisten dengan trigger atau logic aplikasi.
5. Gunakan tipe data yang tepat
Untuk uang, gunakan NUMERIC, bukan FLOAT.
harga NUMERIC(12,2)
6. Gunakan index pada kolom yang sering difilter
Contoh:
CREATE INDEX idx_pesanan_status ON pesanan(status);
CREATE INDEX idx_pesanan_pelanggan ON pesanan(pelanggan_id);
7. Gunakan transaction untuk operasi penting
Terutama untuk:
- Pembayaran
- Pengurangan stok
- Transfer saldo
- Proses multi-tabel
46. Kesalahan Umum Pemula
1. Lupa WHERE saat UPDATE atau DELETE
Berbahaya:
UPDATE produk SET harga = 0;
Ini mengubah semua produk.
Seharusnya:
UPDATE produk SET harga = 0 WHERE id = 10;
2. Menggunakan SELECT * terlalu sering
Untuk query aplikasi, lebih baik pilih kolom yang dibutuhkan:
SELECT id, nama, harga
FROM produk;
3. Tidak memakai index pada data besar
Jika data sudah jutaan baris, query tanpa index bisa lambat.
4. Menyimpan uang sebagai FLOAT
Gunakan:
NUMERIC
5. Tidak membuat backup
Selalu biasakan backup database penting.
47. Latihan Proyek
Untuk benar-benar paham, coba buat proyek berikut.
Level 1: Sistem Perpustakaan
Tabel:
buku
anggota
peminjaman
Fitur:
- Data buku
- Data anggota
- Peminjaman buku
- Status kembali
- Denda sederhana
Level 2: Sistem Sekolah
Tabel:
siswa
kelas
mata_pelajaran
nilai
Fitur:
- Nilai siswa
- Rata-rata nilai per kelas
- Ranking siswa
Level 3: Sistem Toko Online
Tabel:
kategori
produk
pelanggan
pesanan
pesanan_item
pembayaran
Fitur:
- Keranjang belanja
- Checkout
- Laporan penjualan
- Produk terlaris
- Pelanggan terbaik
48. Soal Latihan SQL
Coba kerjakan query berikut.
- Tampilkan semua produk yang harganya di bawah 50.000.
SELECT *
FROM produk
WHERE harga < 50000;
- Tampilkan produk yang stoknya lebih dari 10.
SELECT *
FROM produk
WHERE stok > 10;
- Tampilkan 3 produk termahal.
SELECT nama, harga
FROM produk
ORDER BY harga DESC
LIMIT 3;
- Hitung jumlah produk per kategori.
SELECT kategori_id, COUNT(*)
FROM produk
GROUP BY kategori_id;
- Tampilkan pesanan dengan total lebih dari 100.000.
SELECT
pe.id,
SUM(pi.qty * pi.harga_satuan) AS total
FROM pesanan pe
JOIN pesanan_item pi ON pi.pesanan_id = pe.id
GROUP BY pe.id
HAVING SUM(pi.qty * pi.harga_satuan) > 100000;
49. Roadmap Belajar PostgreSQL
Tahap 1: Dasar
Yang perlu dikuasai:
SELECT
INSERT
UPDATE
DELETE
WHERE
ORDER BY
LIMIT
Tahap 2: Menengah
Yang perlu dikuasai:
JOIN
GROUP BY
HAVING
Aggregate function
Constraint
Foreign key
Subquery
Tahap 3: Lanjutan
Yang perlu dikuasai:
Index
EXPLAIN ANALYZE
Transaction
View
Function
Trigger
CTE
Window function
JSONB
Backup restore
50. Contoh Window Function
Window function berguna untuk analisis data.
Contoh: ranking produk berdasarkan harga.
SELECT
nama,
harga,
RANK() OVER (ORDER BY harga DESC) AS ranking
FROM produk;
Contoh lain: total harga per kategori tanpa GROUP BY.
SELECT
kategori_id,
nama,
harga,
SUM(harga) OVER (PARTITION BY kategori_id) AS total_harga_kategori
FROM produk;
51. Tips Cepat Belajar PostgreSQL
- Praktik langsung, jangan hanya membaca.
- Gunakan database contoh kecil.
- Biasakan menulis query bertahap.
- Sering gunakan
SELECTsebelumUPDATEatauDELETE. - Gunakan
EXPLAIN ANALYZEjika query lambat. - Pelajari cara membaca error PostgreSQL.
- Buat proyek sederhana.
- Latihan soal SQL secara rutin.
52. Ringkasan Perintah Penting
-- Database
CREATE DATABASE toko;
\c toko
\l
-- Tabel
CREATE TABLE produk (...);
ALTER TABLE produk ADD COLUMN ...;
DROP TABLE produk;
-- Data
INSERT INTO produk (...) VALUES (...);
SELECT * FROM produk;
UPDATE produk SET ... WHERE ...;
DELETE FROM produk WHERE ...;
-- Query
SELECT kolom
FROM tabel
WHERE kondisi
ORDER BY kolom
LIMIT 10;
-- Agregasi
COUNT()
SUM()
AVG()
MIN()
MAX()
-- Join
JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
-- Transaksi
BEGIN;
COMMIT;
ROLLBACK;
Penutup
Untuk belajar PostgreSQL, alurnya bisa seperti ini:
Instalasi
↓
psql dasar
↓
CREATE DATABASE
↓
CREATE TABLE
↓
INSERT, SELECT, UPDATE, DELETE
↓
WHERE, ORDER BY, LIMIT
↓
JOIN
↓
GROUP BY
↓
Index
↓
Transaction
↓
View, Function, Trigger
↓
Backup & Restore
Jika kamu konsisten latihan membuat query dan membangun satu proyek kecil, kemampuan PostgreSQL akan cepat meningkat.