5 Query SQL yang Paling Sering Dipakai Analis Data
Kebanyakan pekerjaan analis data cukup dengan lima pola query: SELECT-WHERE, GROUP BY, HAVING, ORDER BY-LIMIT, dan CASE WHEN. Ini contohnya dengan data penjualan.
Ingin mulai belajar SQL tapi bingung harus menghafal apa? Kabar baiknya, sebagian besar pekerjaan analis data sehari-hari hanya memakai beberapa pola query. Daripada menghafal puluhan perintah, kuasai lima pola yang sering muncul ini, lalu latih dengan data kecil yang hasilnya bisa kamu hitung di kepala. Kita pakai satu tabel contoh bernama penjualan:
| id | tanggal | kota | produk | jumlah | harga |
|---|---|---|---|---|---|
| 1 | 2026-09-01 | Bandung | Kopi | 3 | 25000 |
| 2 | 2026-09-01 | Jakarta | Teh | 2 | 18000 |
| 3 | 2026-09-02 | Jakarta | Kopi | 5 | 25000 |
| 4 | 2026-09-03 | Surabaya | Roti | 4 | 15000 |
| 5 | 2026-09-03 | Bandung | Teh | 1 | 18000 |
| 6 | 2026-09-04 | Jakarta | Roti | 6 | 15000 |
| 7 | 2026-09-05 | Surabaya | Kopi | 3 | 25000 |
Omzet tiap transaksi adalah jumlah * harga. Hitung dulu supaya mudah memeriksa hasil query: transaksi 1 = 75.000, 2 = 36.000, 3 = 125.000, 4 = 60.000, 5 = 18.000, 6 = 90.000, 7 = 75.000. Total seluruhnya 479.000.
Menyaring data dengan WHERE
SELECT tanggal, produk, jumlah * harga AS omzet
FROM penjualan
WHERE kota = 'Jakarta'
ORDER BY omzet DESC;
Hasilnya tiga transaksi Jakarta, dari omzet terbesar:
| tanggal | produk | omzet |
|---|---|---|
| 2026-09-02 | Kopi | 125000 |
| 2026-09-04 | Roti | 90000 |
| 2026-09-01 | Teh | 36000 |
AS omzet memberi nama baru pada kolom hasil hitungan, dan nama itu bisa dipakai di ORDER BY.
Meringkas dengan GROUP BY
Pertanyaan paling umum dari atasan: "Kota mana yang omzetnya paling besar?"
SELECT kota, COUNT(*) AS transaksi, SUM(jumlah * harga) AS omzet
FROM penjualan
GROUP BY kota
ORDER BY omzet DESC;
| kota | transaksi | omzet |
|---|---|---|
| Jakarta | 3 | 251000 |
| Surabaya | 2 | 135000 |
| Bandung | 2 | 93000 |
Cek cepat: 251.000 + 135.000 + 93.000 = 479.000, sama dengan total seluruh transaksi. Kebiasaan menjumlah ulang seperti ini menyelamatkanmu dari query yang salah tapi tampak meyakinkan.
Menyaring hasil ringkasan dengan HAVING
WHERE menyaring baris sebelum dikelompokkan, sedangkan HAVING menyaring setelah dikelompokkan:
SELECT kota, SUM(jumlah * harga) AS omzet
FROM penjualan
GROUP BY kota
HAVING SUM(jumlah * harga) > 100000;
Hanya Jakarta (251.000) dan Surabaya (135.000) yang lolos. Bandung (93.000) tersaring karena di bawah 100.000.
Ingin lebih dalam? Artikel ini baru membahas sebagian kecil. Di ebook SQL untuk Analis Data, kamu akan mempelajari lebih jauh:
- Mengambil dan menyaring data dengan SELECT dan WHERE
- Menggabungkan beberapa tabel dengan JOIN tanpa bingung
- Meringkas data dengan agregasi dan GROUP BY
Semua langkahnya disusun berurutan dan bisa langsung dipraktikkan. Lihat isi bukunya.
Mencari yang teratas dengan ORDER BY dan LIMIT
SELECT produk, SUM(jumlah) AS terjual
FROM penjualan
GROUP BY produk
ORDER BY terjual DESC
LIMIT 1;
Produk terlaris adalah Kopi dengan 11 unit (3 + 5 + 3). Sebagai pembanding, Roti terjual 10 unit dan Teh 3 unit. Ganti LIMIT 1 menjadi LIMIT 5 untuk mendapatkan daftar 5 teratas.
Membuat kolom bersyarat dengan CASE WHEN
CASE WHEN berguna untuk menghitung beberapa kategori sekaligus dalam satu query, mirip pivot di Excel:
SELECT kota,
COUNT(*) AS transaksi,
SUM(CASE WHEN produk = 'Kopi' THEN jumlah * harga ELSE 0 END) AS omzet_kopi
FROM penjualan
GROUP BY kota
ORDER BY kota;
| kota | transaksi | omzet_kopi |
|---|---|---|
| Bandung | 2 | 75000 |
| Jakarta | 3 | 125000 |
| Surabaya | 2 | 75000 |
Logikanya: untuk setiap baris, jika produknya Kopi maka nilai omzet dipakai, selain itu dihitung 0. Setelah itu SUM menjumlahkan per kota.
Sekilas tentang JOIN
Data di dunia nyata biasanya tersebar di beberapa tabel. Misalkan ada tabel kedua bernama kategori:
| produk | kategori |
|---|---|
| Kopi | Minuman |
| Teh | Minuman |
| Roti | Makanan |
Untuk mengetahui omzet per kategori, gabungkan kedua tabel dengan JOIN pada kolom yang sama:
SELECT k.kategori, SUM(p.jumlah * p.harga) AS omzet
FROM penjualan p
JOIN kategori k ON k.produk = p.produk
GROUP BY k.kategori;
Hasilnya: Minuman 329.000 (Kopi 275.000 ditambah Teh 54.000) dan Makanan 150.000. Jumlahnya 479.000, sama dengan total omzet seluruh transaksi, itu tanda penggabungannya benar. Huruf p dan k hanyalah nama singkat (alias) agar query tidak terlalu panjang.
Urutan menulis dan urutan berjalannya query
Kamu menulis query dengan urutan SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT. Namun database menjalankannya dengan urutan logis yang berbeda:
| Urutan jalan | Tahap | Fungsi |
|---|---|---|
| 1 | FROM / JOIN | Menentukan tabel sumber |
| 2 | WHERE | Menyaring baris mentah |
| 3 | GROUP BY | Mengelompokkan baris |
| 4 | HAVING | Menyaring kelompok |
| 5 | SELECT | Memilih dan menghitung kolom |
| 6 | ORDER BY | Mengurutkan hasil |
| 7 | LIMIT | Memotong jumlah baris |
Dari sini jelas kenapa WHERE tidak bisa memakai SUM(...): saat WHERE berjalan, pengelompokan belum terjadi.
Kesalahan yang sering dilakukan pemula
- Memakai
SELECT *untuk semuanya. Sebutkan kolom yang dibutuhkan. Hasilnya lebih mudah dibaca dan lebih ringan untuk tabel besar. - Lupa memasukkan kolom ke
GROUP BY. Setiap kolom diSELECTyang bukan fungsi agregat (SUM,COUNT,AVG) harus ada diGROUP BY. - Membandingkan
NULLdengan=. Nilai kosong tidak bisa dicek dengan= NULL. PakaiIS NULLatauIS NOT NULL. - Menukar
WHEREdanHAVING.WHEREmenyaring baris mentah,HAVINGmenyaring hasil ringkasan. - Menyamakan
COUNT(*)danCOUNT(kolom).COUNT(*)menghitung semua baris, sedangkanCOUNT(kolom)melewati baris yang kolomnya kosong. - Percaya hasil tanpa memeriksa. Jumlahkan ulang hasil per kelompok dan bandingkan dengan total.
Latihan dengan tabel yang sama
Coba tulis sendiri query-nya sebelum melihat jawaban:
- Berapa total omzet, dikelompokkan per produk?
- Berapa rata-rata omzet per transaksi?
- Berapa total omzet pada tanggal 2026-09-03?
Jawabannya: (1) Kopi 275.000, Roti 150.000, Teh 54.000, memakai GROUP BY produk. (2) Total omzet 479.000 dibagi 7 transaksi, sekitar 68.429, memakai AVG(jumlah * harga). (3) 78.000, dari transaksi Roti di Surabaya (60.000) dan Teh di Bandung (18.000), memakai WHERE tanggal = '2026-09-03'.
Kalau hasilmu berbeda, periksa dulu apakah kamu menghitung jumlah * harga dan bukan hanya salah satunya.
Langkah berikutnya
Kuasai lima pola ini sampai lancar, lalu lanjutkan ke subquery dan window function untuk analisis yang lebih tajam, seperti peringkat dan total berjalan. Cara termudah berlatih: buat tabel kecil sendiri di SQLite atau MySQL, isi dengan data dari kehidupanmu, lalu ajukan pertanyaan seperti di atas.
Kalau artikel ini membantu, langkah berikutnya ada di ebook SQL untuk Analis Data.
Pelajari sampai tuntas di “SQL untuk Analis Data”
Hampir semua data perusahaan tersimpan di database, dan SQL adalah bahasa untuk bertanya kepadanya. Buku ini mengajarkan SQL dari query pertama sampai teknik analisis yang dipakai...