msHOWTO

30 Nisan 2012 Pazartesi

T-Sql Transaction

Merhaba arkadaşlar.Bu makalemde sizlere oldukça önemli ve kullanılan bir yöntemi anlatacağım.Transaction.Nedir bu transaction? Bir bütün olarak çalışması gereken bir takım sql komutlarınız olduğunu düşünün.Dolayısıyla bu komutlardan birisinin çalışması sırasında oluşacak bir hata sonucunda diğer sql komutlarının sonuçları da etkilenecektir.Bu konuya en güzel örnek banka havale işlemidir aslında.Düşünün ki siz bana 1000Tl havale yaptınız.Fakat banka sizden parayı çektikten sonra bir hata oluştu ve bana çektiği parayı yatırmadı.Eee ne olacak?Para nerede ? Para uçtu değil mi ? Sizden 1000tl gitti.Bana para gelmedi.Düşünün bu şekilde 100 kere hata oluştuğunu hatta çok daha fazla miktar havale sırasında hata oluştu.Banka batar :) İşte bu şekilde son derece önemli ve bir bütün halinde başarılı çalıştıktan sonra sonuçların yansıması gereken işlemlerde Transaction kullanılır.

Şimdi id,adi ve bakiyesi kolonlarından oluşan basit bir hesap tablomuz olsun.Bu tablo üzerinden havale işlemini yapan sql komutlarını yazalım .

update Hesap set Bakiyesi-=1000 where id =2

update Hesap set Bakiyesi+=1000 where id =3

Yukarıdaki sql komutları birlikte çalışması yani bütün halinde çalışması gerekmektedir.Diyelim ki bir hata oluştu.Çok basit bir hata fırlatalım hemen .

update Hesap set Bakiyesi-=1000 where id =2
update Hesap set Bakiyesi+=(select 10/0where id =3

Yukarıdaki division by zero hatası fırlattım basit olarak.Diyelim ki bir hata oluştu id si 2 olan hesaptaki müşteriden 1000 tl düşüyor.Fakat 3 'e aktarılmıyor.Bunu engellemek için akla gelen try catch dir.

begin try
update Hesap set Bakiyesi-= 1000 where id =2
update Hesap set Bakiyesi+=(select 10/0)  where id =3
end try
begin catch
print 'hata oluştu'
end catch

Fakat bu şekilde kullanırsak da ilk işlemi yapacak diğerinde hata oluşacağı için yapmayacaktır.Try catch de işimize yaramadı arkadaşlar. Tek bir çaremiz var transaction kullanmak.

begin try
      begin transaction
            update Hesap set Bakiyesi-=1 where id =2
            update Hesap set Bakiyesi+= (select 10/0)  where id =3
      commit tran--transaction da yazılabilir.Commiti gordugunde o ana kadarki işlemleri onaylar ve gerçek verilere yansıtır.    
end try
begin catch
      print ' hata oluştu '
      rollback tran --transaction da yazılabilir.
end   catch



Evet arkadaşlar yukarıdaki bir transaction yapısı oluşturursak eğer işlemlerimizin tamamı başarılı bir şekilde gerçekleşirse sonuçları kayıtlarımıza yansıyacaktır.Aksi taktirde hiç bir işlem olmayacaktır.Buradan anlaşılan şudur: Transanction da ya hep ya hiç mantığı vardır.

Umarım faydalı olmuştur arkadaşlar.Bir sonraki makalemde görüşmek dileğiyle...

T-Sql Trigger 2 - DDL Trigger

Merhaba arkadaşlar.Trigger konumuzun 2.partında Ddl Trigger ları anlatacağım.Önceki partta Dml trigger ları anlatmıştım.Ddl Trigger lar tanımlandığı sql server üzerinde çalıştırılan Ddl sorguları ile tetiklenen triggerlardır.Database oluşumundan tutun da view düzenlemesine kadar dml sorguların etki ettiği tüm database nesneleri üzerinden tetiklenebilirler.Farklı senaryolar ile ddl triggerların oluşturulmasını inceleyeceğiz arkadaşlar.

Not:Syntax i dml trigger lar ile aynıdır.Bu yüzden tekrardan incelemeye almayacağım.Dml trigger ları anlattığım makaleden syntax i hakkında bilgi edinebilirsiniz.

İlk senaryomuz server üzerinde herhangi bir tabloyu herhangi bir şekilde değiştirme işlemini engelleyen bir trigger oluşturmak olsun arkadaşlar.


create trigger TabloDuzenlemeEngeli
on database
for Alter_Table
as
      raiserror('Tablo düzenleme engeli',16,1)
      rollback

Yuarıdaki gibi bir trigger oluşturduğumuzda triggerımızın bulunduğu server üzerindeki tabloların yapısında değişiklik yapılmasını engellemiş oluruz arkadaşlar.Bu trigger da kullandığım 2 tane sql komutu vardır.Raiserror ile hata fırlatma işlemi yapabiliriz.İstediği parametreler sırası ile hata mesajı,severity değeri ve state değeridir.Rollback ise trigger tetiklenmeden önce yapılan işlemleri geri almak için kullanılır.Transaction konusunda detaylı olarak anlatacağım.Şuan üzerinde durmuyorum.

Diğer bir senaryomuz ise database oluşturma engeli vermek olsun.Bunun için de ,

create trigger VeriTabaniOlusturmaEngeli
on all server
for CREATE_DATABASE
as
      raiserror ('Adam ol la',16,1)
      rollback

Diğer bir senaryomuz ise database silme engeli vermek olsun.Bunun için de ,

create trigger VeriTabaniSilmeEngeli
on all server
for Drop_DATABASE
as
      raiserror ('Adam ol la',16,1)
      rollback

Gibi bir çok senaryo kurabiliriz arkadaşlar.Temel olarak anlaşılması gereken önemli nokta tüm database nesneleri üzerinde ddl sorguları çalıştırıldığında yani drop,create ve alter işlemi yapıldığında ddl triggerların tetiklenip içerisinde belirttiğimiz kodları işlemesidir.Diğer tüm özellikleri dml triggerlar ile aynıdır.

Umarım faydalı olmuştur arkadaşlar.Bir sonraki makalemde görüşmek dileğiyle ...


T-Sql Trigger 1 DML Trigger

Merhaba arkadaşlar.Bu makalemizde ki konumuz T-Sql üzerinden trigger oluşturmak.Öncelikle nedir trigger?Ne amaçla kullanılır? Bu soruların cevaplarını arayalım.Trigger'ı C# da ki event lara benzetebilirsiniz arkadaşlar.C# da nasıl ki bir button un click olayı buttona tıklandığı anda içindeki kodlar çalışıyorsa bizim oluşturduğumuz trigger database üzerinden hangi durumu kontrol ediyorsa o durum oluştuğunda kendi içerisindeki kodlar çalışmaktadır.Peki nerelerde kullanılır?En basit olarak bir tabloya çekilen sorguyu kontrol etmeden tutun da bir database oluşturulurken sizin istediğiniz kodların çalışmasına kadar bir çok amaçlar için kullanılır.Hadi gelin syntax ini inceleyelim.


go
create trigger TriggerAdi
on TriggerinEtkilencegiDatabaseNesnesininAdi
after insert
as
--Trigger tetiklendiği zaman çalışacak sql sorguları
 select * from shipers


2 farklı Trigger vardır.

1-) DML Trigger:Dml yani select, insert, update ve delete sorguları sonucunda tetiklenen trigger'lardır.

2-) DDL Trigger:Ddl yani drop,alter ve create sorguları sonucunda tetiklenen trigger'lardır.

     A-)After : Dml veya ddl sorguları çalıştıktan sonra tetiklenir.Dml veya ddl sorguları işlenir ve daha sonrasında trigger içerisine yazılan sorgular işlenir.

     B-)Instead of : Dml veya ddl sorguları çalıştıktan sonra tetiklenir.Dml veya ddl sorguları yerine trigger içerisine yazılan sorgular işlenir.

Basit örneklerden triggerlarımızı yazmaya başlayalım arkadaşlar.


create trigger tetikci
on shippers
after insert
as
 select * from shipers

Yukarıdaki tetikçi ismindeki triggerımız shippers tablosu üzerinde insert işlemi gerçekleştikten hemen sonra kendi içerisinde yazılan sorguları çalıştırmaktadır.Yani kısaca shippers tablosuna veri her eklendiğinde o tabodaki tüm kayıtları gösterir.

create trigger guncellemeTetikcisi on categories
 after update
 as
      print 'Güncelleme tamamlandı.'

Yukarıdaki trigger da categories tablosu üzerinde update işlemi her olduğunda geriye mesaj döndürür.

Basit olarak iki tane trigger oluşturduktan sonra bilinmesi gereken önemli bir noktayı anlatmam gerekmektedir.T-Sql de insterted ve deleted isminde özel tablolar bulunmaktadır.Siz bir insert işlemi yaptığınızda öncelikle verileriniz inserted tablosuna eklenir.Eğer işleminiz başarılı bir şekilde gerçekleşirse verileriniz kaydetmek istediğiniz tabloya kaydolur.Aynı şekilde deleted tablosunda da delete sorgusu çekildikten sonra veriler önce buraya atılır daha sonra silinir.Fakat dikkat ederseniz updated gibi bir özel tablo bulunmamaktadır.Çünkü update işleminde önce veri silnir daha sonra ekleme işlemi yapılır.Yani update işleminde hem deleted hem de inserted tabloları kullanılır.

Bu bilgiden sonra basit olarak inserted tablosunu kullanarak bir örnek yapalım...

go
create trigger Haberci on categories
after insert
as   
      select @sonId=CategoryId from inserted
      select * from categories where categorId=@sonId

Yukarıdaki örnekte categories tablosuna eklenen son kaydın tüm bilgilerini gösteren bir trigger yazdık.

Bir örnekte de deleted tablosunu kullanarak bir trigger oluşturalım arkadaşlar...

create trigger yedekci on shippers
after delete
as
      declare @firmaAdi nvarchar(50)
      declare @telefon nvarchar(24)
      select @firmaAdi = CompanyName , @telefon=Phone from deleted
      insert YedekDataBase.dbo.SilinenShippers values (@firmaAdi,@telefon)

Yukarıdaki örneğimizde shippers tablosunda bir kayıt silindiğinde YedekDataBase isimli database in  SilinenShippers isimli tablosuna silinen kaydı yedek olarak kaydeden bir trigger oluşturduk.Bu örneğimizde de görüldüğü gibi trigger ile silinen kayıtları otomatik olarak loglama yapabiliriz.

Şuana kadar tüm örneklerimizde bir işlem gerçekleştikten sonra Yani After ile kullanılan trigger lar oluşturduk.Fakat gerçekte bir veri tabanından veriler silinmez düşüncesinde olan yazılımcılardan olduğum için bir silme işlemi yapıldığında ne yapacağım ? Benim o silme işlemini engelleyip o kaydı pasif hale getirmem gerekmektedir(Pasif hale getirmek için önceden boolean tipinde bir kolon oluşturduğumu ve bu kolon uzerinden kontrol ettiğimi varsayalım) Şuana kadar trigger oluşturmak için kullandığımız yöntemlerle bu sorunu çözemem arkadaşlar.İşte burada devreye INSTEAD OF girmektedir.

İlk olarak senaryomuz diyelim ki istediğimiz bir tabloda istediğimiz bir kaydın silinmesini engellemek istiyoruz.Bu kayıt bizim için hayati önem arz ediyor diye düşünelim arkadaşlar.Bu işlemi aşağıdaki trigger ile kolaylıkla oluşturabiliriz.

create trigger silmeEngeli on categories
instead of delete
as
      declare @silinenId int
      select @silinenId=categoryId from deleted
      if @silinenId=8
      begin
            print 'Kayýt silinemez'
            rollback tran
      end
      else
      begin
            delete from Categories where CategoryID=@silinenId
      end

İkinci bir senaryoda silinmek istenen veriyi pasif hale getirmek istediğimizi düşünelim.Bu sorunu da aşağıdaki triggerla kolaylıkla çözebiliriz.

create trigger UrunSilmeEngelleyici
on Products
instead of delete
as
      declare @silinenId int
      select @silinenId=ProductId from deleted
      update Products set Discontinued=0 where ProductID=@silinenId




Peki oluşturduğumu tüm bu triggerlar nerede saklanıyor? Oluşturulan ddl trigger lar hangi tablo üzerinde oluşturulduysa yani hangi tabloda ddl işlemi yapıldığında tetikleniyorsa o tablonun altındaki trigger sekmesinde yer almaktadır.

Son olarak bir trigger ı istediğimiz anda enable edip istediğimiz anda disable etmek isteyebiliriz.Bunun için 2 yöntem vardır.İlk olarak ilgili trigger a sağ tıklayıp enable/disable seçeneğine tıklanarak yapılır.T-Sql ile de ,

disable trigger tetikci on shippers --triggerı disable eder
 go
 enable trigger tetikci on shippers --triggerı enable eder

Evet arkadaşlar bu makalemde triggerlara giriş yaptık.DML Triggerları anlattım.DDL Triggerları devamı olarak anlatacağım.Oldukça uzun oldu makale.Okurken sıkılıp yeter artık deme ihtimalinizi düşünerek diğer part ında anlatacağım.Görüşmek dileğiyle...



29 Nisan 2012 Pazar

T-SQL ile SQL Pagging

Merhaba arkadaşlar.Bu makalemde oldulça önemli ve çok yararlı işlem olam pagging yani sayfalamanın nasıl yapılacağını anlatacağım.Ama öncelikle sayfalamanın yararını iyice anlamamız gerekmektedir.Neden kullanılır? Diyelim ki milyonlarca kayıtın olduğu bir tablonuz var ve sorgu çekerek işlem yapacaksınız.Ve aradığınız verinin tahmini olarak nerelerde olduğunu biliyorsunuz.Neden tablodaki tüm kayıtlara sorgu çekeceksiniz ki o zaman.Gereksiz bekleme ve performans kaybı yaşarsınız.Fakat tablodaki tüm kayıtları istediğiniz sayıda sayfalama yaparsanız ve sorgunuzu bir kaç sayfaya atıp hemen sonuç elde etmek müthiş bir şey değil mi ? Bence evet.Hadi bu işlemin nasıl yapıldığına bakalım.

Öncelikle tüm kayıtları bir elde edelim .


SELECT * FROM dbo.Products

Daha sonra ise bu verileri bir şekilde ve benim istediğim türde sıralama yapmam gerekiyor.

SELECT * FROM dbo.Products ORDER BY ProductName

Bu işlemide yaptıktan sonra düşünmem gereken şu ki benim sayfalama yapmam için ve bir sayfada kaç kayıt gözükeceğini belirlemem lazım.Bunun için akla ilk gelen id kolonlarına bakmak olacaktır.Fakat unutulmaması gereken eğer silinen veri varsa düzgün sonuç alamayız.Id kolonundaki değerlerin üzerinden yola çıkamam.Onun için de kendi algoritmamı yazmam gerekmektedir.

DECLARE     @PageSize INT,
      @PageNumber INT,
      @FirstRow INT,
      @LastRow INT

SELECT      @PageSize = 10,
      @PageNumber = 2

SELECT      @FirstRow = ( @PageNumber - 1) * @PageSize + 1,
      @LastRow = (@PageNumber - 1) * @PageSize + @PageSize ;

Olarak algoritmamı yani bir sayfada kaç kayıt varsa ona göre verileri sayfalara ayırmak için gereken değerlerimi elde ettim.Şimdi yapmam gereken şudur.Eğer ben id kolonundan yola çıkamıyorsam kendim öyle bir kolon oluşturmam gerekir ki elde edilen satırlara otomatik sıra numarası atasın.Bu işlem için de Row_Number() over(Sıralı bir kolon) kodlarından yararlanmam gerekir.

select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products

Olarak sıraları otomatik veren kolonumu da oluşturdum.Şimdi sıra geldi bu sorgudan tablo olarak dönen verilere where filtreleme kodu ile istediğim değerler arasındaki verileri çekmeye.

select * from (select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products) Products where (SatirNo between  3 and 15)

Bu işlemi de yaptıktan sonra  3 ile 15 değeri yerine yukarıda bulduğum firstrow ve LastRow değişkenlerini verirsem işlemim tamamlanacaktır.

select * from (select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products) Products where (SatirNo between  @FirstRow and @LastRow)

Parça parça anlattıktan sonra tam olarak sorgumuzu bir görelim .

DECLARE     @PageSize INT,
      @PageNumber INT,
      @FirstRow INT,
      @LastRow INT

SELECT      @PageSize = 10,
      @PageNumber = 2

SELECT      @FirstRow = ( @PageNumber - 1) * @PageSize + 1,
      @LastRow = (@PageNumber - 1) * @PageSize + @PageSize ;

select * from (select row_number() over (order by ProductID asc) as SatirNo, ProductID, ProductName   from Products) Products where (SatirNo between  @FirstRow and @LastRow)




Umarım faydalı olmuştur arkadaşlar.Bir sonraki makalemde görüşmek dileğiyle.







T-Sql Aggregate Functions - String Fonksiyonlar

Merhaba arkadaşlar.Bu makalemde sizlere T-Sql string fonksiyonları anlatmaya çalışacağım.Bizim için önceden hazırlanmış fonksiyonlardır.Tıp ki C# da ve ya başka dillerde olduğu gibi...String fonksiyonlar diğer dillerde olduğu gibi T-Sql'de de string bir ifade üzerinde belli işlemler yaparak istediğimiz sonuçları almak için kullanılır.

Bu kısa ön bilgiden sonra var olan string fonksiyonları incelemeye geçebiliriz.

1-)ASCII(char tipinde karakter): Parametre olarak verilen tek bir karakterin ascii karşılığını bize verir.


SELECT ASCII('A')

2-)CHAR(Ascii kod): Ascii kod olarak verilen değerin karakter karşılığını bize geri döndürür.

SELECT CHAR(65)

3-)CHAR(ArananKelime,AranılanKelime): Parametre olarak ilk verilen string ifadenin ikinci string ifade içerinde kaçıncı karakterden itibaren başladığını geri döndürür.Eğer bulamazsa 0 değerini geri döndürür.

SELECT CHARINDEX('Koray','Mühendis Koray')

4-)LEFT(stringİfade,KarakterUzunluğu): Verilen ilk parametredeki string ifadenin solundan başlayarak ikinci parametrede verilen karakter sayısı kadar karakterleri alıp bize geri döndürür.

SELECT LEFT('Koray Düzgün',3)

5-)LEN(StringIfade): Parametre olarak verilen string ifadenin karakter sayısını geri döndürür.

SELECT LEN('Koray Düzgün')

6-)LOWER(StringIfade): Verilen string ifadenin tamamını küçük harfe döndürür.

SELECT LOWER('Koray Düzgün')

7-)LTRIM(StringIfade): Parametre olarak verilen string ifadenin solunda kalan boşlukları temizler.

SELECT LTRIM('                  Koray Düzgün')

8-)RTRIM(StringIfade): Parametre olarak verilen string ifadenin sağında kalan boşlukları temizler.

SELECT LTRIM('Koray Düzgün'                  )





9-)REPLACE(DegisecekStringIfade,EklenecekStringIfade,ÇıkacakStringIfade): Parametre olarak verilen ilk kelimede son parametredeki ifade yerine ikinci ifadeyi ekler.

SELECT REPLACE('Koray Düzgün','Koray','Bilgisayar Mühendisi Koray')

10-)REPLICATE(StringIfade,Adet): Verilen string ifadeyi istenilen adet kadar yanyana yazar.

SELECT REPLICATE('Koray',3)

11-)REVERSE(StringIfade): Parametre olarak verilen string ifade tersine çevirip geri döndürür.

SELECT REVERSE('K.Düzgün')

12-)RIGHT(stringİfade,KarakterUzunluğu): Verilen ilk parametredeki string ifadenin sağından başlayarak ikinci parametrede verilen karakter sayısı kadar karakterleri alıp bize geri döndürür.

SELECT RIGHT('Koray Düzgün',3)



13-)SPACE(Adet): Parametre olarak verilen adet kadar boşluk karakteri geri döndürür.

SELECT 'Koray' + SPACE(2) + 'Düzgün'

14-)STUFF(DegisecekString,Baslangıç,KarakterUzunlugu,EklenecekString): Verilen ilk string ifadeden 2.parametre olarak verilen başlangıç karakterinden itibaren 3. parametre olarak verilen karakter uzunluğu kadar tüm karakterleri siler ve yerine son parametredeki string ifadeyi ekler.

SELECT STUFF('Koray Düzgün',3,5,'Koray')

15-)SUBSTRING(StringIfade,Baslangic,KarakterUzunlugu): Parametre olarak verilen string ifadeden verilen başlangıç sayısından itibaren son parametre olarak verilen karakter uzunluğu kadar olan karakterleri geri döndürür.

SELECT SUBSTRING('Koray Düzgün',4,5)

16-)UPPER(StringIfade): Verilen string ifadenin tamamını büyük harfe döndürür.

SELECT UPPER('Koray Düzgün')


Evet arkadaşlar umarım faydalı olmuştur.Bir sonraki makalemde görüşmek dileğiyle ...









26 Nisan 2012 Perşembe

MSSQL Select İfadesi (T-Sql)


Merhaba arkadaşlar.Bu makalemde sizlere T-Sql olarak select ifadesini anlatacağım.Öncelikle T-Sql nedir ondan bahsetmek istiyorum.Dünya üzerinde standart hale getirilmiş Sql kullanımı vardır.Bu sql standartı bütün veri tabanlarında kullanılmaktadır.Fakat bir çok veri tabanı sistemleri bu standartın yetmediğini görüp kendilerine göre ekleme yapmışlardır.İşte microsoft da bu standart sql e ek bir çok ekleme yaparak T-Sql i üretmiş ve kullanmaktadır.Sql ile ilgili makalelerimde ağırlıklı olarak T-Sql i kullanacağım.

Bu kısa ön bilgiden sonra gelelim asıl konumuza arkadaşlar.Öncelikle select ifadesi sql standartlarında olan bir ifadedir.Fakat bazı yerlerde T-Sql e ait kullanımları da mevcuttur.Peki nedir select ? Ne işe yarar ? Kelime anlamından da yola çıkarsak eğer seçim yapmak için kullanılır genelde.Seçim yapmak nedir ? Veri tabanınızda bir çok tablonuz ve bu tablolarınızda da bir sürü kayıtlar mevcut.Bu kayıtları görebilmek , bu kayıtlar içinde filtreleme yaparak istediğiniz koşuldaki kayıtları listelemek veya birden fazla tablonuzdaki kayıtları birleştirerek ortak ve anlamlı listeleme raporlama yapmak gibi bir çok işlem için select kullanılır.Yani kısaca ağırlıklı olarak kayıtları istediğiniz şekilde düzenleyerek listeleyip görmeniz için select ifadesini kullanmanız gerekmektedir.Hadi gelin örnekler üzerinden select ifadesini inceleyelim ...

Not : Tüm sorgularımı Microsoft'un örnek olarak vermiş olduğu Northwind database i üzerinde yapacağım arkadaşlar.http://www.microsoft.com/download/en/details.aspx?id=23654 linkinden sizde indirip kurup kullanabilirsiniz.

Select ifadesinin genel kullanımı : select [gösterilecek kolonların adı] from [kayıtların olduğu tablo adı]

select CompanyName ,ContactName ,ContactTitle  from Customers

Yukaridaki kullanımda Customers tablosundaki 3 adet kolondaki kayıtlar listelenmektedir.Fakat bu şekilde kullanılırsa gösterilen listede kolonların başlığı kolonları adı olur.Fakat bunu bizim anlayacağımız hale getirmek mümkündür.

select CompanyName as Firma,ContactName as Kişi,ContactTitle as Ünvan from Customers

select CompanyName Firma,ContactName Kişi,ContactTitle Ünvan from Customers

select CompanyName 'Firma',ContactName 'Kişi',ContactTitle 'Ünvan' from Customers 

select CompanyName "Firma",ContactName "Kişi",ContactTitle "Ünvan" from Customers 

select CompanyName [Firma Adı],ContactName [Kişi],ContactTitle [Ünvan] from Customers

Yukarıdaki 4 farklı kullanımda da kolonlara takma isim verme işlemi yapılır.Fakat 4.kullanımda önemli bir nokta var eğer vereceğiniz takma ad yani alias arasında boşluk varsa ya [] içerisinde ya "" içerisinde yada '' içerisinde yazılmak zorundadır.Microsoft [] içerisindeki kullanımı tavsiye etmektedir.

select FirstName + ' ' + LastName 'Ad Soyad' from Employees

Yukarıdaki kullanıma literal kullanma denir.Yukarıdaki ifade Ad ve Soyadı kolonlarını birleştirip içerisindeki verileri tek kolonda gösterir.

Kısaca giriş yaptıktan sonra select ifadesinin kullanım amaçlarını anlatırken filtreleme işleminden bahsetmiştim.Aşağıdaki örnek de filtreleme işlemi yapar.

select CompanyName,ContactName,ContactTitle,Country
 from Customers
 where Country='Germany'

Yukarıdaki kullanımı incelediğimizde filtreleme için where ifadesinin kullanıldığını ve bu ifadeden sonra da boolean bir ifade kullanıldığını yani bir koşul belirtildiğini göreceğiz.Yukarıdaki örnekte ülkesi almanya olan müşterilerin firma adı,iletişim adı , ünvanı ve ülkesi bilgilerini getiren bir sorgu vardır.

select CompanyName,ContactName,ContactTitle,Country
 from Customers
 where Country='Germany' or Country='Usa' and ContactTitle='Sales Manager'

Yukarıdaki gibi birden çok koşula göre filtreleme işlemi yapılabilir.Fakat burada bilinmesi gereken nokta C# taki gibi and operatörünün baskın olmasıdır. Bu bilgiye göre yukarıdaki sorguya aşağıdaki gibi öncelik sırası belirtilmesi gerekmektedir.

select CompanyName,ContactName,ContactTitle,Country
 from Customers
 where (Country='Germany' or Country='Usa') and ContactTitle='Sales Manager'


Bir başka kullanıma göz atalım .

select CompanyName,ContactName,ContactTitle,Country
 from Customers
 where Country in ('Germany','Usa','Uk')

Şeklinde ki kullanım aslında , 

select CompanyName,ContactName,ContactTitle,Country
 from Customers
 where Country='Germany' or Country='Usa' or Country='Uk'

Kullanımla aynıdır.Yani ülkesi almanya , amerika veya ingiltere olanları getir anlamındadır.

select CompanyName,ContactName,ContactTitle,Country
 from Customers
 where Country not in ('Germany','Usa','Uk')

Bu kullanımda bir öncekinin tam tersi verileri geriye döndürür.Dikkat ederseniz NOT ifadesi vardır.Not ifadesinden sonra belirtilenin tersi sonuç döner.

Peki northwind veri tabanında Customers tablosundaki bulunan müşterilerin hangi ülkeden olduğunu görmek istediğimizde tekrarlı olarak yani aynı ülkeden birden fazla müşteri varsa o kadar aynı ülke göreceğiz.Faka bu yanlış bir sonuçtur.Bu ülkelerin tekrarsız olarak listelenmesi gerekmektedir.Bu durumun çözümü de ;

select distinct Country from Customers

Yukarıdaki gibi DISTINCT ifadesiyle kolaylıkla çözülür.

Peki başka bir senaryo daha üretelim.Birim fiyatı 30(dahil) ve 50(dahil) arasında olan ürünleri görmek istiyorsak eğer.

 select ProductName,UnitPrice from Products
 where UnitPrice>=30 and UnitPrice<=50

Şeklinde bir ifade yazmamız gerekir.Bu sorguyu daha kolay bir şekilde yazabiliriz.Bunun için where ifadesine between ifadesi eklememiz gerekir.

select ProductName,UnitPrice from Products
 where UnitPrice between 30 and 50

Dikkat edilmesi gereken nokta girilen ilk değer ikinci değerden küçük olması gerekir.

Bir başka senaryo düşünerek başka filtreleme şekli görelim.Diyelim ki büyük bir firmanın veri tabanından sorumluyuz.Bir gün kampanya yapacaklarını söylediler ve kampanya da müşterilerimiz arasında isminin baş harfi T ile başlayanlara 50 Tl indirim çeki vereceğiz dediler.Dolayısıyla bizden baş harfi T ile başlayan müşterilerinin listesini istediler.Bunun için Like ifadesi ile filtreleme işlemi yapmamız yeterli olacaktır.

*** Like ifadesinin farklı kullanım şekillerini hep kampanya üzerinden anlatacağım.

select companyName from Customers
where CompanyName like 'T%'

Bir başka kampanyada ise T ile başlayıp S ile biten müşterilerimize 50 Tl hediye çeki verilecektir.Bunun için de ,

select companyName from Customers
where CompanyName like 'T%s'




Bir başka kampanyada ise baş harflerinde a,f,k ve h olan müşterilerimize 50 Tl hediye çeki verilecektir.Bunun için de ,

select companyName from Customers
where CompanyName like '[afhk]%'

Bir başka kampanyada ise baş harflerinde a,f,k ve h olan ve son harfi a ie s arasında olan müşterilerimize 50 Tl hediye çeki verilecektir.Bunun için de ,

select companyName from Customers
where CompanyName like '[afhk]%[a-s]'

Bir başka kampanyada ise baş harflerinde a,f,k ve h olan ve sondan 3. harfi a ie s arasında olan müşterilerimize 50 Tl hediye çeki verilecektir.Bunun için de ,

select companyName from Customers
where CompanyName like '[afhk]%[a-s]__'

Bir sonraki makalemde görüşmek dileğiyle arkadaşlar ...