Having adalah klausa yang digunakan dengan group by. Kegunaannya sama dengan where. Tujuan keberadaannya adalah untuk membedakan kondisi milik where yang jadi syarat statement utama dan having yang digunakan oleh group by. Dengan having, hasil dari pengelompokkan bisa dibatasi berdasarkan kondisi tertentu.
Sintaksnya :
- Statement_select Group By nama_kolom having kondisi
Contoh Query :
- SELECT kelas, Sum(nilai) AS total, Avg(nilai) AS mean FROM siswa Group By kelas having avg (nilai) > 50
Contoh kode program:
//install librarynya kalau belum ada
#include <iostream>
#include <sqlite3.h>
char *err;
typedef char stringku[30];
static char nama_kolom[3][10]={"Kelas","Total", "Rata-rata"};
int callback(void *notused, int jkolom, char **dataku, char **kolom){
for(int i=0;i<jkolom;i++){
printf("%s : %s\n", nama_kolom[i], dataku[i]);
}
printf("\n");
return 0;
}
void isi_database(sqlite3 *conn){
char query[255];
static stringku data[8][3]={{"Deri", "3A", "75"}, {"Panji", "3A", "95"}, {"Romi", "3A", "80"}, {"Doni", "3B", "70"}, {"Jennie", "3B", "60"}, {"Roni", "3C", "50"}, {"Hani", "3C", "45"}, {"Mini", "3C", "40"}};
sqlite3_exec(conn, "Create Table siswa(id INTEGER Primary Key, nama Text, kelas Text, nilai INTEGER);", 0, 0, &err);
//tambahkan data
for(int i=0;i<8;i++){
sprintf(query, "INSERT INTO siswa(id, nama, kelas, nilai) VALUES('%d', '%s', '%s', '%s')", i, data[i][0], data[i][1], data[i][2]);
sqlite3_exec(conn, query, 0, 0, &err);
}
}
int main(){
int res=0;
sqlite3 *conn=NULL;
sqlite3_stmt *stmt=NULL;
sqlite3_open("databaseku.dat", &conn);
//jika database kosong, tambah tabel
sqlite3_exec(conn, "Drop Table siswa", 0, 0, &err);
isi_database(conn);
//gunakan query
printf("\lebih besar dari 50\n");
sqlite3_exec(conn, "SELECT kelas, Sum(nilai) AS total, Avg(nilai) AS mean FROM siswa Group By kelas having avg(nilai) > 50", callback, 0, &err);
printf("\n0-50\n");
sqlite3_exec(conn, "SELECT kelas, Sum(nilai) AS total, Avg(nilai) AS mean FROM siswa Group By kelas having avg(nilai) <= 50", callback, 0, &err);
sqlite3_close(conn);
return 0;
}
Output :
lebih besar dari 50 Kelas : 3A Total : 250 Rata-rata : 83.3333333333333 Kelas : 3B Total : 130 Rata-rata : 65.0 0-50 Kelas : 3C Total : 135 Rata-rata : 45.0