Yuk kita belajar Basis Data lagi. Laporan Desain Basis
Data ke-5 ini, bakal ngebahas tentang Agregasi dan View.
Dasar Teori
Agregasi itu apaan yah?
Agregasi dalam SQL merupakan proses untuk mendapatkan
nilai dari sekumpulan data yang telah dikelompokkan. Pengelompokan data
didasarkan pada kolom atau kombinasi kolom yang dipilih.
Berikut beberapa fungsi untuk agregasi:
MAX :
Mencari data terbesar dari sekelompok data.
MIN :
Mencari data terkecil dari sekelompok data.
COUNT : Mencari
cacah data.
SUM :
Mencari jumlah dari sekumpulan data numerik.
AVG :
Mencari nilai rata-rata dari sekumpulan data numerik.
Fungsi
AVG dan SUM hanya berlaku untuk data bertipe numerik, tidak bisa untuk karakter
atau date.
Sintaks SQL untuk melakukan pengelompokan adalah
SELECT fungsi_agregasi(nama_field) FROM nama_tabel;
GROUP BY
GROUP BY ini digunakan dalam pengelompokan data Sob. Biasa
dipake untuk fungsi-fungsi agregasi. Berikut nih sintaksnye:
SELECT nama_kolom FROM nama_tabel GROUP BY nama_kolom;
Jika menggunakan GROUP BY, semua field yang ingin
ditampilkan dalam SELECT harus tercantum di GROUP BY (kecuali aggregate
functions).
GROUP BY sangat cocok untuk aggregate functions.
Dengan menggunakan GROUP BY, kita bisa mengelompokkan record-record
dan menghitung MIN, MAX, COUNT, SUM dan AVG untuk masing-masing kelompok.
HAVING
Having
= pembatasan
Penggunaan
HAVING terkait dengan GROUP BY, kegunaanya adalah untuk menentukan kondisi bagi
GROUP BY, dimana kelompok yang memenuhi kondisi saja yang akan di hasilkan.
Nih.. langsung ana kasi contohna:
Contoh :
SELECT nama, sum(total) FROM transaksi GROUP BY nama HAVING sum(total)<150000;
Jika
menggunakan HAVING, maka pembatasan dilakukan setelah hasil dikelompokkan dalam
GROUP BY.
SELECT nama, tglbeli FROM transaksi
WHERE total=150000 GROUP BY nama,tglbeli;
Jika
menggunakan WHERE, maka pembatasan dilakukan sebelum hasil dikelompokkan dalam GROUP
BY.
CASE
Perintah
CASE sering digunakan
untuk menampilkan nilai tertentu dari beberapa barisan data dengan
syarat-syarat atau kondisi yang kita berikan. Berikut sintaks case didalam
SELECT:
...CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
VIEW
View
ini mirip dengan tabel, namun SQL Server tidak menyimpan data di dalamnya
melainkan definisi (query) suatu tabel. Untuk mudahnya, view adalah (seperti)
"virtual tabel".
Trus,
buat apa pake VIEW??
Untuk
membagi beban resource yang terpakai saat aplikasi di jalankan. Karena view
dijalan/dieksekusi di sisi server. Maka resource di PC clients akan lebih
hemat.
Untuk mempermudah dalam menampilkan data. Kadang struktur database yang kita buat agak mempersulit kita dalam proses query untuk ditampilkan di report. Untuk mempermudah maintain aplikasi, apabila ada proses query yang sama dan berulang maka akan lebih simple dalam proses pembuatan aplikasi.
Untuk mengimplementasikan security. User tidak bisa melihat colom colom tabel sebenarnya.
Kekuragannya, View tidak bisa menerima parameter sebagaimana Stored Procedured (SP). Berikut sintaks view:
Untuk mempermudah dalam menampilkan data. Kadang struktur database yang kita buat agak mempersulit kita dalam proses query untuk ditampilkan di report. Untuk mempermudah maintain aplikasi, apabila ada proses query yang sama dan berulang maka akan lebih simple dalam proses pembuatan aplikasi.
Untuk mengimplementasikan security. User tidak bisa melihat colom colom tabel sebenarnya.
Kekuragannya, View tidak bisa menerima parameter sebagaimana Stored Procedured (SP). Berikut sintaks view:
CREATE VIEW nama_tabel_view AS query;
Hasil Praktikum
Masih
bingung yaa sama teori-teori diatas?? Coba praktik langsung aja Sob.
Berikut
hasil praktikum penggunaan agregasi dan view dengan MySQL.
Persiapan:
Gunakan tabel mahasiswa dan fakultas pada pertemuan sebelumnya.
Tampilkan
banyaknya data mahasiswa yang telah di inputkan.
Mencari nim mahasiswa yang
paling kecil.
Mencari nim mahasiswa yang
paling besar.
Mencari rata-rata nim
mahasiswa.
Menampilkan rata-rata id atau
nim mahasiswa yang data nimnya lebih dari 12
Menampilkan jumlah mahasiswa
berdasarkan fakultas. Sehingga hasilnya seperti berikut:
Nama fakultas
|
Count(*)
|
Saintek
|
2
|
Psikolog
|
1
|
Menampilkan seperti nomor 3
dengan persyaratan jumlah mahasiswa yang lebih dari sama dengan 2 saja yang
ditampilkan
Menampilkan data mahasiswa
dengan persyaratan, jika jenis kelaminnya “L” maka tertulis laki-laki dan bila
“P” maka tertulis perempuan.
Membuat view untuk query
penampilan data mahasiswa, fakultas berdasarkan nim, nama mahasiswa, nama
fakultas.
Nih,
ana tambah yang pake PostgeSQL. Coba aja Sob..
Server [localhost]:
Database [postgres]: permata13650083
Port [5432]:
Username [postgres]:
Password for user postgres:
psql (9.3.5)
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
permata13650083=# select * from mahasiswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | gender
---------+----------+------------+--------+--------------+--------
1 | Luki | Ponorogo | 2 | 082576568725 | L
2 | Affan | Surabaya | 1 | 085677854321 | L
3 | Melly | Yogyakarta | 1 | 081233476588 | P
4 | Hari | Solo | 2 | 085776889521 | L
5 | Sinta | Jakarta | 1 | 085233456789 | P
6 | Ana | Malang | 2 | 082547766543 | P
7 | Fandi | Jombang | 1 | 081234576980 | L
(7 rows)
permata13650083=# select * from fakultas;
id_fak | nama_fak
--------+-----------
2 | PSIKOLOGI
1 | SAINTEK
(2 rows)
permata13650083=# select count(*) from mahasiswa;
count
-------
7
(1 row)
permata13650083=# select min(nim_mah) from mahasiswa;
min
-----
1
(1 row)
permata13650083=# select max(nim_mah) from mahasiswa;
max
-----
7
(1 row)
permata13650083=# select avg(nim_mah) from mahasiswa;
avg
--------------------
4.0000000000000000
(1 row)
permata13650083=# select avg(nim_mah) from mahasiswa where nim_mah>12;
avg
-----
(1 row)
permata13650083=# select avg(nim_mah) from mahasiswa where nim_mah>3;
avg
--------------------
5.5000000000000000
(1 row)
permata13650083=# select nama_fak, count(*) from mahasiswa, fakultas where mahas
iswa.id_fak=fakultas.id_fak group by nama_fak;
nama_fak | count
-----------+-------
PSIKOLOGI | 3
SAINTEK | 4
(2 rows)
permata13650083=# select nama_fak, count(*) from mahasiswa, fakultas where mahas
iswa.id_fak=fakultas.id_fak group by nama_fak having count(*)>=2;
nama_fak | count
-----------+-------
PSIKOLOGI | 3
SAINTEK | 4
(2 rows)
permata13650083=# select nim_mah, nama_mah, alamat_mah, id_fak, no_telp, case wh
en gender='L' then 'Laki-laki' else 'Perempuan' end as jenis_kelaminn from mahas
iswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | jenis_kelaminn
---------+----------+------------+--------+--------------+----------------
1 | Luki | Ponorogo | 2 | 082576568725 | Laki-laki
2 | Affan | Surabaya | 1 | 085677854321 | Laki-laki
3 | Melly | Yogyakarta | 1 | 081233476588 | Perempuan
4 | Hari | Solo | 2 | 085776889521 | Laki-laki
5 | Sinta | Jakarta | 1 | 085233456789 | Perempuan
6 | Ana | Malang | 2 | 082547766543 | Perempuan
7 | Fandi | Jombang | 1 | 081234576980 | Laki-laki
(7 rows)
permata13650083=# create view data_mahasiswa as select nim_mah, nama_mah, nama_f
ak from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak;
CREATE VIEW
permata13650083=# select * from data_mahasiswa;
nim_mah | nama_mah | nama_fak
---------+----------+-----------
1 | Luki | PSIKOLOGI
2 | Affan | SAINTEK
3 | Melly | SAINTEK
4 | Hari | PSIKOLOGI
5 | Sinta | SAINTEK
6 | Ana | PSIKOLOGI
7 | Fandi | SAINTEK
(7 rows)
permata13650083=#
Database [postgres]: permata13650083
Port [5432]:
Username [postgres]:
Password for user postgres:
psql (9.3.5)
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
permata13650083=# select * from mahasiswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | gender
---------+----------+------------+--------+--------------+--------
1 | Luki | Ponorogo | 2 | 082576568725 | L
2 | Affan | Surabaya | 1 | 085677854321 | L
3 | Melly | Yogyakarta | 1 | 081233476588 | P
4 | Hari | Solo | 2 | 085776889521 | L
5 | Sinta | Jakarta | 1 | 085233456789 | P
6 | Ana | Malang | 2 | 082547766543 | P
7 | Fandi | Jombang | 1 | 081234576980 | L
(7 rows)
permata13650083=# select * from fakultas;
id_fak | nama_fak
--------+-----------
2 | PSIKOLOGI
1 | SAINTEK
(2 rows)
permata13650083=# select count(*) from mahasiswa;
count
-------
7
(1 row)
permata13650083=# select min(nim_mah) from mahasiswa;
min
-----
1
(1 row)
permata13650083=# select max(nim_mah) from mahasiswa;
max
-----
7
(1 row)
permata13650083=# select avg(nim_mah) from mahasiswa;
avg
--------------------
4.0000000000000000
(1 row)
permata13650083=# select avg(nim_mah) from mahasiswa where nim_mah>12;
avg
-----
(1 row)
permata13650083=# select avg(nim_mah) from mahasiswa where nim_mah>3;
avg
--------------------
5.5000000000000000
(1 row)
permata13650083=# select nama_fak, count(*) from mahasiswa, fakultas where mahas
iswa.id_fak=fakultas.id_fak group by nama_fak;
nama_fak | count
-----------+-------
PSIKOLOGI | 3
SAINTEK | 4
(2 rows)
permata13650083=# select nama_fak, count(*) from mahasiswa, fakultas where mahas
iswa.id_fak=fakultas.id_fak group by nama_fak having count(*)>=2;
nama_fak | count
-----------+-------
PSIKOLOGI | 3
SAINTEK | 4
(2 rows)
permata13650083=# select nim_mah, nama_mah, alamat_mah, id_fak, no_telp, case wh
en gender='L' then 'Laki-laki' else 'Perempuan' end as jenis_kelaminn from mahas
iswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | jenis_kelaminn
---------+----------+------------+--------+--------------+----------------
1 | Luki | Ponorogo | 2 | 082576568725 | Laki-laki
2 | Affan | Surabaya | 1 | 085677854321 | Laki-laki
3 | Melly | Yogyakarta | 1 | 081233476588 | Perempuan
4 | Hari | Solo | 2 | 085776889521 | Laki-laki
5 | Sinta | Jakarta | 1 | 085233456789 | Perempuan
6 | Ana | Malang | 2 | 082547766543 | Perempuan
7 | Fandi | Jombang | 1 | 081234576980 | Laki-laki
(7 rows)
permata13650083=# create view data_mahasiswa as select nim_mah, nama_mah, nama_f
ak from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak;
CREATE VIEW
permata13650083=# select * from data_mahasiswa;
nim_mah | nama_mah | nama_fak
---------+----------+-----------
1 | Luki | PSIKOLOGI
2 | Affan | SAINTEK
3 | Melly | SAINTEK
4 | Hari | PSIKOLOGI
5 | Sinta | SAINTEK
6 | Ana | PSIKOLOGI
7 | Fandi | SAINTEK
(7 rows)
permata13650083=#
Evaluasi Perbedaan DBMS PostgreSQL dan MySQL
Dari hasil praktikum ini, ternyata semua sintaks
agregasi dan view di PosgreSQL dan MySQL sama. Hanya saja beberapa tampilannya beda.
Cek berikut:
Untuk bilangan desimal, Kalau di MySQL, angka nolnya
ada 4 digit dibelakang koma. Sedangkan PostgreSQL nolnya 15 yang dibelakang
koma. Busyeet.. alay bener yah.. hehe. (*ana keles, yang alay*)
Pada MySQL, jika data kosong maka tertulis “NULL”,
kalo di PosgreSQL ga ada isi(tulisann)nya Sob.
Selain itu pada MySQL juga dicantumin nama kolom yang
dicari nilai terendah (min), nilai tertinggi (max) atau rata-ratanya (avg).
Kalau di PosgreSQL nggak ada. Cek aja deh!
Tugas Rumah
Tugas
rumah kali ini adalah menjelaskan evaluasi dari DBMS MySQL dan PostgreSQL
berdasarkan tugas praktikum yang meliputi perbedaan atau kesamaan, kelebihan
atau kekurangan.
Perbedaan dari kedua DBMS (MySQL dan PosgreSQL) dari
praktikum kali ini udah dijelasin diatas. Semua sintaks MySQL dan PosgreSQL
meliputi agregasi dan view yang digunakan dalam praktikum ini sama. Hanya tampilannya
aja yang beda. Kalo menurut ana sih, tampilan di MySQL lebih enak dipandang
daripada tampilan PosgeSQL, sehingga lebih mudah dipahami.
Kesimpulan
Dari praktikum yang telah dilakukan, dapat
disimpulkan bahwa
Agregasi dalam SQL merupakan proses untuk mendapatkan
nilai dari sekumpulan data yang telah dikelompokkan. Sintaksnya adalah:
SELECT fungsi_agregasi(nama_field) FROM nama_tabel;
GROUP BY digunakan dalam pengelompokan data. Biasanya digunakan
untuk fungsi-fungsi agregasi. Sintaksnya:
SELECT nama_kolom FROM nama_tabel GROUP BY nama_kolom;
HAVING digunakan untuk pembatasan dalam menampilkan
data.
Perintah
CASE digunakan untuk
menampilkan nilai tertentu dari beberapa barisan data dengan syarat-syarat atau
kondisi diberikan. Sintaks case didalam SELECT:
...CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
VIEW merupakan tabel bayangan (bukan tabel asli dan
bukan temporary). Sintaksnya:
CREATE VIEW nama_tabel_view AS query;
Cukup sudah laporan praktikum kali ini. Semoga bisa bermanfaat bagi Sobat semua. Makasih yaa, udah baca-baca di blog ana. See you next laporan...
Referensi:
Modul
Praktikum Desain Basis Data.
http://y4y4ne.blogspot.com/2010/04/penggunaan-view-di-sql-server.html.
http://pribadiwidianto.blogspot.com/2011/12/pengelompokan-data-dan-agregasi-fungsi.html.
http://m24klik.wordpress.com/2013/01/10/sql-functiongroup-by-having/
0 komentar:
Posting Komentar