Mengambil Data · Pelajaran 6 dari 9
Menggabungkan tabel dengan JOIN
11 menit baca · BelajarCode
Data yang dirancang dengan baik tersebar di beberapa tabel. JOIN menggabungkannya kembali saat dibutuhkan.
1CREATE TABLE mahasiswa (nim TEXT PRIMARY KEY, nama TEXT);2CREATE TABLE mata_kuliah (kode TEXT PRIMARY KEY, nama TEXT, sks INTEGER);3CREATE TABLE krs (nim TEXT, kode TEXT, nilai TEXT);45INSERT INTO mahasiswa VALUES ('001', 'Rizky'), ('002', 'Sinta'), ('003', 'Bagas'), ('004', 'Dewi');6INSERT INTO mata_kuliah VALUES ('IF101', 'Algoritma', 4), ('IF102', 'Basis Data', 3), ('IF103', 'Jaringan', 3);7INSERT INTO krs VALUES8 ('001', 'IF101', 'A'), ('001', 'IF102', 'B'),9 ('002', 'IF101', 'A'), ('002', 'IF103', 'A'),10 ('003', 'IF102', 'C');1112SELECT m.nama, k.kode, k.nilai13FROM krs k14JOIN mahasiswa m ON m.nim = k.nim15ORDER BY m.nama, k.kode;nama | kode | nilai Bagas | IF102 | C Rizky | IF101 | A Rizky | IF102 | B Sinta | IF101 | A Sinta | IF103 | A
JOIN ... ON(lengkapnyaINNER JOIN) memasangkan baris dari dua tabel yang memenuhi syaratON.krs kdanmahasiswa mmemberi alias pendek pada tabel, supaya penulisan kolom ringkas.
Menggabungkan tiga tabel
1SELECT m.nama AS mahasiswa, mk.nama AS mata_kuliah, mk.sks, k.nilai2FROM krs k3JOIN mahasiswa m ON m.nim = k.nim4JOIN mata_kuliah mk ON mk.kode = k.kode5WHERE m.nama = 'Rizky';mahasiswa | mata_kuliah | sks | nilai Rizky | Algoritma | 4 | A Rizky | Basis Data | 3 | B
LEFT JOIN
INNER JOIN hanya menampilkan baris yang punya pasangan. Dewi tidak muncul di hasil sebelumnya karena belum mengambil mata kuliah apa pun. LEFT JOIN mempertahankan semua baris dari tabel kiri, dan mengisi kolom tabel kanan dengan NULL jika tidak ada pasangannya.
1SELECT m.nama, COUNT(k.kode) AS jumlah_mk2FROM mahasiswa m3LEFT JOIN krs k ON k.nim = m.nim4GROUP BY m.nim, m.nama5ORDER BY jumlah_mk DESC, m.nama;nama | jumlah_mk Rizky | 2 Sinta | 2 Bagas | 1 Dewi | 0
COUNT(k.kode) hanya menghitung nilai yang tidak NULL, sehingga Dewi mendapat 0.
Mencari yang tidak punya pasangan
1SELECT m.nama2FROM mahasiswa m3LEFT JOIN krs k ON k.nim = m.nim4WHERE k.nim IS NULL;nama Dewi
Pola LEFT JOIN lalu IS NULL sangat sering dipakai, misalnya mencari pelanggan yang belum pernah bertransaksi.
Cek pemahaman
Kamu ingin daftar semua mata kuliah beserta banyak mahasiswa yang mengambilnya, termasuk mata kuliah yang belum diambil siapa pun. JOIN apa yang dipakai?
Latihan
Total SKS per mahasiswa
Tampilkan setiap mahasiswa beserta total SKS yang diambilnya, termasuk yang belum mengambil mata kuliah (tampilkan 0). Petunjuk: COALESCE(x, 0) mengganti NULL dengan 0.
Pembahasan
1SELECT m.nama, COALESCE(SUM(mk.sks), 0) AS total_sks2FROM mahasiswa m3LEFT JOIN krs k ON k.nim = m.nim4LEFT JOIN mata_kuliah mk ON mk.kode = k.kode5GROUP BY m.nim, m.nama6ORDER BY total_sks DESC, m.nama;nama | total_sks Rizky | 7 Sinta | 7 Bagas | 3 Dewi | 0
Kedua JOIN memakai LEFT JOIN. Jika JOIN kedua memakai INNER JOIN, Dewi akan hilang dari hasil.