Dalam mysql, penyimpanan dan pemrosesan data sering jadi masalah, termasuk dalam menangani field yang berisi “NULL” baik nilai tersebut berupa angka, baik itu integer, decimal, maupun double.
Ambil contoh ketika kita membuat database yang berisi data statistik yang rencananya diisi data yang besar, dimana ada nilai nol (0) dan kosong (NULL). nol akan dihitung, sedangkan NULL tidak.
Sekilas memang sama, seorang programmer database (databaser) yang perhatian sama efisiensi data, akan membuat field dengan tipe data “NULL” yang berarti hemat space, karena NULL tidak makan space
kemudian data yang memiliki nilai nol (0) dihitung, sedang yang NULL tidak
operasi matematis yang disediakan mysql cukup oke, sehingga olah, proses dan simpan data di mysql kemudian program interface nya digunakan untuk menampilkan hasilnya saja.
dalam sebuah operasi matematika di mysql, AVG/rata-rata akan menegasikan angka NULL,
Cth : rata-rata dari : 1,3,7,null,0,5,3 = (1+3+7+0+5+2)/6 = 3
nilai NULL tidak ikut dihitung bukan.. demikian juga dengan SUM, COUNT, STD_DEV, dsb
Coba dibuktikan dengan praktek dulu ya…
Quick Code
CREATE TABLE `data_contoh` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`data_a` DOUBLE NULL ,
`data_b` DOUBLE NULL
) ENGINE = MYISAM ;
INSERT INTO `data_contoh` VALUES (1, 2, 6);
INSERT INTO `data_contoh` VALUES (2, 4, NULL);
INSERT INTO `data_contoh` VALUES (3, 5, NULL);
INSERT INTO `data_contoh` VALUES (4, NULL, 7);
dari tabel diatas kita mempunyai :
id = “1,2,3,4″
data_a = “2,4,5,null”
data_b = “6,NUL,NULL,7″
1. Kasus mencari rata-rata suatu kolom
SELECT AVG( data_a ) AS ratarata_a from data_contoh;
output :
ratarata_a = 3.6666666666667
tidak ada masalah dalam hal ini.
2. Kasus penjumlahan antar kolom (kolom_a + kolom_b)
SELECT id, ( data_a + data_b ) AS jumData FROM `data_contoh` GROUP BY id
Hasil :
ID 1 : 2+6 = 8
ID 2 : 4+NULL = NULL
ID 3 : 5+NULL = NULL
ID 4 : NULL+7 = NULL
nah, kelihatan juga kan ketika NULL dijumlahkan dengan berapapun nilainya akan “NULL”, demikian juga dengan pengurangan.
intinya null tidak hanya menegasikan dirinya sendiri, namun juga mempengaruhi perhitungan dengan menegasikan yang lainnya.
Sebagai solusi agar nilai NULL kita negasikan, yang berarti bukan NULL yang menegasikan kita.
ganti query sql berikut ini:
SELECT id, ( IFNULL(data_a,0) + IFNULL(data_b,0) ) AS jumData FROM `data_contoh` GROUP BY id
Hasil:
ID 1 : 2+6 = 8
ID 2 : 4+NULL = 4
ID 3 : 5+NULL = 5
ID 4 : NULL+7 = 7
Penjelasannya ada disini, Dalam mysql ada istilah Control Flow Functions, yang terdiri dari:
- CASE WHEN THEN
kondisi = operasi yang menghasilkan nilai tertentu, misal 1+1
SELECT CASE kondisi WHEN 1 THEN ’satu’ WHEN 2 THEN ‘dua’ ELSE ‘banyak’ END;
hasil : dua
- IF
kondisi = operasi yang menghasilkan nilai true/false, misal 10>11
SELECT IF(kondisi,’oke’,'not oke’);
hasil : not oke
- IFNULL
kondisi = jika kondisi berupa NULL maka ambil angka 9, jika kondisi tidak NULL ambil nilai kondisi, misal 12/0
SELECT IFNULL(kondisi,9);
hasil : 0
- NULLIF
kondisi = jika kondisi1=kondisi2 hasil=NULL, jika tidak hasil=kondisi1. misal kondisi1=5-2, kondisi2=6-3
SELECT NULLIF(kondisi1,kondisi2);
hasil : NULL
Cukup mudah bukan, yang penting jika ketemu NULL, maka pakai control flow sebagai solusinya.
Fuihhh ngantukk….