29 Aralık 2012 Cumartesi

SQL Server'da Fonksiyon Oluşturma ve Kullanma

  • Fonksiyonlar istenilen veri tiplerini alıp istenilen veri tiplerini veya bir tablo bile geri döndürebilir.
  • Birden çok parametre vereceğimiz zaman bunları virgül ile ayırmamız gerekmektedir. 
Function Create(Fonksiyon  Oluşturma) 
  • Örneğimizde Animals tablomuzdaki Kusların ortalama ağırlıklarını döndüren bir fonksiyon yazalım.

ÖRNEK:

CREATE FUNCTION fnc_OrtalamaAgirlik
(
@KusNo int
)
RETURNS int
AS
BEGIN
  DECLARE @Result int
  SET @Result = (SELECT AVG(Weight) FROM Animals.dbo.Kuslar WHERE KusNo <=@KusNo)
RETURN(@Result)
END


Function Kullanma(Fonksiyon  Kullanma)  
  • İstediğimiz lokasyondan doğru path i vererek fonksiyonumuzu çağırabiliriz.
 ÖRNEK:

DECLARE @KusNo int
SET @KusNo = 5
SELECT dbo.fnc_OrtalamaAgirlik(@KusNo) AS Ortalama



58. SELECT INTO Deyiminin Kullanılması

  • SELECT INTO ile ilgili veritabanı üzerindeki verilerle kopya veritabanı oluşturabiliriz.
  • Kullanım durumlarına değinirsek  örneğin tablomuza değişiklik yapmadan önce yedekleyebiliriz.
  • Ayrıca bütün bir veritabanını kopyalamak yerine istediğimiz verileri içeren yeni bir kopya oluşuturup onu yedekleyebiliriz.

SÖZ DİZİMİ;

SELECT kolon_ad(ları) INTO [yeni_veritabanı.]yeni_tablo_adı
FROM ilgili_veritabanı

ÖRNEK:

SELECT * INTO Animals.dbo.Kuslar_Yedek FROM Animals.dbo.Kuslar
 

23 Aralık 2012 Pazar

SQL Serverda Karakter Sorunları

  • SQL Serverda Unicode Karakter Nasıl Kullanabiliriz?
-SQL Server elle girdiğimiz string değeri ASCII olarak algılar.

-Bu string Unicode String olarak algılaması için string ifadesini başına 'N' koymamız gerekmektedir.
  • Bozuk Karakterilerin Karşılığını Nasıl Bulabiliriz?  
 -Tabi ki belli başlı harfleri kontrol ederek onlara bizdeki karşılıklarını atayarak bozuk karakterlerin karşılığını bulabiliriz.

DECLARE @gelen NVARCHAR(MAX)
DECLARE @sonuc NVARCHAR(MAX)
SET @gelen = N'þýrýnga'

SET @sonuc = Replace(@gelen COLLATE Latin1_General_BIN,N'ð', N'ğ');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'ð', N'Ğ'); 
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN, N'Ð', N'Ğ');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'ý', N'ı');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'Ý', N'İ');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'þ', N'ş');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'Þ', N'Ş');
SELECT  @sonuc  COLLATE Turkish_CI_AS ;





Yukardaki örneğimizdeki gibi bir fonsiyon ile gerekli dönüşümü yapabilirsiniz.

9 Aralık 2012 Pazar

SQL' de VIEW Tanımlama ve Kullanımı

  • Öncelikle view lere neden ihtiyaç duyarız onu anlatalım.
  • Vıewler kısaca ben bütün tablodaki sütunları değilde sadece şu şu sütunlar listelensin demek için kullanılır.
  • Örneğin bir çalışan tablonuz olsun ve bu tabloda personelin adresinden tutun aldığı maaşa kadar bilgiler bulunsun.Bu durumda sadece herkese açık verileri tutan yeni bir tablo create etmek yerine belirli sütunları gösteren bir view create edebiliriz.
  • Ayrıca parçalı sorgularımızı da view e bağlayabiliriz. Bu view üzerinden yeni sütun ekleyip silebiliriz. 
  • Veri tabanı view da oluşan datayı saklamaz. Dolayısıyla bir viewun geçtiği SQL deyimi her çalıştırıldığında ilgili view sanal kümeyi yeniden oluşturur.

SÖZ DİZİMİ:

CREATE VIEW Kuslar_view
(KusNo,Adı)AS
SELECT KusNo,Adı FROM Kuslar


NOT: Eklediğimiz VIEW ın Yapıdaki yerini ve sorgusunu aşağıdaki resimde görebilirsiniz.


NOT: Database imizde bulunan VIEW ler hakkında ayrıntılı bilgi almak için System sp sini kullabiliriz.

SÖZ DİZİMİ:

SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE



NOT: Ayrıca view içindeki sorgumuzu öğrenmek istediğimiz zaman da aşağıdaki sorgu cümlemizi kullanabiliriz.

SÖZ DİZİMİ:

SELECT * FROM  INFORMATION_SCHEMA.VIEWS



Vıewlerimizi silmek gayet basit.Drop ederek View imizi veritabanımızdan sileriz.

DROP VIEW [view adı]

NOT: Özetlemek gerekirse view ile kullanıcılara göstermek istediğimiz verileri gösterir istemediklerimiz yokmuş gibi yaparız.

8 Aralık 2012 Cumartesi

T-SQL de sp_helptext System Prosedürünün kullanılması

  • sp_helptext prosedürü bizim tanımladığımız yada sistemde bulunan objelerin tanımlamalarını text formatında gösterir.
  • Böylece istediğimiz objenin tüm içeriğini nerede olduğunu aramadan Örneğimizle direk alabiliriz.
SÖZ DİZİMİ:
sp_helptext '@objname'

USE NORTHWIND
GO
EXEC
sp_helptext 'Ten Most Expensive Products'
GO



2 Aralık 2012 Pazar

T-SQL'de sp_help System Prosedürünün Kullanımı

  • Genel olarak sistemde bulunan bir tablo hakkında ayrıntılı bilgi almamızı sağlar.
SÖZ DİZİMİ:

EXEC sp_help '@objname'

A. Bütün nesneler hakkında bilgi almak için;
  • Animal veritabanındaki herbir objenin bilgilerini listeler.
USE Animals

exec sp_help


B. İstenilen Obje hakkında bilgi almak için;

Örneğimiz Animals veritabanındaki Kuslar tablosu ile ilgili bilgileri getirir.

USE Animals

exec sp_help 'Kuslar'


NOT:F1 tuşuyla bunu hazır olarak kullanabilirsiniz.

1 Aralık 2012 Cumartesi

T-SQL'de sp_rename System Prosedürünün Kullanılması

  •  SQL de nesnelerimizin adlarını değiştirmek için sp_rename sistem procedürünü kullanılırız.
SÖZ DİZİMİ:

exec sp_rename @object_name, @new_object_name, @object_type

1-) Tablo adının değiştirilmesi 

SELECT object_id('Birds')
exec sp_rename  'Birds','Kuslar'


SELECT object_id('Birds')
SELECT * FROM Birds
Invalid Object Name 'Birds' hatası döndürecektir.

SELECT * FROM Kuslar
Sorgusunu çalıştırarsınız, Birds tablosundan taşıdığımız kolonları göreceksiniz.
İçerisinde data olduğu için kayıtlı verileri görebilirsiniz.



2-) Kolon adının değiştirilmesi : 

  • Biraz önce create ettiğimiz ve adını Kuslar olarak değiştirdiğimiz tablonun name kolonunu Adı olarak değiştirelim..
  • sp_rename prosedürünün bizim şimdiye kadar kullanmadığımız, default u 'object' olan bir parametresi daha var.  
  • Kolonlar, sysobjects de yer almazlar ve birer database objesi değillerdir ve tablo ismi olmadan da birşey ifade etmezler. 
  •  x tablonun y kolonu diye saklanırlar ve çağırılırlar.  Bu yüzden ismini değiştirdiğimiz nesnenin kolon tipinde olduğunu ve hangi tabloya ait olduğunu  da söylememiz gerekir.
exec sp_rename 'Kuslar.Name','Adı','COLUMN'

Kuslar tablomuza ait olan name isimli kolonu Adı olarak değiştirdik.

SELECT * FROM Kuslar
sorgusunu çağırarak kolon adının değiştiğini görebiliriz.


3-) Index değerinin değiştirilmesi
  • sp_rename ile indexleri de yeniden adlandırabiliriz.
 exec sp_rename 'Kuslar.BirdId', 'KusNo','INDEX'


NOT: sp_rename ile syscomments de bulunan text alanındaki nesne ismini değiştiremeyiz.
Bu yüzden 'function','stored procedure','trigger' ve 'view' gibi programlanabilir nesneler için sp_rename i kullanmamalıyız.
Bu tür nesneler için sp_rename yerine önce bu nesleri drop(silme) edip sonra istediğimiz yeni isim ile yeniden create(oluşturma) edebiliriz.

NOT: Oluşturulan her bir nesne nin bir id si vardır ve sql serverda nesneler id leri ile saklanırlar.
object_id system function ını kullanarak objenin id sini öğrenebilir ve varolup olmadığından da böylecek emin olabiliriz.
object_id (objectname) null döndürüyorsa o isimde nesne ilgili database de yok demektir.

24 Kasım 2012 Cumartesi

57. CONTINUE Komutunun kullanımı

  • Program çalıştığı süreç içinde bazı durumlarda WHILE döngüsü içindeyken END e kadar gidip başa dönmesinden ziyade istediğimiz şartın içinde o an ki döngüsünü bitirmeden başa gönderir ve bir sonraki değer için bloğa girmesini sağlarız.
  • Aşağıdaki örneğimizde sadece karesi çift sayı olan değerlerini yazılması sağlayabiliriz.
ÖRNEK:
DECLARE @Sayi INT
SET @Sayi=1
WHILE (@Sayi<15)
BEGIN
    IF((@Sayi*@Sayi)%2=1)
    BEGIN
        SELECT @Sayi=@Sayi+1
        CONTINUE
    END
    BEGIN
        PRINT CAST(@Sayi AS VARCHAR(5))+' sayısını karesi='+ CAST(@Sayi*@Sayi AS VARCHAR(5))
    END
    SELECT @Sayi=@Sayi+1
END


Ders 58'e Geçebilirsiniz.

23 Kasım 2012 Cuma

56. BREAK Komutunun Kullanımı

  • İstenilen şart yerine getirildiğinde döngüden çıkmak için BREAK komutu kullanılır.
  • Program çalışmasına WHİLE 'ın END satırından sonra devam eder.
  • BREAK komutu performans açısında da önemlidir. 
  • Gereksiz yeri elimizdeki bütün verileri kontrol etmemizi engeller. İstediğimiz dataya ulaştığımız zaman diğerlerini incelemeden döngüden veya listeden çıkmamızı sağlar.
ÖRNEK:
DECLARE @Sayac INT
SET @Sayac=0
WHILE (@Sayac<10)
BEGIN
    SELECT @Sayac=@Sayac+1
    IF(@Sayac*@Sayac>9)
        BEGIN
            PRINT 'Sayı 9 değerini geçti.'
            BREAK
        END
END
PRINT @Sayac

Not: Bu yapıda BEGIN..END lerin kullanımına dikkat edin. T-SQL de bunları düzgün kullanmak önemlidir.

Ders 57' ye geçebilirsiniz.

17 Kasım 2012 Cumartesi

55. WHILE Döngüsünün Kullanımı


  • Tekrar gerektiren işlemlerde istenilen şart sağlanana kadar işlemyapabilmemize imkan verir.
  • While döngüsü ile istediğimiz kadar işlemi tekrarlatabiliriz.
SÖZ DİZİMİ:

WHILE şart
BEGIN
 Tekrarlanması istenilen kod bloğu
END

NOT: Şart gerçekleştiği sürece BEGIN..END arasındaki kod bloğu çalışır.

ÖRNEK:

DECLARE @Sayac TINYINT
SET @Sayac=5
WHILE (@Sayac>0)
BEGIN
    PRINT @Sayac
    SELECT @Sayac=@Sayac-1
END



Not: Örneğimizde @Sayac değerini koşulumuzu sağlayana kadar WHILE döngümüzün içinde tuttuk. Dikkat etmeniz gereken bunu BEGIN..END Bloğu içinde yapmanız.

Önemli Not: Neden BEGIN..END diye sordugumuzda nedenini yokluğundan anlamak daha kalıcı olur diye düşünüyorum. Oda size kalsın. BEGIN.. END'siz ilk döngüsünü bile nasıl bitiremediğini görmelisiniz.:)

Ders 56'ya Geçebilirsiniz.

54. CASE Yapısının Kullanımı

  • Bu yapı SQL'de dallanma olduğu durumlarda bir şartın sağlayabileceği farklı durumları bulmak için kullanılır.
SÖZ DİZİMİ:

CASE koşula girecek değer
     WHEN değer THEN işlem
     WHEN değer THEN işlem
 ELSE işlem
END

ÖRNEK:

 SELECT Name AS İsim,Weight AS Ağırlık,'Durum'=
CASE
    WHEN Weight BETWEEN 1500 AND 2500 THEN 'Büyük'
    WHEN Weight BETWEEN 450 AND 1500 THEN 'Orta'
    WHEN Weight BETWEEN 0 AND 450 THEN 'Küçük'
END
FROM Birds



Not: Birds isimli tablomuza 4 tane yeni Instance ekledik. Bunlara kafamıza göre ağırlık belirleyip sadece case yapısını nasıl kullanabiliriz onu gördük.

Ders 55'e geçebilirsiniz.

29 Ekim 2012 Pazartesi

53. IF..ELSE Yapısının Kullanılması

  • Diğer programlama dillerinde olduğu gibi SQLde de bloklar kullanılır.
  • Eğer işlenecek komut satırları birden fazla ise mutlaka BEGIN..END yapısı kullanılmalıdır.
  • IF..ELSE blokları komutların belirli bir koşula bağlı olarak çalışmasını sağlar.
SÖZ DİZİMİ:
IF Koşul
{
   Deyim
}
ELSE
{
   Deyim
}
ÖRNEK:
//ortalama fiyatın düşük veya yüksek olup olmadığını buluyoruz.

DECLARE @ortalamafiyat DECIMAL(10,2)
SELECT @ortalamafiyat=AVG(UnitPrice) FROM Products
PRINT 'Ortalama Birim Fiyatı='+CAST(@ortalamafiyat AS VARCHAR(5))
IF(@ortalamafiyat<30)
BEGIN
    PRINT 'Düşük Fiyat'
END
ELSE
BEGIN
    PRINT 'Yüksek Fiyat'
END


Ders 54'e geçebilirsiniz.

14 Ekim 2012 Pazar

52. SQL KARAKTER FONKSİYONLARI

  • Karakter değerleri üzerinde işlem yapmak için karakter fonksiyonları kullanılır.
1-) CHAR() Fonksiyonu
-ASCII kodu verilen karakteri gösterir.

SELECT CHAR(69)  // E harfi

SELECT ASCII('B') // 66

2-) CHARINDEX() Fonksiyonu
-Bir metin içerisinde istedilen metin parçasını istediğimiz konumdan itibaren arar.

SELECT CHARINDEX('Aranacak metin','İçinde arancak metin',0)

SELECT CHARINDEX('tr','sqltr.blogspot.com',0) // Sonuç 4 döner.

3-) LEFT() Fonksiyonu
-Metinde sol taraftan istediğimiz uzunluktaki metni alır.

SELECT LEFT('sqltr.blogspot.com',5) // Sonuç 'sqltr' döner.

4-) LEN() Fonksiyonu
-Metnin uzunluğunu verir.

SELECT LEN('sqltr.blogspot.com') // Sonuç 18

5-) LOWER() Fonksiyonu
-Metnin tamamını küçük harfe çevirir.

SELECT LOWER('SQLtr.BLOGspot.com') // Sonuç 'sqltr.blogspot.com'

6-) LTRIM() Fonksiyonu
-Metnin başında bulunan boşluk karakterlerini siler.

SELECT LTRIM('  sqltr.blogspot.com')  // Sonuç 'sqltr.blogspot.com'

7-) RIGHT() Fonksiyonu
-Metinde sağ taraftan istediğimiz uzunluktaki metni alır.

SELECT RIGHT('sqltr.blogspot.com',3) // Sonuç 'com' döner.

8-) RTRIM() Fonksiyonu
-Metnin sonunda bulunan boşluk karakterlerini siler.

SELECT RTRIM('sqltr.blogspot.com  ')  // Sonuç 'sqltr.blogspot.com'

picture8

9-) REVERSE() Fonksiyonu
-Metni ters çevirir.

SELECT REVERSE('sqltr.blogspot.com') // Sonuç 'moc.topsgolb.rtlqs'

10-) SUBSTRING() Fonksiyonu
-Belirli bir metinde belirli bir karakterden itibaren belirli sayıda karakteri almak için kullanılır.

SELECT SUBSTRING('sqltr.blogspot.com',1,5) // 'sqltr' döner.

Not: Dikkatli olmanız gereken String ifadelerde ilk karakter 1. karakterdir. 0.karakter değildir.

11-) UPPER() Fonksiyonu
-Metnin tamamını büyük harfe çevirir.

SELECT UPPER('SQLtr.BLOGspot.com') // Sonuç 'SQLTR.BLOGSPOT.COM'

12-) STUFF() Fonksiyonu

-Metnin içinde belirttiğimiz uzunluktaki karakteri siler ve onun yerine belirlediğimiz uzunlukta karakter ekler.

- STUFF ( metin, başlangıç karakteri, kaç karakter, yeni eklenecek metin)

SELECT STUFF('sqltr.blogspot.com',1,5,'aileye')

13-) CONCAT() Fonksiyonu 
Ders- 65

14-) PATINDEX() Fonksiyonu
Ders- 66

15-) REPLACE() Fonksiyonu 
Ders- 67




Ders 53'e geçebilirsiniz.

51. SQL TARİH VE ZAMAN FONKSİYONLARI

  • Tarih ve zaman değerleri üzerinde işlemler yapmamızı sağlayan fonksiyoları içerir.

1-)GETDATE() Fonksiyonu
-O an ki tarih ve saat değerini dönüdürür.

Örnek: SELECT GETDATE()


2-)DATEADD() Fonksiyonu
-Verilen tarihi istenilen sayıda tarih bilgilerinin eklemesini yapar.

-Bu fonksiyonda bilmemiz gereken;
dd(gün)
mm(ay)
yy(yıl) anlamına gelmektedir.

Örnek 1: SELECT DATEADD(dd,60,'15.09.2012')
Açıklama: Belirtilen tarihe 60 gün ekleyen fonksiyon.
//Sonuç .14.11.2012

Örnek 2:
SELECT DATEADD(mm,2,'15.09.2012')
Açıklama: Belirtilen tarihe 2 ay ekleyen fonksiyon.
//Sonuç 15.11.2012

Örnek 3: SELECT DATEADD(yy,3,'15.09.2012')
Açıklama: Belirtilen tarihe 3 yıl ekleyen fonksiyon.
//Sonuç 15.09.2015

3-)DATEDIFF() Fonksiyonu
-Belirtilen iki tarih arasındaki farkı istenilen cinste verir.

Örnek: SELECT DATEDIFF(dd,'10.10.2011','11.11.2012')
Açıklama:İki tarih arasındaki gün farkını verir.
NOT:Ayrıca;
Hafta için 'wk'
Gün için 'dd'
Saat için 'hh'
Dakika için 'mi'
Saniye için 'ss'



4-)DATEPART() Fonksiyonu
-Tarihle ilgili sayısal bilgilerin alınmasını sağlar.

Örnek:
SELECT DATEPART(dd,'13.12.2012')

SELECT DATEPART(mm,'13.12.2012')

SELECT DATEPART(yy,'13.12.2012')



Ders 52'ye geçebilirsiniz.


6 Eylül 2012 Perşembe

50. PRINT Kullanımı

  • Değişkenlerin değerlerini, dönen hataları vb. diğer ihtiyaç duyulan sonuçların direk ekranda gisterilmesinde PRINT Komutu kullanılır.
  • Özellikle Debug işlemlerinde ihtiyaç duyulur.
Söz Dizimi: PRINT 'sqltr.blogspot.com'


Ders 51' e geçebilirsiniz.

49. DECLARE & SET Kullanımı

  • SQL'de değişken tanımlamalarında DECLARE komutu kullanılır.
  • Tanımlıdığımız değişken değer atama işlemlerinde SET komutu kullanılır.
Söz Dizimi: DECLARE @<Değişken_Adı> <Değişken_tipi>



Ders 50'ye geçebilirsiniz.

48. USE Kullanımı

  • Kısacası USE kullanımı hangi database üzerinde işlem yapacağımızı belirtir.
  • SQL Server da New Query dediğimizde default olarak gelen database sol üst menüde görünmektedir.
Söz Dizimi: USE Animals


  • Sql Serverda üzerinde çalışacağımız databaselerin belirtilmesinde birkaç yol vardır.
1-)Eğer tek bir database üzerinde çalışıyorsak menüden istediğimiz database i seçip USE kullanmadan da sorgularımızı gerçekleştirebiliriz.



2-)Ya da sol üst menüyle hiç ilgilenmeyip direk sorgu sayfamıza USE 'DATABASE NAME' ile SQL Server da bulunan istediğimiz database üzerinde çalışabiliriz.



3-)Eğer birden fazla database üzerinde işlem yapıyorsak sorgularımızda database belirterek istediğimiz
database lerden veri çekebiliriz.


Ders 49' a geçebilirsiniz.

12 Ağustos 2012 Pazar

SQL Server'da Stored Procedure

  • SQL ifadeleri SQL Serverda Stored Procedure olarak saklanmaktadır. 
  • Basit örneklemek gerekirse " SELECT * FROM Birds " ifadesini saklayabiliriz. Ama büyük yapılarda kullanılan Stored Procedureler daha komplekstir. 
  • Stored Procedure'ler birden fazla tablonun farklı JOIN işlemleri ile bağlanmasıyla ve parametreli veya parametresiz değerlerin WHERE koşullarıyla kısıtlanmasıyla istenilen sonuça hızlı ve sade bir şekilde ulaşmamızı sağlar.

ÖRNEK:
CREATE PROCEDURE Person_Selection
@yas INT

AS

IF(Yas> 19)
SELECT * FROM Person WHERE Yas > @yas ORDER BY Yas
ELSE
SELECT * FROM Person WHERE Yas> @yas and Eriskin=1 ORDER BY Yas

GO

11 Ağustos 2012 Cumartesi

Stored Procedure Tipleri ve Genel Yapısı

     1-) Stored Procedure Tipleri

  • Extended Stored Procedure :  Genellikle *.dll şeklinde derlenmiş prosedürlerdir.
  • CLR Stored Procedure : SQL Server 2005’den itibaren CLR ortamındaki herhangi bir dili kullanarak kodladığımız stored procedure’lerdir.
  • Sistem Stored Procedure : Genellikle sp_ ön eki ile başlarlar ve hepsi master veri tabanında tutulan stored procedure'ler.
  • Kullanıcı Tanımlı Stored Procedure : Programcının yani bizim programladığımız stored procedure'lerdir.

     2-) Stored Procedure'lerin Genel Yapısı

CREATE  PROCEDURE or CREATE PROC  prosedür_adı
[ WITH Seçenekleri ]
AS
               SQL ifadeleri
GO




Açıklama:  Yukarıda gördüğümüz gibi Create Proc veya Create Procedure deyimi ile başlıyoruz ve prosedürümüzün ismini yazıyoruz. WITH seçeneği ile Stored procedure de bulunan kaynak kodlarını gizlemek için kullanıyoruz. WITH kullanımı zorunlu değildir.Create Procedure ile AS deyimleri arasına parametreli stored prosedürler için değişken tanımlaması yapılır. Örnek olarak ' @ogrencino int ' gibi...  Parametresiz prosedürler için herhangi bir tanımlama yapılmaz, AS yazılarak devam edilir. AS’den sonra prosedürün içine yazacağımız SQL ifadelerini yazarız ve GO deyimini de ekleyerek prosedürümüzü tamamlamış oluruz.

Not: GO deyimi zorunlu değildir ama programı ciddi hatalardan kurtarmaktadır.

Daha sonra Procedure 1 kere çalıştırmanız (F5) yapmanız yeterlidir. Stored Procedure'ümüzü tekrar çağırmak istediğimizde aşağıdaki komutu çalıştırmamız yeterlidir.

         EXEC prosedür_adı  


Stored Procedure'ler SQL Serverda aşağıdaki konumda bulunmaktadır.




21 Temmuz 2012 Cumartesi

Stored Procedure Nedir?

  • Yapısal yordamlar olarak da söylenen Stored Procedures belirli bir işlevi, görevi yerine getirmek için özellilkle yapılandırlımış bir veya birden fazla tablo,sp..vs ile ilişkili kod parçacıklarıdır.
  • Kısaca 'Derlenmiş SQL Cümlecikler'dir.
  • SP'ler Database Serverda saklanan SQL ifadeleridir. Diğer programlama dilleri gibi parameterler içerir. Bu parametrelere göre çalışıp farklı sonuçlar listeleyebilir.
  • Ayrıca bir Stored Procedure içinde başka bir Stored Procedure çağırabiliriz.
  • Datebase Serverda saklandıkları için daha hızlı çalışırlar. Normal kod ile çağırmak yerine kodla sadece SP ye parametre gönderip çağırmak çok daha iyi performans sağlamaktadır.
  • SP ler sadece ilk çalıştırıldıklarında derlenirler. Diğer çağrılışlarında derlenmeden çalışırlar. Eğer her seferinde kod içinde bu sorguyu çalıştırsak her seferinde derleme işlemi yapılacağından hem zaman hem de performans açısından kötü olur.
  • Bir SQL komutu çağrıldığında ayrıştırma , derleme ve çalıştırma aşamalarından geçmektedir. SP’ler önceden derlenmiş olduğu için , normal kullandığımız bir SQL sorgusunda olduğu gibi bu 3 aşamadan geçmez, bu özelliği sayesinde programımızın performansı artmaktadır ve ağ trafiğini de azaltmış oluruz, istemci tarafından bir çok satıra sahip SQL komutunun sunucuya gitmesindense, sadece saklı yordamın adının sunucuya gitmesi ağı daha az meşgul etmiş olur. Bir kez yazıp tekrar ve tekrar kullandığımız için modüler bir yapıda program geliştirmiş oluruz.
  • Stored procedure'un diğer bir özelliği ise programlama deyimleri içermesidir. if, next, set vs.. programlama dillerindekine benzer özellikler sunar. Gelen parametrelere göre sorgu yapılıp sonucun dönmesi sağlanabilir. 
  • Eğer veritabanlı bir projede çalışıyorsanız kesinlikle SP ler ile çalışmalısınız. Çoğu programcı programlarının hiç bir yerinde SQL ifadesi kullanmazlar. Her zaman Stored Procedure ler ile çalışırlar.

47. ALTER ve DROP Kullanımı

  • ALTER Komutu nesneler üzerinde değişiklikler yapmamıza imkan verir.
SÖZ DİZİM: ALTER <Nesne_Adı>  <Değişim_Cümlesi>

SORGULAR:
ALTER TABLE Birds
ADD Weight INT NULL
//Birds tablomuza yeni bir Sütun ekleyip değerinin ise NULL olabilir şekilde ayarlıyoruz.

ALTER TABLE Birds
ALTER COLUMN Name VARCHAR(30)
 //Örneğimizde Birds tablomuzda önceden kaydettiğimiz sütunun özelliğini değiştiriyoruz. Artık Name alanı 30 karaktere kadar değer alabilir. 

DROP TABLE Birds
//Veritabanımızdan Birds tablomuzu siler.


Ders 48'e geçebilirsiniz.

46.CREATE İşlemleri

  • Veritabanındaki nesneleri oluşturmak için kullanılır.
SÖZ DİZİM: CREATE <Nesne_Adı>

SORGULAR:
CREATE DATABASE Animals
//Animals isminde yeni bir veritabanı oluşturulur.

CREATE TABLE Birds(BirdId INT,Name VARCHAR(25) )
//Bu sorguda veritabanımızda yeni bir tablo oluşturduk. Kuşlar tablomuz birdId ve Name sütunlarından oluşmaktadır.

Ders 47'ye geçebilirsiniz.

45. DELETE Kullanımı

  • DELETE ifadesi tablomuzdaki bir veya birden fazla kayıdın silinmesini sağlar. 
  • Eğer koşul belirtmessek bütün kayıtları tablomuzdan siler. O yüzden DELETE ifadesini kullanırken dikkat etmeli ve BEGIN TRANSACTİON ..yapısını kullanmamız önem arz etmektedir.
SÖZ DİZİMİ: DELETE FROM Table
                       WHERE <Sütun_Adı>=<Koşul_Değeri>

ÖRNEK: Sorgumuzda Employees tablumuzdaki bir kayıdı silmek isteyelim.

SORGU: SELECT * FROM Employees
                DELETE FROM Employees WHERE EmployeeID=10
                SELECT * FROM Employees

Ders 46'ya Geçebilirsiniz.

44. UPDATE Kullanımı

  • UPDATE deyimi tablomuzda bulunan verileri güncellemek, değiştirmek için kullanılır.
SÖZ DİZİMİ:
         UPDATE <tablo adı>
         SET <sütun adı>= <yeni değer>
         WHERE <sütun adı> = <eski değer> 

ÖRNEK: Sorgumuzda Çalışan tablomuzda bir kaydımızı güncellemek isteyelim. 'Margaret' isimli çalışanın terfi aldığını düşünürsek gerekli güncellemeyi yapalım. 2 tane aynı SELECT sorgusunu farklı görmek için koydum.

SORGU:SELECT * FROM Employees
   UPDATE Employees SET Title='Sales Manager' WHERE EmployeeID=4
   SELECT * FROM Employees



Ders 45' e Geçebilirsiniz.


18 Temmuz 2012 Çarşamba

43.INSERT INTO... VALUES Kullanımı

  • INSERT INTO Deyimi bir tabloya yeni kayıt eklemek için kullanılır.
  • Önce gördüğümüz INSERT Deyiminden farklı olarak sadece istediğimiz sütunlara da kayıt işlemi yapabiliriz.
  • 2 farklı kullanım şekli vardır.
1-) Söz Dizimi 

 INSERT INTO tablo_ismi (kolon1, kolon2, kolon3,...)  
VALUES (deger1, deger2, deger3,...)

2-) Söz Dizimi

INSERT INTO tablo_ismi  
VALUES (deger1, deger2, deger3,...)

ÖRNEK: Çalışan tablomuza sadece isim ve soyad bilgilerini girerek yeni bir kayıt ekleyebiliriz.

SORGU:INSERT INTO Employees(LastName,FirstName)
               VALUES ('Cücü','Cüneyt')


Ders 44'e geçebilirsiniz.

3 Temmuz 2012 Salı

42. INSERT...SELECT Kullanımı

  • Bir sorgunun sonuç kümesini yeni bir tabloya kayıt olarak atmak istersek INSERT... SELECT yapısını kullanırız. 
  • Bu durumda dikkat etmemiz gereken 2 durum vardır:
  1. Değer girdiğimiz alanın default(varsayılan) bir  değerinin olup olmadığına,
  2. Tablonun alanlarının boş(NULL) değere izin verip vermediğine dikkat etmeliyiz. Eğer NULL değere izin vermiyorsa gerekli veri tipinde mutlaka değer göndermeliyiz.
ÖRNEK: Sorgumuzda çalışanlarında birer müşteri olduğu göz önünde bulundurularak müşteri tablosuna kaydedilmesi istenmektedir.

SORGU: INSERT customers
SELECT SUBSTRING(firstname,1,2)+SUBSTRING(lastname,1,3)
,lastname, firstname, title, address, city
,region, postalcode, country, homephone, NULL
FROM employees


Ders 43'e geçebilirsiniz.

41.SQL INSERT.. VALUES Kullanımı

  • INSERT ifadesini VALUES ile birlikte kullanarak istediğimiz tabloya yeni kayıt atabiliriz. 
  • Dikkat etmemiz gereken eklediğimiz verilerin eklediğimiz tablodaki sütün tanımlamalarına uyumlu olması yani VARCHAR tipinideki bir sütuna INTEGER değeri yazmamalıyız.
ÖRNEK: Sorgumuzda Nakliyatçı firma listemize yeni bir firma ekleyelim. ShipperID değerini girmedik. Çünkü ShipperID sütunu Primary Key olarak tanımlanmış. Yani default olarak 1 arttırım ile otomatik kayıt atmaktadır.

SORGU:SELECT * FROM Shippers
INSERT Shippers(CompanyName,Phone)
VALUES('IstanbulKargo','(0232) 456-89-89')
SELECT * FROM Shippers


Ders 42'ye geçebilirsiniz.

17 Haziran 2012 Pazar

40.SUBQUERİES- EXISTS ve NOT EXISTS Kullanımı

  • Bazı durumlarda sorgu sonucu dönen listeyle ilgili değilde herhangi bir değer dönüp dönmediyle ilgileniriz. 
  • İşte böyle durumlarda EXISTS ve NOT EXISTS kullanırız. 
  • EXISTS ve NOT EXISTS kullanımı TRUE veya FALSE değerleri döndürür.
Örnek: Birinci sorguda ‘3/05/1997’ ve '4/05/1997' tarihleri arasında sipariş almış olan çalışanlar EXIST işlevi yardımıyla tespit edilip, bilgileri listelenmiştir. Aynı sonuca tabloları JOIN ile birleştirerek te ulaşabiliriz. İkinci sorgudaki DISTINCT ifadesi her çalışanın tekbir kez görüntülenmesini sağlar.

Sorgu-1:
SELECT EmployeeId,LastName,FirstName
FROM Employees AS e
WHERE EXISTS
(SELECT * FROM Orders AS o
     WHERE e.EmployeeId=o.EmployeeId
    AND o.OrderDate BETWEEN '3/5/1997' AND '4/5/1997') 


Sorgu-1:
SELECT DISTINCT FirstName,LastName, e.Employeeid
FROM
Orders AS o
INNE
R JOIN Employees AS e
ON
o.Employeeid =e.Employeeid
WHERE
o.OrderDate BETWEEN '3/5/1997' AND '4/5/1997'


Ders 41' e geçebilirsiniz.

39. SUBQUERIES-HAVING Dönüşümü

  • İlişkili alt sorgularla elde ettiğimiz sonuçları aynı zamanda HAVING işlemi ile de elde edebiliriz. Bu bize kullanım çeşitliliği sağlar.
Örnek: İnceleyeceğimiz iki örnekte aynı kategorideki ürünlerden birim fiyatı ortalama birim fiyatından yüksek olan ürünleri kategoriye göre listelenmesini istiyoruz. İlk örneğimizde herhangi bir dönüşüm yapmadan gerekli koşullarımızı sağlıyoruz.

Sorgu:
SELECT ProductName,CategoryID,UnitPrice FROM Products AS p1
    WHERE p1.UnitPrice>(SELECT AVG(UnitPrice) FROM Products AS p2 WHERE p1.CategoryId=p2.CAtegoryId)
    ORDER BY CategoryId




Örnek: Bu örneğimizde INNER JOIN ve HAVING kullanarak aynı sonucu listeliyoruz.

Sorgu:
SELECT p1.ProductName,p1.CategoryID,p1.UnitPrice FROM Products AS p1
    INNER JOIN Products AS p2 WITH (NOLOCK) ON p1.CategoryID=p2.CategoryID
    GROUP BY p1.ProductName,p1.CategoryID,p1.UnitPrice
    HAVING p1.UnitPrice>AVG(p2.UnitPrice)
    ORDER BY p1.CategoryId


Ders 40 'a geçebilirsiniz.

4 Haziran 2012 Pazartesi

38. SUBQUERIES - JOIN Dönüşümü

  • Genel olarak ilişkili alt sorguları birer JOIN ifadesi yerine de kullanabiliriz. 
  • Aralarında sadece kullanım olarak farklılık bulunmaktadır. 
  • Sonuç olarak ise iki sorgudan da aynı sonucu elde ederiz.
Örnek: İlk sorgumuzda çalışanların hitap şekillerini 2 sorguda birbirine eşit olmayanların karşılaştırmasını yaptık. Yani IN ile bir liste alıp bunu kendi içinde eşit olmayanlarla karşılaştırdık.

Sorgu:
SELECT  DISTINCT E1.TitleOfCourtesy FROM Employees AS E1
WHERE E1.City IN
(SELECT E2.City FROM Employees AS E2 WHERE E1.TitleOfCourtesy<>E2.TitleOfCourtesy)



Örnek: Bu sorgumuzda üstteki örneğin JOIN işlemiyle yapılmış halidir.

Sorgu:
SELECT DISTINCT E1.TitleOfCourtesy FROM Employees AS E1
INNER JOIN Employees AS E2 WITH (NOLOCK) ON E1.City=E2.City
WHERE E1.TitleOfCourtesy<>E2.TitleOfCourtesy



Ders39'a Geçebilirsiniz.

29 Mayıs 2012 Salı

37. SUBQUERIES-İlişkili Alt Sorgular

  • Aslında iç sorgular ve dış sorgular belirli bir alan yani sütun üzerinden ilişkili ve birbirlerine bağlıdır. 
  • Bunu genelde WHERE koşulu üzerinden sağlarız.
Örnek: Aşağıdaki örneğimizde her bir ürün için verilmiş en yüksek sipariş miktarını listelemekteyiz.

Sorgu: 
SELECT DISTINCT ProductId,Quantity
FROM [order details] AS ord1
WHERE Quantity=( SELECT MAX(Quantity)FROM [order details] AS ord2
                  WHERE ord1.productid=ord2.productid )
ORDER BY ProductId

Ders 38'e geçebilirsiniz.

26 Mayıs 2012 Cumartesi

36. SUBQUERIES-Sonuç Listesinin Deyim Olarak Kullanılması

  • Sorgularımızda başka bir sorguyu deyim yani yeni bir parametre olarak kullanabiliriz. 
  • Bu amaç için kullanacağımız sorgu ya tek satır sonuç döndürmeli yada tek bir sütun değer listesi döndürmeli.
  • Bir değerler listesi geri döndüren sorgular IN anahtar kelimesi içeren WHERE yantümcesi yerine kullanılabilir. 
Örnek: Sorgumuzda ortalamayı bulup satılan ürünlerimiz ayrıntılı birim fiyatlarını ve bu birim fiyatlarının genel ürün potansiyelinde ortalama ürün fiyatına oranla durumunu göstermekte. Burda alt sorguları kullanarak daha anlaşılabilir sorgu yazabiliriz.

Sorgu: 
SELECT ProductName,UnitPrice,UnitsinStock,
(SELECT AVG(UnitPrice) FROM Products) AS Average,
UnitPrice-(SELECT AVG(UnitPrice) FROM Products) AS Difference
FROM Products 



Ders 37' geçebilirsiniz.

25 Mayıs 2012 Cuma

35. SUBQUERIES-Sonuç Listesinin Tablo Olarak Kullanılması

  • Sorgularımızda FROM dan sonra tanımladığımız tablo bağlanıtısı yerine tablo değilse sorgu yazabiliriz. 
  • Sonucunda da ilerde bahsedeceğim TEMP TABLE kullanmış oluruz. 
  • Dönen sonuç listesi temp tablo gibi kullanılıp AS ile ad verilip sütunlarını istediğimiz gibi kullanabiliriz.
Örnek: Sorgumuzda Çalışan tablomuzdan bize lazım olanları alıyoruz. Daha anlaşılabilir hale getirip temp tablomuzu kullanarak yeni bir sorguya bağlıyoruz.

Sorgu: 
SELECT Calisan.Kimlik, Calisan.Isim, Calisan.Soyad FROM
(SELECT EmployeeID AS Kimlik,LastName AS Soyad,FirstName AS Isim FROM Employees)
 AS Calisan


Ders 36'ya geçebilirsiniz.

34. SUBQUERIES (ALT SORGULAR)

  • Kısaca Alt Sorgu bir sorgu içine gömülmüş SELECT sorgularıdır. 
  • Çoğu durumlarda  Alt Sorguyu JOIN ifadelerine dönüştürebiliriz. 
  • Genelde Büyük sorgulardaki karmaşıklığı azaltmak, anlaşılabilirliği arttırmak için kullanılırlar. 
  • Mantık olarak burda yaptığımız bir sorgu sonucu gelen sonuç listesine dayalı yeni sorgular çalıştırmak için kullanırız. 
  • Bilmeniz gereken Alt Sorgularda JOIN işlemi daha hızlı işlemektedir. 
  • Ayrıca daha karmaşık SP'ler yazmaya başladığınızda bunu daha iyi anlayacaksınız. 
  • Scriptlerin anlaşılabilirliği, yazılımcıdan bağımısızlığı ne kadar iyi sağlanırsa yazdığınız sorgular o kadar uzun ömürlü ve kullanılabilir olur. 
  • Kural olarak ise Alt Sorguları parantez içinde yazmalıyız.

İlgili Konular;

35. SUBQUERIES-Sonuç Listesinin Tablo Olarak Kullanılması 
36. SUBQUERIES-Sonuç Listesinin Deyim Olarak Kullanılması 
37. SUBQUERIES-İlişkili Alt Sorgular 
38. ALT SORGULAR - JOIN Dönüşümü
39. SUBQUERIES-HAVING Dönüşümü 
40.SUBQUERİES- EXISTS ve NOT EXISTS Kullanımı

33. UNION Kullanımı

  • Bazen sonuç kümesinin tek olmasını isteriz. 
  • Yani birden fazla yazdıgımız SELECT sorgularından dönen sonuç listeleri sorgu sayısı kadardır. 
  • Bunu tek bir sonuç listesinde döndürmek için UNION kullanırız. 
  • Görüntülenecek olan tablolar aynı veritüründe aynı sayıda ve aynı düzendeki sütunlardan oluşmalıdır.

Örnek: Aşağıdaki örnekte Çalışanlar (Employees) tablosu ve Yön(Region) tablosu verileri birleştirilmiştir. Birinci sorgunun SELECT ifadesindeki takma adın görüntülendiğine dikkat edin.

Sorgu: 
SELECT EmployeeID,City FROM Employees UNION
SELECT RegionID,RegionDescription FROM Region



Ders 34 'e geçebilirsiniz.

22 Mayıs 2012 Salı

32. SELF-JOINS Kullanımı

  • Bir tablonun kendisiyle JOIN işlemine tutulmasına SELF-JOIN işlemi denir. 
  • Tablodaki aynı değerleri içeren farklı kayıtlar mevcutsa bunları listeleyebilmek için kendisiyle birleştiririz.  
  • Bir tablo içinde bulunan satırlar arasında referans ilişkisi varsa, o tablo için farklı takma adlar (alias) kullanılarak JOIN sorguları gerçekleştirilebilir. 
  • Çok kullanılan bir yöntem değildir.
 Örnek: Aşağıdaki sorgumuzda aynı tabloyu kendisiyle birleştirdik. Daha çok SELF-JOIN işlemini aynı değerleri olan farklı kayıtlar üzerinde işlem yaparken kullanmalıyız. Örnekte basitce aynı tablo içi kıyaslama yaptık. SicilNo olarak her çalışanın altında olan çalışanları listeledik.

Sorgu: 
SELECT a.employeeid AS SicilNo,a.lastname,a.title
,b.employeeid AS AltSicilNo, b.lastname ,b.title
FROM employees AS a
INNER JOIN employees AS b
ON a.title=b.title
WHERE a.employeeid < b.employeeid
ORDER BY a.employeeid



Ders 33'e geçebilirsiniz.

20 Mayıs 2012 Pazar

31. İkiden Fazla Tablonun Birleştirilmesi

  • Büyük sorguların yazıldığı durumlarda ikiden fazla tablonun belirli kısıtlamalarla birleştirilmesi gerekebilir. 
  • JOIN işlemiyle birleştirilen tablolar bir başka tabloya aradaki ortak sütunlar üzerinden bağlanabilir.
Örnek: Aşağıdaki örnekte Sipariş Detayları(Order Details) tablosunu ara tablo şeklinde kullanarak, Siparişler (Orders) ve Ürünler(Products) tablosundan gerekli bilgileri görüntülenmiştir. Bir sipariş birden fazla ürünü içerebilir ve bir ürün birden fazla siparişte yer alabilir. Sonuç kümemizde Sipariş Detayları (Order Details) tablosundan hiçbir alan görüntülemesekte sorguda kullanmalıyız.

Sorgu:
SELECT OrderDate,ProductName FROM Orders AS O
INNER JOIN [Order Details] AS OD ON O.Orderid=OD.Orderid
INNER JOIN Products AS P ON OD.Productid=P.Productid
WHERE OrderDate BETWEEN '7/8/96' AND '7/9/96'
ORDER BY OrderDate

Ders 32'ye geçebilirsiniz.