Setelah dua puluh sembilan section Course, sintaks yang benar-benar dipakai harian ternyata kumpulan yang cukup kecil. Chapter ini merangkumnya menjadi referensi cepat: setiap kelompok perintah disajikan dengan bentuk umum sintaksnya dan satu contoh minimal yang bisa langsung disalin, disusun mengikuti urutan penulisan query yang natural. Gunakan halaman ini sebagai pengingat struktur — detail perilaku tiap klausa tetap menjadi wilayah chapter masing-masing di Course ini dan dokumentasi resmi.
Referensi Tabel #
Tabel berikut memetakan kelompok perintah ke chapter Course yang membahasnya secara mendalam:
| Kelompok | Perintah kunci | Chapter mendalam |
|---|---|---|
| DDL | CREATE, ALTER, DROP | Dasar SQL, Table Design |
| DML | INSERT, SELECT, UPDATE, DELETE | Manipulasi Data |
| Filtering | WHERE, LIKE, IN, BETWEEN | Filtering dan Sorting |
| Join | INNER, LEFT, CROSS, self | Joins |
| Agregasi | COUNT, SUM, GROUP BY, HAVING | Agregasi Data |
| Set & CTE | UNION, WITH | Set Operations dan CTE |
| Window | OVER, ROW_NUMBER, LAG | Window Functions |
| Transaksi | START TRANSACTION, COMMIT | Transactions |
Bentuk Umum SELECT #
Satu perintah SELECT menampung hampir separuh kebutuhan harian. Urutan penulisan klausa berikut wajib dihafal karena MySQL menolak urutan lain — meskipun urutan eksekusi logisnya berbeda:
-- @notest (sketsa urutan klausa — tanda [ ] menandai bagian opsional)
SELECT kolom, ekspresi AS alias
FROM tabel
[JOIN tabel2 ON kondisi]
[WHERE kondisi_baris]
[GROUP BY kolom]
[HAVING kondisi_agregat]
[ORDER BY kolom [ASC|DESC]]
[LIMIT n OFFSET m];Urutan eksekusi logisnya justru terbalik dari penulisan: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Pemahaman urutan ini menjelaskan dua aturan praktis: alias dari SELECT tidak bisa dipakai di WHERE (belum dievaluasi), tetapi bisa dipakai di ORDER BY (sudah dievaluasi).
Pola DDL dan DML #
Pola pembuatan objek yang paling sering dipakai beserta variasi amannya:
DROP DATABASE IF EXISTS belajar_ref;
CREATE DATABASE belajar_ref;
USE belajar_ref;
-- Tabel dengan constraint inti
CREATE TABLE produk (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
harga DECIMAL(10,2) NOT NULL,
kategori VARCHAR(30) NOT NULL,
stok INT NOT NULL DEFAULT 0,
UNIQUE KEY uq_produk_nama (nama)
);
-- Pengisian data aman-idempoten (alias baris MySQL 8):
INSERT INTO produk (nama, harga, kategori) VALUES
('Kopi Gayo', 55000.00, 'kopi'),
('Teh Melati', 25000.00, 'teh') AS baru
ON DUPLICATE KEY UPDATE harga = baru.harga;Output yang Dihasilkan:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Database changed
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0Perubahan struktur mengikuti dua varian utama — ALTER TABLE produk ADD COLUMN stok INT NOT NULL DEFAULT 0; untuk menambah kolom dan MODIFY COLUMN untuk mengubah tipe — lengkap di chapter Mengubah Struktur Tabel
. Perubahan data selalu mengikuti pola dua kunci: UPDATE ... WHERE id = n dan DELETE ... WHERE id = n — tanpa WHERE, keduanya mengenai seluruh tabel. Detail lengkap pola upsert ada di chapter Insert On Duplicate Key Update
serta Upsert Patterns
.
Pola Filtering dan Join #
Filtering harian terangkum dalam lima bentuk: perbandingan langsung WHERE harga > 50000, keanggotaan WHERE kategori IN ('kopi', 'teh'), rentang WHERE harga BETWEEN 20000 AND 60000, pencocokan pola WHERE nama LIKE 'Kopi%', dan uji keberadaan WHERE telepon IS NULL. Kombinasi kompleks dibangun dari AND/OR dengan tanda kurung sebagai penegas prioritas.
Join harian pada dasarnya dua bentuk: INNER JOIN untuk data yang harus ada di kedua tabel, dan LEFT JOIN memakai IS NULL untuk mencari baris yang justru tidak punya pasangan:
CREATE TABLE pelanggan (
id INT PRIMARY KEY, nama VARCHAR(50) NOT NULL
);
CREATE TABLE pesanan (
id INT PRIMARY KEY, pelanggan_id INT NOT NULL
);
CREATE TABLE detail_pesanan (
pesanan_id INT, qty INT NOT NULL, harga DECIMAL(10,2) NOT NULL,
PRIMARY KEY (pesanan_id, qty)
);
INSERT INTO pelanggan VALUES (1, 'Budi'), (2, 'Siti'), (3, 'Rina');
INSERT INTO pesanan VALUES (1, 1), (2, 2);
INSERT INTO detail_pesanan VALUES (1, 2, 55000.00), (2, 1, 25000.00);
-- Relasi dengan agregat: total belanja tiap pelanggan
SELECT p.nama, COALESCE(SUM(d.qty * d.harga), 0) AS total
FROM pelanggan p
LEFT JOIN pesanan ps ON ps.pelanggan_id = p.id
LEFT JOIN detail_pesanan d ON d.pesanan_id = ps.id
GROUP BY p.id, p.nama
ORDER BY total DESC;Output yang Dihasilkan:
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
+------+-----------+
| nama | total |
+------+-----------+
| Budi | 110000.00 |
| Siti | 25000.00 |
| Rina | 0.00 |
+------+-----------+
3 rows in set (0.00 sec)Pola di atas menjadi harga mati begitu data tersebar di tiga tabel — COALESCE menjaga pelanggan tanpa transaksi tetap tampil dengan angka nol.
Pola Transaksi #
Dua pola transaksi yang menutup referensi ini — alur perubahan multi-tabel yang atomik:
CREATE TABLE rekening (
id INT PRIMARY KEY, pemilik VARCHAR(50) NOT NULL,
saldo DECIMAL(12,2) NOT NULL
);
INSERT INTO rekening VALUES (1, 'Budi', 500000.00), (2, 'Siti', 300000.00);
START TRANSACTION;
UPDATE rekening SET saldo = saldo - 100000 WHERE id = 1;
UPDATE rekening SET saldo = saldo + 100000 WHERE id = 2;
COMMIT;
SELECT id, pemilik, saldo FROM rekening ORDER BY id;Output yang Dihasilkan:
Query OK, 0 rows affected (0.00 sec)
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
+----+---------+-----------+
| id | pemilik | saldo |
+----+---------+-----------+
| 1 | Budi | 400000.00 |
| 2 | Siti | 400000.00 |
+----+---------+-----------+
2 rows in set (0.00 sec)Aturan praktisnya tiga: transaksi sesingkat mungkin, jangan menyisipkan DDL di tengahnya, dan COMMIT hanya setelah seluruh prasyarat bisnis terverifikasi.
Referensi #
- SQL Statements — MySQL 8.4 Reference Manual
- SELECT Statement — MySQL 8.4 Reference Manual
- Functions and Operators — MySQL 8.4 Reference Manual
Referensi sintaks di tangan, pemeriksaan harian tinggal soal pola: chapter berikutnya merangkum panduan praktik terbaik yang menimbang keputusan desain — dari penamaan sampai backup.