ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

A’dan Z’ye Temel SLECT İfadeleri 1

İsmail ADAR
SQL
13.06.2010 14:04:53
Hit : 8667

A’dan Z’ye Temel SLECT İfadeleri 1
Merhaba arkadaşlar bu yazı dizisi ile Select ifadelerini baştan sona kadar ayrıntı bir şekilde inleyeceğiz.
Bir veritabanı üzerinde çalışırken en çok ihtiyaç duyduğumuz işlem bir veri kaynağı(Tablo,View v.b.) üzerinden istemiş olduğumuz veriyi istediğimiz biçimde çekebilmektir. Bunun için en basit SQL ifadesi olan “SELECT” ile yapabiliriz.

Genel olarak Select ifadesinin yazılış biçimine bakarsak:

 

[ WITH <common_table_expression>]
[SELECT <TOP (expression) [PERCENT]><DISTINCT> Kolon_Listesi [ INTO yeni tablo]
[ FROM source ] [ WHERE arama koşulları ]
[ GROUP BY Gruplama kriteri ]
[ HAVING Gruplama koşulu ]
[ ORDER BY Sıralama_koşulu [ ASC | DESC ] ]
 
Şimdi sırasıyla ifadeleri inceleyelim:
[ WITH <common_table_expression>] ile yazmış olduğumuz SQL Sorgusunu genel bir tablo ifadesine dönüştürmüş oluyoruz. Aslında CTE için bir SQL sorgusu sonucunda oluşturulan ve sorgulanabilen geçici bir view’dır diyebiliriz. Yani başka bir değişle yazmış olduğumuz sorgu sonucu dönen kayıt setini tekrar sorgulayabilmek için onu sorgulanabilir bir yapı haline(bir tablo gibi, view gibi…) getiren yapılardır.
CTE(common_table_expression) genelde recursive yapılarda kullanılsa da biz non- recursive yapılarda da CTE kullanabiliriz. Aslında CTE yapı itibariyle kaydedilmemiş bir View gibi kullanılabilir. Ayrıca SubQuery ile sorgulama yapmak yerine CTE kullanmak bize performans kazandırmanın yanında sorguyu daha anlaşılabilir hala getirmektedir.
Bunun yanında her güzel şeyin olduğu gibi CTE’nin de dezavantajları vardı. Bunlardan en çok karşılaşılanları CTE ile Compute, Order By (TOP ifadesi olmadan), INTO deyimleri kullanılamaz. Ayrıca oluşturulan bir CTE ard arda sorgulanamaz.
Örneğin AdventureWorks veri tabanı üzerinde oluşturulmuş bir CTE şöyledir.
 
 
WITH s_cte AS(
SELECT ContactID,(FirstName + ', ' + LastName + ' (' + cast(ContactID AS varchar(10)) +')') as p_n
FROM Person.Contact
)
 
SELECT s.ContactID,s.p_n FROM    s_cte AS s
-- SELECT * FROM s_cte
 
Fakat CTE yi ard arda sorgulayama çalıştığımız zaman bize aşağıdaki hatayı verecektir.
 
 Msg 208, Level 16, State 1, Line 8
Invalid object name 's_cte'.
SELECT s.ContactID,s.p_n FROM    s_cte AS s
Not: CTE’ler yukarıda da bahsettiğimiz gibi geçici yapılardır ve sadece o an tanımlı olan bağlantı (connection) üzerinden erişilebilir.
SELECT Kolon_Listesi [ INTO yeni tablo] :
Temel olarak seçmek anlamına gelen Select ifadesi veri tabanımızda bulunan sorgulanabilir yapıların bir kısmını ve/veya tamamına işlenmek üzere seçmemize yarayan ifadedir.
Veri kaynağından listelemek istediğimiz kolonların bir listesi şeklinde olmalıdır. Örneğin:
SELECT [CustomerID]
      ,[TerritoryID]
      ,[CustomerType] FROM [AdventureWorks].[Sales].[Customer]
 
ifadesi ile [AdventureWorks] veri tabanında bulunan [Sales] şemasına ait [Customer] objesi sorulandığı anlaşılmaktadır.
 
 
 
Sorgulanacak obje bir tablo olabileceği gibi bir view, kullanıcı tanımlı bir fonksiyondan dönene tablo,bir CTE olabileceği gibi bir geçici tablo da olabilir.Burada dikkat edilmesi gereken nokta ise Stored Procedureden dönenen sonuç kümesinin doğrudan sorgulanamadığıdır.Bunu sorgulamak için en çok kullanılan yöntem ise geçici tabloları kullanmaktır.
 
Create table #temp(kolon1,....)  --Tablo yapısı SP çıktısı ile uyumlu olmalıdır.

Insert into #temp EXEC storedProc

Select * from #temp
<TOP (expression) [PERCENT]> select ile beraber kullanılmakta olup sorgumuzdan dönecek record setin sadece bir kısmını görüntülemeyi sağlar.
SELECT TOP 5 [CustomerID]
      ,[TerritoryID]
      ,[CustomerType] FROM [AdventureWorks].[Sales].[Customer]
 
İfadesi ile tabloda 200 kayıt olmasına rağmen sadece 5 tane kayıt görünecektir. TOP ifadesiyle beraber kullanabileceğimiz [PERCENT]

ifadesi ise dönecek kayıt setinden gösterilecek kayıtları sayı değil yüzde ile sınırlar.

 
SELECT TOP 5 Percent [CustomerID]
      ,[TerritoryID]
      ,[CustomerType] FROM [AdventureWorks].[Sales].[Customer]
 
Diye değişen sorgumuzdan dönen kayıt sayısı 10 olacaktır.
 
NOT: Aslında TOP ifadesi çoğunlukla sıralanmış kayıtlar üzerinde çalıştırılır örneğin en ucuz ilk 5 ürünü listelemek istiyorum fakat 5. Gelen ürünle aynı fiyata sahip birkaç tane daha ürün varsa ve bunları da görmek istiyorsam TOP ifadesi With Ties ifadesi ile kullanmam gerekir. Örneğin aşağıdaki ifade ile sadece ilk 5 kayıt dönerken bir sonraki ifadeden 163 tane kayıt dönmektedir çünkü 5. Kayıttan sonraki 158 kayıtta UnitePrice değeri aynıdır.
 
SELECT TOP 5 [SalesOrderID]
      ,[ProductID]
      ,[SpecialOfferID]
      ,[UnitPrice]
 FROM [AdventureWorks].[Sales].[SalesOrderDetail]

 order by [UnitPrice]

Şimdi aynı sorguyu with Ties ifadesi ile çalıştırıp sonucu görelim:

SELECT TOP 5 With Ties [SalesOrderID]

      ,[ProductID]

      ,[SpecialOfferID]

      ,[UnitPrice]

  FROM [AdventureWorks].[Sales].[SalesOrderDetail]

  order by [UnitPrice]

Yukarıda görüldüğü gibi TOP 5 ile sadece 5 kayıt sorulama sağmen bana dönen kayıt setinde 163 kayıt bulunmaktadır. Bunun sebei yukarıda da değindiğimiz gibi aynı değere sahip tekrar eden kayıtların bulunmasıdır.

Buraya kadar Select ifadesine bir giriş yaptık yazı dizisi devamında Select deyimi ile kullanılan diğer ifadelere değineceğiz.

Kolay gelsin




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR