geçici tablolar, tablo değişkeni ve CTE

Bu anlatacağımız konuda tabloların yapısından bahsedeceğiz. Hadi zaman kaybetmeden beraber öğrenelim.

Bu anlatacağımız konuda tabloların yapısından bahsedeceğiz. Hadi zaman kaybetmeden beraber öğrenelim.

Geçici Tablolar

Önünde # işareti olarak oluşturulan tablolardır. Bu tablolar sadece SQL Server a bağlandığınız oturumda geçerlidir. Oturumu sonlandırdığınızda tablo silinir.

create table #deneme
( adi nvarchar(50),
soyadi nvarchar (50),
numara int,
id int primary key identity(1,1))


deneme isminde geçici tablo oluşturur.

insert into #deneme(adi,soyadi,numara) (select adi,soyadi,numara from ogrenci where notu>80)

tabloya kayıt eklendi. #deneme isminde oluşturulan tablo ogrenci tablosundan bağımsız yeni bir tablo olduğu için verilerle oynadığımızda (update, insert, delete) ogrenci tablosundaki kayıtlara birşey olmaz.

select * from #deneme
seçme işlemi diğer tablolarla aynıdır.

Drop Table #deneme
geçici deneme tablosunu siler

Tablo Değişkeni

Değişken olduğu için oturum sonunda hafızadan silinir.

declare @takdirogrenci table(
adi nvarchar(30),
soyadi nvarchar (30),
numara int)

insert into @takdirogrenci(adi,soyadi,numara) (select adi,soyadi,numara from ogrenci where notu>85)

select * from @takdirogrenci

Geçici Tablo mu, Tablo Değişkeni mu?

  • 100 den az kayda sahip olacaksanız tablo değişkenini kullanın. SQL Server tablo değişkeni üzerinde istatistik oluşturamaz.
  • İndex oluşturulacaksa geçici tablo kullanılmalıdır. (Indexleri yakında göreceğiz)
  • Geçici tablolarda tablo oluşturma (create table), index oluşturma (create index) SQL Server a iş yükü bindirir. Bunun için gerektiğinde kullanılmalıdır.

Common Table Expressions (CTE)

View ler karmaşık sorguları veya sayısal işlemlerle gruplanarak (group by) ya da filtrelenerek (where=....) yapılan sorguları daha okunabilir, basit hale getirir. Bununla birlikte view ler sql serverda saklanırlar. Karmaşık sorgularda view kullanılabildiği gibi storde procedure ler ve UDF (User defined function-yakında göreceğiz) de kullanılabilir. Bir başka seçenek ise üretilen tablolardır. Üretilen tablolar Sql Server da saklanmazlar. Fakat üretilen tablolar karmaşık Sql cümleciklerinin okunmasını zorlaştırır. Üretilen tabloların (derived tables) daha esnek, daha okunaklı biçimi ise CTE lerdir.. CTE bir kez tanımlandıktan sonra defalarca kullanılabilir. Özyinemeli (recursive-fonksiyonun kendi kendini çağırması) olarak, herhangi bir storded procedure gerek kalmadan çalıştırılabilir.

CTE kullanımına basit bir örnek

with ornekcte (adi,soyadi) as
(select adi,soyadi from ogrenci)
select * from ornekcte

Örnekte
1. satırda ornekcte ile CTE ismi tanımlanır parantez içerisinde sahip olacağı alanlar belirtilir as ifadesi ile CTE başlatılır
2. satırda parantezde belirtilen alanlara select ile değerler atanır.
3. satırda ayni view de olduğu gibi ornekcte select ile çalıştırılır.
Uyarı: CTEler view, stored procedirler ve UDF ler gibi kaydedilen bir nesne değildir. Onun için select * from ornekcte çalıştırılırken with ile başlyan kısımdan itibaren blok olarak çalıştırılmalıdır.

Bu gibi basit sorgularda CTE kullanmak okunabilirliği azaltır. Bu tür basit sorgular için view ya da üretilen tablolar (derived table) kullanılmalıdır.

CTE için diğer bir örnek

with deneme (adi,soyadi,notu) as
(
select o.adi,o.soyadi,n.notu from ogrenci o
inner join notlar n on (o.numara=n.numara)
)
select * from deneme

CTE yazım kuralları

  • CTE ismi with ifadesinden sonra yazılır
  • İsimden sonra kolon listesi yazılır. Yazılmadığı takdirde de olur. Yazıldığı takdirde CTE içerisindeki selecet cümleciğinde ki alan listesi kadar kolon yazılmalıdır. İstenirse adi ifadesi değistirilebilir (ogrenciadi yazıyabilir) bu durumda cte deki kolon listesi as ifadesinde kolon adını değistirdiğimiz gibi başlığı değiştirmiş oluruz.
  • Sorgu cümleciği parantezler içerisine yazılmalıdır.
  • CTE yazdıktan sonra ilk yazılacak sorgu CTE ye ait olmalı, araya başka sorgular alınmamalıdır. Aşağıdaki örneği inceleyiniz

with deneme (adi,soyadi,notu) as
(
select o.adi,o.soyadi,n.notu from ogrenci o
inner join notlar n on (o.numara=n.numara)
)
select * from ogrenci --araya bu sorgu yazılırsa hata oluşur.
select * from deneme --bu satırdan önce bir sorgu çalıştırıldığından dolayı artık deneme tanımsız hale geldi. Böyle bir nesne yok artık (çok trajik oldu. üzülmeyin :) bi daha oluştururuz )

bir tane with ifadesi ile iki ya da daha fazla CTE oluşturulabilir. Aşağıdaki örneğin yaptığı iş mantıksız ama kullanımını görmek bakımından inceleyiniz.

with ogrencinotu(adi,soyadi,numara) as
(
select adi,soyadi,numara from ogrenci
), dersvenot (ad,numara) as
(
select ders,numara from notlar
)

select * from ogrencinotu
inner join dersvenot on (dersvenot.numara=ogrencinotu.numara)

CTE nerelerde kullanılır

  • Özyinemeli sorgularda ,
  • Karmaşık sorgular sonucunda oluşturulacak tablo, birçom sefer kullanılacaksa,
  • Group by ifadesiyle gruplamalarda
  • View yerine kullanılarak, gereksiz yere view tanımlamasını saklamayız.
Telefon +90 505 747 42 84
Email info@devedijital.com
Adres
Tacettin Veli Mahallesi Halit Narin Caddesi Bahadır Plaza Kat:11 Daire:41 38230 Deve Dijital Melikgazi/Kayseri/Türkiye