HAVING

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