Aylık arşivler: Temmuz 2007

Select, Group By, Having

Merhabalar,

Bu yazı, bir önceki SQL nedir, ne deÄŸildir ? adlı yazının devamı ÅŸeklinde olacak ve ‘Group By’ ve ‘Having’ ile SELECT sonuçu olarak dönen liste üzerinde yapılan iÅŸlemlere deÄŸineceÄŸiz.

Geçen yazımızdan hatırlayacağınız gibi, SELECT cümlesi geriye bir liste dönen bir ve üç ana parçaya ayırabileceğimiz bir komut idi. Bu ana parçalardan kısaca bahsedecek olursak;
– süzme iÅŸlemi (WHERE alt cümlesi ile yapılabilen)
– sıralama iÅŸlemi (ORDER BY alt cümlesi ile yapılabilen)
– geri dönen liste üzerinde yapılan iÅŸlemler (GROUP BY, HAVING, MAX, SUM, COUNT, MIN….vs.)

Peki SELECT cümlesinde gerçekleşen olayları biraz daha derinden inceleyelim, bu şekilde GROUP BY ve diğer işlemlerin anlaşılmasını kolaylaştırmaya çalışalım.

SELECT Price
  FROM Customer
 WHERE Price < 100
   AND Price > 50

Bu SQL cümlesinden geriye bir liste gelir, buraya kadar herşey çok normal ve oldukça basit. Ama biz biraz daha analitik bir liste istersek ki iş dünyasında bu çeşit listelere oldukça fazla başvuruluyor.

  SELECT Count(*), Price
    FROM Customer
   WHERE Price < 100
     AND Price > 50
GROUP BY Price

Yukarıdaki cümlede durum biraz karışık ama inanın göründüğü kadar deÄŸil, şöyleki; Bu SELECT cümlesi bir üstte belirtiÄŸimiz SELECT cümlesi ile aynı listeyi oluÅŸturur ama son yazılan SELECT cümlesine ‘Count(*)’ ve ‘GRUOP BY’ gibi SELECT’den dönen listeyi deÄŸiÅŸtiren alt cümleleri eklenmiÅŸtir. Biz standart listeleme iÅŸleminden dönen (yani Price bilgisi 100 ile 50 arasında olan Customer listesine) listeye düşük seviyeli liste diyelim. Bu düşük seviyeli listenin üzerine GRUOP BY ve COUNT iÅŸlemleri uygulandıktan sonra ortaya çıkan yeni listeye ise sonuç listesi adını verelim.

Veri tabanı uygulamaları, işte bu mantık doğrultusunda öncelikle düşük seviyeli listeleri oluşturur ve bu düşük seviyeli listeler üzerine yapılan işlemlerle sonuç listesini meydana getirirler. Bu bilgiler ışığında GROUP BY alt cümlesinin tanımı şu şekilde olabilir;
– Cümleden sonra parametre olarak belirtilen alanın veya alanların deÄŸerine göre düşük seviyeli listeyi parçalara ayırır, belirtilen alanın veya alanların kaç farklı deÄŸeri var ise o kadar düşük seviyeli liste oluÅŸturur.

Bu tanım biraz daha aklınıza yattı değil mi.. ?

Peki şimdi bir de COUNT(*), MIN, MAX, AVERAGE gibi fonksiyonların nasıl çalıştıklarını anlatmaya çalışalım;
– Tüm bu fonksiyonlar, düşük seviyeli listenin tamamı üzerine çalışır. EÄŸer düşük seviyeli liste GRUOP BY ile bölünmüş ise, her bir parça için ayrı ayrı çalışırlar.

Yani son SQL cümlesinde yer alan Count(*) işlemi her Price değeri için bölünmüş olan düşük seviyeli listenin herbir parçası için çalışır. Ve ortaya sonuç listesi olarak, her parçanın içerisinde yer alan kayıt sayısı ve her parçanın ayıraçı konumundaki Price bilgisi çıkar. Örnek;

Count(*) - Price
    5            60
    7            70
... vb.

Peki biz şu şekilde bir SQL cümlesi yazacak olursak;

  SELECT Count(*), Price, Name
    FROM Customer
   WHERE Price < 100
     AND Price > 50
GROUP BY Price

Veri tabanı bize hata verecektir. Hemen aklınızdan ‘KardeÅŸimmmm bu ne hatası böyleee…. eee Customer üzerinde Name var.. neden görmez bunu bu salak..’ vb. düşünceler geçebilir. Aman geçmesin çünkü veri tabanı manyağı haklı. Peki neden haklı onu inceleyelim;

Şimdi öncelikle düşük seviyeli listenin ne olduğunu bulalım;
– Price bilgisi 100 ile 50 arasında olan Customer bilgileri.. Id, Price, Name…vs.. vs.. Bu listeye ‘A’ listesi diyelim.

‘GRUOP BY’ iÅŸlemi olduÄŸuna göre, elimizdeki düşük seviyeli ‘A’ listesi Price bilgisinin deÄŸerlerine göre bölümlere ayrılmıştır. Örnek olarak Price bilgisi 5 farklı deÄŸere sahip olsun elimizdeki ‘A’ listesi ‘A1, A2, A3, A4, A5’ ÅŸeklinde küçük listelere ayrılır.

Daha sonra COUNT(*) iÅŸlemi ile bu her bir küçük listenin adet bilgisi ile Price ve Name bilgisi sonuç listesine verilmiÅŸtir. Peki burada ki gariplik ne, neden hata veriyor. Sorun ÅŸu A listesinden A1’e geçiÅŸ sırasında her bir Price’a karşılık ‘n’ adet Name bilgisi oluÅŸmuÅŸtur bu nedenle sonuç listesi oluÅŸturulurken, Count bilgisi hesaplanmış, Price bilgisi tek olduÄŸu için alınmış fakat hangi Name bilgisinin kullanılacağına karar verilememiÅŸtir.

Düşük Seviyeli Liste’nin son hali..

Id Price Name
1 60 Test60-1
2 60 Test60-2
3 70 Test70-1
4 70 Test70-2
5 80 Test80-1
6 90 Test90-1

‘Group By’ uygulandıktan sonraki düşük seviyeli listenin hali;

Price Alt Kümeler
60
Id Name
1 Test60-1
2 Test60-2
70
Id Name
1 Test70-1
2 Test70-2
80
Id Name
1 Test80-1
90
Id Name
1 Test90-1

İşte bu da son ipucu; SQL programlama dilinde herhangi bir liste oluşturabilmek için bir kademe altta yer alan listenin elemanları direkt olarak kullanılabilir ya da fonksiyonlar yardımı ile alt listelere ulaşılıp, toplam, en küçük, en büyük, ortalama.. vb. değerler elde edilebilir.

Kolay gelsin.

SQL nedir, ne deÄŸildir ?

Merhabalar arkadaÅŸlar,

“Uzun bir aradan sonra tekrar birlikteyiz ben …” ÅŸeklinde bir cümle kurmayacağım, ben de biliyorum bu aralar tembelleÅŸtim, önceden ne güzeldi sık sık ve güzel güzel yazıyordum ama ya ÅŸimdi aradan aylar geçmesi gerekiyor, elime kalem alabilmem için :P (Duyan da gerçek yazar zannedecek :) ) Neyse bugün ki konumuz “SQL nedir, ne deÄŸildir ?”

Åžimdi aklınızda şöyle bir soru olabilir “beee adam canın mı sıkıldı oturuyorsun SQL hakkında yazı yazıyorsun ?”. Olabilir diyorum ya olabilir, illa olacak diye bir kaide yok. Ben size genede nedenini söyleyeyim, memleketimin yazılımcılarının SQL ile arasının pek olmaması nedeni ile bu yazıyı yazıyorum. Açıklayıcı olması için ve gerçek örneklerle bu yazıyı yazmaya çalışacağım, gariplikler görürseniz ÅŸaşırmayın.

Öncelikle bu SQL ne değildir ? sorusuna cevap arayalım. SQL programlama dili animasyon yapımında, gelişkin matematiksel işlemlerde veya işletim sistemi yazımında kullanılmaz, kullanan var ise hemen anlından öpeyim bitsin bu çile.

Peki nedir bu SQL ? diye soracak olursanız;
– Sadece veriler üzerinde iÅŸlem yapmak için tasarlanmıştır. Bu nedenle basit anlamda 4 adet iÅŸlemden oluÅŸur. Bu iÅŸlemler listeleme, güncelleme, ekleme ve silmedir. (SELECT, UPDATE, INSERT, DELETE)
– Kendi kendine herhangi bir ÅŸekilde çalışamaz, veri tabanı uygulamaları tarafından veriler üzerinde iÅŸlemler yapabilmek için kullanılırlar. (Maalesef tüm veri tabanı uygulamaları üç aÅŸağı beÅŸ yukarı, ufak da olsa bir takım farklılıklarla SQL dilini destekler.)
– Sonuç olarak, SQL programlama dili veri tabanı uygulamaları tarafından derlenen ve çalıştırılan (bu nedenle veri tabanı uygulamasına göre çalışması deÄŸiÅŸebilen), sadece verilere hükmetmek için kullanılan, evrensel bir programlama dilidir.

http://en.wikipedia.org/wiki/SQL adresinden daha fazla bilgiye ulaşabilirsiniz. Hemen belirtmem gereki ki; SQL programlama dilinin versiyonları vardır, veri tabanı uygulamaları hangi SQL versiyonuna destek verdiklerini belirtirler. Bu versiyonları tarif etmek gerekir ise;
SQL-86: BildiÄŸimiz standart SQL cümlelerinden oluÅŸur, herhangi bir ek yoktur. Kısaca tüm dünyanın ~%95’i sadece bu kadarlık kısmını kullanılır.
SQL-1999: Bildiğimiz SQL cümlelerinin üzerine birçok yeni özellik eklenmiştir ki saymakla bitmez, kısaca SQL programlama dilinin programlama dili olduğu versiyon bu versiyondur.
SQL-2003: Tüm bu özelliklere XML ile çalışabilme özelliği eklenmiş ve ortaya bu versiyon çıkmıştır.
SQL-2006: Artık bu versiyonda XML entegrasyonu konusunda ‘Yok artık löbran ceyms’ konumuna ulaÅŸmış ve XQuery (XML Query Language)’de desteklemeye baÅŸlanmıştır.

Sizleri çok endiÅŸelendirmeden hemen konumuza girelim; Biz bu yazımızda sadece; SQL-86’yı inceleyeceÄŸiz. Ä°ÅŸe sizlere küçük bir ipucu vermek ile baÅŸlayacağız, (bu belirteceÄŸim ipucu SELECT cümlesi içerisinde listeme sırasında veri üzerinde herhangi bir deÄŸiÅŸikliÄŸin yapılmadığı durumlarda geçerlidir) aslında ‘INSERT’ hariç tüm cümleler bir çeÅŸit ‘SELECT’ cümlesidir tek bir farkla ‘UPDATE’ kayıtları ekrana yazmak yerine güncellerken, ‘DELETE’ ise kayıtları siler. INSERT’in durumu ise, çok vahimdir iÅŸi gücü belirtilen tek kaydı veya SELECT cümlesi ile bulunmuÅŸ bir kümeyi tabloya eklemektir.

Örnek vermek gerekir ise;

SELECT *
   FROM Customer
-- OR
DELETE *
   FROM Customer
-- OR
UPDATE Customer
     SET Name = 'Hebele'
-- Farklı olan INSERT
 INSERT 
    INTO Customer (Name) 
VALUES ('Hebele2')

Yukarıda belirtiğim gibi aslında sizler SELECT cümlesini öğrendiğinizde geri kalan tüm işlemleri aşağı yukarı öğrenmiş olursunuz. Şimdi bu nedenle bizler SQL programlama dilinin en önemli özelliği olan SELECT cümlesi üzerine yoğunlaşacağız.
Hemen ikinci ipucunu verelim; SELECT cümleleri içerisinde yer alan komutlar üçe ayrılır. Bunlardan birincisi verileri süzme iÅŸlemidir bu iÅŸlem WHERE alt cümlesi ile yapılır, baÅŸka bir komut ile süzme iÅŸlemi yapılmaz. Ä°kinci komut sıralama iÅŸlemidir, sadece ‘ORDER BY’ alt cümlesi ile yapılır. Ä°ÅŸte iÅŸin zor kısmı listeme sırasında yapılacak iÅŸlemler için ise ‘GROUP BY, HAVING, ROWNUM, LIMIT, TOP, COUNT, MAX, MIN, AVARAGE……’ ve daha zilyon tane alt cümle kullanılabilir, tüm bunların hepsi yani WHERE ve ORDER BY haricindekiler, oluÅŸan liste üzerinde deÄŸiÅŸiklik yapar veya liste üzerinden farklı listeler, farklı veriler elde etmeye yararlar.

Örnek vermek gerekir ise; Yeri gelmişken SQL cümleleri nasıl okunmalıdır, bunun da örneğini yapalım.

SELECT Name, Price -- Name ve Price alanlarını göster
  FROM Customer -- Customer'ın
WHERE Price < 100 -- Price'ı 100'den küçük olanların
ORDER BY Price DESC -- Price bilgisi büyükten küçüğe doğru sıralanmış olsun.
-- Peki biz 100'un altında kaç tane kayıt olduğunu öğrenmek istersek
SELECT COUNT(*)
  FROM Customer
WHERE Price < 100
-- Peki biz 100'ün altında yer alan fiyatlardan hangisinden kaç tane bulunduğunu öğrenmek istersek;
SELECT Count(*), Price
  FROM Customer
WHERE Price < 100
GROUP BY Price

Bir sonraki yazımızda SELECT konusuna daha fazla değineceğiz.

Kolay gelsin.

Ruby Değişken Özellikleri

Merhabalar,

Öncelikle bu kadar uzun bir süre yazı yazmak ilginç oluyor. Bir aydan fazla bir süredir, nokta koymadığım bu günlüğe birşeyler yazmak biraz yabancı geldi açıkcası.

Bu yazıyı yazmam için beni birazcıkta olsa gaza getiren sevgili Mehmet DURAN kardeşime buradan teşekkür etmek isterim.. şak şakk şakk şakk.. javaayyyyy diyorum sana Mehmet.. :)

Öncelikle bu yazıdaki konumuzu belirteyim; Ruby programlama dilinde değişkenlerin nasıl tanımlandığı ve değişkenler üzerinde tip dönüşümlerinin nasıl olduğu.

Ruby’de deÄŸiÅŸkenler tanımlanırken herhangi bir ÅŸekilde tip belirtmenize gerek yoktur. Ä°sterseniz Java veya C#’da yaptığınız gibi yapabilirsiniz ama o zaman biraz ayıp olur.. yuhananırsınız.. ohaa artık diyenler olabilir. Şöyledir yani;

intValue = 5
strValue = 'Hobaaa'
arrValue = []
hashValue = {}
regValue = \.*\
classValue = MyClass.new

Öncelikle programlama dillerinde değişken tiplerinin dönüşümü ve bu tiplerin ele alınmasını iki soru altında toplanabiliriz; Bu sorular
1. Tipler arasındaki dönüşüm nasıl gerçekleşir?
2. Değişken üzerinde işlem yaparken tip önemlimidir?

Öncelikle 1. soruyu ele alalım; “1. Tipler arasındaki dönüşüm nasıl gerçekleÅŸir?”
El cevap: EÄŸer deÄŸiÅŸkeninizi bir tipten öteki tipe hödöö hödöö diye gönderiyorsanız, kullandığınız dil dinamik tip dönüşümüne sahiptir demektir. EÄŸer hödö hödöö diye deÄŸil de, daha efendi bir ÅŸekilde (örnek: ‘String.valueOf(55)’) yapıyorsanız duraÄŸan tip dönüşümüne sahipsiniz demektir. DeÄŸiÅŸkenlerinizi bir tipten öteki tipe deÄŸiÅŸtiremiyorsanız, ohaaa sizin o kullandığınız ÅŸey programa dili deÄŸil çin iÅŸkencesi demektir.

Programlama dillerine göre dinamik ve durağan tip dönüşümüne sahip olan diller;
Dinamik: Ruby, Python..vb.
DuraÄŸan: Java(yyyy), C#….vb.

Ä°kinci soruyu ele alırsak; “2. DeÄŸiÅŸken üzerinde iÅŸlem yaparken tip önemlimidir?”
El cevap: EÄŸer siz bir karakter ile sayiyi toplamak isterseniz veya benim bir deÄŸerim var ama inan ben bile bilmiyorum ne olduÄŸunu öyle yanar dönerli birÅŸey iÅŸte.. (Basic’den Variant, C’den void) diyebiliyor iseniz, sizin için deÄŸiÅŸkenin tipi pekde önemli deÄŸildir. Yani deÄŸiÅŸkenler ile deÄŸiÅŸken tipleri arasındaki baÄŸlantı ‘zayıf’tır. Her deÄŸiÅŸkenin veya her iÅŸlemin tipi olmasına gerek yoktur, diyebilirsiniz. Ama dersenizki ‘hadeee canım, tipsiz tipsiz deÄŸiÅŸkenmi olur, tipli adamın tipsiz deÄŸiÅŸkeni olmaz’ derseniz, tüm deÄŸiÅŸkenleriniz ile deÄŸiÅŸken tipleri arasında ‘güçlü’ bir baÄŸlantınız var demektir.

Güçlü: Ruby, Java(yyyy), C#, C++…vb.
Zayıf: C, Basic, Java(yyy)Script….vb.

Peki Ruby’de bunlar nasıl oluyor da oluryor diyeceksiniz ÅŸimdi; Ä°ÅŸte böyle oluyor..;

intValue = 5
puts 5 + intValue # problem yok.
puts "5" + intValue # büüürrrstt nereye biraderr..
puts "5" * "5" # bürrsttt yok daha neler..
# bir string(a) ile numarayı(b) çarptığınızda, ruby sizin a'yi b kez tekrarlamak istediğinizi zanneder.
puts "5" * intValue # Olur, bunun ruby'de karşılığı vardır.

Kolay gelsin..!