Ortak Değer İşlevleri
Önceki SQL Dili Sonraki
Ortak Değer İşlevleri
Çoğu ilişkisel veritabanı ürünü gibi PostgreSQL'de ortak değer işlevlerini destekler. Bir ortak değer işlevi çok sayıda satırı girdi olarak alır ve bunlardan tek bir sonuç elde eder. Belli bir satır grubu üzerinde işlem yaparak, bunların sayısını bulan count, değerlerinin toplamını bulan sum, değerlerinin ortalamasını hesaplayan avg, en büyük ve en küçük değerleri bulan max ve min işlevleri bunlara birer örnektir.
Örnek olarak, düşük sıcaklık değerlerinin en yükseğini bulalım:
SELECT max(tmp_lo) FROM weather;
 max
-----
  46
(1 row)
Eğer bu sıcaklığın hangi şehir (veya şehirlerde) ortaya çıktığını bulmak istersek,
SELECT city FROM weather WHERE tmp_lo = max(tmp_lo);     YANLIŞ
bu çalışmaz, çünkü max işlevi WHERE deyiminde kullanılamaz. (Böyle bir sınırlamanın olmasının sebebi, WHERE deyiminin ortak değeri bulunacak satırların belirlenmesinde kullanılmak zorunda olmasıdır; yani, deyim, işlevden önce değerlendirilmiş olmalıdır.) Bu durumda böyle bir sorunu gidermek için sorgunun yeniden durumlanabilmesini sağlayan aşağıdaki gibi bir altsorgu (subquery) kullanılır:
SELECT city FROM weather
    WHERE tmp_lo = (SELECT max(tmp_lo) FROM weather);
     city
---------------
 San Francisco
(1 row)
Şimdi her şey yolunda. Çünkü ortak değer bulma bir altsorgu ile yapıldıktan sonra sonuç dış sorguda karşılaştırma değeri olarak kullanıldı.
Ortak değer işlevleri GROUP BY deyimi ile kullanıldığında oldukça yararlıdır. Örneğin her şehrin en yüksek düşük sıcaklığını bulmak için şunu yazabiliriz:
SELECT city, max(tmp_lo)
    FROM weather
    GROUP BY city;
Bu bize her şehir için bir değer verecektir:
     city      | max
---------------+-----
 Hayward       |  37
 San Francisco |  46
(2 rows)
Burada, satırlar şehirlere göre gruplanmakta, her gruptaki satırlar üzerinde max işlevi hesaplanmakta ve sonuçlar listelenmektedir. Hesaplamaya dahil olacak satırları HAVING deyimini kullanarak gruplayabiliriz:
SELECT city, max(tmp_lo)
    FROM weather
    GROUP BY city
    HAVING max(tmp_lo) < 40;
  city   | max
---------+-----
 Hayward |  37
(1 row)
Sadece tmp_lo değeri 40'ın altında olan şehirleri listelelemsi dışında bu cümle de aynı sonucu verir. Eğer bir de bu işi abartıp sadece "S" ile başlayan şehir isimlerini istersek:
SELECT city, max(tmp_lo)
    FROM weather
    WHERE city LIKE 'S%'    
    GROUP BY city
    HAVING max(tmp_lo) < 40;
1
LIKE işleci kalıp eşleştirmesi yapar ve PostgreSQLTM 8.0 belgelerindeki Kalıp Eşleme bölümünde açıklanmıştır.
SQL dilinde WHERE ve HAVING deyimlerinin ortak değer işlevleri ile nasıl etkileşime girdiğinin anlaşılması önemlidir. WHERE ve HAVING deyimleri arasındaki temel fark şudur: WHERE satırları, gruplar ve ortak değerler hesaplanmadan önce seçer (ortak değer hesaplamasında kullanılacak satırları seçer), HAVING deyimi ise ortak değerler hesaplandıktan ve gruplamalar yapıldıktan sonra işleme sokulur. Sonuç olarak, WHERE ifadelerinde (altsorgu dışında) ortak değer bulma işlemleri kullanılmazken, HAVING deyimlerinde kaçınılmazdır. (Aslında HAVING deyimleri içinde ortak değer işlevleri dışında ifadeler de kullanmanıza izin verilmiştir ama, bu biraz savurganlık olur; böyle bir koşulu WHERE deyiminde kullanmak daha verimlidir.)
Önceki örnekte, WHERE deyiminde bir ortak değer bulma işlemine ihtiyaç duyulmadığından, şehir isimlerine kısıtlama uygulamıştık. Bu, kısıtlamanın HAVING ile sağlanmasından daha uygundur; çünkü gruplamanın ve ortak değer hesaplamasının WHERE sınamasından geçemeyen satırlar için yapılması gereksizdir.
Önceki Üst Ana Başlık Sonraki
Tablolar Arası Katılım Başlangıç Verilerin Güncellenmesi
Bir Linux Kitaplığı Sayfası