VERİTABANINDAN VERİ ÇEKMEK
SQL’in desteklediği bütün veritabanları ilişkili veritabanlarıdır.
SQL’de tablo adı, verilen temel ünite veriyi organize eder. Tek bir satırdaki veriler birbirleriyle ilişkilidir ve her bir satır kayıt adını alır.
Tip: Özel Terimler tablolarla ilişkilendirilmiştir. Tablodaki satır sayısı “cardinality” olarak adlandırılırken, sütun sayısı ise tablonun derecesi olarak adlandırılır. Eğer iki sütun aynı veri tipine dönüştürülebilir ise onlara alan uyumlu (domain compatible) denir. Eğer iki tablo aynı dereceye sahipse bunlara birleşme uyumlu (union compatible) adı verilir.
Sütunlar veritabanında özel sınıflandırmada rol oynar. (Onlarda hangi tip veri tutulacağını belirler)
Kısaca özetlersek: Veri, tablolarda depolanır. Tablolar, veri parçalarıyla ilişkilendirilmiş grup olan satırlardan ve verinin tipine göre sınıflandırma olan sütunlardan oluşur. Bu bölümde bizim amacımız veritabanından veriyi almak olduğu için bu, tablodan verinin alınmasına dönüşmüş olur. SQL bu işlemi uygulamak için SELECT adında bir eylem oluşturur. Tablodan veriyi almak için bu SELECT deyiminin değişik formlarını kullanacağız.
SELECT’İ KULLANMAK
SELECT emri tek başına bir iş yapmaz. (Çalıştırdığımızda hata mesajı verir) Bu yüzden SELECT’i ek nesne ve kelime gruplarıyla beraber kullanmalısınız.
Bu deyimi kullanırken tablodan çekeceğimiz sütunları tek tek virgüllerle ayırabilir ya da * ile bütün sütunları belirtebilirsiniz.
Bununla beraber FROM kelimesini de kullanmanız gerekir. Bu kelimenin nesnesi tablonun ismidir (birden çoksa virgüllerle ayrılır). Örnek verirsek:
SELECT * FROM authors
Burada dikkat etmeniz gereken hususlardan ilki, sütun isimlerinde boşluk kullanılmamasıdır. Eğer boşluk kullanmak istiyorsanız yazacağınız ismi köşeli parantezler içine yazmalısınız.
İkinci önemli husus ise, her bir kayıdın kimlik numarasının ayrı olmasıdır. Kimlik numaralarının olduğu sütuna kimlik sütunu (identity column) adı verilir. Bu numara aynı ada sahip kayıtları birbirlerinden ayırt etmeye yarar.
Üçüncü husus ise okunabilirlik ve anlaşılabilirlik açısından kelime gruplarını birleştirmek yerine “_” kullanmaktır. (kimlikno yerine kimlik_no) Diğer bir yöntemi de kelimelerin ilk harfinin büyük yazılmasıdır. Ayrıca kullanacağımız kelimeler açık olmalı (Adres yerine A yazmak anlaşılabilirliği olumsuz etkiler).
Eğer bütün sütunları değil de belli sütunları çekmek istiyorsak:
SELECT au_fname, au_lname FROM authors
şeklinde sütun isimlerini virgüllerle ayırarak * yerine yazabiliriz.
Tip: SELECT deyimiyle döndürülen tablodaki sütunların sıralanışı ana tablodaki sıralanış olarak değil, deyimde kullanılan sıralanış olarak döndürülür.
Tablodaki sütunları döndürürken birleştirme işlemini de yapabiliriz. Önce aşağıdaki örneği inceleyelim:
SELECT au_lname + ‘, ’ + au_fname AS full_name FROM authors
Burada + işlemi iki sütunu birleştiriyor (string için tek tırnak kullanıldığına dikkat edin) ve sütunun ismi de AS deyimi yardımıyla full_name olarak adlandırılıyor.
Tip: Bazı veritabanları SQL deyimlerinin sonuna “;” konmasını ister. Buna dikkat etmek gerekir. (SQL Server istemezken Access, Oracle ve Sybase ister)
WHERE
Eğer tablodan döndürülecek kayıt sayısını sınırlamak istiyorsak SELECT’te WHERE ifadesini kullanmalıyız.
Tablonun başından itibaren belli sayıda kayıt çekmek istiyorsak TOP deyimini kullanabiliriz. Örneğin:
SELECT TOP 10 au_lname+‘, ’+au_fname AS full_name FROM authors
TOP deyimi sadece tablodan sırasıyla kayıtları çeker. Eğer belli bir koşula göre tablodan kayıt çekmek istersek WHERE ifadesini kullanmalıyız. Kullanımına örnek verirsek:
SELECT * FROM authors WHERE state=’UT’
WHERE’i daha iyi incelemek için veri türlerini incelemeliyiz.
Tip: Bazı veri tiplerini bazı veritabanları tanımayabilir. Örneğin MSSQL Server char ve varchar’ın Unicode extens. Kabul etmesine karşın diğerleri etmez.

binary.................. 8000 byte’a kadar binary veri
bit....................... 0 veya 1 olan integer
char.................... Unicode olarak kodlanmamış sabit uzunluktaki string
datetime.............. 1/1/1753 den 12/31/9999 a kadar tarih va zaman değerleri
decimal............... -10^38-1’den 10^38-1’e kadar sayılar (31.2 gibi)
float.................... -1.79E+308’den 1.79E+308’ekayan noktalı sayılar
image.................. maximum 2^31 büyüklüğünde değişken uzunluk stringi
int....................... -10^38-1’den 10^38-1’e kadar onluk sayılar (31 gibi)
money................. -2^63 den 2^63 e kadar para ifade eden sayılar (10.68 gibi)
nchar.................. Unicode olarak kodlanmış sabit uzunluktaki karakter stringi
ntext................... maximum 2^31-1 uzunlukta değişken uzunluklu string
nvarchar.............. Unicode olarak kodlanmış değişik uzunlukta string
numeric............... decimal ile aynı
real..................... -3.40E+38 den 3.40E+38 e kayan noktalı onluk sayılar
smalldatetime...... 1/1/1900 den 6/6/2079 a tarih ve zaman değeri
smallint .............. -2^15-1 ten 2^15-12 e integer sayılar
smallmoney......... -214,748.3648 den 214,748.3647 ye para ifade eden sayılar
sysname............. nvarchar (128)
text..................... max 2^31 uzunluklu Unicode olamayan değişken uzunluklu string
timestamp........... Veritabanındaki kendine has sayı
tinyint.................. 0 dan 255 e integer
varbinary.............. max 8000 byte uzunluklu binary veri
varchar................ Unicode olamayan değişken uzunluklu karakter stringi
uniqueidentifier..... Dünyada kendine has olan global belirleyici
SIRALAMA
Verinin sıralanmasını ORDER BY deyimiyle gerçekleştirebiliriz. Örneğin:
SELECT * FROM authors WHERE contract=1 ORDER BY au_lname
Burada sıralama çeşidini belirtmezsek artan (ascending =ASC) olarak sıralanır. Azalan şekilde sıralanmasını istiyorsak deyimin sonuna DESC ifadesini de koymalıyız. (isteğe bağlı olarak [DESC] de yazabiliriz.)
Eğer birden çok sütuna göre sıralama istiyorsak sütunları virgüllerle ayırarak (ORDER BY au_lname, au_fname) ve öncelik sırasına göre yazmalıyız.
ÖZET EKLEMEK
AVG : ortalama değeri, COUNT : döndürülen eleman sayısı (boş olmayan, sayılabilir), MAX : en büyük değeri, MIN : en küçük değeri, SUM : toplam değeri döndürür. Örnek verirsek:
SELECT AVG(qty) FROM sales
Bu örnek qty sütunundaki değerlerin ortalamasını döndürür. (WHERE kullanılsaydı sadece o koşulu sağlayanların ortalaması alınırdı)
GRUPLAMA
Eğer kayıtları gruplamak istiyorsak GROUP BY ı kullanmalıyız. Örnek üzerinde incelersek:
SELECT ord_num,SUM(qty) FROM sales WHERE qty>9 GROUP BY ord_num
Burada SQL ilk önce WHERE koşuluna uyan kayıtları ord_num a göre gruplar. Ardından da bu gruptaki her kayıtın qty bilgilerini toplar ve ord_num sütununun yanına qty toplamlarını da ayrı bir sütun şeklinde yazar. Eğer bu örnekte GROUP BY ı kullanmasaydık SQL hata verirdi. (Ya GROUP BY kullanmalısınız ya da sales.ord_num bir aggregate(toplam) değer değildir diye bizi uyarırdı)
Eğer aggregate fonksiyonlarını WHERE’de kullanmak istiyorsak WHERE’de alt sorgulama kullanılıyor olmalıdır. Aksi halde WHERE yerine HAVING ifadesini kullanmalıyız. HAVING, GROUP BY’dan sonra icra edilir.
Veritabanından sadece birbirinden ayrı olan elemanlarını almak istiyorsak:
SELECT DISTINCT title_id FROM sales
yazarız. Başka bir örnek incelersek:
SELECT COUNT(title_id) FROM sales HAVING SUM(qty)>30
Burada COUNT ile geçerli olan 21 değer alınıyor. Bu 21 kayıdın qty toplamları 30’dan büyük olduğu için HAVING sağlanır ve COUNT’un sonucu olan 21 değeri döner.
Eğer toplama fonksiyonunda sütun ismi verilmemişse GROUP BY’da verilmesi lâzımdır.
Ayrıca, bütün sütun isimleri toplama fonksiyonlarında içerilirse HAVING’i GROUP BY’sız kullanabiliriz.
TABLOLARI BİRLEŞTİRMEK
Şimdiye kadar hep verilerimizi tek bir tablodan aldık. SQL, join adı verilen işlemle birden çok tabloyla işlem yapmaya izin verir.
SELECT * FROM table1, table2 WHERE table1.identity = table2.identity
Burada anlaşıldığı üzere her iki tablonun da aynı kimliğe sahip elemanları döndürülüyor. Bu tür birleşmeye iç birleştirme (inner join) adı verilir. Burada tabloya erişim tablo adı ile sağlanıyor.
(tablo_adi.sütun_adi = veritabani_ismi.sahip_adi.tablo_adi.sütun_adi)
Inner join oluşturmak için kullanılan yapı SQLS2 standartıyla değiştirildi:
SELECT * FROM table1 INNER JOIN table2 ON table1.au_id = table2.au_id
Tip: Terminolojide, On yapısında eşitlik içerene equi joins, diğer operatörleri içerene nonequi joins, bunların her ikisine theta joins, koşulsuz joinlere de cross join adı verilir.
Inner join haricinde iki tür birleştime daha var ki bunlara outer join de deniliyor. Bunlar right ve left join’dir.
Right join sağdaki tabloyu aynen alır, soldaki tablodaki aynı elemanlarla birleştirir. Left ise tam tersidir. Genel yapı şöyledir:
SELECT * FROM table1 LEFT JOIN table2 ON table1.au_id = table2. au_id
Başka bir örnek verirsek: Diyelim ki bir tabloda yazarlar, diğer tabloda yazılar, başka bir köprü tablosunda da yazı ve yazar kimlikleri var. Bu tabloları şöyle birleştirebiliriz:
SELECT * FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titleauthor.title_id = titles.title_id
Left ve right joinleri full join kullanarak birleştirebiliriz (iki tabloyu birleştirmek).
ALANLARI BİRLEŞTİRMEK VE SÜTUN OLUŞTURMAK
Alanları birleştirmeyi daha önce görmüştük. (+ operatörü ile) Bunun daha bir çok yolu vardır. Önemli olan nokta, birleştirilerek oluşturulan sütuna sonradan tekrar erişebilmek ve isimlendirmek için AS deyimi ile ad vermektir. Örneğin:
SELECT au_lname + ‘, ’ + au_fname AS full_name FROM authors
Ayrıca matematik işlemlerini de uygulayabiliriz (+, -, /, *, ^) Örneğin:
SELECT qty*price AS total_sale FROM sales
Bunlara ek olarak tabloya ek bir sütun ekleyip, bu sütunun elemanlarına istediğimiz sabit değeri verebiliriz:
SELECT *, ‘Temmuz’ AS the_month FROM titles
Tip: As kullanılarak oluşturulan her isme ilişki ismi (correlation name) denir.
SQL bir bilgisayar programı içinde kullanılmışsa embedded SQL denir.
Outer join’in eski hali tablo isminden sonra + koymaktı.
ÖNCEKİ SAYFA SONRAKİ SAYFA
| Yorumlar |
|

