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.
| Perintah | Bentuk ringkas | Bahasan dalam |
|---|---|---|
CREATE TABLE | CREATE TABLE nama (kolom tipe [constraint], ...); | Membuat Tabel |
ALTER TABLE | ALTER TABLE nama ADD COLUMN kolom tipe; | Mengubah Struktur Tabel |
DROP TABLE | DROP TABLE nama; | Menghapus Database dan Tabel |
CREATE INDEX | CREATE INDEX nama ON tabel (kolom); | Membuat dan Menghapus Index |
CREATE SCHEMA | CREATE SCHEMA nama; | Membuat Schema |
CREATE VIEW | CREATE VIEW nama AS SELECT ...; | Membuat View |
CREATE DATABASE | CREATE 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.
| Perintah | Bentuk ringkas | Bahasan dalam |
|---|---|---|
INSERT | INSERT INTO nama (kolom) VALUES (nilai); | INSERT |
INSERT banyak baris | INSERT INTO nama VALUES (...), (...), ...; | Insert Multiple Rows |
SELECT | SELECT kolom FROM nama WHERE ... ORDER BY ...; | SELECT |
UPDATE | UPDATE nama SET kolom = nilai WHERE ...; | UPDATE |
DELETE | DELETE FROM nama WHERE ...; | DELETE |
RETURNING | INSERT/UPDATE/DELETE ... RETURNING *; | RETURNING Clause |
| Upsert | INSERT ... ON CONFLICT (kolom) DO UPDATE SET ...; | ON CONFLICT |
MERGE | MERGE INTO target USING sumber ON kondisi WHEN MATCHED THEN ...; | MERGE |
TRUNCATE | TRUNCATE 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.
| Pola | Bentuk ringkas | Bahasan dalam |
|---|---|---|
INNER JOIN | FROM a JOIN b ON a.x = b.x; | INNER JOIN |
| Outer join | FROM a LEFT/RIGHT/FULL JOIN b ON ...; | LEFT , RIGHT , FULL OUTER |
CROSS JOIN | FROM a CROSS JOIN b; | CROSS JOIN |
| Self join | FROM t a JOIN t b ON a.atasan_id = b.id; | SELF JOIN |
LATERAL | FROM a, LATERAL (SELECT ... WHERE ... = a.x) sub; | LATERAL Join |
GROUP BY + HAVING | ... GROUP BY kolom HAVING count(*) > 1; | GROUP BY , HAVING |
FILTER | count(*) FILTER (WHERE kondisi); | FILTER Clause |
| Grouping sets | GROUP BY GROUPING SETS ((a), (b), ()); | Grouping Sets , ROLLUP dan CUBE |
| CTE | WITH nama AS (SELECT ...) SELECT ... FROM nama; | Common Table Expressions |
| Recursive CTE | WITH RECURSIVE t AS (SELECT ... UNION ALL SELECT ... FROM t) ...; | Recursive CTE |
| Scalar subquery | SELECT (SELECT max(x) FROM t) AS maks; | Scalar Subquery |
EXISTS | WHERE EXISTS (SELECT 1 FROM t WHERE t.id = luar.id); | EXISTS dan NOT EXISTS |
| Window function | fn() 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.
| Perintah | Bentuk ringkas | Bahasan dalam |
|---|---|---|
BEGIN | BEGIN; atau START TRANSACTION; | BEGIN, COMMIT, dan ROLLBACK |
COMMIT / ROLLBACK | COMMIT; / ROLLBACK; | BEGIN, COMMIT, dan ROLLBACK |
SAVEPOINT | SAVEPOINT nama; ROLLBACK TO SAVEPOINT nama; | SAVEPOINT |
| Isolation level | SET 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
.
| Perintah | Peran |
|---|---|
\d nama | Deskripsi struktur tabel, view, atau index |
\dt | Daftar tabel di schema aktif |
\dn / \du / \l | Daftar schema, daftar role, daftar database |
\c nama | Berpindah database |
\x | Tampilan expanded untuk baris berkolom banyak |
\timing | Tampilkan durasi setiap query |
\i file.sql | Jalankan file SQL dari dalam sesi |
\copy | Impor/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.
| Kategori | Fungsi andalan | Bahasan dalam |
|---|---|---|
| String | length, upper/lower, initcap, substring, trim, split_part, concat, replace | Fungsi String |
| Numerik | round, trunc, ceil, floor, abs | Fungsi Numerik |
| Tanggal & waktu | now, current_date, date_trunc, extract, age, to_char | Fungsi Date dan Time |
| NULL | coalesce, nullif | Fungsi NULL |
| Kondisional | CASE WHEN, greatest, least | Fungsi Kondisional |
| Konversi | CAST(x AS tipe), x::tipe | Type Casting |
| Agregat | count, sum, avg, min, max, string_agg, percentile_cont | Fungsi 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:
-- 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:
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-- 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;