Mencari Ketidakcocokan Baris pada Dua Tabel - MySQL Dasar #75

Untuk dapat mencari adanya baris – baris pada satu tabel yang tidak memiliki ketidakcocokan dengan tabel lain maka kita bisa menggunakan operasi LEFT JOIN atau RIGHT JOIN, karena operasi penggabungan biasa hanya akan menghasilkan nilai – nilai yang memiliki kecocokan baris saja, contohnya :
MariaDB [root93]> SELECT * FROM seniman, lukisan
    -> WHERE seniman.a_id=lukisan.a_id;
+------+----------+------+------+-------------------+----------+-------+
| a_id | nama     | a_id | p_id | judul             | negara   | harga |
+------+----------+------+------+-------------------+----------+-------+
|    1 | Da Vinci |    1 |    1 | The last super    | Amerika  |    34 |
|    1 | Da Vinci |    1 |    2 | The Mona Lisa     | Spanyol  |    87 |
|    3 | Van Gogh |    3 |    3 | Stary Night       | Inggris  |    48 |
|    3 | Van Gogh |    3 |    4 | The Potato Eaters | Jerman   |    67 |
|    3 | Van Gogh |    3 |    5 | The Rocks         | Polandia |    33 |
|    5 | Renoir   |    5 |    6 | Les Deux Soeurs   | Perancis |    64 |
+------+----------+------+------+-------------------+----------+-------+
6 rows in set (0.046 sec)

selanjutnya jika misalnya Anda mengubah ekspresi/operator didalam klausa WHERE dengan != maka hasilnya justru akan menampilkan semua kombinasi nilai yang tidak cocok, padahal disini kita menginginkan untuk menampilkan daftar nilai (nama seniman, a_id) pada tabel seniman yang tidak terdapat pada tabel lukisan. Jadi solusinya ketika mencari nilai – nilai pada satu tabel yang tidak memiliki kecocokan nilai – nilai pada tabel lain adalah menggunakan operasi penggabungan LEFT JOIN atau RIGHT JOIN. 


LEFT JOIN sebenarnya mirip dengan operasi penggabungan biasa, yang akan melakukan pencocokan baris pertama (kiri) dengan baris – baris pada tabel kedua (kanan). Ketika tabel kiri memiliki ketidakcocokan pada tabel sebelah kanan, LEFT JOIN akan tetap menampilkan satu baris pada semua kolom dari tabel kanan yang ditetapkan sebagai nilai NULL. Berbeda dengan operasi penggabungan biasa dimana nilai penggabungan tabel hanya dipisahkan dengan koma kemudian kolom yang dibandingkan ditetapkan didalam klausa where. 

Jika menggunakan LEFT JOIN, setiap tabel yang dibandingkan akan ditetapkan atau dipisahkan didalam LEFT JOIN kemudian parameter nilainya akan dibandingkan didalam klausa ON sehingga kita perlu menuliskan quernya seperti berikut :

 
MariaDB [root93]> SELECT * FROM seniman
    -> LEFT JOIN lukisan
    -> ON seniman.a_id=lukisan.a_id
    -> ;
+------+----------+------+------+-------------------+----------+-------+
| a_id | nama     | a_id | p_id | judul             | negara   | harga |
+------+----------+------+------+-------------------+----------+-------+
|    1 | Da Vinci |    1 |    1 | The last super    | Amerika  |    34 |
|    1 | Da Vinci |    1 |    2 | The Mona Lisa     | Spanyol  |    87 |
|    2 | Monet    | NULL | NULL | NULL              | NULL     |  NULL |
|    4 | Picasso  | NULL | NULL | NULL              | NULL     |  NULL |
|    5 | Renoir   |    5 |    6 | Les Deux Soeurs   | Perancis |    64 |
|    3 | Van Gogh |    3 |    3 | Stary Night       | Inggris  |    48 |
|    3 | Van Gogh |    3 |    4 | The Potato Eaters | Jerman   |    67 |
|    3 | Van Gogh |    3 |    5 | The Rocks         | Polandia |    33 |
+------+----------+------+------+-------------------+----------+-------+
8 rows in set (0.001 sec)
Query diatas sebenarnya juga akan menghasilkan daftar keluaran seperti operasi penggabungan biasa, hanya saja yang membedakannya bahwa LEFT JOIN juga akan menampilkan keluaran untuk baris – baris seniman yang tidak memiliki kecocokan pada tabel lukisan dimana ketidakcocokan tersebut ditetapkan sebagai NULL. 

Jika misalnya Anda hanya ingin menampilkan daftar keluaran yang tidak memiliki kecocokan maka Anda bisa menambahkan klausa WHERE dengan cara mencari nilai NULL seperti berikut :
MariaDB [root93]> SELECT * FROM seniman
    -> LEFT JOIN lukisan
    -> ON seniman.a_id=lukisan.a_id
    -> WHERE lukisan.a_id IS NULL;
+------+---------+------+------+-------+--------+-------+
| a_id | nama    | a_id | p_id | judul | negara | harga |
+------+---------+------+------+-------+--------+-------+
|    2 | Monet   | NULL | NULL | NULL  | NULL   |  NULL |
|    4 | Picasso | NULL | NULL | NULL  | NULL   |  NULL |
+------+---------+------+------+-------+--------+-------+
2 rows in set (0.001 sec)
Contoh lainnya jika Anda hanya ingin menampilkan daftar nama – nama seniman yang tidak ada pada tabel lukisan maka Anda bisa menuliskan query seperti berikut :
MariaDB [root93]> SELECT seniman.* FROM seniman
    -> LEFT JOIN lukisan
    -> ON seniman.a_id=lukisan.a_id
    -> WHERE lukisan.a_id IS NULL;
+------+---------+
| a_id | nama    |
+------+---------+
|    2 | Monet   |
|    4 | Picasso |
+------+---------+
2 rows in set (0.001 sec)
Anda juga bisa melaporkan tiap nilai pada tabel kiri dengan indikator ada tidaknya nilai pada tabel sebelah kanan dengan cara menghitungnya dengan parameter IF COUNT, jika nilai lebih besar dari 0 maka sebalikanya tidak ada jika kurqang dari 0. Contoh query berikut akan menghasilkan kedimpulan daftar nama seniman, dan ada tidaknya lukisan yang dimiliki oleh seniman tersebut pada tabel lukisan.
MariaDB [root93]> SELECT seniman.nama,
    -> IF(COUNT(lukisan.a_id)>0,'ada','tidak ada') AS 'karya lukisan'
    -> FROM seniman
    -> LEFT JOIN lukisan ON seniman.a_id=lukisan.a_id
    -> GROUP by seniman.nama;
+----------+---------------+
| nama     | karya lukisan |
+----------+---------------+
| Da Vinci | ada           |
| Monet    | tidak ada     |
| Picasso  | tidak ada     |
| Renoir   | ada           |
| Van Gogh | ada           |
+----------+---------------+
5 rows in set (0.001 sec)
Selanjutnya selain menggunakan LEFT JOIN, Anda juga bisa menggunakan RIGHT JOIN, hanya saja peran tabelnya akan dibalik.
MariaDB [root93]> SELECT seniman.nama,
    -> IF(COUNT(lukisan.a_id)>0,'ada','tidak ada') AS 'karya lukisan'
    -> FROM lukisan
    -> RIGHT JOIN seniman ON lukisan.a_id=seniman.a_id
    -> GROUP by seniman.nama;
+----------+---------------+
| nama     | karya lukisan |
+----------+---------------+
| Da Vinci | ada           |
| Monet    | tidak ada     |
| Picasso  | tidak ada     |
| Renoir   | ada           |
| Van Gogh | ada           |
+----------+---------------+
5 rows in set (0.001 sec)

0 Response to "Mencari Ketidakcocokan Baris pada Dua Tabel - MySQL Dasar #75"

Post a Comment

Komentar yang Anda kirim akan terlebih dahulu di moderasi oleh Admin