Jobsheet SELECT Multi-Tabel
Jobsheet SELECT Multi-Tabel
Topik
Tujuan
Pendahuluan
Relationship adalah suatu hubungan antara beberapa entitas. Konsep ini sangat penting sekali di dalam basis
data, di mana memungkinkan entitas-entitas untuk saling berhubungan satu sama lain. Di dalam sebuah
relationship, primary key memiliki peran penting untuk mengaitkan entitas. Selain itu, primary key juga
digunakan untuk mendefinisikan batasan keterhubungan.
JOIN merupakan salah satu konstruksi dasar dari SQL dan basis data. Join dapat didefinisikansebagai
kombinasi record dari dua atau lebih tabel di dalam basis data relasional dan menghasilkan sebuah tabel
(temporary) baru yang disebut sebagai joined table. Join dapat diklasifikasikan ke dalam dua jenis: INNER
dan OUTER.
1. INNER JOIN
Inner join pada dasarnya adalah menemukan persimpangan (intersection) antara dua buah tabel.
Sintaks inner join diperlihatkan sebagai berikut:
Cara 1
SELECT A1, A2, ..., An
FROM r1
INNER JOIN r2
ON r1.join_key = r2.join_key
Cara 2
SELECT A1, A2, ..., An
1
FROM r1, r2
WHERE r1.key = r2.key
Misalkan terdapat tabel A dan B, maka hasil inner join dapat diperlihatkan—sebagai bidang terarsir—
dalam diagram Venn seperti Gambar 1.
2. OUTER JOIN
LEFT OUTER JOIN
Left outer join (atau left join) mengembalikan semua nilai dari tabel kiri ditambah dengan nilai dari
tabel kanan yang sesuai (atau NULL jika tidak ada nilai yang sesuai).
Syntax
SELECT A1, A2, ..., An
FROM r1
LEFT OUTER JOIN r2
ON r1.join_key = r2.join_key
Left outer join antara tabel A dan B dapat diilustrasikan dalam diagram Venn seperti Gambar 2.
Syntax
SELECT A1, A2, ..., An
FROM r1
RIGHT OUTER JOIN r2
ON r1.join_key = r2.join_key
2
Right outer join antara tabel A dan B dapat diilustrasikan dalam diagram Venn seperti Gambar 3.
Syntax
SELECT A1, A2, ..., An
FROM r1
FULL OUTER JOIN r2
ON r1.join_key = r2.join_key
Bentuk visual dari full outer join dapat diperlihatkan menggunakan diagram Venn seperti Gambar 4.
Selain empat jenis join yang utama di atas, masih ada beberapa variasi join lainnya, seperti CROSS JOIN
(cartesian product), NATURAL JOIN, dan sebagainya. Perlu juga diperhatikan, join bisa diimplementasikan
dalam bentuk bersarang (nested join). Jadi, di dalam sebuah operasi join bisa terdapat operasi join lainnya.
3
Praktikum – Bagian 1: Menyiapkan Database untuk Percobaan
Langkah Keterangan
Bersama jobsheet ini disertakan sebuah file bernama percobaan_join.sql, eksekusilah file
tersebut pada server MySQL Anda dengan cara apapun yang Anda bisa.
1
Pada contoh di bawah ini, SQL dieksekusi dengan menggunakan perintah SOURCE melalui
MySQL Shell. Anda juga dapat mengimpor SQL tersebut melalui PHPMyAdmin atau MySQL
Workbench, atau tools yang lain yang Anda sukai.
4
Jika Anda telah berhasil mengimpor/mengeksekusi/menjalankan file percobaan_join.sql
2
tersebut, maka di server MySQL Anda akan dibuatkan database dengan struktur seperti berikut.
Pastikan pada database Anda terdapat tabel-tabel seperti di bawah ini dengan menjalankan
3
SQL dibawah. Jika tabel-tabelnya sudah sesuai, lanjutkan ke Praktikum – Bagian 2.
5
Praktikum – Bagian 2: INNER JOIN
Langkah Keterangan
Apabila kita ingin menampilkan data yang kolom-kolomnya terdapat pada tabel yang berbeda,
maka kita dapat menggunakan sintaksis INNER JOIN. Sintaksis ini akan menampilkan nilai kolom
pada 2 atau lebih tabel yang saling bersesuaian dalam 1 baris.
Solusi: Jalankan query berikut ini, dan akan ditampilkan 52 baris nama kelas berikut nama
prodinya yang bersesuaian (kolom kode_prodi di tabel kelas sama nilainya dengan kolom
kode_prodi di tabel prodi).
Pada contoh sebelumnya, jika diperhatikan baik-baik, setiap nama kolom yang ingin
ditampilkan harus disebutkan nama tabel asalnya dengan notasi dot/titik
(nama_tabel.nama_kolom). Hal ini masuk akal karena hal tersebut memiliki tujuan untuk
menghilangkan ambiguitas karena bisa saja 2 tabel yang berbeda memiliki kolom dengan nama
yang sama.
2
Namun demikian akan sedikit merepotkan apabila kita secara berulang-ulang menuliskan nama
tabel di sebelah nama kolom, lagi dan lagi. Apalagi jika nama tabelnya Panjang.
Solusinya adalah dengan menggunakan alias yaitu sintaksis AS. Dengan menggunakan sintaksis
ini, query kita akan menjadi lebih singkat namun dengan hasil yang sama. Jalankan SQL berikut
untuk mengetahui hasilnya!
6
Pada contoh sebelumnya kita telah menampilkan 2 kolom yang terletak pada 2 tabel yang
berbeda namun penggunaan INNER JOIN tidaklah terbatas pada 2 tabel saja. Kita juga dapat
menampilkan data yang lebih banyak dari beberapa tabel sekaligus.
Contoh: “Tampilkan nama dosen berikut kelas yang diajar dan harinya!”
Solusi: Jalankan SQL berikut. Jika benar akan ditampilkan 320 baris. Pada query tersebut
dilibatkan 4 tabel yaitu tabel jadwal, dosen, kelas, dan hari.
7
SELECT JOIN juga bisa difilter. Tentu saja dengan menggunakan klausa WHERE.
Contoh: “Tampilkan nama kelas berikut nama prodinya, hanya untuk kelas yang A saja!”
Solusi: Jalankan SQL berikut ini. Jika benar akan ditampilkan 7 baris yaitu semua kelas dari kelas
1-4 di masing-masing prodi yang namanya diakhiri huruf “A”
8
Praktikum - Bagian 3: OUTER JOIN
Langkah Keterangan
Jika INNER JOIN hanya menampilan baris-baris pada 2 atau lebih tabel yang saling
bersesuaian. Maka untuk menampilkan data pada tabel yang saling bersesuaian ditambah
yang tidak bersesuaian, kita dapat menggunakan sintaksis OUTER JOIN.
OUTER JOIN pada umumnya beguna untuk mengecek data yang tidak ada pasangannya di
tabel yang di-JOIN-kan.
Contoh: “Tampilkan data semua kelas berikut nama prodinya, beserta kelas yang tidak ada
prodinya!”
Solusi: Jalankan query berikut. Jika benar akan ditampilkan 57 baris data dimana 52 baris
adalah nama kelas yang ada prodinya, dan 5 baris sisanya adalah nama kelas yang tidak
terdaftar di prodi manapun.
9
Apabila hanya ingin menampilkan data yang tidak ada pasangannya saja, maka kita bisa
menggunakan filter melalui penambahan klausa WHERE.
Query berikut akan menampilkan data seperti sebelumnya, namun hanya yang tidak ada
pasangannya saja.
Selain LEFT OUTER JOIN juga ada RIGHT OUTER JOIN. Keduanya sama-sama menampilkan data
yang bersesuaian ditambah yang tidak bersesuaian. Bedanya dalah letak data yang TIDAK
NULL-nya di sebelah mana. Tabel kiri atau tabel kanan.
LEFT OUTER JOIN à NULL-nya di tabel kanan, data yang lengkap di tabel KIRI (LEFT)
3 RIGHT OUTER JOIN à NULL-nya di tabel kiri, data yang lengkap di tabel KANAN (RIGHT)
Contoh: “Terdapat prodi baru yang belum ada kelasnya, tampilkan nama kelas berikut nama
prodinya serta nama prodi-prodi baru yang belum ada kelasnya tersebut!”
Solusi: Jalankan query berikut. Apabila benar akan ditampilkan 55 baris dimana 52 baris adalah
data yang bersesuaian (prodi dan nama kelasnya masing-masing), sedangkan 3 baris sisanya
adalah prodi baru yang belum ada kelasnya. Perhatikan data yang lengkap ada di kolom
nama_prodi yang merupakan kolom dari tabel prodi yang ditulis di sebelah KANAN (RIGHT)
dari kata JOIN pada sintaksis SQL-nya.
10
Jika kit ingin menampilkan semua data yang bersesuaian, ditambah dengan data yang tidak
bersesuaian di tabel KANAN dan KIRI sekaligus, maka kita dapat menggunakan sintaksis FULL
JOIN.
Pada beberapa DBMS tertentu, sintaksis eksplisit FULL JOIN telah didukung, namun pada
MySQL, sintaksis ini belum didukung.
Untuk mengakalinya kita dapat menggunakan sintaksis UNION ALL yang akan menggabungkan
2 buah himpunan hasil SELECT yang berbeda.
Jalankan query berikut ini untuk menampilkan hasil FULL join terhadap tabel kelas dan tabel
prodi. Apabila benar, maka akan ditampilkan sebanyak 112 baris data dengan rincian:
- 104 data yang lengkap ada prodi dan kelasnya.
- 5 baris data kelas yang tidak ada prodinya
- 3 baris nama prodi yang tidak ada kelasnya
11
…
12
Praktikum - Bagian 4: INNER JOIN Implisit dan CROSS JOIN
Langkah Keterangan
Sintaksis JOIN yang kita pelajari sebelumnya merupakan sintaksis ANSI SQL yang lebih baru.
Sekedar pengetahuan saja, bahwa sebelum distandarkannya format sintaksis tersebut,
sebelumnya JOIN dilakukan dengan menggunakan sintaksis yang tidak ada kata JOIN-nya.
Format ini disebut sebagai IMPLICIT JOIN. Sedangkan format sintaksis kita sebelumnya disebut
sebagai EXPLICIT JOIN.
Kita dianjurkan untuk menggunakan format yang baru, yaitu yang ada kata JOIN-nya karena
cenderung lebih jelas dan menghindari terjadinya kesalahan maksud pada SQL yang kita tulis.
Dengan menuliskan kata-kata JOIN, berarti kita secara sadar memang ingin menampilkan data
dari 2 tabel atau lebih.
Namun demikian untuk sekedar pengetahuan Anda, jalankan sintaksis SQL berikut, hasilnya
akan sama dengan hasil pada Praktikum – Bagian 1 Langkah 1.
INNER JOIN Implisit juga bisa diberikan alias nama tabel agar tidak terlalu Panjang.
Alias nama tabel dituliskan pada klausa FROM, sama seperti pada Explicit JOIN.
2
Jalankan query berikut. Hasilnya akan sama dengan langkah sebelumnya, namun dengan
penulisan SQL yang lebih singkat.
13
Selain INNER JOIN, OUTER JOIN, dan FULL JOIN, terdapat satu jenis JOIN lagi yaitu CROSS JOIN.
CROSS JOIN akan menampilkan kombinasi satu-satu dari setiap kolom pada semua tabel tanpa
mempedulikan kesesuaian antar tabel atau tidak.
Jumlah baris yang dihasilkan adalah perkalian jumlah baris pada kedua buah tabel yang di
CROSS-kan.
14
CROSS JOIN juga dapt dilakukan secara IMPLICIT yaitu dengan tanpa memberikan WHERE pada
sintaksis JOIN IMPLICIT.
Jalankan query di bawah ini, hasilnya akan sama dengan langkah sebelumnya.
4
15
Tugas
1. Jalankan semua SQL pada praktikum-praktikum di atas, pahami maksudnya dan Screenshot-lah
hasilnya!
2. Tampilkan nama dosen berikut mata kuliah yang mereka ampu (186 baris) dengan ketentuan:
a. Tidak ada data yang duplikat
b. Urut berdasarkan nama dosen dari A-Z.
c. Nama kolom yang ditampilkan harus sesuai dengan contoh di bawah.
3. Tampilkan ruang yang digunakan untuk perkuliahan pada hari 'Selasa' berikut jam-nya (79 baris)
dengan ketentuan:
a. Harus ditampilkan ruangan tersebut dipakai mulai dari jam berapa sampai dengan jam
berapa.
b. Nama kolom yang ditampilkan harus sesuai contoh di bawah.
4. Tampilkan dosen yang tidak mendapatkan jadwal mengajar! Catatan: Nama kolom harus sesuai
contoh.
16
5. Tampilkan nama mata kuliah berikut dosen pengampunya berikut (192 baris) yang tidak ada dosen
pengampunya! Ketentuan:
a. Nama Kolom harus sesuai contoh
b. Anda bisa menggunakan RIGHT OUTER JOIN agar lebih mudah
6. Tampilkan nama-nama dosen (88 baris) berikut jumlah jadwal mereka! Ketentuan:
a. Nama kolom harus sesuai contoh
b. Apabila ada dosen yang tidak mendapatkan jadwal, jumlah_jadwal_mengajarnya haruslah =
0
-- Selamat Mengerjakan --
17