Belajar Bahasa Pemrograman Dari Dasar

Tutorial lengkap dari dasar untuk berbagai bahasa pemrograman populer.

16 menit

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

  1. Download installer dari situs resmi PostgreSQL.
  2. Jalankan installer.
  3. Pilih komponen:
    • PostgreSQL Server
    • pgAdmin
    • Command Line Tools
  4. Atur password untuk user postgres.
  5. Biarkan port default: 5432.
  6. 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:

Advertisements
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

PerintahFungsi
\lLihat daftar database
\c nama_databasePindah ke database
\dtLihat daftar tabel
\duLihat daftar user/role
\dnLihat daftar schema
\diLihat daftar index
\dfLihat daftar function
\qKeluar dari psql
\?Bantuan perintah psql
\h SELECTBantuan 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 DataContoh Penggunaan
INTEGERAngka bulat
BIGINTAngka bulat besar
NUMERIC(12,2)Harga, uang
VARCHAR(n)Teks dengan panjang maksimal
TEXTTeks panjang
BOOLEANtrue/false
DATETanggal saja
TIMESTAMPTanggal dan waktu
TIMESTAMPTZTimestamp dengan timezone
JSONBJSON biner
UUIDUUID
SERIALAuto increment integer
BIGSERIALAuto 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_id menjadi 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.

Advertisements
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.

  1. Tampilkan semua produk yang harganya di bawah 50.000.
SELECT *
FROM produk
WHERE harga < 50000;

  1. Tampilkan produk yang stoknya lebih dari 10.
SELECT *
FROM produk
WHERE stok > 10;

  1. Tampilkan 3 produk termahal.
SELECT nama, harga
FROM produk
ORDER BY harga DESC
LIMIT 3;

  1. Hitung jumlah produk per kategori.
SELECT kategori_id, COUNT(*)
FROM produk
GROUP BY kategori_id;

  1. 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

  1. Praktik langsung, jangan hanya membaca.
  2. Gunakan database contoh kecil.
  3. Biasakan menulis query bertahap.
  4. Sering gunakan SELECT sebelum UPDATE atau DELETE.
  5. Gunakan EXPLAIN ANALYZE jika query lambat.
  6. Pelajari cara membaca error PostgreSQL.
  7. Buat proyek sederhana.
  8. 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.

Zulfikar

Penulis

Artikel Terkait

Tidak ada artikel terkait.

Leave a Reply

Alamat email Anda tidak akan dipublikasikan.

CAPTCHA

Berlangganan Newsletter

Dapatkan update tutorial dan artikel terbaru langsung ke email Anda.