Setelah menempuh lebih dari tiga ratus chapter, ingatan kita bekerja dengan pola, bukan dengan sintaks huruf demi huruf: kita tahu apa yang ingin dicapai, tetapi urutan klausa persisnya sering perlu dicek ulang. Momen seperti itu butuh contekan yang bisa dipindai dalam hitungan detik — bukan tiga ribu halaman manual. Chapter ini adalah contekan itu: tabel-tabel ringkas yang mengelompokkan perintah SQL PostgreSQL paling sering dipakai menurut tugasnya, dari membentuk struktur tabel sampai mengendalikan transaksi. Setiap baris memuat bentuk ringkas perintahnya dan tautan ke chapter course yang membahasnya secara utuh, jadi tabel ini sekaligus berfungsi sebagai peta jalan mundur ke materi yang sudah kita pelajari.

DDL: Membentuk Struktur #

Perintah Data Definition Language membentuk dan mengubah kerangka database. Aturan praktisnya satu: perubahan struktur selalu ditulis ulang di file migrasi, jangan diketik langsung di produksi — kebiasaan yang ditanamkan di Section Table Design.

PerintahBentuk ringkasBahasan dalam
CREATE TABLECREATE TABLE nama (kolom tipe [constraint], ...);Membuat Tabel
ALTER TABLEALTER TABLE nama ADD COLUMN kolom tipe;Mengubah Struktur Tabel
DROP TABLEDROP TABLE nama;Menghapus Database dan Tabel
CREATE INDEXCREATE INDEX nama ON tabel (kolom);Membuat dan Menghapus Index
CREATE SCHEMACREATE SCHEMA nama;Membuat Schema
CREATE VIEWCREATE VIEW nama AS SELECT ...;Membuat View
CREATE DATABASECREATE DATABASE nama;Membuat Database

ALTER TABLE adalah perintah paling banyak varian bentuknya: menambah kolom, mengubah tipe, mengganti nama, memasang atau melepas constraint, semuanya lewat satu pintu. Jika ragu urutan klausa untuk kasus tertentu, lompat dulu ke chapter-nya di kolom kanan sebelum menekan Enter.

DML: Mengisi dan Mengubah Data #

Data Manipulation Language adalah kelompok perintah yang paling sering diketik sehari-hari. Semua bentuk di bawah ini aman berkat satu kebiasaan: selalu uji WHERE dengan SELECT dulu sebelum UPDATE dan DELETE.

PerintahBentuk ringkasBahasan dalam
INSERTINSERT INTO nama (kolom) VALUES (nilai);INSERT
INSERT banyak barisINSERT INTO nama VALUES (...), (...), ...;Insert Multiple Rows
SELECTSELECT kolom FROM nama WHERE ... ORDER BY ...;SELECT
UPDATEUPDATE nama SET kolom = nilai WHERE ...;UPDATE
DELETEDELETE FROM nama WHERE ...;DELETE
RETURNINGINSERT/UPDATE/DELETE ... RETURNING *;RETURNING Clause
UpsertINSERT ... ON CONFLICT (kolom) DO UPDATE SET ...;ON CONFLICT
MERGEMERGE INTO target USING sumber ON kondisi WHEN MATCHED THEN ...;MERGE
TRUNCATETRUNCATE TABLE nama;TRUNCATE TABLE

Dua baris terakhir layak diberi catatan. TRUNCATE mengosongkan tabel seketika tanpa menyapu baris satu per satu — cepat, tetapi tidak bisa dibatalkan dengan ROLLBACK setelah dijalankan di luar transaksi yang disengaja. MERGE adalah perintah standar SQL untuk menyinkronkan data dari sumber ke target dan baru tersedia mulai PostgreSQL 15 — di versi lebih tua, ON CONFLICT adalah pasangan penggantinya.

Pola Query: Join, Agregasi, Window #

Kelompok ini bukan sekadar perintah, melainkan pola penyusunan query. Bentuk ringkasnya di bawah sengaja dipendekkan; variasi lengkap tiap pola ada di chapter masing-masing.

PolaBentuk ringkasBahasan dalam
INNER JOINFROM a JOIN b ON a.x = b.x;INNER JOIN
Outer joinFROM a LEFT/RIGHT/FULL JOIN b ON ...;LEFT , RIGHT , FULL OUTER
CROSS JOINFROM a CROSS JOIN b;CROSS JOIN
Self joinFROM t a JOIN t b ON a.atasan_id = b.id;SELF JOIN
LATERALFROM a, LATERAL (SELECT ... WHERE ... = a.x) sub;LATERAL Join
GROUP BY + HAVING... GROUP BY kolom HAVING count(*) > 1;GROUP BY , HAVING
FILTERcount(*) FILTER (WHERE kondisi);FILTER Clause
Grouping setsGROUP BY GROUPING SETS ((a), (b), ());Grouping Sets , ROLLUP dan CUBE
CTEWITH nama AS (SELECT ...) SELECT ... FROM nama;Common Table Expressions
Recursive CTEWITH RECURSIVE t AS (SELECT ... UNION ALL SELECT ... FROM t) ...;Recursive CTE
Scalar subquerySELECT (SELECT max(x) FROM t) AS maks;Scalar Subquery
EXISTSWHERE EXISTS (SELECT 1 FROM t WHERE t.id = luar.id);EXISTS dan NOT EXISTS
Window functionfn() OVER (PARTITION BY k ORDER BY k2);OVER dan PARTITION BY

Ketika membentangkan pola ini menjadi query nyata, urutan penulisan klausa SELECT menentukan: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Tabel referensi ini untuk mengingat bentuk; pemilihan pola yang tepat untuk tiap jenis pertanyaan analisis dibahas lebih jauh di chapter Query Pattern untuk Data Analisis .

TCL: Kontrol Transaksi #

Empat perintah Transaction Control Language ini menjaga kesatuan kerja. Kombinasi yang paling sering dipakai aplikasi: bungkus beberapa UPDATE dalam BEGIN ... COMMIT, dan sisipkan SAVEPOINT untuk operasi yang boleh gagal sendiri tanpa membatalkan sisanya.

PerintahBentuk ringkasBahasan dalam
BEGINBEGIN; atau START TRANSACTION;BEGIN, COMMIT, dan ROLLBACK
COMMIT / ROLLBACKCOMMIT; / ROLLBACK;BEGIN, COMMIT, dan ROLLBACK
SAVEPOINTSAVEPOINT nama; ROLLBACK TO SAVEPOINT nama;SAVEPOINT
Isolation levelSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;Isolation Levels

Meta-Command psql yang Paling Dipakai #

Di terminal, separuh kecepatan kerja datang dari meta-command psql. Tabel ini merangkum yang paling sering diketik; perilaku lengkapnya — termasuk varian + yang menambah detail — dibahas di chapter Menggunakan psql .

PerintahPeran
\d namaDeskripsi struktur tabel, view, atau index
\dtDaftar tabel di schema aktif
\dn / \du / \lDaftar schema, daftar role, daftar database
\c namaBerpindah database
\xTampilan expanded untuk baris berkolom banyak
\timingTampilkan durasi setiap query
\i file.sqlJalankan file SQL dari dalam sesi
\copyImpor/ekspor CSV dari sisi klien — dibahas di Database Seeding
\h [perintah]Bantuan sintaks SQL, lengkap dengan URL dokumentasinya
\?Daftar seluruh meta-command

Fungsi yang Paling Sering Dipakai #

Fungsi bawaan PostgreSQL berjumlah ratusan, tetapi sehari-hari kita berputar di sekelompok kecil. Tabel ini mengelompokkannya per kategori; daftar lengkap per kategori ada di Section Fungsi SQL.

KategoriFungsi andalanBahasan dalam
Stringlength, upper/lower, initcap, substring, trim, split_part, concat, replaceFungsi String
Numerikround, trunc, ceil, floor, absFungsi Numerik
Tanggal & waktunow, current_date, date_trunc, extract, age, to_charFungsi Date dan Time
NULLcoalesce, nullifFungsi NULL
KondisionalCASE WHEN, greatest, leastFungsi Kondisional
KonversiCAST(x AS tipe), x::tipeType Casting
Agregatcount, sum, avg, min, max, string_agg, percentile_contFungsi Agregat

Uji Cepat: Satu File, Semua Keluarga Perintah #

Tabel di atas menjadi bukti kalau dijalankan. File berikut menempuh seluruh keluarga perintah dalam satu alur singkat: dua tabel dibuat (DDL), diisi (DML), direkap lewat join plus agregasi, diberi peringkat lewat window function, diperbarui lewat upsert, dan ditutup dengan transaksi bawaan savepoint — semua dalam sekitar dua puluh baris:

sql uji-cepat.sql
-- Uji cepat referensi: satu file menempuh DDL -> DML -> join + agregasi
-- -> window function -> upsert -> transaksi dengan savepoint.
CREATE TABLE kategori (
    id   integer PRIMARY KEY,
    nama text NOT NULL UNIQUE
);

CREATE TABLE barang (
    id          integer PRIMARY KEY,
    nama        text NOT NULL,
    harga       numeric(10,2) NOT NULL CHECK (harga >= 0),
    kategori_id integer NOT NULL REFERENCES kategori(id)
);

INSERT INTO kategori VALUES (1, 'Makanan'), (2, 'Minuman');

INSERT INTO barang VALUES
    (1, 'Beras 5kg',  68000.00, 1),
    (2, 'Gula 1kg',   16500.00, 1),
    (3, 'Teh Celup',   9500.00, 2);

-- Join + agregasi: rekap nilai stok per kategori.
SELECT k.nama AS kategori,
       count(b.id)  AS jumlah_barang,
       sum(b.harga) AS total_harga
FROM kategori k
LEFT JOIN barang b ON b.kategori_id = k.id
GROUP BY k.nama
ORDER BY k.nama;

-- Window function: peringkat harga termurah di dalam tiap kategori.
SELECT nama,
       harga,
       row_number() OVER (PARTITION BY kategori_id ORDER BY harga) AS peringkat_murah
FROM barang
ORDER BY kategori_id, harga;

-- Upsert: id yang sudah ada diperbarui, bukan ditolak.
INSERT INTO barang (id, nama, harga, kategori_id)
VALUES (2, 'Gula 1kg', 17500.00, 1)
ON CONFLICT (id) DO UPDATE
SET harga = EXCLUDED.harga;

SELECT harga FROM barang WHERE id = 2;

-- Transaksi: savepoint menyelamatkan pekerjaan yang sudah benar.
BEGIN;
INSERT INTO barang VALUES (4, 'Kopi Sachet', 2500.00, 2);
SAVEPOINT sebelum_revisi;
UPDATE barang SET harga = 2400.00 WHERE id = 4;
ROLLBACK TO SAVEPOINT sebelum_revisi;
COMMIT;

SELECT nama, harga FROM barang WHERE id = 4;

Output yang Dihasilkan:

text
CREATE TABLE
CREATE TABLE
INSERT 0 2
INSERT 0 3
 kategori | jumlah_barang | total_harga 
----------+---------------+-------------
 Makanan  |             2 |    84500.00
 Minuman  |             1 |     9500.00
(2 rows)

   nama    |  harga   | peringkat_murah 
-----------+----------+-----------------
 Gula 1kg  | 16500.00 |               1
 Beras 5kg | 68000.00 |               2
 Teh Celup |  9500.00 |               1
(3 rows)

INSERT 0 1
  harga   
----------
 17500.00
(1 row)

BEGIN
INSERT 0 1
SAVEPOINT
UPDATE 1
ROLLBACK
COMMIT
    nama     |  harga  
-------------+---------
 Kopi Sachet | 2500.00
(1 row)

Empat pengamatan dari hasil eksekusinya. Pertama, rekap kategori dihitung sebelum upsert, sehingga Gula 1kg masih tercatat 16500.00 — urutan pernyataan dalam file memang menumpuk, sebagaimana urutan kerja sehari-hari. Kedua, row_number() memberi peringkat per kategori berkat PARTITION BY kategori_id, bukan peringkat global. Ketiga, upsert mengubah harga Gula 1kg menjadi 17500.00 tanpa error duplicate key. Keempat, Kopi Sachet tetap 2500.00 karena UPDATE ke 2400.00 dibatalkan oleh ROLLBACK TO SAVEPOINT, sementara INSERT-nya selamat sampai COMMIT.

Referensi ini merangkum apa yang tersedia. Pertanyaan berikutnya setelah alat dikuasai adalah ke mana melangkah untuk terus naik level — kurasi jalur belajar, bacaan, dan latihan lanjutan menjadi isi chapter Panduan Praktik.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

uji-cepat.sql

Unduh berkas
sql
-- Uji cepat referensi: satu file menempuh DDL -> DML -> join + agregasi
-- -> window function -> upsert -> transaksi dengan savepoint.
CREATE TABLE kategori (
    id   integer PRIMARY KEY,
    nama text NOT NULL UNIQUE
);

CREATE TABLE barang (
    id          integer PRIMARY KEY,
    nama        text NOT NULL,
    harga       numeric(10,2) NOT NULL CHECK (harga >= 0),
    kategori_id integer NOT NULL REFERENCES kategori(id)
);

INSERT INTO kategori VALUES (1, 'Makanan'), (2, 'Minuman');

INSERT INTO barang VALUES
    (1, 'Beras 5kg',  68000.00, 1),
    (2, 'Gula 1kg',   16500.00, 1),
    (3, 'Teh Celup',   9500.00, 2);

-- Join + agregasi: rekap nilai stok per kategori.
SELECT k.nama AS kategori,
       count(b.id)  AS jumlah_barang,
       sum(b.harga) AS total_harga
FROM kategori k
LEFT JOIN barang b ON b.kategori_id = k.id
GROUP BY k.nama
ORDER BY k.nama;

-- Window function: peringkat harga termurah di dalam tiap kategori.
SELECT nama,
       harga,
       row_number() OVER (PARTITION BY kategori_id ORDER BY harga) AS peringkat_murah
FROM barang
ORDER BY kategori_id, harga;

-- Upsert: id yang sudah ada diperbarui, bukan ditolak.
INSERT INTO barang (id, nama, harga, kategori_id)
VALUES (2, 'Gula 1kg', 17500.00, 1)
ON CONFLICT (id) DO UPDATE
SET harga = EXCLUDED.harga;

SELECT harga FROM barang WHERE id = 2;

-- Transaksi: savepoint menyelamatkan pekerjaan yang sudah benar.
BEGIN;
INSERT INTO barang VALUES (4, 'Kopi Sachet', 2500.00, 2);
SAVEPOINT sebelum_revisi;
UPDATE barang SET harga = 2400.00 WHERE id = 4;
ROLLBACK TO SAVEPOINT sebelum_revisi;
COMMIT;

SELECT nama, harga FROM barang WHERE id = 4;