Belajar Database Relational SQL Lite Bagian 4 – Join Table
Belajar Database Relational SQL Lite Bagian 4 akan membahas mengenai operasi join yaitu menggabungkan beberapa tabel menjadi satu yang dihubungkan/relational oleh primary key dan foreign key. Pada bab sebelumnya kita telah membahas cara membuat table Belajar Database Relational SQL Lite Bagian 2 – Operasi CRUID dan Sqlite browser Belajar Database Relational SQL Lite Bagian 3 – DB Browser Sqlite
Operasi join terdiri dari cross, inner, dan out join. Masing-masing mempunyai perbedaan sesuai dengan tujuaanya. Untuk mempermudah cara kerja join table pada Sqlite. Kita akan membuat table provinsi yang berisikan no, kota, nama_provinsi untuk di join dengan table kontak. Berikut isi tabel provinsi
no | kota | nama_provinsi |
1 | semarang | jawa tengah |
2 | solo | jawa tengah |
3 | kendari | sulteng |
4 | makasar | sulsel |
5 | surabaya | jawa timur |
6 | kediri | jawa timur |
7 | jepara | jawa tengah |
8 | pati | jawa tengah |
9 | klaten | jawa tengah |
Penggabungan antar tabel kontak (Ingat bab sebelumnya telah kita buat tabel kontak) dengan isi berikut
id_biodata | nama | tanggal_lahir | kota |
1 | agus | 04/06/1988 | semarang |
2 | bejo | 01/11/2000 | solo |
3 | cucup | 09/09/1988 | kendari |
4 | deden | 01/07/1986 | makasar |
5 | eko | 08/09/2001 | surabaya |
6 | farah | 31/12/2000 | kediri |
7 | galih | 06/12/1988 | jepara |
8 | bejo | 09/12/1989 | pati |
akan menghasilkan tabel yang lebih detail yaitu semarang –> jawa tengah. Nah tabel kontak mempunyai foreign key nya adalah kota sedangkan tabel provinsi mempunyai primary key adalah kota. Kalau digabungkan menjadi seperti berikut
id_biodata | nama | tanggal_lahir | kota | nama_provinsi |
1 | agus | 04/06/1988 | semarang | jawa tengah |
2 | bejo | 01/11/2000 | solo | jawa tengah |
3 | cucup | 09/09/1988 | kendari | sulsel |
4 | deden | 01/07/1986 | makasar | sulteng |
5 | eko | 08/09/2001 | surabaya | jawa timur |
6 | farah | 31/12/2000 | kediri | jawa timur |
7 | galih | 06/12/1988 | jepara | jawa tengah |
8 | bejo | 09/12/1989 | pati | jawa tengah |
Kalian bisa menggunakan sqlite CLI atau sqlite browser. Berikut detail schema dari tabel provinsi
sqlite> CREATE TABLE provinsi ( ...> no int primary key, ...> kota text, ...> nama_provinsi text); sqlite>
kita isi dengan berikut (biar cepat pakai sqlite browser saja)
insert into provinsi (no,kota,nama_provinsi) values (1,'semarang','jawa tengah'); insert into provinsi (no,kota,nama_provinsi) values (2,'solo','jawa tengah'); insert into provinsi (no,kota,nama_provinsi) values (3,'kendari','sulteng'); insert into provinsi (no,kota,nama_provinsi) values (4,'makasar','sulsel'); insert into provinsi (no,kota,nama_provinsi) values (5,'surabaya','jawa timur'); insert into provinsi (no,kota,nama_provinsi) values (6,'kediri','jawa timur'); insert into provinsi (no,kota,nama_provinsi) values (7,'jepara','jawa tengah'); insert into provinsi (no,kota,nama_provinsi) values (8,'pati','jawa tengah'); insert into provinsi (no,kota,nama_provinsi) values (9,'klaten','jawa tengah');
Inner Join
Yaitu akan menggabungkan 2 tabel jika kondisinya sama. Perintah yang digunakan yaitu SELECT * FROM tabel1 INNER JOIN tabel2 ON tabel1.key = tabel2.key. Contohnya sebagai berikut
select * from kontak inner join provinsi on provinsi.kota=kontak.kota;
hasilnya yaitu terlihat kota klaten tidak muncul karena pada tabel kontak tidak ada kota dengan nama klaten
id_biodata | nama | tanggal_lahir | kota | no | kota | nama_provinsi |
1 | agus | 4/6/1988 | semarang | 1 | semarang | jawa tengah |
2 | bejo | 1/11/2000 | solo | 2 | solo | jawa tengah |
3 | cucup | 9/9/1988 | kendari | 3 | kendari | sulteng |
4 | deden | 1/7/1986 | makasar | 4 | makasar | sulsel |
5 | eko | 8/9/2001 | surabaya | 5 | surabaya | jawa timur |
6 | farah | 31/12/2000 | kediri | 6 | kediri | jawa timur |
7 | galih | 6/12/1988 | jepara | 7 | jepara | jawa tengah |
8 | bejo | 9/12/1989 | pati | 8 | pati | jawa tengah |
biasanya agar rapi, kita hanya seleksi kolom2 yang diperlukan saja, misalkan
select id_biodata,nama,tanggal_lahir,kontak.kota, nama_provinsi from kontak inner join provinsi on provinsi.kota=kontak.kota;
hasilnya sebagai berikut
id_biodata | nama | tanggal_lahir | kota | nama_provinsi |
1 | agus | 4/6/1988 | semarang | jawa tengah |
2 | bejo | 1/11/2000 | solo | jawa tengah |
3 | cucup | 9/9/1988 | kendari | sulteng |
4 | deden | 1/7/1986 | makasar | sulsel |
5 | eko | 8/9/2001 | surabaya | jawa timur |
6 | farah | 31/12/2000 | kediri | jawa timur |
7 | galih | 6/12/1988 | jepara | jawa tengah |
8 | bejo | 9/12/1989 | pati | jawa tengah |
Outer Join
Sayangnya untuk saat ini sqlite hanya bisa mendukung left outer join. Yuk kita coba dibalik tabel nya menjadi urutan sebagai berikut
select * from provinsi LEFT OUTER JOIN kontak on provinsi.kota=kontak.kota;
hasilnya ada baris kosong pada kota klaten
no | kota | nama_provinsi | id_biodata | nama | tanggal_lahir | kota |
1 | semarang | jawa tengah | 1 | agus | 4/6/1988 | semarang |
2 | solo | jawa tengah | 2 | bejo | 1/11/2000 | solo |
3 | kendari | sulteng | 3 | cucup | 9/9/1988 | kendari |
4 | makasar | sulsel | 4 | deden | 1/7/1986 | makasar |
5 | surabaya | jawa timur | 5 | eko | 8/9/2001 | surabaya |
6 | kediri | jawa timur | 6 | farah | 31/12/2000 | kediri |
7 | jepara | jawa tengah | 7 | galih | 6/12/1988 | jepara |
8 | pati | jawa tengah | 8 | bejo | 9/12/1989 | pati |
9 | klaten | jawa tengah |
Cross Join
Cross join akan melakukan penggabungan antar 2 tabel tanpa terkecuali sehingga bila ada 8 baris di tabel kontak dan 9 baris di tabel provinsi, maka nanti akan ada 72 baris (8*9)
select * from provinsi CROSS JOIN kontak;
hasilnya sebagai berikut
no | kota | nama_provinsi | id_biodata | nama | tanggal_lahir | kota |
1 | semarang | jawa tengah | 1 | agus | 4/6/1988 | semarang |
1 | semarang | jawa tengah | 2 | bejo | 1/11/2000 | solo |
1 | semarang | jawa tengah | 3 | cucup | 9/9/1988 | kendari |
1 | semarang | jawa tengah | 4 | deden | 1/7/1986 | makasar |
1 | semarang | jawa tengah | 5 | eko | 8/9/2001 | surabaya |
1 | semarang | jawa tengah | 6 | farah | 31/12/2000 | kediri |
1 | semarang | jawa tengah | 7 | galih | 6/12/1988 | jepara |
1 | semarang | jawa tengah | 8 | bejo | 9/12/1989 | pati |
2 | solo | jawa tengah | 1 | agus | 4/6/1988 | semarang |
2 | solo | jawa tengah | 2 | bejo | 1/11/2000 | solo |
2 | solo | jawa tengah | 3 | cucup | 9/9/1988 | kendari |
2 | solo | jawa tengah | 4 | deden | 1/7/1986 | makasar |
2 | solo | jawa tengah | 5 | eko | 8/9/2001 | surabaya |
2 | solo | jawa tengah | 6 | farah | 31/12/2000 | kediri |
2 | solo | jawa tengah | 7 | galih | 6/12/1988 | jepara |
2 | solo | jawa tengah | 8 | bejo | 9/12/1989 | pati |
3 | kendari | sulteng | 1 | agus | 4/6/1988 | semarang |
3 | kendari | sulteng | 2 | bejo | 1/11/2000 | solo |
3 | kendari | sulteng | 3 | cucup | 9/9/1988 | kendari |
3 | kendari | sulteng | 4 | deden | 1/7/1986 | makasar |
3 | kendari | sulteng | 5 | eko | 8/9/2001 | surabaya |
3 | kendari | sulteng | 6 | farah | 31/12/2000 | kediri |
3 | kendari | sulteng | 7 | galih | 6/12/1988 | jepara |
3 | kendari | sulteng | 8 | bejo | 9/12/1989 | pati |
4 | makasar | sulsel | 1 | agus | 4/6/1988 | semarang |
4 | makasar | sulsel | 2 | bejo | 1/11/2000 | solo |
4 | makasar | sulsel | 3 | cucup | 9/9/1988 | kendari |
4 | makasar | sulsel | 4 | deden | 1/7/1986 | makasar |
4 | makasar | sulsel | 5 | eko | 8/9/2001 | surabaya |
4 | makasar | sulsel | 6 | farah | 31/12/2000 | kediri |
4 | makasar | sulsel | 7 | galih | 6/12/1988 | jepara |
4 | makasar | sulsel | 8 | bejo | 9/12/1989 | pati |
5 | surabaya | jawa timur | 1 | agus | 4/6/1988 | semarang |
5 | surabaya | jawa timur | 2 | bejo | 1/11/2000 | solo |
5 | surabaya | jawa timur | 3 | cucup | 9/9/1988 | kendari |
5 | surabaya | jawa timur | 4 | deden | 1/7/1986 | makasar |
5 | surabaya | jawa timur | 5 | eko | 8/9/2001 | surabaya |
5 | surabaya | jawa timur | 6 | farah | 31/12/2000 | kediri |
5 | surabaya | jawa timur | 7 | galih | 6/12/1988 | jepara |
5 | surabaya | jawa timur | 8 | bejo | 9/12/1989 | pati |
6 | kediri | jawa timur | 1 | agus | 4/6/1988 | semarang |
6 | kediri | jawa timur | 2 | bejo | 1/11/2000 | solo |
6 | kediri | jawa timur | 3 | cucup | 9/9/1988 | kendari |
6 | kediri | jawa timur | 4 | deden | 1/7/1986 | makasar |
6 | kediri | jawa timur | 5 | eko | 8/9/2001 | surabaya |
6 | kediri | jawa timur | 6 | farah | 31/12/2000 | kediri |
6 | kediri | jawa timur | 7 | galih | 6/12/1988 | jepara |
6 | kediri | jawa timur | 8 | bejo | 9/12/1989 | pati |
7 | jepara | jawa tengah | 1 | agus | 4/6/1988 | semarang |
7 | jepara | jawa tengah | 2 | bejo | 1/11/2000 | solo |
7 | jepara | jawa tengah | 3 | cucup | 9/9/1988 | kendari |
7 | jepara | jawa tengah | 4 | deden | 1/7/1986 | makasar |
7 | jepara | jawa tengah | 5 | eko | 8/9/2001 | surabaya |
7 | jepara | jawa tengah | 6 | farah | 31/12/2000 | kediri |
7 | jepara | jawa tengah | 7 | galih | 6/12/1988 | jepara |
7 | jepara | jawa tengah | 8 | bejo | 9/12/1989 | pati |
8 | pati | jawa tengah | 1 | agus | 4/6/1988 | semarang |
8 | pati | jawa tengah | 2 | bejo | 1/11/2000 | solo |
8 | pati | jawa tengah | 3 | cucup | 9/9/1988 | kendari |
8 | pati | jawa tengah | 4 | deden | 1/7/1986 | makasar |
8 | pati | jawa tengah | 5 | eko | 8/9/2001 | surabaya |
8 | pati | jawa tengah | 6 | farah | 31/12/2000 | kediri |
8 | pati | jawa tengah | 7 | galih | 6/12/1988 | jepara |
8 | pati | jawa tengah | 8 | bejo | 9/12/1989 | pati |
9 | klaten | jawa tengah | 1 | agus | 4/6/1988 | semarang |
9 | klaten | jawa tengah | 2 | bejo | 1/11/2000 | solo |
9 | klaten | jawa tengah | 3 | cucup | 9/9/1988 | kendari |
9 | klaten | jawa tengah | 4 | deden | 1/7/1986 | makasar |
9 | klaten | jawa tengah | 5 | eko | 8/9/2001 | surabaya |
9 | klaten | jawa tengah | 6 | farah | 31/12/2000 | kediri |
9 | klaten | jawa tengah | 7 | galih | 6/12/1988 | jepara |
9 | klaten | jawa tengah | 8 | bejo | 9/12/1989 | pati |