Tablo döndüren fonksiyonlar (inline)

0 yorum



 Arkadaşlar fonksiyonlar ile ilgili ilk  yazımın linkine buradan ulaşabilirsiniz 
Skaler Tanımlı Fonksiyonlar

Tablo döndüren fonksiyonlar (inline)


Bu tip fonksiyonlar viewlere çok benzerler. Bir tek select ifadesi içerir. Bu ifadenin sonucunu 
gösterir. View’den farklı olarak dışarıdan parametre alır.

Genel ifade 
CREATE FUNCTION fonksiyonAdi 
(varsaParametreler)
RETURNS TABLE
AS
RETURN selectİfadesi 
GO

Örnek: 

Tüm müşteri listeleyen bir view oluşturunuz ve bu viewi sorgulayınız

CREATE VIEW vwMusteri AS
SELECT * FROM musteri 

Go

Bu viewi sorgulayalım 

SELECT * FROM vwMusteri

Tüm müşterileri listeleyen bir fonksiyon oluşturunuz ve bu fonksiyonu sorgulayınız

CREATE FUNCTION fnt_Musteri ( )
RETURNS TABLE
AS
RETURN select * from musteri 
Go
Sorgulayalım 

SELECT * FROM fnMusteri()

Tüm müşterileri listeleyen bir stored prosedure oluşturunuz ve bu prosedürü çalıştırınız.
CREATE PROCEDURE spMusteri 
AS
SELECT * FROM musteri 
Go
Çalıştıralım

EXEC spMusteri


3- Tablo döndüren fonksiyonlar (multi statement)

Farkı tek select ifadesi ile yapamayacağımız işlemlerde kullanılır
CREATE FUNCTION fn_MusteriBilgileri
( @MusteriNo int)
RETURNS @donusTablosu TABLE
(
MusteriNo int,
MusteriAdi varchar(30),
MusteriSoyadi Varchar(30),
Grubu char(1)
)
AS
BEGIN
IF(@MusteriNo=1)
SET @MusteriNo=2
INSERT into @donusTablosu(MusteriNo,MusteriAdi,MusteriSoyadi,Grubu)
SELECT * FROM Musteri WHERE mno=@MusteriNo
RETURN
END

GO

Sql ' de Skaler tanımlı Fonksiyonlar 1

3 yorum

KULLANICI TANIMLI FONKSİYONLAR


Fonksiyonları, view ve Stored Procedurelerle karşılaştıralım.
* dışarıdan parametre alan bir view tanımlanamaz. Bu türden ihtiyaçlar için fonksiyon 
kullanılır. 
* stored procedureleri bir sorgunun parçası olarak kullanamayız. Yada stored prosedürleri 
sorgulayamayız. Ancak view ve fonksiyonları sorgulayabiliriz.
* bir select ifadesi içeren stored prosedürler sorgunun FROM, WHERE, IN gibi kısımlarında 
kullanılamaz.
* bir tek select ifadesi ile view oluşturamadığımız zaman fonksiyon kullanılır. 
* sql server’da tanımlı olmayan REPLACE() gibi fonksiyonları tanımlamak için fonksiyonlar 
kullanılır

1- Skaler tanımlı (tek değer döndüren) fonksiyonlar

Skaler değerli fonksiyonlar bir tek değer döndüren fonksiyonlardır. Örnek getdate() bir skaler 
fonksiyondur, çünkü tek bir değer yani şu anın tarih ve saatini döndürür.
Bazı durumlarda, buna benzer fonksiyonlara ihtiyaç duyulur. Örneğin bir müşterinin 
sepetinde kaç ürünün bulunduğu , kaç sipariş verdiğini döndüren fonksiyonlar tanımlanabilir.


Genel ifade
CREATE FUNCTION fonksiyonAdi(varsa parametreTanimi)

RETURNS geriDonusTipi

AS

BEGIN

Sql deyimi

RETURN geriDonusDeğeri

END

Parametre yapısı, stored prosedürlerle aynıdır.



Örnek:
Bir müşteri no girildiğinde, bu müşterini sepetinde kaç ürün olduğunu bulan bir kullanıcı 
tanımı fonksiyon yazınız ve bu fonksiyonu çalıştırınız.


CREATE FUNCTION sepetUrunSayi(@mno int)
RETURNS int
AS
BEGIN
Declare @urunSayi int
Set @urunSayi = ( SELECT sum(miktar) FROM Sepet WHERE mno=@mno)
RETURN @urunSayi
END

Çalıştıralım
SELECT dbo.sepetUrunSayi(4)


Örnek:
CREATE FUNCTION fn_ogrNoyaGorOrtalama( @ogrNo NVARCHAR(10))
RETURNS INT
AS
BEGIN
DECLARE @ogrOrt INT
SET @ogrOrt = (SELECT AVG(n.notu) FROM tbl_ogrenci o
JOIN tbl_ogrenciNot n ON n.ogr_id = o.ogr_id
WHERE o.ogrNo =@ogrNo)
RETURN @ogrOrt
END

Örnek: yukarıdaki fonksiyonu kullanarak, sepetindeki ürün miktarı 15 den fazla olan 
müşterileri listeleyiniz


SELECT * FROM musteri 
WHERE dbo.sepetUrunSayi(mno) >15

Örnek: 1,2 gibi ay numarası gireceğiz. Ocak, şubat gibi ay adını veren fonksiyon yazınız. Ay 
değeri 12 büyük girildiğinde tanımsız yazsın


CREATE FUNCTION AyAdi (@ay int)
RETURNS nvarchar(20)
AS
BEGIN
RETURN
(
SELECT CASE @ay 
WHEN 1 THEN 'Ocak'
WHEN 2 THEN 'Şubat'
WHEN 3 THEN 'Mart'
WHEN 4 THEN 'Nisan'
WHEN 5 THEN 'Mayıs'
WHEN 6 THEN 'Haziran'
WHEN 7 THEN 'Temmuz'
WHEN 8 THEN 'Ağustos'
WHEN 9 THEN 'Eylül'
WHEN 10 THEN 'Ekim'
WHEN 11 THEN 'Kasım'
WHEN 12 THEN 'Aralık'
ELSE 'Tanimli Değil'
END
)
END



Sql veri tabanında kursor kullanmı

0 yorum

Sql Veri tabanında kursor nasıl kullanılır bu makalemde sizlere bunu göstereceğim


CREATE TABLE kitap
                      (
kitapNo INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
kitapAdi VARCHAR(55) NOT NULL,geldiMi BIT
                       )
DECLARE cursor_adi CURSOR FOR
SELECT İFADESİ
DECLARE cr_ogrenciAdlari CURSOR FOR
SELECT o.ad, o.soyad FROM dbo.tbl_ogrenci o


DECLARE @ad NVARCHAR(50),@soyad NVARCHAR(50)
OPEN cursor_adi

OPEN cr_ ogrenciAdlari

FETCH NEXT FROM cursor_adi [INTO icine_doldurulacak_degisken1 [, ....] ] 
FETCH NEXT FROM cr_KitaplarListesi INTO @kitapNo, @kitapAdi 
-- ilk satirin üstüne geldik ve ilk kayitta yer alan iki değeri yazdirdk. 
print @kitapNo 

print @kitapAdi


Örnek: Sehir tablosundaki sehilerin bölgelerini bularak ekrana yazdıran 

cursor ifadesini yazalım.

DECLARE cr_sehir CURSOR FOR

SELECT sehir,bolge_id FROM tbl_sehir

DECLARE @sehir NVARCHAR(65),@bolge_id INT, @bolgeAdi NVARCHAR(40)

OPEN cr_sehir

FETCH NEXT FROM cr_sehir INTO @sehir,@bolge_id

WHILE @@FETCH_STATUS=0

BEGIN

SET @bolgeAdi = (SELECT bolgeAd FROM tbl_bolge WHERE bolge_id=@bolge_id)

PRINT @sehir + ' '+@bolgeAdi

FETCH NEXT FROM cr_sehir INTO @sehir,@bolge_id

END

CLOSE cr_sehir


DEALLOCATE cr_sehir

Sql ' de Stored Procedure Kullanımı,Detaylı Anlatım

1 yorum

Saklı Yordamlar (Stored Procedure)

T-SQL (sql server da yazdığımız komutların tamamına verilen addır) programlama dili veri 
tabanı ile program arasındaki ilk basamaktır

Hazırladığımız programda veritabanına işlem yaptırmanın iki yöntemi vardır.

İşlem için gerekli komutlar programdan gönderilir

İşlemler saklı yordamlarda saklanır. Programdan saklı yordam çağrılır.
Saklı Yordamların üstünlükleri

Yordam bir kez oluşturulduktan sonra defalarca çağrılabilir. Yaptığınız programın 
kodlarıyla oynamadan sql server da saklı yordam üzerinde değişiklik yapabilirsiniz. 
Bu işleme modülerlik adı verilir.


Eğer yapılacak işlemler fazla T-Sql kodu içeriyorsa ve/veya bu işlemler tekrar 

tekrar yapılacaksa saklı yordam yığın işlemlerinden (go ile ayrılan işlem blokları)
çok daha hızlı çalışır. Saklı yordam ilk kez çalıştırıldığında yazım denetimi yapılır ve 
hız için en iyi seviyeye getirilir. Saklı yordam derlendikten sonra sonraki kullanımlar 
için hafızada saklanır. Yani her kullanım için yazım denetimi ve hız için en iyi 
seviyeye getirme ayarı yapılmaz.

Ağ trafiğini azaltır.
Bir döngü içerisinde yüzlerce satırın herbirinde baştan sona işlem/işlemler yapılacaksa 
ağın trafik yoğunluğu artar. Bu durumda döngü işlemleri saklı yordam içerisinde 
yapılarak ağ trafiği azaltılır.

Güvenlik
Saklı Yordamı çalıştırabilmek için kullanıcının izne ihtiyacı vardır. İzne sahip değilse 
doğrudan saklı yordamı çalıştıramazlar.

Parametre

Saklı yordam içerisindeki kodlar başka programlardan gönderilen parametrelere göre 
çalıştırılabilir.

Saklı Yordamlar fonksiyonlar gibi değer döndürebilir, bu döndürülecek değer işlemi 
parametreye OUTPUT yazısı eklenerek belirtilir

Saklı yordamlar 2100 tane parametreye sahip olabilir

Parametre; parametre adı, veri türü, yönü (output veya input), ve varsayılan değer 
özelliklerine sahiptir.

Parametresiz bir örnek;

CREATE PROCEDURE stp_IlkOnOgrenci
AS
SET NOCOUNT ON
SELECT TOP 10 ogrNo, tcNo, ad, soyad FROM tbl_Ogrenci
ORDER BY ogrNo DESC

satırda stp_IlkOnOgrenci yordamı oluşturuluyor. Yordam oluşturulurken CREATE
PROCEDURE veya CREATE PROC kullanılır.

satırda AS ile yordam başlangıcı belirtiliyor

satırda nocount özelliğine atama yapılıyor

satırda t-sql cümleciği yazılıyor

Parametreli bir örnek;

CREATE PROCEDURE stp_OgrenciBilgi
@ogrNo NVARCHAR(10)
AS
SELECT ogrNo,ad,soyad FROM tbl_Ogrenci WHERE ogrNo = @ogrNo
exec stp_OgrenciBilgi '11760101'

--Bir yordamı çalıştırmak için exec veya execute

komutu kullanılır yordam çalıştırıldığında '11760101' nolu öğrenci bilgileri ekrana getirilir.
Saklı yordamlar; viewler ve fonksiyonlar gibi sql cümleciklerine tablo adı olarak yazılamaz. 
SELECT * FROM stp_OgrenciBilgi şeklinde yazım olmaz



CREATE PROCEDURE stp_OgrenciBilgi

@ogrNo NVARCHAR(10)= '11760101'
AS
SELECT ogrNo,ad,soyad FROM dbo.Ogrenci WHERE ogrNo = @ogrNo

exec stp_OgrenciBilgi '11760102'

Yordama Joker parametre geçmek
%, _, [] ve [^] karakterleri joker karakterlerdir. Eğer yordama geçilecek parametre like

sözcüğünde kullanılacaksa gönderilen parametre değeri joker karakter içerebilir. Ayrıca 
Parametreye varsayılan değer verilirken joker karakterler kullanılabilir.

CREATE PROC stp_OgrenciBilgi
@ogrAd NVARCHAR(100)= 'A%',
@ogrSoyad NVARCHAR(100) = '%'
AS
SELECT ogrNo,ad,soyad FROM dbo.Ogrenci
WHERE ad LIKE @ogrAd AND soyad LIKE @ogrSoyad

exec stp_OgrenciBilgi

DROP PROCEDURE var olan yordamı silmek için kullanılır.

DROP PROCEDURE stp_OgrenciBilgi

ALTER PROCEDURE var olan yordam üzerinde değişiklik yapmak için kullanılır
-----------------------------------------------------------------------------------------------------------------------------
ALTER PROCEDURE stp_IlkOnOgrenci
AS
SET NOCOUNT ON
SELECT TOP 10 ogrNo, ad, soyad
FROM dbo.Ogrenci
ORDER BY ogrNo ASC

SET NOCOUNT OFF


Veri Giriş Örneği


CREATE PROCEDURE stp_tbl_ogrenciVeriGir
( @ogrNo NVARCHAR(10) ,
@tcNo DECIMAL(11),
@ad NVARCHAR(100),
@soyad NVARCHAR(100),
@dogumYeri NVARCHAR(50),
@bolum_id INT,
@dogumTarihi DATETIME,
@medeniDurum TINYINT
)
AS
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.tbl_ogrenci
(
ogrNo,
tcNo,
ad,
soyad,
dogumYeri,
bolum_id,
dogumTarihi,
medeniDurum
)
VALUES
(
@ogrNo,
@tcNo,
@ad ,
@soyad ,
@dogumYeri ,
@bolum_id ,
@dogumTarihi ,
@medeniDurum
)
END

Arkadaşlar Makale Hakkında Düşüncelerinizi bekliyorum olumlu veya olumsuz

Sql TRANSACTİON

0 yorum


TRANSACTİON Kullanımı 

Bir transaction bir veya daha fazla SQL ifadesinden meydana gelen tek bir işlemdir. SQL ifadelerinin tamamı bir bütün olarak düşünülür ve daha küçük İş parçalarına ayrılamaz. Özellikle ardı ardına gelen ve birbiriyle bağımlı birden fazla işlemin tek bir İşlem olarak kullanılmasını sağlar.Bir transaction içerdiği SQL ifadelerini tamamını veya hiçbirini gerçekleştirir. SQL ifadelerini bir bölümünün uygulanması gibi bir İşlem söz konusu olamaz. İşlemlerin tamamı gerçekleşmediği sürece işlemlerin hiçbiri gerçekleşmemiş sayılır.Bir müşteri kendi hesabından başka bir hesaba 1500 TL para transferi gerçekleştiriyor. Önce kişinin hesabından transfer edilecek olan 1500 TL tutar düşülmelidir. Sonra diğer kişinin hesabına transfer edilecek olan 1500 TL tutar eklenmelidir. 

UPDATE hesaplar SET bakiye=bakiye-1500

WHERE hesap_no=1453

UPDATE hesaplar SET bakiye=bakiye+1500

WHERE hesap_no=145 4

Bu işlemlerden birincisi gerçekleştikten sonra herhangi bir sorundan dolayı İkinci işlem 

gerçekleşmezse hesaplarla ilgili ciddi sorunlar yaşanabilir

Gönderenin hesabından 1500TL tutar düşer ama alıcının hesabına bu para aktarılamaz

Bu tür sorunları Önlemek için transaction yapılan kullanılır.

Transaction her iki işlemi de tek bir işlem olarak ele alacağı için herhangi birisi gerçekleşmediği zaman 

diğer gerçekleşen işlemleri de yok sayacaktır.

Yani gerçekleşen işlemi geri alacaktır(rollback)

Eğer işlemlerin tamamı sorunsuz bir şekilde gerçekleşirse, tüm İşlemleri kalıcı(commit) hale 

getirecektir.


Transaction yapıları transaction logları adı verilen yöntemi kullanır

Örnek; 
BEGIN transaction
UPDATE kitaplar SET s_sayisi=0
UPDATE kitaplar SET kitap_adi='Deneme'
SELECT * FROM kitaplar
ROLLBACK



SELECT * PROM kitaplar

SQL PROGRAMLAMA,Sql 'de if yapısı,sql ' de case yapısı sql ' de while komutu

0 yorum

Sql Server ' da if,case,while yapısı nasıl kullanılır,bu makalemde sizlere bundan bahsediyorum makaleyi sonuna kadar incelemenizi tavsiye ediyorum...


BATCH
Bir batch , bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir.
SELECT ……
………….
…………
UPDATE …..
…..
GO
……..
DELETE ……
…..
GO
……

Özellikleri
1- Bir batch içinde bir deyimde yazım hatası olduğunda tüm batch çalışmaz hale
gelir.
2- Aynı batch içinde bir tablonun yapısı değiştirilip kullanılamaz.
Örnek:
CREATE TABLE urun ………
INSERT urun ……….
GO
Yukarıdaki kod çalışmaz. Çünkü aynı batch içinde tablo oluşturuluyor ve bu tabloya ekleme
yapılmak isteniyor.
CREATE TABLE urun ………
GO
Yukarıdaki kod ise hata vermeden çalışır

SQL Server’da değişken tanımı


Sql server’da değişken isimlerinin başında @ sembolü bulunur.
@ad , @soyad, @tarih değişken isimlerine birer örnektir.
Değişken tanımı için DECLARE deyimi kullanılır.

Genel ifade
DECLARE @isim veritipi

Şeklinde tanımlanır
DECLARE @ad nvarchar(25), @soyad nvarchar(25), @tarih datetime
DECLARE @numara int, @borc Money
@numara =10 şeklinde atama yapılamaz, hata verir. 
Atama aşağıdaki gibi yapılır.
SELECT @numara=10 

Set @numara=10


@numara =10 şeklinde atama yapılamaz, hata verir.
Atama aşağıdaki gibi yapılır.
SELECT @numara=10
Set @numara=10
SELECT @ad=’ali’, @soyad=’coşkun’ , @borc=50
Yukarıdaki kodda @numara değişkenine 10 rakamı, @ad değişkenine ‘’ali’, @soyad

değişkenine ‘’coşkun’, @borc değişkenine 50 değer atandı.
Örnek:
DECLARE @UrunAdi varchar(30)
SELECT @UrunAdi=’Defter’
SELECT * FROM Urun WHERE UrunAdi=@UrunAdi


Örnek:
DECLARE @PersonelAdi varchar(20)
SELECT @PersonelAdi ='Ahmet'
SELECT * FROM Personel WHERE ad=@PersonelAdi

SQL server’da önceden tanımlı pek çok değişken vardır. Bunlardan iki tanesinden
bahsedelim.
@@error : sql deyimi hata vermeden çalışırsa değeri sıfır, hata verirse sıfırdan farklı bir değer
alır.
@@rowcount : Bir update, delete, insert deyimi çalıştığında, kaç tane kayıdın etkilendiğini
bize bildirir...
Yazı Yazdırma:
Yazı yazdırma PRINT deyimi kullanılır

Örnek:
PRINT 'Mehmet İrfan Erdoğan'
PRINT 5
PRINT 'HATA'
PRINT @numara
Print @@error


Akış kontrol deyimleri


SQL serverdaki akış kontrol deyimleri aşağıdadır

CASE
 IF …. ELSE ….
 WHILE …..
 BREAK
 CONTINUE

CASE deyimi 
Case deyimi SELECT, UPDATE, DELETE, SET, IN, WHERE , ORDER BY gibi deyimlerin
içinde kullanılır.
Sql içinde belirli durumlara göre farklı değerler üretmek istiyorsak CASE deyimi kullanırız.
İki farklı yazım şekli vardır.
Basit CASE yapısı

CASE GirişDenklemi
WHEN değer1 THEN sonuç1
WHEN değer2 THEN sonuç2
….
….
ELSE sonuçn
END
Örnek 1:
CASE medeniDurum
WHEN 1 THEN 'Bekar'
WHEN 2 THEN 'Evli'
ELSE 'Bilinmiyor'
END
Örnek 2:
DECLARE @sayi INT=5
SELECT
CASE @sayi
WHEN 1 THEN 'Zayıf'
WHEN 2 THEN 'Geçer'
WHEN 3 THEN 'Orta'
WHEN 4 THEN 'İyi'
WHEN 5 THEN 'Pekiyi'
ELSE 'Aralık Dışı Değer'
END

Yukarıdaki ifade tek başına yazılmaz, bir SELECT deyimi içine yazılır. medeniDurum değeri
1 ise Bekar, 2 ise Evli , hiç biri değilse else tarafında bulunan bilinmiyor değeri gelir.
İkinci CASE yazımı
CASE
WHEN koşul1 THEN sonuç1
WHEN koşul2 THEN sonuç2
…….
ELSE sonuçn
END

Örnek 1:
CASE
WHEN medeniDurum=1 THEN 'bekar'
WHEN medeniDurum=2 THEN 'evli'
ELSE 'Dul'

END


IF… ELSE… deyimi

Batch içinde koşula bağlı olarak dallanma yapar

IF koşul
Sql deyimi
Koşul doğru ise devamındaki sql deyimi çalışır. Yanlış ise çalışmaz.
IF koşul
Sql deyimi (1)
ELSE

Sql deyimi (2)

Koşul doğru ise 1. sql deyimi, yanlış ise 2. sql deyimi çalışır.
Eğer sql deyimi bir den fazla satır dan oluşursa BEGIN …. END arasında yazılır.
Örnek:
DECLARE @isim varchar(20)
SELECT @isim='irfan'
IF @isim = 'mehmet'
PRINT @isim + ' Coşkun'


WHILE döngüsü
While yapısı bir sql deyiminin tekrarlanmasını sağlar. Koşul yanlış oluncaya kadar döngü

çalışır.
BREAK : döngüden koşul sağlanmadan yani erken çıkılmasını sağlar.

CONTINUE : devamındaki satırlar işlenmeden döngünün ilk satırına dönülmesini sağlar.

Genel ifade
WHILE koşul
Sql deyimi
Veya
WHILE koşul
BEGIN
Sql deyimleri
END
Veya
WHILE koşul
BEGIN
Sql deyimi
Koşula bağlı BREAK deyimi
Sql deyimi
Koşula bağlı CONTINUE deyimi
Sql deyimi
END
Örnek:1 den 12 ye kadar sayıları yazdıralım.
DECLARE @sayi int
SELECT @sayi=1
WHILE @sayi<=12
BEGIN
PRINT @sayi
SELECT @sayi = @sayi + 1
END
Örnek : Önceki örnek gibi, 1’den 30 kadar döngüyü çalıştıralım. 1’den 24’e kadar yazdıralım.
25 olunca döngüden çıkalım.
DECLARE @sayi int
SELECT @sayi =1
WHILE @sayi <=30
BEGIN
PRINT @sayi
IF @sayi = 24 
BREAK
SELECT @sayi=@sayi+1
END
Örnek : 1 den 30 a kadar yazdıralım. Ancak 15-20 arası yazılmasın.
DECLARE @sayi int
SELECT @sayi=0
WHILE @sayi < 30
BEGIN
SELECT @sayi=@sayi+1
IF @sayi between 15 and 20 
continue
PRINT @sayi
END

Sql ' de İndexler

0 yorum


İndex Nedir?

İndex view veya tablodaki belirli sütunları 
kullanarak tablo içerisindeki verilere hızlı 
erişimi ve verilerin belirli sütunlara göre 
sıralanmasını sağlar.
 İndexler tablodan ayrı depolanırlar.


İndex Nasıl Çalışır?


Sql sorgusu çalıştığında kayıtlar iki 
yöntemle alınır
– Table scan
• Tüm tablodaki kayıtlar incelenerek veri döndürülür.
– İndexler yardımıyla
• Kitaplardaki içindekiler mantığına benzer çalışır.

İndex Özellikleri

İndexler tablolardaki sütunlar üzerinde 
tanımlanırlar.
• İndexler veriye erişimi hızlandırır.
• İndex oluşturmak genellikle sorgunun hızlı cevap 
vermesini sağlar. Fakat oluşturmak zaman alır 
ve yer kaplar.
• İndex oluşturulan bir sütunda veri ekleme,silme 
güncelleme diğerlerine göre daha uzun sürebilir 
fakat bu fark index kullanımının veri erişiminde 
sağladığı performansın yanında göz ardı 
edilebilir.

İndex Ne Zaman Kullanılır

En temel koşullu sorguları hızlandırmak
için.
• Tablo içerisinde sütundaki değerin tekrar
etmesi istenmiyorsa
• Tablo birleştirme işlemlerinde
birleştirmede kullanılan sütunlar mutlaka
indexlenmelidir.
• aralık sorgularını hızlandırmak için
• order by ifadesini hızlandırmak için

İndex Ne Zaman Kullanılmaz?

Aynı değeri tekrar tekrar içeren değerler 
için index kullanılmaz. Örnek cinsiyet 
• Sorgularda çok az kullanılan yada hiç 
kullanılmayan sütunların indexlenmesine
gerek yoktur.
• Tablodaki kayıt sayısı çok azsa index
kullanılmaz.

İndex Çeşitleri

Composite İndex
– Birden fazla sütunda tanımlanan 
• Unique İndex
– değerlerin tekrarını engeller
• Clustered İndex
– bir tablo üzerinde sadece bir tane
– primary key tamınlanan sütun clustered indextir.
– en hızlı index tipi
– Nonclustered indexler clustered indexler üzerinde tanımlanır.
• Nonclustered İndex
– birden fazl olabilir
– clustered indexle birlikte çalıştığı için ona göre performansı biraz 
düşüktür.

İndex Mantığı

Clustered index örneği
– Kütüphanedeki kitapların isme göre sıralanışı.
• Nonclustered index örneği
– Yazara göre kitap aranması

Kullanımı

CREATE [UNIQUE] INDEX index_ismi
ON tablo_ismi(sütun_ismi)


SQL Server Views oluşturma

0 yorum


SQL Server Views

"View nedir? Ne değildir?" sorularına geçmeden önce View'ler hakkında kulaktan kalma bilgilerimizin ne kadarı doğru, ne kadarı yanlış bunları bir gözden geçirelim. View'lerhakkında en çok söylenen söz "Veritabanında ihtiyacın olmasa da istediğin kadar kullan hiç zararı yok, sonra üzerinden işlem yapmak daha kolay oluyor" sözüdür. Bu söz bir açıdan doğru olmasına rağmen yanlış bilgi içerdiği de su götürmez. View'ler, ihtiyaçduyulduğunda yaratılması ve doğru şekilde kullanılması halinde bizi birçok yükten kurtaracak olan veritabanı elemanlarıdır. Eğer yerinde kullanılırlarsa veritabanı üzerinde daha verimli çalışmamıza olanak sağlarlar.


Peki, nedir bu View'ler? View'ler bir veya birden fazla tablodan istenilen verilerin 
bir arada sunulmasını sağlayan tanımlanmış sorgulardır.
Sanal bir tablo olarak da düşünebiliriz. 
Aynı tablolar gibi satırlar ve sütunları içerir. 
Bir ya da birkaç tablodan seçtiğimiz verileri okuyabiliriz hatta bazı durumlarda veri girişi 
bile yapabiliriz. Peki neden “sanal” kelimesini kullanıyoruz? 
Çünkü View'ler veri saklamazlar sadece istenen veriye ulaşılacak yolu kullanarak 
verileri kullanıcıya sunarlar. 
View'leri nasıl yaratacağımız konusuna girmeden, bize ne avantajlar sağlıyorlar biraz 
bahsedelim çünkü sağladığı avantajları bilirsek ne amaçlar için kullanacağımıza da daha 
rahat karar veririz. Daha önce gereksiz yere View yaratıp kullanmanın hem bizim için 
hem de veritabanı için verimsiz olacağından zaten bahsetmiştik.
-Birden çok tablo ile çalışırken gereksiz karmaşadan(özellikle her seferinde uzun bir SQL 
sorgu cümlesi yazmakla uğraşmaktan) kurtulmak.
-Veri ulaşım performansını arttırmak.
-Veri erişimini sınırlamak ve kontrol altında tutmak.
Buraya kadar kod yazmamamızın en önemli nedeni View hakkında öğreneceğiniz bilgilerin 
“SQL’de nasıl View yaratılır?” sorusunun cevabından daha yararlı ve karmaşık olmasıdır. 
Bir diğer neden ise eğer yeterince SQL bilgisine sahipsek zaten bir View’in nasıl yazılması 

gerektiğini az çok biliyor olmamızdır.



CREATE VIEW vw_ogrenciNotlari
AS
SELECT o.ad,o.soyad,d.dersAd,n.notu
FROM tbl_ogrenci o
join tbl_ogrenciNot n ON o.ogr_id=n.ogr_id

join tbl_ders d ON n.ders_id=d.ders_id



SQL bilgisine sahip olmasak bile işlem yapacağımız veritabanı içindeki Views klasörüne 
sağ tuşla tıklayıp “New View…” seçeneğini seçtikten sonra karşımıza gelen ekrandan 
tablolar ekleyerek kolaylıkla yaratmak istediğimiz View’i hazırlayabiliriz. Tek yapmamız 
gereken tablolardan istediğimiz sütunları belirleyip Select cümlemizin otomatik olarak 

yazılmasını sağlamaktır



View oluştururken dikkat etmemiz gereken hususlar:
Oluşturulan View de;-Compute ya da Compute By cümleciği,
-Into anahtar sözcüğü,
-Option cümleciği
kullanılamaz.
-View’ler temporary tablo dediğimiz geçici olarak oluşturulan tablolara referans 
verilemez. Bu tablolardan veri istenemez. 
-Order By cümleciği sadece TOP operatörü ile birlikte kullanıldığında kullanılabilir.
-Bir View farklı tablolardan gelen aynı isimlere sahip farklı sütunları içerebilir.

-View’lerdeki sütunlar aritmetik ifadelere sahip olabilir


CREATE VIEW view_ismi [(görünen sütun ismi,…)]
[WITH {ENCRYPTION | SCHEMABINDING}]
AS
select_cümlesi
[WITH CHECK OPTION]
Görüldüğü gibi sadece –
Create View view_ismi
As
select_cümlesi
- ile bir view yaratabiliriz. Bizi asıl zorlayacak kısım yazacağımız Select cümlesi olsa 
gerek, başka bir içerikte kalmadı gibi.
Create View [sahip_ismi].view_ismi kısmındaki [sahip_ismi] alanını doldurmak zorunda 

değiliz yani isteğe bağlı olarak doldurulabiliriz. Yalnız daha sonra karışıklık olmaması için o View’in kim tarafından yönetileceğini belirtmek yararımıza olacaktır. Hiçbir isim 
girilmemesi durumunda o sıradaki kullanıcıyı View’in sahibi olarak atayacaktır.
Create View view_ismi başlangıcından sonra gelen [(görünen sütun ismi,…)] yazan 
bölümde Select sorgusu ile sonuçta gösterilecek sütunların isimlendirmesini yapabiliriz. 
Birden fazla sütun ismi yazmak için sütunların arasına yukarıdaki gibi virgül koyulur.
Bunu test etmek için gelin ilk yaptığımız örneğin sütunlarının Türkçeleştirilmiş halini, yeni 
bir View olarak oluşturalım. İki örneği kıyaslayıp sonuçlarını görüntülediğimizde farkı 
görebiliriz.
Geldik View kullanmayı kulaktan dolma öğrenmiş ve View oluşturmayı bildiğini iddia eden 

bazı insanların kullanmaya aşina olmadığı bölümlere.
[WITH {ENCRYPTION | SCHEMABINDING}]
Encryption:
Öncelikle With Encryption cümlesinin ne işe yaradığından bahsedelim biraz. Aşağıda 
yaptığımız örneği direk alıp kopyalarsak oluşturduğumuz View’den sonuçta ne olduğunu 
büyük olasılıkla anlayamayacağız.
Encryption yapısını kullanmamızın nedeni o veritabanında oluşturduğumuz View’in kod 
içeriğinin yani View’i oluşturmamızı sağlayan kaynak kodun görüntülenemez şekilde 
şifrelenmesidir. Görüntülenemez çünkü Encryption yaptığımız bir View’i Decryption gibi 
bir işlemle geri alamıyoruz. Şifresiz haline döndüremiyoruz. Bunu yapabilmek için View’in 
kaynak koduna ihtiyaç duyuyoruz. Kaynak kodunu bildiğimiz bir View’in şifrelenmiş 
kaynak kodunu niye açmaya çalışalım ki sonuçta. Bu yüzden Encryption(şifreleme) 
yapmayı düşündüğümüz View cümlesinin yedeğini kaydetmeyi unutmazsak bizim için 
daha iyi olur. Tekrar bu cümleyi oluşturmak zorunda kalacağımız durumlarda oradan alıp 
kullanabiliriz
Örnek-3: With Encryption yapısı



Daha önce bahsettiğimiz gibi Encryption yaptığımız View’in kaynak kodunu görmemiz 
mümkün değil. Örnekte oluşturduğumuz View’e sağ tuşla tıkladığımızda karşımıza çıkan Modify veya Design seçeneği artık inaktif durumda. View’lerin içeriğini görüntülemenin bir 
başka yolu da bir stored procedure(saklı yordam) kullanmak, sp_hepltext.
sp_helptext ‘ÖrnekViewinİsmi’
Bu stored procedure’e Encryption yaptığımız örneğimiz üzerinde işlem yapmasını 
söylersek daha önce Encryption yapıldığı için sonuçta bir hata mesajı almamız kaçınılmaz. 
Fakat biz bunu öncelikle Encryption yapılmamış bir View üzeride deneyelim. Ben ilk 
yaptığımız View örneğini kullanarak sp_helptext stored procedure’ünü çalıştıracağım


SchemaBinding:
Encryption kelimesi kadar olmasa da Schemabinding kelimesinin tercümesi, zaten bize ne 
amaçlar için kullanabileceğimizi anlatmaya yeter gibi gözüküyor. Eğer oluşturacağımız 
View’de With Schemabinding kullanırsak ya da daha önce oluşturduğumuz bir View’e 
ALTER View ile With Schemabinding özelliği verirsek bu View’de görmek istediğimiz 
verilerin tutulduğu tablolardaki veri çektiğimiz sütunları kilitlemiş oluruz.
Bir View’e Schemabinding özelliği eklemek istiyorsak hatırlamamız gereken iki durum var.
-Schemabinding’li View’imizde * kullanamayız. Yani select * from ... diye bir cümle 
kullanmaktansa bütün sütunların isimlerini tek tek girmeliyiz. Eğer aşağıdaki gibi 
kullanırsak Schemabinding’in neden olduğu bir hata mesajı ile karşılaşırız.


 
© 2014 İrfan Blog ' s | Mehmet İrfan ErdoğanTüm Hakları Saklıdır | r