Kenan kılıçaslan

  • Baca Hesabı
  • Sürtünme Kaybı
  • Diferansiyel Denklem
  • Denklem Çözümü
SQL Server

Alt Sorgular

Bazen, bir sorgunun çıktısını, başka bir sorguda kullanma ihtiyacımız olabilir. Bu durumda alt sorgular kullanılır.

Aşağıdaki örnek tablo ile alt sorguyu açıklayalım.

Örnek alt sorgu tablosu

Soru : Yukarıdaki tablodaki, tüm ürünlerin yüzdesini bulalım.

1. Aşama : Bunun için ilk önce miktar toplamını bulmalıyız.

Select sum(miktar) from satis
Örnek toplam sorgusu

2. Aşama :Bulduğumuz 57 rakamını kullanarak her bir ürünün yüzdesini bulalım.

Select *, miktar/57*100.0 as yuzde from satis
Alt sorgu kullanamadan yüzde bulmak

3. Aşama : 57 rakamı yerine, bu rakamı veren sorguyu koyalım. Elde ettiğimiz yeni sorgu her zaman doğru bilgi verir.

Select *, miktar/(Select sum(miktar) from satis)*100.0 
                                    as yuzde from satis
Alt sorgu ile yüzde bulmak

ÖNEMLİ NOT : Her sorgu alt sorgu olarak kullanılamaz. Kullanıldığı yere bağlı olarak bazı özellikleri sahip olmalıdır.

Alt sorguları sınıflandıralım.

1.tip alt sorgu: Çıktısında tek kolon ve tek kayıt bulunan alt sorgular.

2.tip alt sorgu: Çıktısında tek kolon ve çok kayıt bulunan alt sorgular.

Bir sorgunun tek kayıt mı, çok kayıt mı döndürdüğü nasıl anlaşılır?

Bunu örneklerle açıklayalım.

Select avg(maas) from personel

Yukarıdaki sorgu bir gruplama sorgusudur. Çünkü avg fonksiyonu, kolon düzeyinde çalışan, bu kolunun ortalamasını veren bir fonksiyondur. Bu sorguda bir tane grup vardır, bu grup tüm tablodur. Bu nedenle bu sorgunun çıktısında her zaman tek kayıt bulunur.

Select avg(maas) from personel group by departman

Yukarıdaki sorgu bir gruplama sorgusudur. Bu sorguda departman sayısı kadar grup vardır. Bu sorgunun çıktısında, departman sayısı kadar kayıt vardır. Bu sorgunun çıktısında çok kayıt bulunur.

Select sicilno from personel

Yukarıdaki sorgunun çıktısında, personel tablosunun kayıt sayısı kadar kayıt bulunur. Tek kolon vardır.

Select sicilno from personel where departman = 5

5 nolu departmandaki personel sayısı kadar kayıt bulunur. Tek kolon vardır.

Select top 1 sicilno from personel where departman = 5

Yukarıdaki sorgu top 1 deyimi sayesinde tek kayıt döndürür.

Örnek Alt Sorgu Uygulamaları

Aşağıdaki örnek tablo ile ilgili alt sorgu uygulamaları yapalım.

Soru

Her departmanda en yüksek maaş alanların listesini veren sorgu yazalım.

1.aşama: Her departmanın en yüksek maaşını bulalım.

Select max(maas) from personel group by departman

Departman'a göre grupladık ve her grubun yada departmanın en yüksek maaşını bulduk.

2.aşama: 1. aşamanın sonucunda elde edilen, 1700,1500,2500 rakamlarını kimler alıyor.

Select * from personel where maas IN (1700, 1500 ,2500)

3.aşama (hedef sorgu): Önceki sorguda yer alan 1700,1500,2500 yerine, bu değeri veren sorguyu koyacağız.

Select * from personel where maas 
    IN (Select max(maas) from personel group by departman)

Yazdığımız sorguda kriter olarak sadece maaş dikkate aldık. Bu sorgu örneğin, 12 nolu departmanda en yüksek olmayan 1700 maaş alan varsa onu da listeler. Problemi gidermek için sorguyu aşağıdaki gibi değiştirelim.

Select * from personel where 
      str(departman) +' '+str(maas) IN 
      (Select str(departman)+ ' ' +str(max(maas))
         from personel group by departman )

Yukarıdaki sorguda önceki örnekte açıkladığımız problem oluşmaz. Çünkü alt sorgu sadece maaş rakamını döndürmez, bu rakam ile birlikte departman'da döndürür.

Birden fazla kolon döndüren sorgular ile alt sorgu oluşturulamaz. Bu nedenle, iki kolon str(departman) +' '+str(maas) olarak birleştirilmiş ve tek kolon elde edilmiştir.

beyaz_sayfa_en_alt_oval