JOIN menggabungkan baris dari dua tabel jadi satu hasil, dengan memasangkan baris yang nilainya cocok. INNER JOIN cuma menyimpan pasangan yang ketemu. Bayangkan kamu menempelkan setiap nota pesanan ke kartu member yang nomornya sama: nota tanpa nomor member gak bisa ditempel ke mana-mana, dan member yang belum pernah belanja gak punya nota. Dua-duanya gak masuk ke tumpukan hasil.
🧪 Tebakan cepat:
customerspunya 3 baris,orderspunya 4 baris. INNER JOIN keduanya menghasilkan berapa baris: 3, 4, atau 12? Tebak dulu, jawabannya ada di bagian "Langkah demi langkah".
Data yang dipakai
Tabel yang sama dengan pelajaran Relasi Antar Tabel. orders.customer_id menunjuk customers.id.
customers
| id | name |
|---|---|
| 1 | Budi |
| 2 | Siti |
| 3 | Andi |
orders
| id | customer_id | product |
|---|---|---|
| 1 | 1 | Laptop |
| 2 | 1 | Mouse |
| 3 | 2 | Monitor |
| 4 | NULL | Flashdisk |
Menulis INNER JOIN
SELECT customers.name AS nama_pelanggan, orders.product AS produk
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;
FROM customers: tabel pertama, disebut tabel kiri.INNER JOIN orders: tabel kedua, tabel kanan, yang digabungkan.ON customers.id = orders.customer_id: syarat pasangannya. Sebuah pelanggan dan sebuah pesanan dipasangkan kalauidpelanggan sama dengancustomer_idpesanan. Ini kolom primary key dan foreign key dari pelajaran sebelumnya.customers.name: nama tabel, titik, nama kolom. Begitu ada dua tabel, tulis tabelnya supaya jelas kolom itu milik siapa.AS nama_pelanggan: alias, nama kolom di hasil. TanpaAS, kolomnya bernamaname.JOINsaja (tanpaINNER) artinya sama persis: INNER JOIN.
Langkah demi langkah
Bayangkan database mencoba setiap pasangan pelanggan dan pesanan (3 × 4 = 12 pasangan), lalu menyimpan yang syarat ON-nya benar. Database aslinya mencari dengan cara yang lebih cepat, tapi hasilnya sama.
| Pelanggan | Pesanan (customer_id) | customers.id = orders.customer_id |
Ikut? |
|---|---|---|---|
| 1 Budi | Laptop (1) | 1 = 1, benar | ya |
| 1 Budi | Mouse (1) | 1 = 1, benar | ya |
| 2 Siti | Monitor (2) | 2 = 2, benar | ya |
| 3 Andi | gak ada pesanan dengan customer_id 3 | tidak | |
| siapa pun | Flashdisk (NULL) | 1 = NULL bukan benar | tidak |
Hasilnya:
| nama_pelanggan | produk |
|---|---|
| Budi | Laptop |
| Budi | Mouse |
| Siti | Monitor |
3 baris. Itu jawaban tebakannya. Budi muncul dua kali karena dia punya dua pesanan. Andi hilang karena gak punya pesanan, dan Flashdisk hilang karena customer_id-nya NULL: perbandingan apa pun dengan NULL gak pernah bernilai benar.
Alias tabel
Menulis customers. dan orders. berulang-ulang itu panjang. Kasih tabelnya nama pendek:
SELECT c.name AS nama_pelanggan, o.product AS produk
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
customers c: mulai sekarang tabel ini dipanggilc, danordersdipanggilo.- Setelah diberi alias, pakai aliasnya.
customers.namedi query ini dijawab SQLite denganno such column: customers.name.
Kalau ON-nya salah
Di Lab kamu bisa mencoba semuanya di SQLite sungguhan:
- Kolom yang salah:
ON c.id = o.idmemasangkan nomor pelanggan dengan nomor pesanan. Hasilnya tetap 3 baris tanpa error, tapi Siti dapat Mouse dan Andi dapat Monitor. Query yang jalan belum tentu benar. - Tanpa ON:
FROM customers c INNER JOIN orders oditerima SQLite (dan MySQL) sebagai "pasangkan semuanya": 3 × 4 = 12 baris. PostgreSQL menolaknya sebagai syntax error. - Salah ketik:
ON c.id = o.customerdijawabno such column: o.customer.
📌 JOIN tiga tabel
JOIN bisa disambung. Kalau ada tabel reviews dengan kolom order_id, ulasan setiap pesanan bisa ikut diambil:
SELECT c.name, o.product, r.rating
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id
INNER JOIN reviews r ON o.id = r.order_id;
Setiap INNER JOIN punya ON-nya sendiri, dan setiap langkah bisa membuang baris yang gak punya pasangan.
⚠️ Jebakan yang sering ketemu
- Lupa
ONatau salah kolom. Hasilnya membengkak (12 baris) atau pasangannya salah, sering tanpa error. Pasangkan primary key dengan foreign key-nya:c.id = o.customer_id. - Kolom yang ada di dua tabel tanpa nama tabel.
SELECT id, name, product ...dijawabambiguous column name: id, karenacustomersdanorderssama-sama punyaid. Tulisc.idatauo.id. - Lupa
AS. Latihan mencari kolom bernamanama_pelanggandanproduk. Tanpa alias, kolomnya bernamanamedanproduct. - Mengira yang gak punya pasangan ikut. Andi dan Flashdisk gak pernah muncul di INNER JOIN. Untuk menyimpan mereka, pakai LEFT atau RIGHT JOIN (pelajaran berikutnya).
TL;DR: SELECT ... FROM customers INNER JOIN orders ON customers.id = orders.customer_id memasangkan setiap pelanggan dengan pesanannya dan cuma menyimpan pasangan yang ON-nya benar. 3 pelanggan dan 4 pesanan jadi 3 baris: Budi dua kali, Siti sekali, Andi (tanpa pesanan) dan Flashdisk (customer_id NULL) hilang. Pakai AS untuk nama kolom hasil, alias tabel (customers c) untuk menyingkat, dan nama tabel di depan kolom yang ada di dua tabel. ON yang salah kolom memberi hasil salah tanpa error, dan ON yang hilang memasangkan semuanya (12 baris).