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.
1package main23import (4"database/sql"5"fmt"6"log"78_ "github.com/lib/pq"9)1011func main() {12db, err:= sql.Open("postgres", "user=admin password=123 dbname=satisdb sslmode=disable")13if err!= nil {14log.Fatal(err)15}16defer db.Close()1718var toplamStok int19err = db.QueryRow("SELECT SUM(stok) FROM urunler").Scan(&toplamStok)20if err!= nil {21log.Fatal(err)22}2324fmt.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 string2var adet int34rows, err:= db.Query("SELECT kategori, COUNT(*) FROM urunler GROUP BY kategori")5if err!= nil {6log.Fatal(err)7}8defer rows.Close()910for 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ün2Giyim: 120 ürün3Yiyecek: 89 ürünAggregate 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.
2 yorum
aggregate fonksiyonlar kullanmak veritabanı sorgusu yazarken en temel şey ama çoğu kişi GROUP BYı unutup hata yapıyor
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