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?
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ı
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