Temel SQL Sorguları II

SQL Sorguları Bölüm 2

SQL sorguları ile ilgili olan bu yazı dizimin bu bölümünde Veri İşleme Dili (Data Manipulation Language - DML) konusundan bahsedeceğim ve çeşitli select sorgularından örnekler sunacağım.

Not : Örnekler AdventureWorks2008R2 veritabanı ile yapılmıştır.

 

Veri İşleme Dili (Data Manipulation Language - DML)  : Veri işleme ifadeleri veri seçme, veri ekleme, veri güncelleme ve veri silme gibi işlemlerin yapılmasını sağlar. Toplamda 4 adet veri işleme ifadesi bulunmaktadır. Bunlar Insert, Update, Delete, Select ifadeleridir.

 

Select : Bir ilişki içerisindeki verilerin tamamını getirir veya belirli şartlara göre bir kısmını filtreleyerek seçme işlemlerini gerçekleştirir.

Genel kullanım

Select Secilecek Alan1,Secilecek Alan2 From İlişkiAdı(Tablo adı yani)

 

Örnek 

Select FirstName,LastName From Person.Person
// Eğer tüm alanları görüntülemek istersek * işaretini kullanırız.
Select * From Person.Person

 

Örnek

// Görüntüleyeceğimiz alanların başlıklarını istediğimiz isimde görmemizi sağlar.
Select FirstName As Ad,LastName As Soyad From Person.Person

 

Örnek

// Alanları birleştirip alan başlıklarını istediğimiz isimde görüntülememizi sağlar.
Select FirstName + '  ' + LastName As [Ad Soyad] From Person.Person

 

Örnek

// 25 Şubat 2002’den sonraki tarihlerde kayıtlı olan bilgiler seçilmektedir.
// Burada Where kullanarak istemiş olduğumuz filitrelemeyi yapabiliriz.
 Select * From Purchasing.Vendor Where ModifiedDate > '20020225'

 

Örnek

// Seçilen alanlar ve ListPrice değeri 160'dan küçük kayıtlar gelir.
Select Name,ProductNumber,ListPrice From Production.Product Where ListPrice > = 160


Örnek

// Seçilen alanlar görüntülenip List Price 50'den küçük 
// ve Class bölümü boş geçilemez olan bilgiler gelir.
Select Name,ProductNumber,ListPrice,Class From Production.Product Where ListPrice < 50 And Class Is Not Null

 

Örnek

// Burada tüm alanlar seçilerek bu kayıtlardan List Price değeri 50 ile 100 arasında olan kayıtlar 
// Between (Arasında) kullanılarak ekrana getirtilir.
Select * From Production.Product Where ListPrice Between 50 And 100

 

Örnek

// StateProvinceID değeri 74 olmayan kayıtları ekrana Like kullanarak getirmiş oluruz
Select * From Person.Address Where StateProvinceID Not Like 79
// Ayrıca bu yollada yapabiliriz
Select * From Person.Address Where StateProvinceID != 79

 

Örnek

// Alan1 ile Alan2'yi çıkarıp 30 ile çarpan örnek bir sorgu
Select (Alan1 - Alan2) * 30 FROM TabloAdı

 

Örnek

Select 'Eklenecek Metin' + AlanAdı + 'Eklenecek Metin' From TabloAdı

 

Örnek

// İlişkideki belirli alanları seçerek doğum günü olan kişileri listeleyen bir sorgu.
// Burada GETDATE bugünün tarihini, DAY tarihin gün kısmını alır MONTH ise ay kısmını alır.
Select FirstName,LastName,ModifiedDate From Person.Person Where 
Month(ModifiedDate)= Month(Getdate()) And Day(ModifiedDate)= Day(GetDate())

 

Örnek

// Sorgu çalıştırıldığında Name alanında ürün isimlerinin önüne “Zamlanan Ürün Ismi:“ yazar.
// ListPrice alanındaki veriler 1.20 ile çarpımlarının sonucunda %20 zamlı olarak elde edilirler.
Select 'Zamlanan Ürün Ismi: ' + Name, ListPrice * 1.20  From Production.Product

 

Not : Where ifadesi Select, Update ve Delete ifadeleri ile birlikte kullanılır.

 

Arama işlemleri : Bazen bir alan içerisinde arama yapılarak veri seçilmek istenebilir. Bir alan içerisinde arama işlemlerinin yapılması için Where ifadesi ile birlikte Like anahtar kelimesi kullanılmaktadır.

 

Örnek

// Be ile başlayan kayıtlar getirilir. Örneğin; Ben, Benjamin gibi
Select * From Person.Person Where FirstName Like 'Be%'

 

Örnek

// İçinde ben geçen kayıtlar
Select * From Person.Person Where FirstName Like '%ben%'

 

Örnek

// 3 karakterden oluşup, son 2 karakteri en ve ilk karakteri herhangi bir karakter olabilen kayıtlar.
Select * From Person.Person Where FirstName Like '_en'

 

Örnek

// A ve K 'da dahil olmak A ve K ile başlayan tüm kayıtlar.
Select * From Person.Person Where MiddleName Like '[A-K]'

 

Örnek

// A ile L arasındaki harfler dışında tüm kayıtlar.
Select * From Person.Person Where MiddleName Like '[^A-L]%'

 

Sıralama İşlemleri (Order By) : Bazen ilişkilerdem seçtiğiniz verilerin bir düzen içerisinde olmasını isteyebilirsiniz. Order By kullanarak seçilen kayıtların bir veya birden fazla alana göre sıralanması sağlanabilir. Order By sözcükleri sıralama tipini belirlemek için ek olarak Asc (Ascending-artan) veya Desc (Descending-azalan) ifadelerini alabilir. Ek almadan kullanıldığında Asc eki aldığı varsayılır.

 

Örnek

// İlişkideki veriler FirstName ve LastName değerlerine göre sıralanır.
Select * From Person.Person Order By FirstName, LastName

 

Veri Tekrarlarını Önlemek ( Distinct ) : Arama işlemlerinde getirilecek veri içerisinde aynı kayıttan birden fazla bulunabilir. Böyle bir durumda birbirini tekrar eden kayıtların sadece birininin kullanılması istenebilir. Örneğin Calisanlar ilişkisinde çalışanların yaşadıkları şehirlerin bir listesi elde edilmek istenebilir. Select Sehir From Calisanlar şeklinde bir SQL sorgusu çalıştırıldığında ilişkide kayıtlı olan tüm çalışanların şehirleri listelenecektir. Böyle bir sorgu içerisinde Distinct anahtar kelimesi kullanılarak tekrar eden kayıtların teke indirilip her kayıttan bir tane seçilmesi sağlanabilir.

 

Genel Kullanımı

Select Distinct AlanAd From İlişkiAdı

 

Veriyi belirli sayıda seçmek :  Bazen ilişkilerden çekilen verilerin hepsine ihtiyaç duyulmaz. Belirli bir şartı sağlayan verilerin sadece istenilen kısmı alınmak istenebilir. Bu şekilde sorguların daha hızlı çalışması ve sadece ihtiyaç duyulan verilerin elde edilerek gereksiz verilerle uğraşılmaması sağlanabilir. SQL'de Bu işlem Top n söz dizimi ile yapılır. Buradaki n seçilecek kayıt sayısı anlamına geliyor. Eğer seçilecek toplam kaydın belli bir yüzdesinin seçilmesi istenir ise Percent ifadesi kullanılır. Top n Percent şeklindeki kullanım sorgu sonucunda oluşacak toplam kaydın yüzde n kadarını getir anlamına gelir. Top n ifadesi ile birlikte With Ties kelimelerinin kullanılması durumunda ise son kayıt ile aynı değere sahip başka kayıtlar varsa, bu kayıtlar da sorgu sonucunda getirilecektir.

 

Örnek

// Sorgu sonucunda Production.Product ilişkisinden
// ListPrice bilgisi en yüksek olan ilk 5 kayıta ait tüm bilgiler getirilir.
Select Top 5 * From Production.Product Order By ListPrice Desc
// Bu sorgu sonucunda eğer 5. sırada getirilen kaydın ListPrice değerine sahip 
başka kayıtlar varsa bu kayıtlar da getirilir.
Select Top 5 With Ties Name, ProductNumber, ListPrice  From Production.Product Order By ListPrice Desc

 

NOT : With Ties ifadesi sadece Order By ifadesi içeren sorgu cümlelerinde kullanılabilir.

 

SQL'de fonksiyonlar : T-SQL içerisinde tanımlı olan ve belirli görevleri yapmak için kullanılan yapılara fonksiyon denir. SQL‘de fonksiyonlar, C# gibi dillerdeki amaçlara benzer yapılardır. SQL içerisinde önceden tanımlanmış ve farklı amaçlara  hizmet eden birçok fonksiyon hazır olarak bulunur. Tüm fonksiyonlar tek bir değer üretmektedir. Şimdi aşağıda bunlardan bazılarını öğrenelim.

 

MIN(): Parametre olarak aldığı alan içerisindeki en küçük değeri bulur. Alan rakamsal veri taşıyorsa en küçük değeri, metinsel bir değer taşıyorsa alfabetik olarak en başta olan değeri bulur.

MAX(): Parametre olarak aldığı alan içerisindeki en büyük değeri bulur.  

SUM(): Parametre olarak aldığı alana ait kayıtlı verilerin toplamını hesaplar. SUM() fonksiyonunun parametre olarak alacağı alan sayısal bir değer taşımak zorundadır. 

AVG(): Parametre olarak aldığı alana ait kayıtlı verilerin ortalamasını hesaplar. Parametre olarak alacak değer tabiki sayısal olmalı. 

COUNT(): COUNT(*) veya COUNT(AlanAdı) şeklinde kullanılmaktadır. COUNT(*) ifadesinde tablodaki tüm kayıtları (Null da dahil) sayar. COUNT(AlanAdı) şeklindeki bir kullanımda ise AlanAdı isimli alanda NULL değeri almamış olan tüm kayıtları sayar.

LEN(): Parametre olarak aldığı alana ait kayıtlı verilerin karakter uzunluğunu gösterir.

LOWER(): Parametre olarak aldığı alana ait kayıtlı metinsel verilerin harflerini büyütür.

UPPER(): Parametre olarak aldığı alana ait kayıtlı metinsel verilerin harflerini küçültür.

REVERSE(): Parametre olarak aldığı alana ait kayıtlı verileri ters çevirir.

SQRT(): Belirlenen alandaki değerin karekökünü almamıza yarar.

 

Örnek

// Class alanı "M" olan kayıtlar içerisindeki en yüksek ListPrice değerini getirir.  
Select Max(ListPrice) From Production.Product Where Class ='M' Production.Product

 

Örnek

// Toplam kayıt sayısını getirir. Null değerler de dahil
Select Count(*) From Production.Product

 

Örnek

// Class alanında NULL değer taşımayanların toplam sayısını getirir.
Select Count(Class) From Production.Product

 

Örnek

// Color değeri Red olan tüm alanların ListPrice değerlerinin toplamını 
// ve ListPrice değerlerinin ortalamasını getirir.
Select Sum(ListPrice), Avg(ListPrice) From Production.Product Where Color = 'Red'

 

Örnek

// FirstName, LastName ve Title alanları gösterilecek.
// FirstName ile LastName uzunluğu hesaplanarak Ad uzunluğu ve Soyad uzunluğu olarak gösterilir.
Select FirstName, LastName, Title, Len(FirstName) As [Ad Uzunluğu], Len(LastName) As [Soyad Uzunluğu]
From Person.Person

 

Örnek

// FirstName kısmındaki metinleri büyük ve kolonun üzerinde Ad yazacak şekilde 
// LastName kısmındaki metinleri de küçük ve kolonun üzerinde Soyad yazacak şekilde ayarlıyor.
Select Upper(FirstName) As Ad,Lower(LastName) As Soyad From Person.Person

 

Örnek

// FirstName alanındaki isimleri ters çevirir.
Select  Reverse (FirstName) From Person.Person

 

Alan Adına Göre Verileri Gruplamak (Group By) :  Veri seçme işlemi yapılırken bazı durumlarda verileri gruplamak ve gruplanan veriler üzerinde bazı işlemler yapılması gerekebilir. Mesela çalışanların kayıtlı olduğu bir tablodan çalışanları yaşadıkları semtlere göre gruplama yapılabilir ve her semtteki toplam çalışan sayısı bulunabilir. Gruplama fonksiyonu içeren bir Select sorgu cümlesinde Group By ifadesini kullanarak alan ismine göre gruplama yapılabilir ve her grup içerisinde kullanılan gruplama fonksiyonuna göre bilgiler elde edilebilir. Bir tablodaki verileri gruplama fonksiyonu kullanmadan, bir alana göre görsel olarak gruplamak istersek kullanacağımız ifade Group By yerine Order By olmalıdır. Group By sadece gruplama fonksiyonlarının olacağı Select sorgularında kullanılabilmektedir

 

Örnek

// Sorgu cümlesi ile ürünlerin her renge ait ortalama ListPrice ve StandartCost değerlerini getirir.
Select Color, Avg(ListPrice), Avg(StandardCost) From Production.Product Group By Color

 

Örnek

// Sorgu cümlesi ile her şehirde yaşayan kişilerin toplam sayıları bulunur 
// ve veriler şehir adına göre gruplanarak alfabetik sırada elde edilmektedir.
Select City, Count(City) As Sayi From Person.Address Group By City Order By City

 

Örnek

// Adresler Şehirlere göre gruplandırıp bu şehirlerin posta kodları gösterilir
// ve Şehir adına göre sıralanır.
Select City, Count(City), PostalCode From Person.Address Group By City, PostalCode Order By City

 

Gruplanan Verilere Şart Eklemek (Having) : Bazı durumlarda gruplanarak getirilecek veriler üzerinde bir filtreleme ihtiyacı olabilir. Group By kullanıldığı durumlarda Select ile birlikte Where ifadesi kullanılarak gruplanacak verilere sınırlamalar getirilebilir. Gruplama fonksiyonları sonucunda elde edilen değere göre filtreleme işlemi yapılmak istenildiğinde ise Having ifadesi kullanılmalıdır. Having sadece gruplama fonksiyonlarını içeren şart ifadelerini kullanabilir.

 

Örnek

// Kırmızı veya mavi renkli ürünlerin Class bilgisine göre gruplanır ve
// sıfır olmayan Class kayıtları listelenir.
Select Class,COUNT(Class) As Sayi From Production.Product Where Color='Red' Or Color ='Blue'
Group By Class Having Count(Class) !=0

 

Örnek

// Kişileri MiddleName değerlerine göre gruplandırır ve
// MiddleName kaydı 5'den büyük olan kayıtların listelenmesi.
Select MiddleName,COUNT(MiddleName) As Sayi From Person.Person Group By MiddleName 
Having Count(MiddleName) > 5 Order By MiddleName

 

Birden Fazla İlişkiden Veri Getirmek : İlişki birleştirme işlemi birden fazla ilişkiyi birleştirerek çalıştırılacak sorgunun bir sonuç kümesi olarak oluşmasını sağlar.

 

Genel Kullanımı

Select AlanAdı1, AlanAdı2 FROM İlişki1, İlişki2

 

Örnek

// Person.Person ve Person.Adress ilişkileri BusinessEntityID ve AdressID alanları üzerinden
// birleştirilerek görüntülenir.
Select FirstName,LastName,Title,AddressLine1,City  From Person.Person,Person.Address 
Where BusinessEntityID = AddressID

 

Join İfadeleri ile Tabloları Birleştirme

Farklı tabloları birleştirmek için kullanılan bir diğer yol ise JOIN ifadelerinin kullanılmasıdır.

 

Inner Join: Birleştirilen iki tablodaki verilerden sadece kritere uyanların getirilmesini sağlar. (JOIN ifadesi de INNER JOIN ile aynı işi yapar.)

 

Genel Kullanım

Select Seçilecek Alan  From İlişki1 Inner Join İlişki2 On İlişkilendirme Şartı

 

Örnek

// BussinessEntityID değeri AdressID değerine eşit olan kayıtları seçilen alanlar dahilinde
// sonuç kümesine getirir.
Select FirstName,LastName,AddressLine1,City,PostalCode From Person.Person
Inner Join Person.Address On BusinessEntityID=AddressID

 

Outer Join : Birleştirilen iki ilişkideki verilerin birbiri ile uyumsuz olması halinde bile birleştirme işlemini gerçekleştirir. Left Join, Right Join veya Full Join ifadeleri ile getirilecek verilerin hangi ilişkide olacağı seçimi yapılabilir. Left Join ile birleşen ilişkilerden sorgu içerisinde Left Join’in sol kısımda kalan ilişkinin tüm kayıtları, Right Join ile birleşen ilişkilerden sorgu içerisinde Right Join’in sağında kalan ilişkinin tüm kayıtları ve Full Join ile birleşen ilişkilerden her ikisindeki tüm kayıtlar getirilir. İki ilişkideki kayıtların eşlenerek oluşturulan sonuç kümesinde diğer ilişkide karşılığı olmayan kısım Null olarak getirilir.“Outer Join” ifadeleri sorgu içerisinde kullanılmaz. Outer Join ifadelerinde yukarıda bahsedilen Left Outer Join, Right Outer Join ve Full Join kelimeleri kullanılır.

 

Genel Kullanımı

Select Seçilecek Alanlar  From İlişki1 [Left Join, Right Join veya Full Join] İlişki2 On İlişkilendirme Şartı  

 

Cross Join : İlişkiler arasında yapılan birleşmelerde, seçilen tüm verilerin birbiriyle kartezyen çarpımı şeklinde eşleşmesini sağlayan ifadelerdir.

 

Genel Kullanımı

Select Seçilecek Alanlar From İlişki1 Cross Join İlişki2

 

Intersect Komutu : İki sorgu sonucunun kesişimini elde etmek için kullanılır. Yani iki sorgu sonucunu Intersect komutu ile birleştirdiğimizde her iki sorgu sonucunda da dönen kayıtlar listelenecektir. Örnek söz dizimi şu şekildedir:

Select A From B   Intersect   Select A from B                                  
//Yani ilişkilerde karşılaştırma yaparak benzer verileri bize sunar

 

Except Komutu : Except  iki farklı sorgu sonucunu karşılaştırırken ilk sonuç setinde olup ikinci sorgu sonucunda olmayan kayıtları listelememizi sağlamaktadır. Örnek söz dizimi açısından tek fark intersect yerine except yazılır.

 

Union Komutu : İki Select sorgusunun sonucunu tek bir sonuç olarak göstermemize yarar. Bunun için, iki Select ifadesinin eşit sayıda ve veri tipinde sütundan oluşan (eş değer) sonuçlar veriyor olması gerekir.

 

Örnek

Select Ad, Soyad From Calisanlar Where CalisanNo < 3 
Union Select Ad, Soyad From Calisanlar2 Where CalisanNo < 3;

 

Not: Union tıpkı distinct ifadesindeki gibi tekrar eden verileri eklemez eğer eklemek istersek Union All ifadesi kullanarak tekrar eden verilerinde sonuçlarla getirilmesini sağlarız.

 

Into Komutu : Bir ilişkideki tüm alanları veya istemiş olduğumuz alanları seçerek kendi oluşturduğumuz tabloya atmamızı sağlar

 

Örnek

// Urun ve Kategori alanları kayıtlarla beraber alınır ve YeniUrunler isimli bir ilişki
// oluştırulup içerisine aktarılır
Select Urun, Kategori, Marka Into YeniUrunler From Urunler

 

Ayrıca bu ilişki taşıma işlemlerini veritabanları arasında da gerçekleştirebiliriz.

// * ile ilişkideki tüm alanları seçtik
Select * Into Database1.dbo.Yeniİlişki From Database2.dbo.Kopyalanacakİlişki

 

NewID : Söz konusu sorgu sonucundan rastgele veriler elde etmek için kullanılır.

 

Örnek

Select * From Person.Person Order By NEWID()

 

Case-When yapısı : SQL sorgularımızda belirli durumlara göre farklı işlemler yapmak istersek Case-When yapısını kullanırız.

 

Örnek

Select Ad,Soyad Case When Durum =1 Then 'Evli'
When Durum=2 Then 'Bekar'
Else 'Belirtilmemiş'
End As [Durum] From Kayitlar

 

Örnek

Select Case Color When 'Black' Then 'Siyah'
When 'Grey' Then 'Gri'
When 'Multi' Then 'Renkli'
When 'Red' Then 'Kırmızı'
When 'Silver' Then 'Gumus'
When Blue Then 'Mavi' 
Else 'Renksiz' 
End As [Renkler] From Production.Product

 

Makalemin üçüncü bölümünde Insert, Update ve Delete komutlarından devam edeceğim