SQL-2

BÖLÜM-3 SQL'DE ARİTMETİKSEL İFADELER VE FONKSİYONLAR
GRUPLANDIRARAK İŞLEM YAPMA
SUM FONKSİYONU
MAX FONKSİYONU MİN FONKSİYONU
COUNT FONKSİYONU
BİRDEN FAZLA TABLOYUYU İLİŞKİLENDİREREK SORGULAMA
BİRLEŞTİRME İŞLEMİ JOİN
BİR TABLONUN FARKLI İSİMLERDEKİ EŞDEĞERLERİ İLE SORGULAMA
İÇİÇE SELECT KOMUTLARI (NESTED SELECTS) ALT SORGULAMALAR

BÖLÜM 3 SQL'DE ARİTMATİKSEL İFADELER VE FONKSİYONLAR
GRUPLANDIRARAK İŞLEM YAPMA
Bir tablo üzerindeki bilgileri bazı özelliklere göre gruplandırarak listeleme yapabiliriz.Bunun için kullanılan komut GROUP BY sözcükleridir.
Örnek:
Her bölümdeki ortalama maaş nedir?
Personel tablosundaki satırlar,bölüm numaralarına göre (bolumno ) gruplandırılarak,her bir grubun maaş ortalaması ayrı ayrı hesaplanarak listelenebilir.
SELECT  bolumno,AVG (brut)FROM personel GROUP BY bolumno;
Avg:
 Avg sözcüğü matematiksel ortalama hesaplamak için kullanılır.
            Bolumno           AVG(brut)
            1                 25000000
            2                 45000000
            3                 78000000
Örnek:
Her bölümdeki en yüksek maaşı alan kişiler listelenmek istendiğinde:
SELECT bolumno,MAX (brut),ad,soyad FROM personel GROUP BY bolumno;
Gruplandırarak kümeleme fonksiyonlarını uygularken, koşul da verilebilir. Bu durumda, grup üzerindeki hesaplamalarla ilişkili koşul belirtilirken HAVING sözcüğünü kullanmak gerekir.
Örnek: En yüksek maaşın, 90000000 'dan fazla olduğu bölümlerde personele ait ortalama maaşları listeleyiniz?
SELECT bolumno,AVG(brut)FROM personel GROUP BY bolumno HAVING  AVG (brut) < 90000000;
Personel tablosunda aşağıdaki bilgiler bulunsun.
         Bolumno                 Brut
 
           1                  25000000
            1                145000000
            2                  78000000 
            3                120000000 
            1                  18000000

Yukarıdaki SELECT komutunun sonucunda,
          Bolumno            AVG_brut
              1                145000000
              3                120000000    tablosu elde edilecektir.
  HAVING sözcüğü,SELECT komutunda GROUP BY sözcükleri bulunmadığı zaman, geçersizdir.HAVING sözcüğünü izleyen ifade içinde,SUM,COUNT (*),AVG,MAX yada MIN gibi kümeleme fonksiyonlarından en az biri bulunmaktadır.
Sum:
Fonksiyonun argümanı olarak belirtilen sütun ile ilişkili olarak toplama işlemini gerçekleştirir.
Max:
Tablo içinde,belirtilen sütun (alan)içindeki en büyük değeri bulur.
Min:
Tablo içinde,belirlenen sütun (alan) içindeki en küçük değeri bulur.
Count:
Tablo içerisinde herhangi bir sayma işlemi gerçekleştirmek için kullanılır.
  WHERE sözcüğü bir tablonun tek tek satırları üzerinde işlem yapan koşullar için geçerli iken,HAVING sözcüğü sadece,gruplanmış veriler üzerinde işlemlerde geçerlidir.
Örnek:
Personel içindeki,her bölümde,erkek personele ait maaşlar için,ortalamanın 90000000'dan fazla olduğu bölümleri listeleyiniz?
SELECT bolumno,AVG (brut)FROM personel WHERE cins =.T.GROUP BY bolumno HAVING AVG (brut)>90000000;
Personel tablosunda aşağıdaki bilgiler olsun:
        Bolumno                 Brut                 Cins
 
          1                 250000000     .T.
            1                 145000000     .F.
            2                   78000000     .F.
            3                 120000000     .T.
            1                   20000000     .T.

Yukarıda uygulanan SELECT komutu,her bölümdeki erkek personele ait ortalama brüt maaşı hesaplayarak (erkek personel .T. ile belirtilmiş) ve erkek personel maaş ortalaması, 90000000'dan yüksek olan bölümler listelenecektir.Komutun çıktısı aşağıdaki gibidir:
            Bolumno            AVG_brut

              1                135000000
              3                120000000 

BİRDEN FAZLA TABLOYU İLİŞKİLENDİREREK SORGULAMA
  Bu bölüme kadar,SQL ile sadece tek tablo üzerinde sorgulamalar gerçekleştirilmiştir.Daha sık karşılaşılan ve güç olan sorgulamalar,birden çok tablonun birbiri ile ilişkilendirilmesini gerektiren sorgulamalardır.SQL'in sorgulama gücüde daha ziyade bu tip sorgulamalarda ortaya çıkmaktadır.
BİRLEŞTİRME (JOİN) İŞLEMİ

  Birleştirme işlemini anlayabilmek için,örnek veri tabanımızdaki, personel ve tablolarını göz önüne alalım.
Personel

 Sicil

SguvN

 Ad

 Soyad

Dog_trh

 Adres

Cins

Brut

Bolumno

YonSGn

Bölüm:

Bolum_ad

Bolum_no

YonSGn

   Bu tablolarla ilişkili olarak aşağıdaki soruyu soralım:Çalışan her personel ve bu personelin yöneticisiyle ilgili bilgiler nelerdir?
   Belirli bir personel ile ilgili bilgiler, personel tablosunun o personele ait satırında mevcuttur.Ancak,personelin yöneticisiyle ilgili bilgilerin bir kısmına ise bölüm tablosundan erişilebilir. Bu durum personel ile bölüm tabloları arasında ilişki kurulmasını gerektirir.Bu ilişki,ancak,ortak bir alan yardımı ile kurulabilir.Ortak alan,burada bölüm numarasıdır ve personel tablosunda bölümno,bölüm tablosunda ise Bolum_no adı ile
birleştirilmesi (Join)demek,her iki tablodaki tüm sütunları içeren yeni bir tablo oluşturmak demektir.Yalnız bu tabloda sadece,her iki tabloda da mevcut olan bölüm numaraları ile ilişkili satırlar yer alacaktır.Birleştirme (Join)işlemi ile listeleme aşağıdaki SQL komutu ile yapılabilir.
 SELECT * FROM personel,bolum  WHERE personel.bolumno = bolum.bolum_no;
Şimdi bu örneğin personel ve bölüm tablolarını çizelim ve JOIN işlemine tabi tutalım.
Personel Tablosu

    Sicil     SGvnN   Ad      Soyad     Dtrh          Adres    Cin   Brut           B_no
   
112    29641  Haluk Levent   01/05/73  Fatih     T   80000000    1
   175    34451  Ayşe  Satır      05/02/63  Şişli       F   70000000    1
   217    12654  Esra   Gül       18/05/73  Taksim   F   50000000    2
   517    24330  Ercan Saatçi    12/07/68  İncirli     T   90000000    2
   618    32561  Ufuk  Ercan     08/07/72  Kadıköy T   80000000    2
 1540    42565  Barış  Manço   07/08/54  Sefaköy T   40000000    3
 Bölüm Tablosu

 Bolum_adı     Bolum_no     Gir_Trh
  
Satış              1          01/07/95
  Muhasebe       1          02/08/92
  Üretim            1          04/06/96
  Eğitim            1           01/05/98
  Bilgi-İşlem     1           05/02/96

Personel ve bölüm tablolarının,Müşterek alan olan bölüm numarası üzerinde JOIN (birleştirme) işlemine tabi tutulması sonucu elde edilen bilgi:

  Sicil  SGvnN   Ad    Soyad    Dtrh   Adres   B_no

   Personel ve bölüm tablolarında sadece her iki tabloda aynı olan bölüm numaralarına ait satırlar alınarak birleştirilmiş ve her iki tablonun alanlarından büyük bir tablo oluşturulmuştur.Listelene birleştirilmiş tabloda,her iki tablodan alınmasına rağmen tablolarda ortak olan alanların tekrarlanmadığı görülmektedir. Bunun için SELECT komutunda * sembolü yerine sadece,sonuçta yazılması istenen sütun başlıkları kullanılmaktadır.

  BİR TABLONUN FARKLI İSİMLERDEKİ EŞDEĞERLERİ İLE SORGULAMA
  Daha önceden tanımlanmış bir tablonun,farklı isimli eşdeğerini oluşturarak sorgulamalarda kullanmak mümkündür.
Örnek:
Her personel için,personel sicil numarası,ad ve soyadı ile, bu personelin yöneticisinin ad,soyad ve doğum tarihini listeleyiniz?
  SELECT A.sicil,A.ad,A.soyad,B.ad,Bsoay,Bdtrh FROM personel A B
  
WHERE A.yonSGn=B.sguvN;

 Sicil      SGvnN  Ad      Soyad     Dtrh          YonSGn    
 
112    29641  Haluk Levent   01/05/73  32222
  175    34451  Ayşe  Satır      05/02/63  43455
  217    12654  Esra   Gül       18/05/73  51455 
  Yukarıda yazılmış olan SELECT komutunun çıktısı Şu şekilde olacaktır.
 Sicil         Ad_a    Soyad_a    Ad_b  Soyad_b   Dtrh   

  
112     Haluk   Levent      Can   Kaptan   01/05/73 
  175     Ayşe     Satır         Can   Kaptan   05/02/63
  217     Esra      Gül           Ali    Öner      18/05/73 

Bu SELECT komutu ile,personel tablosunun A ve B isimli birer kopyası oluşturulur.Bu kopyalara personel kütüğünün eşdeğer yada takma adları (aliases) adı verilir.SELECT komutu ile,personel tablosunun eşdeğeri olan (kopyası) olan A tablosundaki yönetici sosyal güvenlik numarası,personel tablosunun diğer eşdeğeri olan B tablosundaki sosyal güvenlik numarasına eşit olan satırları kontrol ederek her personele ait istenilen bilgileri listelemektedir.Ayrıca bu personelin yöneticisi ile istenilen bilgileri de listelemektedir.
  Buradaki yöntem ile bir tablonun kendisi ile birleştirme adını (self-join) almaktadır.Bazı SQL gerçekleştirimlerinde,bu SELECT komutunun
  SELECT  A.sicil,A.ad,A.soyad,B.ad,B.soyad,B.dtrh
FROM personel A,personel B WHERE A.YonSGn = B.SguvN;
Şeklinde yazılmaktadır.(Foxpro,dbase..)
Örnek:
Satış bölümünde çalışan tüm personelin ad,soyadı ve adreslerini listeleyiniz?
SELECT A.ad,A.soyad,Aadres FROM personel A,personel B
WHERE B.bolum_ad='satış' AND A.bol_no:=b.Bolumno;

 Personel tablosu
 Sicil      SGvnN    Ad       Soyad     B_no

 
112    29641    Haluk Levent     1
  217    12654   Esra   Gül          2
  175    34451   Ayşe  Satı          1
Bölüm tablosu
       Bolum_ad    Bolum_no  YonGSn

      
Satış              1              Ali
      
Muhasebe      2              Ayşe  
      
Bilgi-İşlem     3              Ayça

Sonuç:
       Ad       Soyad      Adres

      
Ali        Kuşcu   K.Çekmece 
      
Ayşe    Akın      Taksim  
      
Buket   Bilgi      Bakırköy

İÇİÇE SELECT KOMUTLARI (NESTED SELECTS) ALT SORGULAMALAR

   Bazı sorgulamalar,özelliği itibari ile içiçe SELECT komutunun kullanılmasını gerektirebilir. İçteki SELCT komutunun bulunduğu sonuç,dıştaki SELECT komutunun işlevini yerine getirmesi için kullanılır.
Örnek: 961 döneminde ve Öğrenci bölüm kodu (Ogr_bol_kod)‘11' olan öğrencilerin aldıkları dersleri sorgulayan SQL komutunu yazınız?

SELECT * FROM Alinandersler  WHERE Donem ='961' AND ali_ogr_num IN (SELECT ogr_num FROM ogrenci WHERE ogr_bol_kod='11');

Buradaki komutların işleyişi: Önce Alınandersler tablosunda öğrenci numarası ali_ogr_num gruplanır.Ali_ogr_no alt sorgu için girdi olarak kullanılır.Eğer ali_ogr_num,alt sorudaki oluşturulan şartlara uyan bir öğrenciyse sonuç tablosunda yer alacaktır.