Skip to main content

Belajar SQL Join

Mungkin sudah banyak yang melihat gambar legendaris ini baik di social media atau di website-website tapi belum paham maksudnya. Gambar ini adalah visualisasi dari berbagai macam contoh SQL Join yang sering digunakan sehari-hari dalam dunia pemrograman dan basis data. Nah saat ini untuk mudahnya saya buat contoh kasusnya.



Nah pada postingan ini saya mencoba memberikan contoh paling sederhana dengan menbuat contoh join antara table-table berikut: users, cars dan motorcycles.

Kasusnya kurang lebih nanti akan seperti ini:

  1. Munculkan users dan mobilnya.
  2. Munculkan users dan mobilnya, yang tidak punya mobil jangan dimunculkan.
  3. Munculkan mobil yang ada pemiliknya, yang tidak ada pemiliknya jangan di tampilkan.
  4. Dan lain-lain.

Untuk awal mari persiapkan table-table yang diperlukan yaitu table users, table cars dan motorcycles.

Buat Dulu Table users

create table users (
  id serial primary key, -- Auto incrementing IDs
  username character varying, -- String column without specifying a length
  job character varying -- String column without specifying a length
);


Ada 7 orang dengan 4 profesi berbeda.

Isi dari table users:

PNS

  1. Joni
    1. Mobil Kia Merah
    2. Motor Honda Hitam
  2. Deni
    1. Motor Kawasaki Biru
TNI
  1. Ismed
    1. Mobil Suzuki Putih
    2. Mobil Mitsubishi Hitam
  2. Ruslan
    1. Motor Jialing Putih
Polri
  1. Sufyan 
    1. Mobil Hyundai Putih
    2. Motor Honda Putih
  2. Suryadi
    1. Motor Yamaha Merah

Wiraswasta

  1. Kurniawan
    1. Mobil Toyota Kuning
    2. Motor Viar Hijau
    3. Motor Harley Ungu



Total ada 5 mobil dan 7 motor yang kebetulan di miliki oleh beberapa users dari beragam propesi.

Buat Tables cars dan motorcycles


create table cars (
  id serial primary key, -- Auto incrementing IDs
  user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
  brand character varying, -- String column without specifying a length
  color character varying -- String column without specifying a length
);

Cars


create table motorcycles (
  id serial primary key, -- Auto incrementing IDs
  user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
  brand character varying, -- String column without specifying a length
  color character varying -- String column without specifying a length
);

Motorcycles

Buat Isi Table

Jangan lupa tambahkan Motor BSA dan Mobil Koenigsegg yang tidak dimiliki Siapapun


Yang kiri mobil yang kanan motor.

Nah sampai disini kita sudah memiliki tiga buat table, yaitu: users, cars dan motorcycles. Ketiga table ini dimaksudnya untuk menggambarkan hubungan antara barang (cars dan motorcycles) dan pemiliknya (users), ada user yang punya mobil tak punya motor ada user punya motor dan tak punya mobil dll.

Contoh Inner Join (Ini default join)

users adalah A (left) dan cars adalah B (right).


Hanya munculkan data saat users punya mobil dan  cars ada yang punya.
Ingat users disini ada di left dan cars ada di right dan operasi adalah inner join (ini paling sering dipakai).

select 
users.id as user_id,
users.username,
users.job,
cars.brand AS car_brand
from users inner join cars on users.id = cars.user_id;



Bawah ini sama inner join juga.


Nah, dari operasi inner join ini maka hanya users yang punya mobil yang tampil dan juga cars yang ada pemilik yang tampil, bandingkan dengan left join di bawah, akan ada users yang tak punya mobil ikut muncul dan kolom mobil dihasil joinnya null.



Contoh Left Join

Lihat left adalah user dan kanan adalah cars, karena ini LEFT JOIN, maka semua di LEFT akan di join walau dia tidak punya data di sebelah RIGHT. Maksudnya pada kasus ini akan ada users yang muncul tapi kolom-kolom cars nya null.
users adalah A (left) dan cars adalah B (right).


Munculkan semua users baik dia punya mobil atau tidak punya mobil.

select 
users.id as user_id,
users.username,
users.job,
cars.brand AS car_brand
from users LEFT JOIN cars on users.id = cars.user_id;

LIhat semua di LEFT (users) ikut JOIN walaupun tidak punya data di RIGHT (cars)


Contoh Right Join


users adalah A (left) dan cars adalah B (right).


Nah yang ini adalah kebalikan dari LEFT JOIN, ini akan menampikan semua mobil bahkan yang tidak ada pemiliknya, jadi akan ada table dengan data cars tapi usersnya null.


select 
users.id as user_id,
users.username,
users.job,
cars.brand AS car_brand
from users right join cars on users.id = cars.user_id;




Full Outer Join (Anggap Left, Inner dan Right Join Digabung)


users adalah A (left) dan cars adalah B (right).


Ambil semuanya yang di kiri dan kanan, sehingga dalam kasus ini akan ada row yang memiliki data cars tapi usersnya null dan sebaliknya juga akan ada data users tapi carsnya null (akan ada users tanpa memiliki mobil dan mobil tanpa pemilik).




Studi Kasus Dunia Nyata

Studi kasus sederhana di bawah ini adalah contoh penerapan SQL join diatas dalam situasi sebenarnya, kasus-kasus tersebut bisa jadi berubah kasus seperti dibawah ini:

Tampilkan users yang memiliki mobil (untuk motor sama saja).

select
 users.id as user_id,
 users.username,
 users.job,
 cars.brand as car_brand
from users LEFT JOIN cars on users.id = cars.user_id

WHERE cars.brand IS NOT NULL;




Tampilkan user yang tidak memiliki mobil (untuk motor sama saja).

select
 users.id as user_id,
 users.username,
 users.job,
 cars.brand as car_brand
from users LEFT JOIN cars on users.id = cars.user_id

WHERE cars.brand IS NULL;




Tampilkan users yang memiliki mobil dan motor (dibalik sama saja).


select
 users.id as user_id,
 users.username,
 users.job,
 cars.brand as car_brand,
 motorcycles.brand as motorcycle_brand
from users
 LEFT JOIN cars on users.id = cars.user_id
 LEFT JOIN motorcycles on users.id = motorcycles.user_id

 WHERE cars.brand IS NOT NULL AND motorcycles.brand IS NOT NULL;



Tampilkan users yang memiliki mobil saja.

select
 users.id as user_id,
 users.username,
 users.job,
 cars.brand as car_brand,
 motorcycles.brand as motorcycle_brand
from users
 LEFT JOIN cars on users.id = cars.user_id
 LEFT JOIN motorcycles on users.id = motorcycles.user_id

 WHERE cars.brand IS NOT NULL AND motorcycles.brand IS NULL;



Tampilkan users yang memiliki mobil lebih dari 1.

Lihat user dengan user_id 3 dan 4 punya dua mobil.

 select 
     users.id as user_id,
     users.username,
     users.job,
     cars.id,
     cars.brand as car_brand

    FROM users 
     LEFT JOIN cars on users.id = cars.user_id
    where exists (select username, count(*) multiplecars        
    FROM users u
      JOIN cars c on u.id = c.user_id
where users.username = u.username 
     group by 
      u.username 
having count(*) > 1


User yang memiliki mobil lebih dari satu muncul.


Atau dengan cara lainnya:

select user_id, username, job, id, car_brand
from (select u.id as user_id, u.username, u.job,
             c.id, c.brand as car_brand,
             count(*) over (partition by u.id) as num_cars
      from users u join cars c
           on u.id = c.user_id
     ) uc
where num_cars > 1;


User yang memiliki mobil lebih dari satu muncul.



*Saya sempat bingung dan saya bertanya dan ada yang jawab disini.

Nah, saat studi kasus seperti ini maka kompleksitas mulai muncul dan kita biasanya akan perlu untuk dapat mengkombinasikan berbagai perintah SQL yang ada hingga penggunaan subquery hingga menjadi sebuah solusi.

#todo





Blog post ini akan saya update berkala kedepannya untuk berbagai macam kasus join mulai dari yang sederhana hingga yang ribet.

Sumber gambar dari sini.

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....