SQL İç İçe Select, İnnej Join ve Order By Kullanımı - Örnekle Anlatım

Temmuz 05, 2017 Mustafa BÜKÜLMEZ 0 Yorum

Bu derste sql de -aynı işi- iç içe select ve inner join ile birlikte yapılışını görelim.


Selamlar,
Bu dersin içeriği;
  • İç içe select kullanımının örnek üzerinde anlatımı
  • İnner Join kullanımının örnek üzerinde anlatımı
  • Order By kullanımının örnek üzerinde anlatımı
yer almaktadır. Aynı işi iki farklı yol ile yapacağız ve aradaki farklara göz atacağız.
Yapacağımız iş hemen hemen her dinamik web sitesinde kullandığımız "kategori" sistemi ile ilgili olacak. Bir kateogi listemiz olacak ve bu kategoriye ait kaç içerik varsa adedini kateogi adının yanına yazdıracağız.
Önce iç içe select kullanarak örneğimizi yapalım ve ekran görüntüsüne bir bakalım.
SQL
Select 
kat_adi as Kategori,
(Select Count(*) from Haberler Where Hbr_Kategori = kat_adi) as Adet
From Kategoriler
Where Aktif = 1

-ya
Order By Adet desc -- genelde bu kullanılır. 
-- Bu şekilde içerisinde en çok makale olan kategori en üstte olacaktır

--yada
Order By Kategori asc
-- Bu şekilde kategorileri alfabetik olarak a-z olarak sıralayacak
------------------------------------------
--iki kolona göre de sıralayabilirsiniz ancak;
Order By Kategori, Adet asc
-- Kategori a'dan z'ye sıralı ve adet az olandan çok olana doğru şekilde sıralanır.

Order By Kategori, Adet desc
-- Kategori z'den a'ya sıralı ve adet çok olandan az olana şeklinde sıralanır.

--aynı anda iki adet order by yazamazsınız.


iç içe select kullanımı bu şekildeydi.
NOT: Order by yazarken kolon adını yazmak şart değildir. Yani kolonun gerçek adı olan "kat_adi" yazarsakda doğrudur "as" dan sonraki "Kategori" yazsak da doğrudur. Her ikisinde de hata almayız.Nitekim "Adet" kolonunda bu şekilde yazdık. Aksi takdirde order by yapabilmek için o select sorgusunu olduğu gibi order by kısmına yazmak zorunda kalırdık.
-----
Şimdi de İnner join kullanarak aynı işlemi yapalım.
SQL
SELECT TOP 100 PERCENT
 Kat_Adi as kategori_Adi,
 COUNT(Haberler.Hbr_Kategori) adet
FROM Kategoriler
INNER JOIN Haberler
 ON Haberler.Hbr_Kategori = Kategoriler.Kat_Adi
WHERE Kategoriler.Aktif = 1
GROUP by Haberler.Hbr_Kategori,Kategoriler.Kat_Adi
ORDER BY Kategoriler.Kat_Adi ASC
1 - Her kategori adından bir tane görünmesi için 
SQL
GROUP by Haberler.Hbr_Kategori,Kategoriler.Kat_Adi
2 - Haberlerin sayısı için
SQL
COUNT(Haberler.Hbr_Kategori) adet
komutlarını eklemek zorundayız.
Sonucu:

İnner Join de "group by" kullanmadan bu işi yapamayız. Aksi takdirde "count()" dan dolayı hata verecektir. Sebebi ise Haberler tablomuzda A kategorisine ait on adet haber var ama kategoriler tablomuzda bir adet A kategorisi var. Bir tablodan bir kayıt diğer tablodan on kayıt geleceğinden dolayı listeyi yapamaycak bu sebeple de hata verecektir.
Hata almamak için Haberler tablosundaki haberleri kategori adıan göre grupluyoruz ki bir tane kategori bilgisi gelsin ve bu şekilde kategori tablosu ile eşleştirme yapılabilsin.
NOT: Bunu sadece Haberler tablosu üzerinden de yapabiliriz. Ancak o zamanda içerisinde haber olmayan kategorileri listelenmeyecektir. Inner Join kullanımı yerine sadece Haberler tablosu üzerinden de aynı sonucu aşağıdaki select sorgusu ile alabiliriz.
SQL
select  Hbr_Kategori as kat, count(*) as adet
from Haberler
group by Hbr_Kategori
Buradaki amacımız Inner Join'i de anlatmak olduğundan ve tek bir örnek üzerinde olması amacı ile bu şekilde anlattım.
Aradaki farkları bakalım.
İç İçe Select:
Avantajları:
  • Okunması, yazılması ve anlaşılması daha kolaydır.
  • Ana tablo baz alınarak işlemler yapılır.
Dezavantaları:
  • Göstermek istediğin her kolon için ayrı ayrı select sorgusu yazman gerekir.
  • Çok fazla tablo kullanmak gerektiğinde hız açısından yavaştır.
Inner Join:
Avantajları:
  • SQL Management Studio üzerinde Views bölümünden kolayca oluşturulabilir.
  • Çoklu tablolarda kolayca ilişkilendirme yapılabilir
  • Sorgular hızlı çalışır.
Dezavantajları:
  • Okunması, yazılması ve anlaması zordur.
  • Manuel olarak yazmak istediğinde daha çok zorlanırsın ve uzun zaman alır.
  • Tablolardaki ortak bilgiler baz alınarak işlemler yapılır.
Bu açıklamada kafanızı karıştırabileceğini yada kafanızda soru işareti oluşturacağını düşündüğüm yerler
  1. Ana tablo baz alınarak işlemler yapılır.
  2. Tablolardaki ortak bilgiler baz alınarak işlemler yapılır.
maddeleridir.
Arkadaşlar yukarıdaki ekran çıktılarında farketmişsinizdir.
İç içe select de karşısında 0 sıfır olan bir kategori var iken inner joinde yoktur..
İç içe select'te önce en dıştaki tablodaki (ana tablo diyorum) tüm veriler listelenir. Daha sonra diğer tablolara gidilerek iç select'teki where şartına göre istenen veriler listeye eklenir. Ana tabloda var olan ama diğer tabloda olmayan bir kayıt olduğunda karşısına 0 sıfır yazar.
Yani şöyle düşünün; "önünüzde iki kutu var ve içlerinde renkli toplar var. İlk kutudaki tüm topları yerine yerleştirdiniz. Sonrasında diğer kutuya bakıp aynı renkte olanları da yerlerine yerleştirdiniz. İlk kutuda olan ama diğer kutuda olmayan birkaç rengin karşısı boş kaldı."
Inner joinde listeyi oluşturacak tüm veriler aynı anda toparlanıp yerlerine koyulduğu için birine olup diğerinde olmayan kayıtlar listelenmez.
Yani şöyle düşünün; "önünüzde iki kutu var ve içlerinde renkli toplar. Her iki kutuyada aynı anda bakıp aynı anda aynı renkli topları aynı anda bir yerlerine koyuyorsunuz. Bu şekilde olduğundan ilk kutuda olup ikinci kutuda olmayan renklere elinizi hiç uzatmıyorsunuz."
Uzun bir ders oldu umarım düzgünce anlatbilmiş ve sizlerinde anlamasını sağlayabilmişimdir.
Bu dersimizde bu kadar arkadaşlar.
Bol Kodlu Günler.
https://mustafabukulmez.com/

0 Yorum: