Lompati ke konten utama
Modul 3 · Pelajaran 2 dari 410/57 dalam kursus~10 min
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

SQL
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.

SQL
-- 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:

SQL
-- 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

Latihan#sql.m3.l2.e1
Upaya: 0Memuat…

Mengembalikan nama depan (nama_depan) dan nama belakang (nama_belakang) karyawan yang TIDAK memiliki departemen yang ditugaskan. Satu atau lebih baris, dua kolom.

Memuat editor…
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

Latihan#sql.m3.l2.e2
Upaya: 0Memuat…

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.

Memuat editor…
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