Pelajaran modul (2/4)
Menyimpan semuanya di sebelah kiri: LEFT JOIN
INNER JOIN dari pelajaran sebelumnya memiliki efek samping yang penting: itu
menghapus baris yang tidak cocok. Jika seorang karyawan tidak memiliki departemen
(department_id adalah NULL), keduanya hilang dari hasil.
Terkadang itulah yang Anda inginkan. Namun seringkali hal ini tidak terjadi: dalam laporan HR
penting untuk melihat semua karyawan, termasuk mereka yang tidak memiliki departemen,
dan tahu siapa mereka. Itulah gunanya LEFT JOIN (selengkapnya, LEFT OUTER JOIN).
Bagaimana cara kerjanya
SELECT columns
FROM table_a
LEFT JOIN table_b ON table_a.x = table_b.y;Baca dalam bahasa Inggris: "simpan semua baris table_a; untuk masing-masing baris cobalah
lampirkan baris dari table_b; jika tidak ada yang cocok, isi kolom dari
table_b dengan NULL".
Kata kuncinya LEFT : artinya "meja kiri", yaitu yang tertulis
setelah FROM. Semua barisnya selalu bertahan.
-- All employees, including those without a department:
SELECT e.first_name,
e.last_name,
d.name AS dipartimento
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;Dalam kumpulan data kami, kueri ini mengembalikan 10 baris (masing-masing satu karyawan). Andrea
Costa, yang memiliki department_id = NULL, tampil dengan dipartimento = NULL
bukannya menghilang.
Menemukan baris "tidak cocok".
Konsekuensi yang sangat berguna: dengan memfilter dengan IS NULL pada kolom
tabel sebelah kanan Anda menemukan baris yang persis sama tanpa kecocokan:
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE d.id IS NULL;Trik ini selalu digunakan di dunia nyata: "temukan saya pesanan dengan no pelanggan", "produk tanpa ulasan", "pengguna yang belum pernah login dalam".
Cobalah
Mengembalikan nama depan (nama_depan) dan nama belakang (nama_belakang) karyawan yang TIDAK memiliki departemen yang ditugaskan. Satu atau lebih baris, dua kolom.
Tunjukkan petunjuk
Lengkapi WHERE dengan d.id IS NULL — Anda ingin baris yang LEFT JOIN tidak menemukan departemen yang cocok.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Cantumkan semua departemen (nama departemen) dan di sebelahnya jumlah karyawan, termasuk departemen yang tidak memiliki karyawan (tunjukkan 0 untuk departemen tersebut). Petunjuk: mulai dari departemen dan lakukan LEFT JOIN dengan karyawan, lalu GROUP BY + COUNT.
Tunjukkan petunjuk
Gunakan COUNT(e.id) (bukan COUNT(*)) untuk menghitung 0 jika tidak ada kecocokan: COUNT(*) akan menghitung 1 karena baris LEFT JOIN dengan NULL.
Solusi tersedia setelah 3 upaya