SQL Aggregate Fonksiyonları: Go ile Veritabanı Sorguları

Veritabanından bir tabloyu tamamen çekmek yerine, verileri özetlemek çoğu zaman daha verimli olur. SQL aggregate fonksiyonları bunun için vardır. Go ile bu fonksiyonları kullanmak basit ama doğru yapmanız gerekiyor.

SQL'de beş ana aggregate fonksiyonu vardır: COUNT (satır sayısı), SUM (toplam), AVG (ortalama), MIN (en küçük) ve MAX (en büyük). Bunlar tüm satırları işleyip tek bir sonuç dönerler.

Örneğin, bir satış tablosundan toplam gelir, ortalama sipariş değeri ya da kaç müşteri olduğunu öğrenmek için aggregate fonksiyonlar kullanırsınız. Uygulamanız milyonlarca satırı işlemek yerine, veritabanı bunu yapar ve sadece sonuç döner.

Go'da SQL sorgusu çalıştırmak için database/sql paketini kullanırsınız. Aggregate sonucu tek bir değer olduğu için, QueryRow metodu işinizi görecektir.

Basit bir örnek: Bir ürün tablosundan toplam stok miktarını almak.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main
2
3import (
4"database/sql"
5"fmt"
6"log"
7
8_ "github.com/lib/pq"
9)
10
11func main() {
12db, err:= sql.Open("postgres", "user=admin password=123 dbname=satisdb sslmode=disable")
13if err!= nil {
14log.Fatal(err)
15}
16defer db.Close()
17
18var toplamStok int
19err = db.QueryRow("SELECT SUM(stok) FROM urunler").Scan(&toplamStok)
20if err!= nil {
21log.Fatal(err)
22}
23
24fmt.Printf("Toplam stok: %d\n", toplamStok)
25}

Bu kod çalıştığında şöyle bir çıktı verir:

1Toplam stok: 5420

Çoğu zaman tek bir sayı yeterli olmaz. Kategoriye göre toplam satış, her müşterinin kaç siparişi olduğu gibi bilgiler lazım olur. Bunun için GROUP BY kullanırsınız.

1var kategori string
2var adet int
3
4rows, err:= db.Query("SELECT kategori, COUNT(*) FROM urunler GROUP BY kategori")
5if err!= nil {
6log.Fatal(err)
7}
8defer rows.Close()
9
10for rows.Next() {
11err:= rows.Scan(&kategori, &adet)
12if err!= nil {
13log.Fatal(err)
14}
15fmt.Printf("%s: %d ürün\n", kategori, adet)
16}

Çıktı:

1Elektronik: 45 ürün
2Giyim: 120 ürün
3Yiyecek: 89 ürün

Aggregate fonksiyonları NULL değerleri görmezden gelir (COUNT(*) hariç). SUM null satırları atlar. Eğer sonuç boşsa, NULL döner; Go'da bunu sql.NullInt64 gibi nullable tipler ile yakalayabilirsiniz.

Performans için, aggregate sorguları WHERE ile filtreledikten sonra yapın. Milyonlarca satırdan sadece gerekli olanı seçip, sonra özet alın.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz

2 yorum

  • adlı kullanıcıya yanıt verdi
    terslale

    benim de başına geldi COUNT kullanıp GROUP BY koymayınca veritabanı hata verdi o andan sonra her aggregate için önce GROUP BY yazıyorum

  • cumburlop

    aggregate fonksiyonlar kullanmak veritabanı sorgusu yazarken en temel şey ama çoğu kişi GROUP BYı unutup hata yapıyor