Kamis, 21 Februari 2013
Selasa, 05 Februari 2013
Penggunaan GROUP BY dan HAVING Pada SQL
Penggunaan GROUP BY dan HAVING Pada SQL

Melanjutkan tulisan sebelumnya tentang Penggunaan LIKE Operator pada SQL, saya cuma pengen berbagi penderitaan yang saya alami sekarang, bekerja di bawah tekanan macam kerja rodi saja.. huhu..
Pada kesempatan kali ini, saya menulis tentang Penggunaan GROUP BY dan HAVING Pada SQL. Semoga buat temen-temen yang merasa senasib dengan saya, ini bisa sedikit membantu (sedikit aja yah)...
Langsung aja deh cek TKP gan... :D
==========// Pembahasan //==========
Klausa HAVING digunakan untuk menentukan kondisi bagi GROUP BY. Kelompok yang memenuhi HAVING saja yang akan dihasilkan.
Penggunaan Group By.
Group By yang di kenakan dalam SELECT berguna untuk mengelompokkan data berdasarkan ekspresi group.
Contoh :
DAFTAR TEMAN
Nama
|
Kota
|
Umur
|
Pekerjaan
|
Kira yagami
|
Jakarta
|
18
|
Pelajar
|
Lucius Lawliet
|
Bandung
|
20
|
Pegawai
|
Neat River
|
Bandung
|
15
|
Pelajar
|
Mellow
|
Surabaya
|
15
|
Pelajar
|
SELECT Pekerjaan FROM DAFTAR_TEMAN
WHERE Umur > 15
GROUP BY Pekerjaan
Output :
Pekerjaan
|
Pegawai
|
Pelajar
|
SELECT Kota FROM DAFTAR_TEMAN
GROUP BY Kota
Output :
Kota
|
Jakarta
|
Bandung
|
SELECT Umur FROM DAFTAR_TEMAN
GROUP BY Umur
Output :
Umur
|
18
|
20
|
15
|
SELECT Pekerjaan FROM DAFTAR_TEMAN
WHERE Umur <>
GROUP BY Pekerjaan
Pekerjaan
|
Pelajar
|
SELECT Nama FROM DAFTAR_TEMAN
GROUP BY Nama
Output :
Nama
|
Kira yagami
|
Lucius Lawliet
|
Neat River
|
Mellow
|
Penggunaan Having.
DAFTAR NILAI
Nama
|
Nilai
|
Kira yagami
|
80
|
Lucius Lawliet
|
90
|
Neat River
|
70
|
Mellow
|
70
|
SELECT Nilai FROM DAFTAR_NILAI
GROUP BY Nama
HAVING SUM (Nilai) <>
Output :
Nama
|
Nilai
|
Neat River
|
70
|
Mellow
|
70
|
SELECT Nilai FROM DAFTAR_NILAI
GROUP BY Nama
HAVING SUM (Nilai) = 70
Output :
Nama
|
Nilai
|
Neat River
|
70
|
Mellow
|
70
|
SELECT Nilai FROM DAFTAR_NILAI
GROUP BY Nama
HAVING SUM (Nilai) > 70
Ouput :
Nama
|
Nilai
|
Lucius Lawliet
|
90
|
Kira yagami
|
80
|
GROUP BY Nama
HAVING SUM (Nilai) = 90
Output :
Nama
|
Nilai
|
Lucius Lawliet
|
90
|
SELECT Nilai FROM DAFTAR_NILAI
GROUP BY Nama
HAVING SUM (Nilai) <>
Output :
Nama
|
Nilai
|
Kira yagami
|
80
|
Neat River
|
70
|
Mellow
|
70
|
sql
Mengamankan aplikasi terhadap injeksi SQL
Bagi sistem basis data yang mendukung placeholder secara asli, seringkali ada keuntungan kinerja yang nyata untuk menggunakan placeholder, karena basis data dapat menyimpan cache dari sebuah perwakilan pernyataan yang terkompilasi dan menggunakannya secara berulang di antara pelaksanaan-pelaksanaan dengan nilai-nilai ikatan yang berbeda. Placeholder kadang-kadang juga disebut sebagai "variabel pengikat".
Dalam PHP, terdapat beberapa fungsi bawaan yang berbeda untuk digunakan pada SMBD-SMBD yang berbeda untuk meloloskan nilai-nilai yang cocok untuk diimbuhkan dalam pernyataan-pernyataan SQL harafiah. Untuk MySQL, yang serupa dengan ini adalah fungsi bawaan mysql_real_escape_string:
Dalam bahasa pemrograman Java, yang serupa adalah kelas PreparedStatement.
Daripada
Daripada
Kebanyakan basis data juga menawaran kemampuan untuk menyiapkan pernyataan-pernyataan SQL pada lapisan basis data melalui stored procedure. Daripada menggunakan sebuah lapisan aplikasi untuk merangkai SQL secara dinamis, stored procedure membungkus prosedur-prosedur basis data pakai-ulang yang dipanggil dengan parameter-parameter bertipe. Ini menyediakan beberapa keuntungan keamanan: dengan membuat masukan-masukan menjadi parameter dan mewajibkan tipe pada mereka, masukan pengguna secara efektif tersaring. Sebagai tambahan, kebanyakan basis data mengijinkan stored procedure untuk berjalan di bawah hak-hak keamanan yang berbeda daripada pengguna basis data. Misalnya, sebuah aplikasi akan memiliki akses untuk menjalankan sebuah stored procedure, tetapi tidak memiliki akses ke tabel-tabel dasarnya. Ini membatasi kemampuan aplikasi untuk melakukan sesuatu yang di luar aksi-aksi yang dituliskan di dalam stored procedure.
Yang juga penting untuk dicatat adalah metode kueri standar dari pustaka client C MySQL tidak akan mengijinkan lebih daripada sebuah kueri dalam sebuah masukan, mencegah serangan banyak-pernyataan yang dipaparkan di atas. Namun begitu, masukan pengguna baik-baik yang mengandung karakter-karakter pelolos (misalnya tanda kutip tunggal) tetap dapat menyebabkan aplikasi tidak berjalan karena sintaks SQL yang buruk. Bahkan beberapa serangan juga mungkin terjadi, sebagai contoh misalkan sebuah situs web yang memperlihatkan sebuah daftar barang untuk sebuah nama pengguna yang dikenal. Kueri yang dijalankan adalah:
Perbaikan aplikasi
Injeksi SQL dapat dengan mudah diatasi dalam kebanyakan bahasa pemrograman yang menargetkan aplikasi web atau menawarkan fungsi. Dalam DBI di Perl, metode DBI::quote meloloskan karakter-karakter khusus (anggaplah variabel $sql menyimpan referensi ke sebuah obyek DBI):$kueri = $sql->prepare ( "select * from pengguna where nama = " . $sql->quote($nama_pengguna) );Namun begitu, secara umum ini bukan jalan yang terbaik dalam menghadapi masalah tersebut. DBI mengijinkan penggunaan placeholder, yang memperbolehkan Anda untuk mengikat data ke sebuah pernyataan secara terpisah dari pendefinisian pernyataan SQL tersebut. Untuk sistem basis data yang tidak secara asli mendukung placeholder, DBI menirukannya dengan menggunakan fungsi DBI::quote secara otomatis pada nilai-nilai. Banyak sistem basis data yang mendukung pengikatan nilai secara terpisah melalui API mereka; DBI akan menggunakan dukungan placeholder asli tersebut dalam hal ini. Sebagai contoh:
$kueri = $sql->prepare("select * from pengguna where nama = ?"); $kueri->execute($nama_pengguna);Keuntungannya adalah Anda tidak perlu mengingat untuk menggunakan DBI::quote kepada setiap nilai. Nilai-nilai akan diikat secara terpisah, atau dikutip secara benar, tergantung pada dukungan yang ditawarkan oleh SMBD tertentu yang Anda gunakan. Anda kemudian terhindari dari masalah dasar injeksi SQL di mana nilai-nilai diinterpretasi sebagai SQL.
Bagi sistem basis data yang mendukung placeholder secara asli, seringkali ada keuntungan kinerja yang nyata untuk menggunakan placeholder, karena basis data dapat menyimpan cache dari sebuah perwakilan pernyataan yang terkompilasi dan menggunakannya secara berulang di antara pelaksanaan-pelaksanaan dengan nilai-nilai ikatan yang berbeda. Placeholder kadang-kadang juga disebut sebagai "variabel pengikat".
Dalam PHP, terdapat beberapa fungsi bawaan yang berbeda untuk digunakan pada SMBD-SMBD yang berbeda untuk meloloskan nilai-nilai yang cocok untuk diimbuhkan dalam pernyataan-pernyataan SQL harafiah. Untuk MySQL, yang serupa dengan ini adalah fungsi bawaan mysql_real_escape_string:
$hasil_kueri = mysql_query ( "select * from pengguna where nama = '" . mysql_real_escape_string($nama_pengguna) . "'" );Antarmuka asli untuk sebuah SMBD tertentu dapat juga menawarkan sebuah metode untuk melakukan pengikatan placeholder secara terpisah, misalnya mysql_stmt_bind_param atau oci_bind_by_name. Selain itu, sebuah pustaka abstraksi basis data dapat digunakan untuk menirukan placeholder dalam cara yang mirip dengan DBI dari Perl. Sebuah contoh dari beberapa pustaka yang ada ialah ADOdb.
Dalam bahasa pemrograman Java, yang serupa adalah kelas PreparedStatement.
Daripada
Connection con = (peroleh koneksi) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM pengguna WHERE nama = '" + userName + "';");gunakan yang berikut
Connection con = (peroleh koneksi) PreparedStatement pstmt = con.prepareStatement("SELECT * FROM pengguna WHERE nama = ?"); pstmt.setString(1, namaPengguna); ResultSet rset = pstmt.executeQuery();Dalam bahasa pemrograman "C#" .NET atau Mono, yang serupa adalah obyek-obyek ADO.NET SqlCommand (untuk Microsoft SQL Server) atau OracleCommand (untuk server basis data Oracle). Contoh di bawah ini memperlihatkan bagaimana mencegah serangan injeksi menggunakan obyek SqlCommand. Kode untuk penyedia ADO.NET lainnya sangat mirip, tetapi dapat sedikit berbeda tergantung pada implementasi khusus yang dibuat oleh vendor penyedia tersebut.
Daripada
using( SqlConnection con = (peroleh koneksi) ) { con.Open(); using( SqlCommand cmd = new SqlCommand("SELECT * FROM pengguna WHERE nama = '" + namaPengguna + "'", con) ) { using( SqlDataReader rdr = cmd.ExecuteReader() ) { ... } } }gunakan yang berikut
using( SqlConnection con = (peroleh koneksi) ) { con.Open(); using( SqlCommand cmd = new SqlCommand("SELECT * FROM users WHERE name = @namaPengguna", con) ) { cmd.Parameters.AddWithValue("@namaPengguna", namaPengguna); using( SqlDataReader rdr = cmd.ExecuteReader() ) { ... } } }
Perbaikan basis data
Mengatur hak-hak keamanan pada basis data ke kebutuhan yang paling minim adalah sebuah perbaikan yanng sederhana. Tidak banyak aplikasi yang memerlukan pengguna untuk memiliki hak menghapus sebuah tabel atau basis data.Kebanyakan basis data juga menawaran kemampuan untuk menyiapkan pernyataan-pernyataan SQL pada lapisan basis data melalui stored procedure. Daripada menggunakan sebuah lapisan aplikasi untuk merangkai SQL secara dinamis, stored procedure membungkus prosedur-prosedur basis data pakai-ulang yang dipanggil dengan parameter-parameter bertipe. Ini menyediakan beberapa keuntungan keamanan: dengan membuat masukan-masukan menjadi parameter dan mewajibkan tipe pada mereka, masukan pengguna secara efektif tersaring. Sebagai tambahan, kebanyakan basis data mengijinkan stored procedure untuk berjalan di bawah hak-hak keamanan yang berbeda daripada pengguna basis data. Misalnya, sebuah aplikasi akan memiliki akses untuk menjalankan sebuah stored procedure, tetapi tidak memiliki akses ke tabel-tabel dasarnya. Ini membatasi kemampuan aplikasi untuk melakukan sesuatu yang di luar aksi-aksi yang dituliskan di dalam stored procedure.
Yang juga penting untuk dicatat adalah metode kueri standar dari pustaka client C MySQL tidak akan mengijinkan lebih daripada sebuah kueri dalam sebuah masukan, mencegah serangan banyak-pernyataan yang dipaparkan di atas. Namun begitu, masukan pengguna baik-baik yang mengandung karakter-karakter pelolos (misalnya tanda kutip tunggal) tetap dapat menyebabkan aplikasi tidak berjalan karena sintaks SQL yang buruk. Bahkan beberapa serangan juga mungkin terjadi, sebagai contoh misalkan sebuah situs web yang memperlihatkan sebuah daftar barang untuk sebuah nama pengguna yang dikenal. Kueri yang dijalankan adalah:
SELECT * from barang where namapengguna='$namapengguna';Seorang penyerang dapat memakai nama pengguna yang dirangkai secara khusus untuk mengetahui semua barang milik semua pengguna:
$namapengguna = "' or namapengguna is not null or namapengguna='";menghasilkan pernyataan SQL sebagai berikut:
SELECT * from barang where namapengguna='' or namapengguna is not null or namapengguna='';Ingatlah, walaupun begitu, bahwa meloloskan atau menghapus tanda kutip tidak melenyapkan risiko injeksi SQL sepenuhnya. Misalkan kueri Anda tampak seperti ini:
SELECT * from barang where idpengguna=$idpengguna;Dengan anggapan bahwa $idpengguna merupakan nilai numerik tetapi dibiarkan lolos tanpa diperiksa, idpengguna yang dirangkai khusus ini akan, sekali lagi, memperlihatkan semua barang milik semua pengguna:
$idpengguna = "33 or idpengguna is not null or userid=44";Yang seperti dapat Anda lihat, tidak mengandung tanda kutip sama sekali dan akan menghasilkan kueri ini:
SELECT * from barang where idpengguna=33 or idpengguna is not null or idpengguna=44;Pertahanan yang terbaik, daripada membuat daftar hitam masukan buruk yang diketahui, adalah hanya mengijinkan masukan baik yang diketahui, atau, dengan kata lain, membuat daftar putih. Misalnya, jika Anda ingin bertahan terhadap serangan ini, Anda dapat memeriksa variabel idpengguna untuk memastikan bahwa isinya numerik seperti berikut:
if(!ctype_digit($idpengguna)){ die("Karakter-karakter yang tidak sah dalam idpengguna."); }
SCRIPT SQL DDL & DML
SCRIPT SQL DDL & DML
DDL (Data Definition Language) : Sebuah perintah SQL yang Berorientasi pada pembentukan atau penghapusan database, table dan index.
· Database:
1. Membuat database
Create database nama_database;
2. Menampilkan Seluruh Database
Show database;
3. Mengaktifkan Database
Use nama_database;
4. Menghapus Database
Drop database nama_database;
5. Membuat table
Create table nama_table(field1 tipe_data(size),field2 tipe_data(size),…….);
6. Menghapus Tabel
Drop table nama_tabel;
7. Mengganti nama tabel
Rename table nama_tabel lama to nama_tabel baru;
· Memodifikasi table : Macam Modifikasi table, yaitu menambahkan field, mengganti size record suatu field, menhapus field, dan mengganti nama field
1. Menambahkan field
Alter table nama_table add column field tipe_data(size);
Untuk menyisipkan/menambahkan field pada awal field
Alter table nama_table add column field tipe_data(size) first;
Untuk menyisipkan/menambahkan field setelah field tertentu
Alter table nama_table add column field tipe_data(size) after nama_column;
2. Mengganti nama,tipe data, size Field
Alter table nama_table change old_field new_field tipe_data(size);
3. Mengganti Tipe Data field
Alter table nama_table modify field new_tipe(size);
4. Menghapus nama Field
Alter table nama_table drop field;
5. Menampilkan struktur table
Desc nama_tabel;
6. Menghapus table
Drop table nama_table;
7. Menampilkan seluruh Tabel
Show tables;
INDEX: berfungsi mempercepat proses pencarian data dalam suatu table
1. Membuat Index
Create index nama_index add index nama_table(field);
2. Menghapus Index
Alter table nama_table drop index nama_index;
3. Membuat Primary Key
Alter table nama_tabel add primary key(field_name);
4. Mengahapus Primary Key
Alter table nama_tabel drop primary key(field_name);
DML (Data Manipulation language) : Perintah SQL Yang Berhubungan dengan data atau record, diantaranya menampilkan data, menghapus data, atau meng-update data
1 . INSERT : Menyisipkan Nilai-Nilai pada field-field Tabel
Insert into nama table values(“nil1”,”nil2”,”nil3”,”….”);
2. SELECT : Menampilkan Record atau data
- Menampilkan record/data tanpa kondisi (Keseluruhan)
Select*from nama_table;
- Menampilkan record/data dengan kondisi
Select*from nama_table where kondisi;
Atau
Select field1,…from nama_table where kondisi;
3. UPDATE : digunakan melakukan penyimpanan hasil Editing sustu data
- Mengupdate data tanpa kondisi
Update nama_table set field=nilai;
- Mengupdate data dengan kondisi
Update nama_table set field=nilai where kondisi;
4.DELETE : Untuk menghapus suatu data pada suatu table
- Menghapus record / data tanpa kondisi
Delete from nama_table;
-Menghapus record / data dengan kondisi
Delete from nama_table where kondisi;
Langganan:
Postingan (Atom)