ON vs WHERE dalam JOIN
Kapan suatu predikat diletakkan di ON atau WHERE dan mengapa hal itu penting bagi hasil.
ON vs WHERE dalam JOIN adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Predikat Dapat Berada di Dua Tempat
Setelah Anda dapat menulis INNER JOIN, pertanyaan wawancara berikutnya menjadi lebih tajam: apakah kondisi ini seharusnya berada di ON atau WHERE?
Untuk INNER JOIN, jawabannya sering kali adalah "hasilnya tidak berbeda." Namun, begitu Anda beralih ke JOIN luar, pilihan tersebut sepenuhnya mengubah hasilnya. Pewawancara menanyakan hal ini karena pengembang pemula sering menaruh semuanya di WHERE karena kebiasaan.
Pelajaran ini merumuskan aturannya dengan jelas.
Yang Dilakukan ON
Klausa ON menentukan cara baris dipasangkan. Klausa ini dijalankan saat JOIN dibentuk, dan menentukan baris dari tabel kiri yang cocok dengan baris dari tabel kanan.
Anggap ON sebagai jawaban atas pertanyaan: "untuk kedua baris ini, apakah keduanya memang saling terkait?"
SELECT c.name, o.amount
FROM customers c
JOIN orders o
ON o.customer_id = c.id; -- pairing ruleYang Dilakukan WHERE
Klausa WHERE dijalankan setelah JOIN menghasilkan baris gabungan. Klausa ini menyaring kumpulan hasil tersebut dan membuang baris yang tidak lolos pengujian.
Anggap WHERE sebagai jawaban atas pertanyaan: "setelah baris digabungkan, baris mana yang ingin saya pertahankan?"
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30; -- filter after pairingPada INNER JOIN, Keduanya Sering Kali Setara
Untuk INNER JOIN, penyaring tambahan menghasilkan hasil yang sama, baik ditempatkan di ON maupun di WHERE. Kedua kueri di bawah hanya mengembalikan pesanan Ada senilai $50 dan pesanan Bob senilai $99.
Karena baris yang tidak cocok sudah dibuang oleh INNER JOIN, memindahkan predikat tidak mengubah baris mana yang bertahan.
-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;Mengapa Gaya Penulisan Tetap Menempatkan Kunci JOIN di ON
Bahkan ketika hasilnya sama, konvensinya adalah: letakkan kondisi relasi JOIN di ON dan penyaring bisnis di WHERE.
- ON:
o.customer_id = c.id(cara tabel saling berhubungan) - WHERE:
o.amount > 30(hasil yang ingin Anda dapatkan)
Pemisahan ini memperjelas maksud bagi pembaca berikutnya dan bagi pewawancara yang menilai gaya Anda.
Di Sini Perbedaannya Benar-Benar Penting: JOIN Luar
Perbedaan ini menjadi penentu pada LEFT JOIN, yang mempertahankan setiap baris kiri meskipun tidak ada baris kanan yang cocok. Berikut pratinjau singkat menggunakan pelanggan dan pesanan, dengan Cleo yang tidak memiliki pesanan.
LEFT JOIN mempertahankan Cleo dengan kolom pesanan bernilai NULL. Sekarang perhatikan dampak ON dan WHERE terhadap dirinya.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)Penyaring di ON: Baris Tetap Dipertahankan
Letakkan kondisi amount > 30 di ON pada LEFT JOIN, dan kondisi itu hanya memengaruhi baris kanan yang dipasangkan. Baris kiri yang tidak cocok tetap dipertahankan, hanya saja dengan NULL.
Cleo tetap ada. Pesanan apa pun yang tidak lolos pengujian tidak akan dipasangkan, sehingga nilainya menjadi NULL.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL (3 rows, Cleo kept)Penyaring di WHERE: JOIN Luar Menyusut
Pindahkan kondisi yang sama ke WHERE, dan Anda menyaring hasil JOIN. Baris Cleo memiliki amount = NULL, sedangkan NULL > 30 tidak bernilai benar, sehingga barisnya dihapus.
LEFT JOIN secara diam-diam berperilaku seperti INNER JOIN. Ini adalah jebakan JOIN yang paling terkenal dalam wawancara.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99 (Cleo GONE -> back to inner-join behavior)Aturan yang Perlu Diingat
Sampaikan hal ini dengan jelas saat wawancara:
- Kondisi di ON menentukan apakah baris kanan dipasangkan; baris kiri tetap dipertahankan.
- Kondisi di WHERE menyaring baris akhir dan dapat menghapus baris kiri yang semula dipertahankan ketika kondisi tersebut menyentuh kolom yang mungkin bernilai NULL.
Jadi, untuk JOIN luar: predikat pada tabel opsional ditempatkan di ON, kecuali Anda memang ingin menghapus baris yang tidak cocok.
Penggunaan WHERE pada NULL yang Tepat
Ada satu kasus ketika menyaring kolom hasil JOIN luar di WHERE memang tepat: anti-JOIN. Menguji IS NULL menemukan baris kiri yang tidak memiliki pasangan.
Di sini, WHERE sengaja hanya mempertahankan baris yang tidak cocok, sehingga mengembalikan pelanggan tanpa pesanan. Mekanismenya sama, tetapi tujuannya berlawanan.
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL; -- customers with no orders -> CleoPemeriksaan Mental Singkat
Sebelum kuis, gunakan daftar periksa ini saat melihat kondisi JOIN:
- Apakah ini kunci JOIN yang menghubungkan tabel? -> ON.
- Apakah ini penyaring pada tabel wajib? -> WHERE atau ON sama-sama dapat digunakan.
- Apakah ini penyaring pada tabel opsional (luar), dan Anda ingin mempertahankan baris yang tidak cocok? -> ON.
- Apakah Anda ingin menemukan baris yang tidak cocok? -> WHERE ... IS NULL.
Pemeriksaan Singkat
Terapkan aturan ON dibandingkan WHERE pada JOIN luar.
Ringkasan: ON dibandingkan WHERE
Poin penting yang perlu Anda bawa ke wawancara:
- ON mengendalikan pemasangan dan, untuk JOIN luar, menentukan apakah baris opsional dipasangkan sambil mempertahankan sisi yang dipertahankan.
- WHERE menyaring hasil yang sudah digabungkan dan dapat menghapus baris yang semula dipertahankan.
- Pada INNER JOIN, keduanya sering kali dapat saling menggantikan; pada JOIN luar, keduanya tidak setara.
- Penyaring pada tabel luar ditempatkan di ON, kecuali Anda memang menginginkan anti-JOIN dengan
IS NULLdi WHERE.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “ON vs WHERE dalam JOIN” gratis?
Ya — teks lengkap “ON vs WHERE dalam JOIN” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “ON vs WHERE dalam JOIN”?
Kapan suatu predikat diletakkan di ON atau WHERE dan mengapa hal itu penting bagi hasil. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “ON vs WHERE dalam JOIN” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Cara INNER JOIN Mencocokkan Baris
- ON vs WHERE dalam JOIN
- Fan-Out JOIN dan Penggandaan Baris
- Menggabungkan Tiga Tabel atau Lebih