Category: SQL

  • Perbedaan Left Join dan Left Outer Join

    Mungkin ada yang belum tahu, bahwa kata kunci OUTER sebenarnya adalah bersifat opsional. Jadi, baik ditulis atau tidak, hasilnya tetap sama. Pada dasarnya, semua bagian dari kata kunci JOIN adalah opsional. Jika hanya ditulis JOIN saja tanpa embel-embel LEFT/RIGHT, FULL, atau CROSS, default-nya adalah INNER. Contoh di bawah ini adalah sebuah query dengan kata kunci JOIN yang artinya sama dengan INNER JOIN.

    SELECT * FROM A JOIN B
    ON A.X = B.Y
    

    Berikut ini adalah daftar query beserta persamaannya.

    A LEFT JOIN B = A LEFT OUTER JOIN B
    A RIGHT JOIN B = A RIGHT OUTER JOIN B
    A FULL JOIN B = A FULL OUTER JOIN B
    A INNER JOIN B = A JOIN B
    A, B = A CROSS JOIN B
    

    Pada baris terakhir adalah syntax lama yang sudah mulai ditinggalkan tapi masih didukung oleh banyak mesin database modern. Penggabungan dua buah table atau lebih menggunakan tanda koma (,) sebaiknya dihindari, karena dapat menimbulkan ketaksaan (ambiguitas) ketika misalnya kata kunci INNER dan OUTER digunakan secara bersamaan pada suatu query. Ketaksaan tersebut mungkin saja diinterpretasikan berbeda dari satu mesin database ke yang lainnya.

    Kerugian lain dari syntax lama adalah hasilnya akan selalu bernilai CROSS JOIN jika kita lupa untuk menambahkan klausa WHERE. Pada syntax baru yang menggunakan kata kunci JOIN, hal ini tidak mungkin terjadi karena akan menimbulkan kegagalan pada saat pemeriksaan syntax sebelum dijalankan oleh mesin database.

    Kesimpulan dari catatan ini adalah:
    1. Jika hanya ditulis JOIN, artinya adalah INNER JOIN.
    2. Kata kunci OUTER, harus didahului oleh LEFT/RIGHT/FULL. Tidak bisa hanya ditulis OUTER JOIN.
    3. Kata kunci OUTER bersifat opsional, jadi bisa ditulis LEFT JOIN atau RIGHT JOIN atau FULL JOIN saja.
    4. CROSS JOIN berarti kita membuat daftar dari table pertama dikali dengan daftar dari table kedua. Akan menghasilkan semua kemungkinan dari kedua table tersebut (Cartesian product).

    Jika ingin lebih jelas mengenai masing-masing kata kunci JOIN, bisa membaca pada catatan lalu, yang menganalogikan kata kunci JOIN dengan Diagram Venn.

  • Mencari Nilai Maksimum Per Kategori SQL

    Salah satu masalah paling umum yang melibatkan query database adalah mencari nilai terbesar/terkecil pada tiap kategori/tipe. Sebagai contoh adalah mencari pencetak gol terbanyak pada masing-masing dari 4 klub teratas sepak bola Liga Inggris berikut ini.

    Nama                    Klub           Gol
    ------------------------------------------
    Sergio Agüero           Man City       23
    Edin Džeko              Man City       14
    Mario Balotelli         Man City       13
    Wayne Rooney	        Man United     27
    Javier Hernández        Man United     10
    Robin Van Persie        Arsenal        30
    Emmanuel Adebayor       Tottenham      17
    Jermain Defoe           Tottenham      11
    Rafael Van der Vaart    Tottenham      11
    

    Berikut ini adalah hasil yang diinginkan.

    Nama                    Klub           Gol
    ------------------------------------------
    Robin Van Persie        Arsenal        30
    Wayne Rooney	        Man United     27
    Sergio Agüero           Man City       23
    Emmanuel Adebayor       Tottenham      17
    

    Untuk menghasilkan keluaran seperti di atas, paling tidak kita membutuhkan dua langkah. Mencari jumlah gol yang diinginkan, kemudian tampilkan field lainnya berdasarkan gol yang sudah dicari tadi.

    Langkah pertama adalah mencari gol terbanyak pada masing-masing klub tanpa melihat siapa pencetak golnya.

    SELECT Klub, MAX(Gol) as maxGol 
    FROM `skorer` 
    GROUP BY Klub
    
    Klub           maxGol
    ---------------------
    Arsenal        30
    Man City       23
    Man United     27
    Tottenham      17
    

    Hasil bisa berbeda tergantung teknik penyortingan yang digunakan. Pada contoh di atas penyortingan menaik (ascending) berdasarkan field “Klub”.

    Langkah kedua adalah menampilkan field sisanya (Nama) dengan cara menggabungkan table hasil query pertama dengan table mula-mula (skorer).

    SELECT b.Nama, b.Klub, b.Gol
    FROM (
      SELECT Klub, MAX(Gol) AS maxGol
      FROM `skorer` 
      GROUP BY Klub
    ) AS a
    INNER JOIN `skorer` AS b ON 
      a.Klub = b.Klub AND a.maxGol = b.Gol
    
    Nama                    Klub           Gol
    ------------------------------------------
    Sergio Agüero           Man City       23
    Wayne Rooney	        Man United     27
    Robin Van Persie        Arsenal        30
    Emmanuel Adebayor       Tottenham      17
    

    Jika ingin diurutkan sesuai contoh, tinggal tambahkan ORDER BY Gol DESC pada akhir query.

    Sebenarnya ada query yang lebih singkat untuk menampilkan hasil seperti di atas, yaitu dengan menggunakan sub-query untuk mencari gol terbanyak pada masing-masing klub.

    SELECT * 
    FROM `skorer`
    WHERE Gol = (
      SELECT MAX(Gol) 
      FROM `skorer` AS a 
      WHERE a.Klub = skorer.Klub
    )
    
  • Memahami SQL Join dengan Diagram Venn

    Query JOIN pada bahasa SQL berfungsi untuk menggabungkan data dari 2 atau lebih tabel dalam sebuah database. Syntax SQL mempunyai 4 tipe JOIN, yaitu: INNER, OUTER, LEFT, dan RIGHT.

    Diagram Venn adalah diagram yang menunjukan semua kemungkinan relasi logis antara sekelompok variabel yang berbeda. Di sekolah dasar, Diagram Venn dikenalkan pada saat mempelajari teori himpunan pada Matematika. Diagram Venn biasanya dilambangkan dengan 2 atau lebih lingkaran yang saling berpotongan (meskipun tidak harus selalu demikian).

    Misalkan kita mempunyai 2 buah tabel pada database, TabelA dan TabelB. TabelA di sebelah kiri dan TabelB di sebelah kanan. Kemudian kita akan mengisi masing-masing dengan 4 buah data.

    id nama       id  nama
    -- ----       --  ----
    1  Andik      1   Andik
    2  Binta      2   Bambi
    3  Carli      3   Conan
    4  Didut      4   Didut
    

    Sekarang kita coba gabungkan kedua tabel di atas menggunakan tipe-tipe JOIN yang ada.

    1. INNER JOIN

    SELECT * FROM TabelA INNER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id nama       id  nama
    -- ----       --  ----
    1  Andik      1   Andik
    4  Didut      4   Didut
    

    INNER JOIN hanya akan menampilkan data yang cocok satu sama lain (berpasangan) pada kedua tabel. Diagram Venn-nya adalah sebagai berikut.

    inner join

    2. OUTER JOIN
    Pada dasarnya OUTER JOIN dibagi menjadi 3, FULL OUTER JOIN, LEFT OUTER JOIN, dan RIGHT OUTER JOIN.

    2.a. FULL OUTER JOIN

    SELECT * FROM TabelA FULL OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id    nama       id    nama
    --    ----       --    ----
    1     Andik      1     Andik
    2     Binta      null  null
    3     Carli      null  null
    4     Didut      4     Didut
    null  null       2     Bambi
    null  null       3     Conan
    

    FULL OUTER JOIN menghasilkan semua data yang ditemukan dan cocok satu sama lain pada kedua tabel, jika ada yang tidak cocok, bagian yang tidak ada tersebut akan berisi null. Jadi bisa dikatakan FULL OUTER JOIN ini akan menampilkan semua data yang ada di kedua tabel termasuk yang tidak cocok satu sama lain. Diagram Venn-nya adalah sebagai berikut.

    full outer join

    2.b. LEFT OUTER JOIN

    SELECT * FROM TabelA LEFT OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id    nama       id    nama
    --    ----       --    ----
    1     Andik      1     Andik
    2     Binta      null  null
    3     Carli      null  null
    4     Didut      4     Didut
    

    LEFT OUTER JOIN menghasilkan semua data yang ada pada TabelA (tabel sebelah kiri), dengan pasangannya (jika ada) pada TabelB (tabel sebelah kanan). Jika pasangannya tidak ditemukan, tabel sebelah kanan akan berisi null. Diagram Venn-nya adalah sebagai berikut.

    left outer join

    Lalu bagaimana jika kita menginginkan data yang hanya ada pada TabelA (tabel sebelah kiri)? Untuk itu kita membutuhkan bantuan klausa WHERE.

    2.c. LEFT OUTER JOIN dengan klausa WHERE

    SELECT * FROM TabelA LEFT OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    WHERE TabelB.id IS null
    
    id    nama       id    nama
    --    ----       --    ----
    2     Binta      null  null
    3     Carli      null  null
    

    Query LEFT OUTER JOIN di atas menghasilkan data yang hanya ada pada TabelA (tabel sebelah kiri). Diagram Venn-nya adalah sebagai berikut.

    left outer join where

    Untuk tipe RIGHT OUTER JOIN tidak perlu dijelaskan lagi karena hasilnya hanya kebalikan dari LEFT OUTER JOIN. Terakhir, ada satu bentuk diagram lagi, yaitu jika yang diinginkan hanya data yang tidak memiliki pasangan satu sama lain, alias data tersebut berada di luar bagian yang berpotongan.

    2.d. FULL OUTER JOIN dengan klausa WHERE

    SELECT * FROM TabelA FULL OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    WHERE TabelA.id IS null OR
    TabelB.id IS null
    
    id    nama       id    nama
    --    ----       --    ----
    2     Binta      null  null
    3     Carli      null  null
    null  null       2     Bambi
    null  null       3     Conan
    

    Query FULL OUTER JOIN di atas menghasilkan data yang unik (tidak ada yang berpasangan) dari TabelA dan TabelB. Diagram Venn-nya adalah sebagai berikut.

    full outer join where

    Artikel ini merupakan terjemahan bebas dari artikel yang ditulis oleh Jeff Atwood dengan ditambah penjelasan seperlunya.