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 |