Transact Sql(Select İşlemi-Where Şartı-Like Sorgusu-Order by-Aggregate fonk.)
Bu yazımızda Sql Serverda,TRANSACT SQL (T-SQL) dilinde select komutuyla veritabanında sorgulama işlemleri gerçekleştireceğim.Where şartı ile belirli kriterlerde veri seçimleri yapacağız.
Öncelikle Transact Sql ‘e değinelim.
Transact Sql
T-SQL ile veri çekme,veri kaydetme,güncelleme ve silme gibi veritabanına müdahale edebilir,database oluşturma,tablo oluşturma ve veritabanı silme gibi işlemlerde de kullanabiliriz.
T-SQL büyük küçük harfe duyarlı bir dil değildir.
Şimdi,Select komutuyla ilgili anlatım ve örneklere geçmeden önce üzerinde çalışma yapmamız için özel olarak Microsoft tarafından hazırlanmış “Northwind” adlı veritabanını SQL Serverımıza Execute ediyoruz.
Şimdi “New Query” butonuna tıklayarak kod sayfasına geliyoruz.
“Available Databases” adlı açılır pencereden “Northwind” veritabanını seçmemiz gerekiyor.Ya da aşağıdaki kodlarla hangi veritabanı üzerinden çalıştığımızı gösterebiliriz.
----use Northwind----
NOT:Eğer “Available Databases” kısmında başka veritabanı seçili olduğu halde yukarıdaki komutu kod sayfasına yazarsanız,bundan sonra “Northwind” adlı veritabanı işlevsel olacaktır.
VERİ ÇEKME İŞLEMİ (SELECT)
“Northwind” adlı veritabanına göz atarsanız “Personeller” adlı bir tablo göreceksiniz.Bu tablodaki bütün bilgileri seçmek istersek eğer aşağıdaki şekilde kodlamalısınız,
----select * from Personeller----
Buradaki *,”Personeller” tablosundaki tüm kolonları temsil etmektedir.Fakat performans açısından * yerine tüm kolonların ismini teker teker yazmak daha avantajlıdır.
“Personeller” adlı tablodan sadece Ad ve Soyad kolonlarını seçmek istersek eğer,
----select Adi,SoyAdi from Personeller----
Bu şekilde istediğimiz kolonları virgülle yazıp çekebiliriz.
Yukarda çektiğimiz kolonların satır başlıkları,kolon isimleriyle aynıdır.Çekilen kolonlara istediğimiz alias tanımlamayı şu şekilde yapıyoruz.
----select Adi as ADI,SoyAdi as SOYADI from Personeller----
Önce kolonun adını yazdıktan sonra “as” operatörünü kullanarak o kolona vermek istediğimiz ismi(alias) yazıyoruz.
Eğer yazacağımız alias ta boşluk karakteri varsa,ÖRN(AD SOYAD), yukarıdaki gibi “as” operatöründen sonra o aliası yazarsak hata verecektir.Bu hatayı önlemek için köşeli parantez kullanılmalıdır.
----select Adi as [Öğrenci Adı] from Personeller----
Aynı şekilde üzerinde çalışmamız gereken tablonunda isminde boşluk karakteri varsa köşeli parantez içinde yazabiliriz.
----select BirimFiyati from [Satis Detaylari]----
Şimdi ise iki “Personeller” tablosundan Ad ve Soyadı çekelim.Ama iki tabloda ayrı ayrı kolonlarda gelmesini değilde tek bir kolonda gelmesini istiyoruz.Bu işlem iki kolonu birleştirerek tek kolon haline getiriyor.Tabi haliyle kolonların ismini birleştirmediği için ben aşağıdaki örnekte “as” operatörüyle birleştirilmiş kolonlara isim verdim.
----select Adi + ' ' + SoyAdi as [AD SOYAD] from Personeller----
Yukarıdaki örnekte gördüğünüz gibi “Adi” ve “Soyadi” kolonlarının arasına virgül değilde, birleştirme operatörü olan + işareti konmustur.Tek tırnaklar ise iki kolonun birleşmesi sonucu araya boşluk koydurmaya yarıyor.
Unutmamamız gereken bir nokta var.+ operatörü ile bir tek metinsel verileri birleştirebiliriz.
Şimdi “Personeller” tablosunda “Adi”,”Soyadi” kolonlarıyla birlikte “IseBaslamaTarihi” kolonunu + operatörüyle birleştirelim.
----select Adi+ ' ' + SoyAdi + ' ' + IseBaslamaTarihi from Personeller----
Yukardaki komutları çalıştırdıktan sonra hatayla karşılacağız.Çünkü birkaç satır üstte dediğim gibi + operatörü metinsel ifadelerde kullanılır.Ancak biz burada iki metinsel ifadeyle birlikte datetime tipli “IseBaslamaTarihi” kolonunuda birleştirmeye calıstık.
Bu birleştirmenin olması için bu tipi metinsel tipe çevirmemiz lazım.
----select Adi+ ' ' + SoyAdi +' '+ CONVERT(nvarchar(50),IseBaslamaTarihi,104) from Personeller----
Convert metoduyla “IseBaslamaTarihi” adlı datetime tipi nvarchar(50) ye dönüştürdüm.Yukardaki yapıda “,104” ifadesi ise tarihin nasıl biçimlendirileceğidir.
Convert metoduyla tip dönüşümü yapılabildiği gibi Cast metoduylada yapılabilir.Sadece aradaki tek fark tarih biçimini bunda seçemiyoruz.
---- select Adi + ' ' + SoyAdi + ' ' + CAST(IseBaslamaTarihi as varchar(50)) from Personeller----
Yukarda Cast metodunu kullanırken parantezin içinde “as” operatörüyle birdaha karşılaşıyoruz.Bu operatör sayesinde cast metodunda tip değişimi gerçekleşiyor.
SORGUYA ŞART İFADESİ YAZMAK(WHERE)
T-SQL de kolonları çektikten sonra veriler arasında “Where” komutuyla sorgulama yapabiliyoruz.Örn, “Personeller” tablosunda şehri “London” olan kişilerin “Adı” kolonunu çekelim.Yani “Personeller” tablosundaki “Adi” tablosunu tam değilde,şehir şartına uyan veriler listelenecek.
---- select Adi from Personeller Where Sehir= 'London' ----
Yukarıdaki yapıda “Where” kodu sayesinde “Sehir” kolonunda “London” olan verileri buluyor ve adlarını yazdırıyor.
Şehri “London” olan verilerin ad ve soyadlarını(istediğimiz bütün verilerini) aşağıdaki şekilde çekebiliriz.
---- select Adi + ' ' + SoyAdi as [Ad ve Soyad] from Personeller where Sehir='London'----
Şehri “London” olan ve adı “Robert” olan verinin işe başlama tarihini sıralayalım.
---- select IseBaslamaTarihi from Personeller where Sehir='London' and Adi='Robert'----
Yukarda gördüğünüz gibi “Where” komutundan sonra “and” komutunu kullanarak şartlarımızı çoğaltabiliyoruz.
Şehri “London” ya da “Redmond” olan verilerin adını sıralayalım.
---- select Adi from Personeller Where Sehir='London' or Sehir='redmond'----
Yukarıda “or” komutuyla şehri “London” ve ya “Redmond” olan kişilerin adını seçebildik.
Şimdide adı “Robert” soyadı “King” olan kişinin tüm bilgilerini çekmek istiyorum.
---- select * from Personeller where Adi='Robert' and SoyAdi='King'----
ID numarası 5 ten küçük ve eşit olan kolonların adlarını seçelim.
---- select Adi,PersonelID from Personeller where PersonelID <= 5----
Yukarıdaki gibi büyük,küçük,eşit vs gibi şartları aşağıdaki sembollerle ifade edebiliyoruz.
<> : Eşit değilse.
<= :Küçük ve eşitse.
>= :Büyük ve eşitse.
= :Eşitse.
——
Eğer elimizde datetime tipli veri varsa, bu veri içinde gün, ay, yıl, saat vs gibisinden bilgilerde vardır.Bize sadece gün,ay,yıl vs lazımsa,bunu elde etmek için tarih fonksiyonlarını kullanmalıyız.
Şimdi bir örnek yapalım.1993 yılından sonra işe başlayanları listeleyelim.Bunu yapabilmek için datetime tipindeki “IseBaslamaTarihi”’den sadece yılı seçmem gerekecek.
---- select IseBaslamaTarihi from Personeller where YEAR(IseBaslamaTarihi)>=1993----
Yukarıda gördüğünüz gibi “YEAR()” metoduyla datetime tipinin yılına ulaşabiliyoruz.
Peki Mayıs ayında doğan personelleri listelersek,
---- select Adi from Personeller where MONTH(IseBaslamaTarihi)=05 ----
Yukarıda gördüğünüz gibi “MONTH()” metoduyla datetime tipinin ayına ulaşabiliyoruz.
Peki doğum günü ayın 29 u olmayan personelleri listeleyelim
---- select Adi from Personeller where DAY(IseBaslamaTarihi) <>29 ----
Yukarıda gördüğünüz gibi “DAY()” metodula datetime tipinin gününe ulaşabiliyoruz.
Doğum yılları 1950 ile 1965 yılları arasındaki personellerin adını yazdıralım.
---- select Adi from Personeller where YEAR(DogumTarihi)>=1950 and YEAR(DogumTarihi)<=1965----
Aralık belirten ifadeler yukarıdaki şekilde yapılabileceği gibi “between” komutu kullanarakta yapabiliriz.”between” komutu arasında demektir.
---- select * from Personeller where YEAR(DogumTarihi) between 1950 and 1965----
Yaşadığı şehir, London,Tacoma,ya da Kirkland olan personellerin adını listeleyelim.
---- select adi from Personeller where Sehir='London' or Sehir='Tacoma' or Sehir='Kirkland'----
Yukarıda gördüğünüz gibi bir yapıda sürekli “or,or,or..” kullanıyorsak bunu “in” operatörü ilede yapabiliriz.
---- select * from Personeller where Sehir in ('London','Tacoma','Kirkland')----
LİKE SORGULARI
Verilerimiz arasında belirli kriterlere göre sorgulama yapabiliriz.
Örn;İsminin baş harfi şuysa,son harfi buysa,son üç harfi,ilk dört harfi,metnin içinde bu varsa … gibisinden kriterlere göre sorgulama yapmak istiyorsak “Like” sorgusunu kullanırız.
Şimdi örneklere geçelim.
İsminin baş harfi “j” olan personellerin adını soyadını yazdıralım.
---- select Adi,SoyAdi from Personeller where Adi like 'j%'----
Yukarıda gördüğünüz kodlarda “Like” komutundan sonra iki tırnak içinde ‘j%’ yazdık.Bu ifadenin açıklaması “baş harfi j olan,gerisi önemli değil.” demektir.
İsminin son harfi “y” olan personellerin adını soyadını yazdıralım.
---- select adi,soyadi from Personeller where Adi like '%y'----
Baş harfindekiyle aynı mantık olan ‘%y’ ifadesi “son harfi y olan,gerisi önemli değil.” Demektir.
İsminin son üç harfi “ert” olan personellerin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi Like '%ert'----
‘%ert’ = “Son üç harfi ert olan,gerisi önemli değil.”
İsminin ilk harfi “r” son harfi “t” olan personellerin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi Like 'r%t'----
‘r%t’ =”ilk harfi r,son harfi t olan,gerisi önemli değil.”
Aslında aşağıdaki şekilde de yapılabilir ama gerek yok.
---- select adi,soyadi from Personeller where Adi like 'r%' and Adi like '%t'----
İsminin içinde “an” geçen personellerin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like '%an%'----
‘%an%’ = “içinde an geçen,gerisi önemli değil.”
Burada dikkat etmemiz gereken nokta, verimizin içinde geçen “an” sözcüğü başla,sonda olmayacak diye bir şart yok.”Ankara” da baştaki ilk iki karakter olduğu halde bu veri bu şartda seçilecektir.
İsminin baş harfi “n” olan,içindede “an” geçen personellerin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like 'n%an%' ----
‘n%an%’ = “Baş harfi n olan,içinde de an olan,gerisi önemli değil.”
İsminin ilk harfi “a”,ikinci harfi fark etmez,üçüncü harfi ise “d” olan personellerin adını yazdıralım.
----- select Adi,Soyadi from Personeller where Adi like 'a_d%'----
Yukarıdaki yapıda,tırnak içindeki “_” karakteri es geç anlamındadır.Yani “ilk harfi a,ikinci harfi es geç,üçüncü harfi d olan,gerisi önemli değil.” Demektir.
İlk harfi “m”,2.3.4. fark etmez,5. “a” olan personelin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like 'm___a%'----
..Ya da..
İsminin ilk harfi “n” ya da “m” ya da “r” olan personelin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like '[nmr]%'----
Yukarıdaki yapıda,tırnak içinde olan köşeli parantez tek bir haneyi temsil edip ya da mantığını işliyor.Yani “[nmr]=ilk harf n ya da m ya da r olan,gerisi önemli değil.”
İsminin içinde “a” ya da “i” geçen personelin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like '%[ai]%'----
‘%[ai]%’ = “içinde a ya da i geçen,diğerleri önemsiz olan”
İsminin baş harfi “a” ile “k” arasında alfabetik sıraya göre herhangi bir harf olan personellerin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like '[a-k]%'----
Yukarıdaki yapıda tırnak içinde ‘[a-k]%’ ifadesini açıklarsak eğer,köşeli parantezler bildiğimiz gibi tek haneyi temsil edip,ya da mantığını işliyor.Tire(-) ise “a” ile “k” karakterleri arasındaki alfabetik sırayı inceliyor.”%” ifadesi ise bildiğiniz gibi gerisi önemsiz demektir.
İsminin baş harfi “a” olmayan personellerin adını yazdıralım.
---- select Adi,Soyadi from Personeller where Adi like '[^a]%'----
Yukarıda gördüğünüz gibi “^” işareti olmayan anlamına gelmektedir.
Verilen kolonun karakter sayısını almak istiyorsak “Len()” fonksiyonunu kullanmamız gerekecektir.
---- select Adi,Soyadi from Personeller where LEN(Adi) < 6----
Yukardaki kodlarda adındaki karakter sayısı 6’dan küçük olan kişilerin ad soyadlarını getir dedik.
SIRALAMA(ORDER BY)
Verilerimizi çektiğimizde istediğimiz kolona göre sıralama yapmak isteyebiliriz.”order by” komutuyla sıralama yapabiliriz.”order by” ‘ın açıklaması “şuna göre sırala” demektir.Şimdi bir örnek üzerinde gösterelim.
---- select Adi,Soyadi from Personeller order by SoyAdi----
Yukarıdaki yapıda dikkat ederseniz artık “Where” komutu kullanmıyoruz.Çalıştığımız tablonun ismini yazdıktan sonra “order by” yazarak sıralama yapılmasını istediğimiz kolonu yazdık.
Burada dikkat etmemiz gereken nokta,kolonun içinde metinsel ifadeler varsa alfabetik olarak sıralar.Sayısal verilerde ise küçükten büyüğe doğru sıralar.
NOT:”order by” varsayılan olarak küçükten büyüğe sıralar.(asc)
--- select Adi,Soyadi from Personeller order by SoyAdi asc----
“asc” kodu olursa büyükten küçüğe sıralar.Olmazsa varsayılan olarak aynı olduğu için değişiklik olmaz.
Eğer büyükten küçüğe sıralatmak istiyorsanız “desc” komutunu kullanmak yeterlidir.
---- select Adi,Soyadi from Personeller order by SoyAdi desc----
Personellerim doğum yıllarına göre sıralı gelsin.
---- select Adi,Soyadi from Personeller order by YEAR(IseBaslamaTarihi) desc----
Personellerim şehirlerine göre sıralı gelsin.
---- select Adi,Soyadi,Sehir from Personeller order by Sehir----
Yukardaki yapıya bakarsanız içinde “London” olan 4 veri var.Sıralatma yaptığımız kolonda aynı veriler varsa,o verileri kendi aralarında başka bir kolonda sıralatma yapabiliriz.Aynı şekilde o kolonda da tekrarlayan varsa gene onları başka kolonda sıralatma yapabiliriz
Şimdi personellerim şehirlerine göre sıralansın,eğer aynı şehirde olan varsa adlarına göre sıralansın.
---- select adi, soyadi ,sehir from Personeller order by Sehir,Adi----
Yukarıdaki yapıda gördüğünüz gibi önce şehire göre sıralama yapıldı,tekrarlayanlar varsa adına göre sıralama yapıldı.
Doğum yılı 1960 dan büyük olan personellerimi soyisimlerine göre sırala.
---- select Adi,Soyadi,Sehir from Personeller where YEAR(DogumTarihi) > 1960 order by SoyAdi----
AGGREGATE FONKSİYONLAR
— AVG : ORTALAMA ALIR
— MAX : EN BÜYÜK DEĞERİ BULUR
— MIN : EN KÜÇÜK DEĞERİ BULUR
— COUNT : TOPLAM SAYISINI VERİR
–SUM : TOPLAMINI VERİR
Toplam kaç adet personelim var.
---- select COUNT(PersonelID) as [Toplam Personel Sayısı] from Personeller----
Yukarda gördüğünüz gibi “Count()” metodu kolondaki kayıt sayısını verir.O kolondaki “null” değerleri saymaz.
En büyük ID numaralı personelimi getir.
---- select MAX(PersonelID) from Personeller----
En küçük ID numaralı personelimi getir.
--- select MIN(PersonelID) from Personeller----
Personellerimin IDlerinin ortalaması kaçtır?
---- select AVG(PersonelID) from Personeller----
NOT: Sorgu kısmında matematiksel işlemlerde yapılır.
select (SUM(PersonelID)-9)/(COUNT(PersonelID)-1) from Personeller
