Archive | MySQL

Tags:

Manipulasi nilai nol dan NULL di mysql


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….

Posted in MySQLComments (2)

Tags:

Menjalankan query select dalam select di Mysql


Menjalankan query select dalam select akan perlu dilakukan ketika kita ingin mengambil informasi database biar hasilnya lebih cepat. Cara konvensional yang sering dipakai adalah melakukan query 2 kali sehingga pemrosesannya akan lebih lama.
Nah sebagai contoh sederhananya, kita akan membuat tabel didatabase yaitu tabel propinsi, yang berisi nama propinsi dan jumlah penduduk.


CREATE TABLE `propinsi` (
  `nama_propinsi` varchar(100) collate latin1_general_ci NOT NULL,
  `jumlah_penduduk` int(20) unsigned NOT NULL,
  PRIMARY KEY  (`nama_propinsi`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
 
INSERT INTO `propinsi` VALUES ('Jatim', 100000);
INSERT INTO `propinsi` VALUES ('Jateng', 200000);
INSERT INTO `propinsi` VALUES ('Jabar', 300000);
INSERT INTO `propinsi` VALUES ('DKI Jakarta', 400000);

Setelah tabel terbentuk, kita akan membuat query untuk menampilkan nama propinsi yang jumlah penduduknya lebih besar dari jumlah penduduk propinsi jateng.
Logika umumnya kita cari dulu jumlah penduduk (n) propinsi jateng, kemudian baru kita cari jumlah penduduk yang lebih besar dari n tadi. terjadi 2 query kan..

Dalam kasus ini, kita akan menggunakan query select dalam select :


select nama_propinsi from propinsi where jumlah_penduduk >
(select jumlah_penduduk from propinsi where nama_propinsi='Jateng');

Output dari query tersebut adalah nama propinsi Jabar dan DKI Jakarta, yang artinya propinsi yang jumlah penduduknya lebih besar dari jumlah penduduk propinsi jateng adalah Jabar dan DKI Jakarta.
Nah cukup simple kan.

Semoga informasi ini berguna.

Posted in MySQLComments (2)

Tags:

Menggunakan type data mysql yang baik, perlukah?


Ketika membuat sebuah database, pada masing2 tabel nya kita buat kolom yang memang sesuai dengan type datanya, hal ini penting karena saat melakukan order by, mysql secara default akan memperlakukan data sesuai type datanya.

Sebagai contoh anggaplah kita akan membuat database mahasiswa,

CREATE DATABASE `mahasiswa` ;
 
CREATE TABLE `data_mahasiswa` (
`nis` INT( 10 ) NOT NULL ,
`nama` VARCHAR( 100 ) NOT NULL ,
`umur` TINYINT NOT NULL ,
PRIMARY KEY ( `nim` )
) ENGINE = MYISAM ;
 
INSERT INTO `data_mahasiswa` ( `nim` , `nama` , `umur` )
VALUES
('02510010', 'Nama Siswa 1', '24'),
('02510012', 'Nama Siswa 2', '8'),
('02510013', 'Nama Siswa 3', '7'),
('02510015', 'Nama Siswa 4', '5'),
('02510018', 'Nama Siswa 5', '31'),
('02510019', 'Nama Siswa 6', '11'),
('02510011', 'Rudi Hermawan', '13')
;

Disini umur mempunyai type data TINYINT, mysql membacanya sebagai bilangan integer/bilangan bulat sehingga jika diurutkan dari kecil kebesar dengan order by ASC hasilnya benar

SELECT *
FROM `data_mahasiswa`
ORDER BY `data_mahasiswa`.`umur` ASC

Hasilnya : 5 7 8 11 13 24 31

atau dari umur terbesar ke umur terkecil dengan order by DESC


SELECT *
FROM `data_mahasiswa`
ORDER BY `data_mahasiswa`.`umur` DESC

Hasilnya : 31 24 13 11 8 7 5

Nah bagaimana jika kolom umur dijadikan varchar, perintah untuk menggantinya adalah

ALTER TABLE `data_mahasiswa` CHANGE `umur` `umur` VARCHAR( 4 ) NOT NULL

Jika di urutkan dari kecil ke besar (ASC)
hasilnya : 11 13 24 31 5 7 8

Jika di urutkan dari besar ke kecil (DESC)
hasilnya : 8 7 5 31 24 13 11

Kenapa bisa begitu, karena kolom umur oleh mysql dianggap sebagai string (varchar) sehingga angka 8 menjadi lebih besar dari 13, dan angka 11 akan dianggap lebih kecil dari 8.

Kesimpulannya adalah jika membuat suatu database harap perhatikan betul type datanya.

Kalau sudah terlanjur dan anda tidak ingin merubah tipe datanya, dan kita ingin merubah type string menjadi angka, caranya pakai Cast Functions and Operators di mysql.
Contoh :

SELECT *
FROM `data_mahasiswa`
ORDER BY CAST(`umur` AS SIGNED) ASC

Atau


SELECT *
FROM `data_mahasiswa`
ORDER BY CONVERT(`umur`, SIGNED) ASC

keterangannya adalah CAST(expr AS type), CONVERT(expr,type) dimana expr merupakan kondisi bilangan yang akan di convert, sedangkan type adalah convert tujuan yang terdiri dari:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

Semoga informasi ini berguna…

Posted in MySQLComments (2)

Tags: ,

Membuat range date Mysql dengan PHP


Kali ini saya mempunyai kasus yaitu :
Jika saya mempunyai dua tanggal
$tanggalAwal = ‘2008-05-15′;
$tanggalAkhir = ‘2008-06-15′;
Bagaimana menampilkan range date dari tanggalAwal sampai tanggalAkhir seperti :
2008-05-15
2008-05-16
2008-05-17
2008-05-18
dst sampai 2008-06-15

Untuk membuatnya, saya eksperimen dengan membuat file PHP dengan nama test.php
Quick Code


< ?php
// Koneksi ke database mysql
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = '';
 
$dbConn = mysql_connect ($dbHost, $dbUser, $dbPass) or die ('MySQL connect failed. ' . mysql_error());
 
$tanggalAwal = '2008-05-15';
$tanggalAkhir = '2008-06-15';
 
//Mencari selisih tanggal dengan DATEDIFF
$sql="SELECT DATEDIFF('$tanggalAkhir','$tanggalAwal') as selisih";
$result = mysql_query($sql,$dbConn);
$row = mysql_fetch_assoc($result);
$slsh = $row['selisih'];
echo 'Selisih tanggal awal dan akhir adalah '.$slsh;
echo '<br>';
 
//Menampilkan tanggal dengan DATE_ADD dan INTERVAL 1 DAY
$tanggal=$tanggalAwal;
echo $tanggal;
echo '<br />';
if ($slsh > 0) {
    for($i=1;$i< =$slsh;$i++){
    $sqlIn="SELECT DATE_ADD('$tanggal', INTERVAL 1 DAY) as intervalDay";
    $resultIn = mysql_query($sqlIn,$dbConn);
    $rowIn = mysql_fetch_assoc($resultIn);
    $tanggal=$rowIn['intervalDay'];
    echo $tanggal;
    echo '<br>';
    }
} else {
  echo 'Tanggal akhir harus lebih besar daripada tanggal awal';
}
?>

Nah keluar kan, kita tidak perlu membuat tabel di mysql.
Dari kode tersebut kita dapat mengembangkan untuk membuat array/menampilkan range menit, detik, jam, hari, bulan dst, yaitu tinggal mengganti INTERVAL nya.
Kalau kita ingin menampilkan dari tanggal besar ke kecil tinggal mengganti DATE_ADD menjadi DATE_SUB. Mudah khan…

Demikian, jika ada yang tau cara menampilkan range date yang lain silahkan kirim di menu comment ya..
Cz saya cari-cari di manual mysql dan browsing2 ga nemu2, adanya cuma mengambil range date dari tabel di mysql. Kalau menggunakan PHP fungsi menampilkan range datenya juga ga ketemu…
Karena bisanya ini, saya share dengan pembaca, di kommenin yach..

thx

Posted in MySQLComments (6)

  • Popular
  • Comments
  • Tags
  • Subscribe
Advertise Here

Category

Tag Cloud