53 perintah SQL, lengkap dengan query dan hasilnya.
Dari SELECT sampai JOIN, CTE, dan window function. Tiap perintah dijelaskan dalam bahasa Indonesia, dan semua contoh query sudah dijalankan di tabel contoh yang sama, jadi kamu bisa lihat hasilnya baris per baris.
Data contohSemua contoh memakai 3 tabel ini: departemen, karyawan, penjualan
Tabel departemen
id
nama_dept
lokasi
1
Keuangan
Jakarta
2
Marketing
Jakarta
3
IT
Bandung
4
Legal
Surabaya
Tabel karyawan
id
nama
dept_id
kota
gaji
tgl_masuk
atasan_id
1
Andi Pratama
3
Bandung
12500000
2019-03-11
NULL
2
Bunga Lestari
1
Jakarta
9800000
2020-07-01
NULL
3
Candra Wijaya
3
Bandung
8200000
2021-02-15
1
4
Dewi Anggraini
2
Jakarta
7500000
2022-05-09
6
5
Eko Saputra
1
Jakarta
6900000
2023-01-16
2
6
Fajar Nugroho
2
Surabaya
11000000
2018-09-03
NULL
7
Gita Permata
3
Jakarta
8200000
2023-08-21
1
8
Hendra Gunawan
NULL
Medan
5500000
2024-04-02
NULL
Tabel penjualan
id
tanggal
karyawan_id
produk
kategori
qty
harga
1
2026-01-05
4
Laptop
Elektronik
2
8500000
2
2026-01-12
6
Printer
Elektronik
1
2300000
3
2026-01-20
4
Kursi Kantor
Furnitur
5
1200000
4
2026-02-03
6
Laptop
Elektronik
1
8500000
5
2026-02-14
4
Meja Kerja
Furnitur
3
1750000
6
2026-02-25
5
Kertas A4
ATK
20
55000
7
2026-03-02
6
Kursi Kantor
Furnitur
4
1200000
8
2026-03-10
4
Printer
Elektronik
2
2300000
9
2026-03-18
5
Kertas A4
ATK
30
55000
10
2026-03-27
6
Monitor
Elektronik
3
1900000
Perintah tidak ditemukan. Coba kata lain, misalnya "gabung", "urut", atau "kosong".
Bab 01
Dasar Query
Mengambil kolom, memberi nama baru, mengurutkan, dan membatasi jumlah baris.
Query ditulis mulai dari SELECT, tapi database mengerjakannya mulai dari FROM. Ini sebabnya alias di SELECT tidak bisa dipakai di WHERE.
FROM / JOINTentukan tabel sumber dan gabungkan.
WHERESaring baris.
GROUP BYKelompokkan baris.
HAVINGSaring kelompok.
SELECTPilih kolom, hitung ekspresi, beri alias.
DISTINCTBuang baris kembar.
ORDER BYUrutkan hasil.
LIMITBatasi jumlah baris.
Resep
Pola query yang sering dipakai
Gabungan beberapa perintah untuk pertanyaan yang sering muncul di kantor.
Top 1 per kelompok
query.sql
WITH urut AS (
SELECT kategori, produk, qty * harga AS omzet,
ROW_NUMBER() OVER (PARTITIONBY kategori ORDERBY qty * harga DESC) AS rn
FROM penjualan
)
SELECT kategori, produk, omzet FROM urut WHERE rn = 1;
Transaksi terbesar di setiap kategori. Ganti rn = 1 dengan rn <= 3 untuk Top 3.
Cari data duplikat
query.sql
SELECT produk, COUNT(*) AS jumlah
FROM penjualan
GROUPBY produk
HAVINGCOUNT(*) > 1;
Nilai yang muncul lebih dari sekali. Tambahkan kolom lain di GROUP BY untuk mengecek kombinasi yang kembar.
Persentase terhadap total
query.sql
SELECT kategori,
SUM(qty * harga) AS omzet,
ROUND(100.0 * SUM(qty * harga) / SUM(SUM(qty * harga)) OVER (), 1) AS persen
FROM penjualan
GROUPBY kategori;
Porsi omzet tiap kategori. SUM(...) OVER () menghitung total keseluruhan tanpa subquery.
Data yang tidak punya pasangan
query.sql
SELECT d.nama_dept
FROM departemen AS d
LEFTJOIN karyawan AS k ON k.dept_id = d.id
WHERE k.id ISNULL;
Departemen yang belum punya karyawan. Pola LEFT JOIN + IS NULL ini disebut anti join.
Hitung bersyarat dalam satu baris
query.sql
SELECTCOUNT(*) AS total,
SUM(CASEWHEN kota = 'Jakarta'THEN1ELSE0END) AS di_jakarta,
SUM(CASEWHEN gaji >= 10000000THEN1ELSE0END) AS gaji_10jt
FROM karyawan;
Beberapa hitungan dengan syarat berbeda sekaligus, mirip COUNTIFS di Excel.
Pertumbuhan bulan ke bulan (%)
query.sql
WITH b AS (
SELECTSUBSTRING(tanggal, 1, 7) AS bulan, SUM(qty * harga) AS omzet
FROM penjualan GROUPBY1
)
SELECT bulan, omzet,
ROUND(100.0 * (omzet - LAG(omzet) OVER (ORDERBY bulan))
/ NULLIF(LAG(omzet) OVER (ORDERBY bulan), 0), 1) AS growth_persen
FROM b;
Kenaikan atau penurunan omzet dibanding bulan sebelumnya, aman dari pembagian nol.
Dialek
Beda MySQL, PostgreSQL, SQL Server & BigQuery
Inti SQL sama di semua database. Yang berbeda biasanya fungsi teks, tanggal, dan cara membatasi baris.
Kebutuhan
MySQL
PostgreSQL
SQL Server
BigQuery
Ambil 10 baris
LIMIT 10
LIMIT 10
SELECT TOP 10
LIMIT 10
Sambung teks
CONCAT(a, b)
a || b
a + b / CONCAT
CONCAT(a, b)
Ganti NULL
IFNULL(a, 0)
COALESCE(a, 0)
ISNULL(a, 0)
IFNULL(a, 0)
Tanggal hari ini
CURDATE()
CURRENT_DATE
CAST(GETDATE() AS DATE)
CURRENT_DATE()
Ambil bulan
MONTH(tgl)
EXTRACT(MONTH FROM tgl)
MONTH(tgl)
EXTRACT(MONTH FROM tgl)
Panjang teks
CHAR_LENGTH(a)
LENGTH(a)
LEN(a)
LENGTH(a)
Selisih hari
DATEDIFF(b, a)
b - a
DATEDIFF(day, a, b)
DATE_DIFF(b, a, DAY)
Belajar SQL bareng mentor
Hafal sintaks itu mudah. Menjawab pertanyaan bisnis, itu skill.
Private Class Python & SQL untuk Data: dari query dasar sampai JOIN dan studi kasus kerja, dengan kurikulum dan jadwal yang menyesuaikan kamu.