Sql Server Veri Okuma

Herkese merhaba, Sql Server yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda Sql Server ile bir tablodan veri okumayı anlatacağım. Hadi başlayalım !
Sql Server’da herhangi bir tablodan veri okumak için select adında bir komut kullanılmakta ve bu komut ile tablo içerisinden ister tüm verileri, ister verilerin bir kısmını getirebiliyorsunuz. Ayrıca veri sayısı, veriler üzerinde filtreleme yapma, tür dönüşümleri yapma, matematiksel işlemler yapma, sıralama, parçalama gibi birçok işlem yapılabilmekte. Hepsini select komutu ile yapıyoruz fakat bu komut doğrudan bir işe yaramıyor, kendisine eklenecek özelliklerle güçleniyor ve sorgu tamamlanıp veritabanına gönderildiğinde ise istediğimiz veriyi bize getiriyor ve verileri istediğimiz bir programlama dili ile yada doğrudan Sql Server Management Studio gibi araçlar yardımıyla elle görebiliyoruz. Öncelikle select komutunun yapısından bahsedelim.
select * | (sütun1, sütun2, sütun3, ..., sütunn) from tablo_adı [where koşul] [group by sütun] [order by sütun belirteç] [offset başlangıç rows fetch next adet rows only]
Bu yapıda köşeli parantez içerisinde olanlar zorunlu değil, ihtiyaca göre eklenip kullanılabiliyor. Örneğin veriler üzerinde filtreleme işlemi yapacaksanız where kısmını, alfabetik olarak sıralayacaksanız order by kısmını doldurmanız gerekiyor. * | (sütun1, sütun2, sütun3, …, sütunn) kısmında ise ikisinden birini kullanmanız gerekiyor. Tablo içerisindeki tüm sütunları getirecekseniz *, hepsini değil de bazı sütunları getirecekseniz de aralarında virgül olacak şekilde sütun isimlerini yazmanız gerekmekte. Şimdi sırayla select komutuyla beraber kullanılan komutlara bakalım.
order by sütun belirteç kısmı ile verileri bir sütuna göre alfabetik olarak artan yada azalan şekilde sıralayabiliyoruz. Örneğin en son eklenenden en eski eklenene doğru bir sıralama yapmak için ideal bir çözüm. belirteç ise asc yada desc olabiliyor. asc, ascending yani artan sırada, desc ise descending yani azalan sırada sıralama yapılmasını sağlıyor. Artan sırada sıralayacaksanız yani asc kullanacaksanız asc yazmanıza gerek yok (order by sütun kısmı yazılacak) çünkü yazmazsanız asc olarak alınır ve işletilir. Azalan sırada sıralayacaksanız yani desc kullanacaksanız kesinlikle yazmanız gerekiyor.
Örneğin varchar tipte kitapAdi, int tipte sayfaSayisi, int tipte basimYili sütunları bulunan kitaplar tablosunda basimYili sütununa göre azalan sırada sıralayalım;
select * from kitaplar order by basimYili desc
order by ile birden fazla sütuna göre de sıralama yapabiliyorsunuz. order by komutundan sonra aralarına virgül koyarak sıralama şartlarını yazarak birden fazla sıralama yapabilirsiniz. Tablo, sıralama kurallarından ilkine göre sıralanır ve sıralama kuralında belirttiğiniz veriler içerisinde aynı veriden varsa ikinci kurala, onlarda da aynı veriler varsa üçüncü kurala göre sıralama yapılır. Mesela kitaplar tablosunu basimYili sütununa göre azalan, sayfaSayisi sütununa göre artan sırada sıralama yapalım;
select * from kitaplar order by basimYili desc, sayfaSayisi asc
Evet order by ile veri sıralama işlemi bu kadar basit. Şimdi sıra geldi group by komutuna.
Group by komutu, tablo içerisindeki verileri gruplamayı sağlıyor ve genelde tekrar eden verilerde gruplama yapmak için kullanılmakta. Gruplamaktan kastım örneğin kitaplar tablomuzdaki yazarı Sabahattin Ali olan kitap sayısını getirme yada 2000 yılında yazılan kitap sayısını getirme gibi olabilir. Yani hangi türden kaç tane olduğunu bulmak için kullanılıyor. Örneğin biz hangi yıl kaç tane kitabın yazıldığını bulan bir Sql kodu yazalım;
select count(kitapAdi), basimYili from kitaplar group by basimYili;
Burada count(kitapAdi) kısmı dikkatinizi çekmiş olması gerekiyor. count(kitapAdi) ne, orada ne işi var, benim bahsettiğim select komutuna benzemiyor diyebilirsiniz. count() bir Sql Server fonksiyonu ve parametre olarak verilen sütun içerisinde kaç tane veri olduğunu söylüyor. Bu fonksiyon sayesinde hangi veriden kaç tane olduğunu görebiliyoruz. Burada ise basimYili sütununa göre grupladığımız verilerden kaç tane olduğunu bize söyleyecek. basimYili sütununu ayrıca select içerisine alıyoruz çünkü eklemeseydik sadece basılan kitap sayısını bulurduk, basimYili sütununu da ekleyerek hangi yılda basıldığını da buluyoruz. Örneğin ben farazi veriler ekledim ve bu kodu Sql Server Management Studio üzerinden çalıştırdığımda şöyle bir çıktı gördüm.

offset başlangıç rows fetch next adet rows only kısmı ile sadece belirli aralıktaki verileri alabiliyorsunuz. Buradaki başlangıç ve adet kısmını değiştirip diğer kalan kısımları sabit bırakarak komutu tamamlayabilirsiniz. başlangıç terimi ile verinin başlanacağı numarayı, adet ile veriden kaç tane getirileceğini belirliyorsunuz. Yani tüm veri içerisinden bir kısmını bu şekilde alabiliyorsunuz. Örneğin kitaplar tablomuz var ya, o tablodaki kitapları çekip bir sayfada göstermek istediğimizde 1000 tane veri varsa hepsini birden tek sayfada göstermek hem sunucu hemde tarayıcı için eziyet olacaktır. 1000 tane verinin doğrudan tarayıcıya aktarılması hem sunucuyu hemde tarayıcıyı yorar fakat sayfalama dediğimiz bir yapı kurarak her sayfada 20 tane kitap gösterip 1000 veriyi 50 sayfaya bölersek hem sunucu hem kullanıcı hemde tarayıcı için daha iyi olur. Birinci sayfada ilk 20 kitabı, ikinci sayfada 21. ile 40. arasındaki kitapları, 3. sayfada 41. ile 60. arasındaki kitapları, …, 50. sayfada 981. ile 1000. arasındaki kitapları getirip web sayfası üzerinde listeyebiliriz. Mesela birinci sayfada başlangıç değerimiz 0 adet değerimiz 20, ikinci sayfada başlangıç değerimiz 20 adet değerimiz 20, 3. sayfada başlangıç değerimiz 40 adet değerimiz 20, …, 50. sayfada başlangıç değerimiz 980 adet değerimiz 20 olacaktır. Adet değeri hiç değişmedi çünkü her sayfada 20 tane veri göstereceğiz. Fakat başlangıç değerimiz her sayfada 20 tane gösterdiğimiz için 20’şer 20’şer arttı. Bu sayede 1000 tane veriyi her sayfada 20 tane olacak şekilde 50 sayfaya bölebiliriz.
Burada dikkat etmemiz gereken şey; bu şekilde bir kullanım yapabilmek için order by ile sıralama yapmamız gerekiyor. Yani offset başlangıç rows fetch next adet rows only komutu order by komutu ile beraber kullanılıyor. Önce veriyi order by ile bir sütuna göre sıralayacak sonra içerisinden istediğimiz aralıktaki veriyi alacağız. Böyle olmasının sebebi; veritabanında veriler herhangi bir mantık yada sütuna göre sıralanmamış olabilir (ki çoğunlukla böyle olur), bu durumda Sql Server hangi 20 tane veriyi getireceğini bilemez. Ama herhangi bir sütun üzerinden sıralama yaparsak veriler üzerinde bir sıralılık olacağından istediğimiz bir parçasını getirebiliriz. Örneğin biz kitaplar tablosunu id değerine göre artan sırada sıralayıp ilk 20 tane veriyi getirelim. Ardından 30. veriden sonra bi 40 tane daha veri getirelim.
select * from kitaplar order by id offset 0 rows fetch next 20 rows only;
select * from kitaplar order by id offset 30 rows fetch next 40 rows only;
İlk sorguda ilk 20 veriyi getireceğimiz için başlangıç değerimiz 0, adet değerimiz 20 oldu. İkinci sorguda ise 30. veriden sonra 40 veri getireceğimiz için başlangıç değerimiz 30, adet değerimiz 40 oldu.
Başlangıç ve adet değerleri için değerlerin pozitif olması şartı dışında herhangi bir limit yok, yani hem başlangıç hemde adet değerimizin sıfırdan büyük olması gerekiyor. Tüm verilerin sayısından daha büyük değerler verdiğinizde, (örneğin tabloda 100 veri var ama başlangıç değerini 1000 yaptınız yada başlangıç değerini 0 adet değerini 1000 yaptınız) sorgu hata vermeyecek, sadece eşleşen kadar veri getirecektir. Örneğin 100 tane veri olan bir tabloda başlangıç değerini sıfır adet değerini 1000 yaparsanız size 100 tane veri gelir çünkü tabloda 100 veri var. Başlangıç değerini 101 adet değerini 10 yaparsanız da size boş veri gelir, çünkü 100 tane veri varken size 101.’den sonra 10 tane veri getiremez.
where koşul kısmı ile veriler arasında filtreleme yapabiliyoruz. Fakat bu filtrelemenin ucu bucağı yok diyebilirim. Doğrudan sütunlar üzerinden filtreleme yapabileceğiniz gibi Sql Server’ın kendi fonksiyonlarını kullanarakta filtreleme yapabilirsiniz. Örneğin ilk harfi a, 5. harfi b olan 5 karakter uzunluğunda, tamamen sesli harflerden oluşan, bir karakterin bir kere geçtiği verileri getir diyebiliyorsunuz. Yada karesinin küp kökünün 5’te 1’inin 15 kuvveti 10’dan küçük olan verileri de getir diyebiliyorsunuz. Filtreler tamamen sizin hayal gücünüze kalmış bir şey. Sql Server’daki fonksiyonları ayrı yazılarda anlatacağım fakat şimdi basit anlamda anlatalım.
where ile bir filtreleme yapmak için where anahtar kelimesinden sonra filtre şartını yazmamız gerekiyor. Örneğin bizim kitaplar tablosunda 2000 yılından önce yazılmış kitapları getirebilmemiz için where basimYili < 2000 gibi bir kod yazmamız gerekiyor. Bu yapı aslında C#, Python, NodeJS gibi programlama dillerinde de birebir aynı. Sql sorgusunun where’den önceki kısmına bir dizi dersek where’den sonrası da filtre işlevi görüyor, yani dizi içerisinde filtreleme yapılıyor aslında. C# gibi güçlü bir dilde var olan toplama, çıkarma, çarpma, mod alma ve bölme matematiksel işlemler aynı şekilde Sql Server’da da var. Toplama yapmak için +, çıkarma için -, bölme için /, çarpma için * ve mod almak için mod anahtar kelimesi kullanılıyor. Standart bir programlama dilinden tek farkı class yapısı yok, fonksiyonlar doğrudan ismiyle çağrılıyor. Neredeyse tüm fonksiyonları anlatacağım fakat şimdilik az önce dediğim gibi 2000 yılından önce yazılmış kitapları getiren bir Sql komutu yazıp yazıyı bitirelim.
select * from kitaplar where basimYili < 2000;
Evet şimdilik bu kadar yeter bence, tüm Sql Server yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.