V er ita ban ı P rogram la ma

advertisement
Temmuz 2003
Veritabanı
Programlama
Yaşar Gözüdeli
Veritabanı Programlama
Eğitim dizisi
Veritabanı
Programlama
1
Temmuz 2003
Yaşar GÖZÜDELİ
Bu ek kopyalanamaz, satılamaz. Her hakkı saklıdır.
BYTE’ın okurlarına ücretsiz armağanıdır.
© 2003 BYTE
BYTE bir Acar Yayıncılık Yayınıdır
İÇİNDEKİLER
Önsöz........................................................................ 6
Bu kitapta..................................................................................8
Veritabanı Yönetim Sistemleri.................................................................. 8
Veritabanı Nerelerde Kullanılır?............................................................... 9
1.İlişkisel Veritabanı Kavramı ..................................................12
Günlük Hayatta ilişkisel Veritabanı......................................................... 12
Temel Kavramlar1......................................................................................... 13
Tablolar: ........................................................................................................... 13
Değişken İsimlendirme Kuralları............................................................. 14
İlişkisel Veritabanı Yönetim Sistemleri: ................................................. 14
2.SQL Veri Tanımlama Dili (Data Definition Language).........20
Temel Veri Tipleri:.......................................................................................... 20
Veritabanı: ....................................................................................................... 20
Tablolar: ........................................................................................................... 21
Tablo Oluşturma ........................................................................................... 21
Kısıtlar(Constraint) oluşturma :................................................................ 22
Tablo silme:..................................................................................................... 23
Tabloda Değişiklik Yapma:......................................................................... 23
İndeksler: ......................................................................................................... 23
View’ler ............................................................................................................ 24
Veritabanı Tasarımı:...................................................................................... 25
1.Nesneleri Tanımlayın:............................................................................... 26
2.Her nesne için bir tablo oluşturun: ..................................................... 26
3.Her bir tablo için bir anahtar alan seçin:........................................... 26
4.Nesnelerin gerekli her bir özelliği için
tabloya bir sütun ekleyin ........................................................................... 27
5.Tekrarlayan nesne özellikleri için ek tablolar oluşturun.............. 27
6.Anahtar alana bağlı olmayan alanları belirleyin ............................ 28
7.Tablolar arasındaki ilişkileri tanımlayın ............................................. 29
Veritabanı Normalizasyonu ...................................................................... 29
3.SQL Veri İşleme Dili (Data Maniplation Language).............32
1.ResultSet Kavramı..................................................................................... 32
2.Select............................................................................................................. 32
En Basit Select................................................................................................ 32
Koşula bağlı Select ve Where Yapısı:...................................................... 32
Matematiksel Karşılaştırma İşaretleri: ................................................... 33
Mantıksal İşaretler ........................................................................................ 33
Sadece belli alanları seçmek..................................................................... 35
Distinct ............................................................................................................. 36
In......................................................................................................................... 36
İç içe Select Yapısı:........................................................................................ 36
Any, Some, All ................................................................................................ 37
Exists, not Exists ........................................................................................... 38
Union (Birleştirme)....................................................................................... 38
Kesişim Bulma:............................................................................................... 39
Except(Fark Bulma) ...................................................................................... 39
Between .... and .... ...................................................................................... 40
Karakter Karşılaştırmaları:Like.................................................................. 40
Null Karşılaştırma......................................................................................... 42
3.Sonuçları Sıralama:Order By ................................................................. 43
4.Kayıtları Gruplama:Group By ................................................................ 44
Gruplamalı Fonksiyonlar(Aggregate Functions): .............................. 44
Alana Takma Ad ............................................................................................ 44
5.Tabloları Birleştirme:Joining ................................................................. 49
Klasik Join........................................................................................................ 50
Tabloya Takma Ad(Alias) ............................................................................ 50
Self-join ............................................................................................................ 50
Left [Outer] Join ............................................................................................ 51
Right [Outer] Join ......................................................................................... 51
[Inner] Join...................................................................................................... 52
6.Kayıt Ekleme:Insert................................................................................... 53
Bir Tablodan Seçilen Kayıtları Başka bir Tabloya Ekleme:............... 53
7.Kayıt Güncelleme:Update...................................................................... 54
8.Kayıt Silme:Delete..................................................................................... 54
9.Genel SQL Fonksiyonları......................................................................... 55
Aritmetik İşaretler......................................................................................... 55
Tarih-Zaman Fonksiyonları:....................................................................... 55
Aritmetik Fonksiyonlar: .............................................................................. 55
Karakter İşleme Fonksiyonları: ................................................................. 56
Dönüştürme Fonksiyonları ....................................................................... 57
Önsöz
Basit bir Web uygulamasından, devasa
Sorumlu Yazı İşleri Müdürü:
Murat Yıldız
myildiz@byte.com.tr
Yönetici Editör:
İbrahim Özdemir
iozdemir@byte.com.tr
kuruluşların ağır verilerine kadar, günümüzde bir çok alanda veritabanı uygulamalarına ihtiyaç duyulmaktadır. Seri
özellikle, Web projeleri gibi küçük çaplı
işlerinde Veritabanı kullanmak zorunda
Editörler:
Burak Kahyaoğlu
bkahyaoglu@byte.com.tr
kalan, ama bu konuda başlangıç aşa-
Üsame İldar Özdemir
uildar@byte.com.tr
Bundan dolayı da SQL ve veritabanının
Tasarım ve Uygulama:
Yağız Akay
yakay@byte.com.tr
XML, Web servisleri ile başka sitelere
masında bile bilgi sahibi olmayan bir
çok kişiye ışık tutacak şekilde hazırlandı.
dışında, bir veritabanının Web’e açılması,
hizmet sunma gibi konulara da nasıl
yapılacağı konusunda fikir vermesi açısından bir noktaya kadar değinildi.
Tüm bunların yanında, SQL’i iyi bilenler için bile seyrek kullanılan komutlara
ACAR Yayıncılık adına imtiyaz sahibi:
Murat Yıldız
bir yerlerden bakmak bazen bir zorunlu-
Reklam Müdürü:
Ahmet Aslantürk
bir ihtiyacı da karşılamak üzere SQL’i
Baskı:
ETAM A.Ş.
bilecek hataları, akla takılabilecek soru ve
Film Çıkış:
Figür
önemli olduğunu gördüğüm teknikleri
Merkez Ofis:
Fulya Cad. Fulya Bayırı Sk.
Bilsan Plaza 11/4 80300
Mecidiyeköy - İSTANBUL
Tel: (212) 212 62 06
Faks: (212) 212 62 11
www.byte.com.tr
luk arz edebilmektedir. İşte kitapta böyle
enine boyuna ele aldım. Özellikle yapılasorunları, program geliştirme esnasında
püf noktaları halinde bulabilirsiniz.
Veritabanı uygulamalarının kurgulamak bir çok platforma hakim olmayı
gerektirir. Ciddi bir Web uygulaması
meydana getirebilmek için öncelikle, SQL
ve veritabanı konusunda temel bilgilere
sahip olmak gerekir. Çünkü tüm sistem,
veritabanı şeması üstüne inşa edilir.
Veritabanının tarihi gibi , uygulama
Bunun üstüne, HTML ve ASP-ASP.NET-
geliştirme açısından çok da etkili olma-
PHP gibi bir Web programlama tekniğine
yan konuları maalesef bu seride bulama-
hakim olmak gerekir. Bu da yetmez, veri
yacaksınız. Bu türden kuru bilgiler için
erişim bileşenlerini de yakından tanıyıp
bakılabilecek en iyi yer, bu konuda eğitim
etkin olarak kullanabilmek gerekir. Bunun
veren yüksek öğretim kurumlarımızda
üstüne, güncel bir uygulama geliştirmek
okutulan ders kitapları olabilir.
için XML’i yakından tanımak gerekir. XML
Günlük hayatta, veritabanına hakim
Web Servisleri, Web’de kurumlar arası
olamamış programcı arkadaşların, bu
haberleşme açısından oldukça ciddi
açıklarını daha fazla (SQL harici) kod ile
gelişmeler önermekte.
kapatmaya çalıştıklarına defalarca şahit
Seriyi hazırlarken, bu durumları
oldum. Böyle bir seri sayesinde, neyin
göz önüne aldık. İlk kitapçıkta, İlişkisel
veritabanı programlama kapsamında
Veritabanı ve SQL konuları ele alındı.
düşünüleceği, neyin istemci programa
İkinci ünitede bir popüler orta ve büyük
bırakılacağı konularının okurlar tarafın-
ölçekli Veritabanı Yönetim Sistemi olan
dan daha iyi anlaşılacağı kanaatindeyim.
Microsoft SQL Server 2000, T-SQL ile
Bu kitap sayesinde SQL’i tanıyan prog-
VTYS üstünde dinamik programcıkların
ramcıların bunu nerede nasıl kullanacak-
geliştirilmesi, belli başlı dinamik olarak
larını geniş örneklerle hem de güncel
SQL scriptleri oluşturma konularına da
teknolojiler ışığında öğrenebilecekleri bir
orta düzeye kadar yer verildi. Böylelikle,
seri ortaya çıkmış olacak.
veritabanı işine sıfırdan başlayacak bir
kullanıcının profesyonelliğin kapısından
içeriye adım atacak hale gelebileceği bir
kitap ortaya çıktı.
Özellikle SQL’e adanan ilk kitapçıkta
Emeği geçen herkese teşekkürü borç
bilirim.
-Yaşar GÖZÜDELİ
ygozudeli@hotmail.com
olmak üzere, kolay ama çok şey öğrenilmesi gerektiğinden, serinin tamamındaki
konu anlatımları sık sık ve kolaydan zora
doğru giden örneklerle desteklendi. İlk
kitapçıkta yer alan örneklerin bir çoğunu,
www.verivizyon.com/sqlkitabi adresinde online simülasyon üstünde test
edebilirsiniz.
Veritabanı Programlama 1
BYTE
7
Bu Kitapta...
İ
lk olarak, İlişkisel Veritabanı kavramını
yakından tanıyacağız. Böylelikle hayatta
karşılaşılan bilgiye dayalı projelerin
nasıl veritabanı mimarisine uyarlanacağını
öğreneceğiz.
İkinci bölümde, SQL komutlarını iki
gruba ayırarak inceleyeceğiz. Öncelikle,
veritabanı tasarlamaya yönelik komutları
öğreneceğiz. Bu gruba giren komutlar için
Veri İşaretleme Dili deyimini kullanacağız.
Veri İşaretleme Dili ile sadece verilerin saklanacağı ortama dair düzenlemeler yapılır.
Son olarak Veri İşleme Dili terimi
altında, İlişkisel veritabanı destekli veri
işleme komutlarını öğreneceğiz. Bu
komutlarla veritabanına kayıt eklemek,
veritabanından kayıt silmek, var olan
kayıtlar üstünde güncelleme yapmak gibi
işlemleri öğreneceğiz.
Bu konuya yeni başlamayı planlıyorsanız, önce ilk bölümü, ardından hazır bir
veritabanı üstünde 3. bölümü uygulamanız, son olarak ikinci bölümde kod yazarak
nasıl veritabanı tasarlayabileceğinizi öğrenebilirsiniz. 2.bölümü anlamak zorunda
değilsiniz.
Artık bir çok VTYS ortamında, veritabanı şemalarını düzenlemeniz için görsel
arayüzler mevcuttur. Ancak bir proje
üstünde çalışmak isterseniz, öncelikli
olarak nesneleri tasarlayıp veritabanı
şemasını ortaya çıkarmak gerekir. Ancak
daha sonra veri işleme işlemlerine geçilebilir.
8
BYTE
Veritabanı Programlama 1
GİRİŞ
SQL(Es-kü-el okunur) insanların veritabanı sistemleri ile konuşmasını sağlayan
popüler bir dildir. Bu dil sayesinde, bir veritabanından kayıtları alabilir, değiştirebilir
ya da yeni kayıtlar ekleyebiliriz. SQL bir
dildir; ancak bir programlama dili değildir.
Program geliştirme aşamasında SQL’den
faydalanılır, ancak tek başına bu iş için
yeterli değildir.
Verilerin belli özelliklerine göre gruplanıp diske kaydedilmesi işine veritabanı
yönetimi denir. Veritabanlarından en
popüler olanı, ilişkisel veritabanıdır. İlişkisel veritabanın kökeni, 1970’li yıllarda IBM
laboratuarlarında yapılan çalışmalarda
atılmıştır. Takip eden çalışmalarla, 1983’te
SQL (Structural Query Language) standartları tanımlanmış ve ardından 1987 yılında
önce ISO ardından da ANSI tarafından
bir standart olarak kabul edilmiştir. Daha
sonra, bu standartlar çerçevesinde bir çok
veritabanı yönetim sistemleri geliştirilmiştir. Bunlardan belli başlıları, Oracle, Sybase,
MS SQL Server, Informix ve MySQL’dir. Bu
VTYS’lerin işlerin daha kolay yürümesi için
kendi adlarına standart dilden uzaklaşan
tarafları vardır. Ancak genel işlemlerde kullanılan dil tümü için de ortaktır ve SQL’dir.
Veritabanı Yönetim
Sistemleri (VTYS)
Veri Tabanı Yönetim Sistemleri, fiziksel
hafızada bilgileri çeşitli özelliklerine göre
gruplandırıp şekillendirdikten sonra saklayan programlardır. Kısaca VTYS diye
adlandıracağız. VTYS, saklanan bu veriyi, SQL komutları ile insanların istekleri
çerçevesinde işler, yeniden
şekillendirirler. Yani, Veritabanı Yönetim Sistemi’nin bir
ucunda, bilgisayar disk(ler)inde saklanan düzenlenmiş
veriler, diğer ucunda ise bir
kullanıcı (genellikle insan)
vardır. Veritabanı Yönetim
Sistemleri konusunda daha
geniş bilgi bir sonraki kitapçıkta verilecektir.
Veritabanı Yönetim
VTYS, disk üstündeki verileri daha kolay işleyip yönetmemizi sağlar.
sistemleri, her zaman bir
SQL ile VTYS’ye veriler üstünde nasıl bir işlem yapması istendiği anlatıkullanıcıya, yönetim ekranlır. VTYS bunu bizim adımıza gerçekleştirir.
larından bilgi vermek için
kullanılmaz. Bazen kullanıcı konumunda
Veritabanı Nerelerde Kullanılır?
doğrudan bir insan yerine bir program da
Veritabanı programlama ile bir çok proje
olabilir.
geliştirilebilir. Bir İngilizce-Türkçe sözlük
Bir veritabanı programcısı, veritabanını
bu yolla kolayca yazılabilir. Bir kütüphane
çekip çevirmenin yanında, VTYS’ye bağlatakip otomasyonu, bir hastane otomasnıp veri alış-verişi ve veri üstünde değişiklik
yonu, muhasebe programları ve daha bir
yapan bu ‘istemci programları’ da yazabilen
çok otomasyon programı temelde veritakişidir.
banı projesidir. Günlük hayatta eritabanı
Veritabanı istemci programları SQL
programlama telefon şirketleri tarafından
dışında başka dillere de hakim olmayı
yoğun olarak kullanılır. Konuşmaların süregerektirir. VBScript’ten tutun da PHP, Perl,
leri ay boyunca veritabanlarında saklanır
ASP, ASP.Net gibi teknikler ile Web sayfası
ve ay sonu geldiğinde istemci programlar
geliştirmeye aşina olmak yahut C/C++/C#,
tarafından her bir abonenin telefon faturası
Java, Visual Basic gibi diller ile basit uygulateker teker hesaplanır. Günde yüzbinlerce
maları yapabiliyor olmak bu iş için başlanabonenin birbirini aradığı bir durumun
gıçta yeterlidir.
içinden başka hangi yolla çıkılabilir ki?
Veritabanı Programlama 1
BYTE
9
1. Bölüm
İlişkisel Veritabanı
Kavramı
İlişkisel veritabanı günümüzde en yaygın
kullanılan ilişkisel veritabanı sistemlerinden biridir. En çok kullanılan ilişkisel
Veritabanı Yönetim Sistemlerine Oracle,
Ms SQL Server, Sybase, Informix, MySQL
gibi veritabanı yönetim sistemlerini
örnek olarak verebiliriz. Bu bölümde
verilen uygulamaları test etmek için MS
Access de bir noktaya kadar kullanılabilir ancak verilen örneklerin tamamı MS
Access tarafından desteklenemez. Bu
nedenle, örneklerin büyük bir çoğunluğu
MS Access MS SQL Server 2000 üstünde
test edilmiştir. ONLINE olarak kitabın
içerdiği uygulamaları test etmek için
www.verivizyon.com/sqlkitabi adresinden faydalanabilirsiniz.
Bilgisayar ortamında veri saklamak
için kullanılan yapılardan en büyüğüne
dosya dendiğini biliyorsunuzdur. İlişkisel
veritabanları, veritabanı denilen büyük
dosyalardan oluşur. Veritabanı, içerisinde
tabloları barındıran bir dosyadır. Her bir
tablo, belli yapıya uygun verileri saklamak üzere tasarlanır. Tablolar, satırlardan
ve sütunlardan oluşur.
Bu bölümde, bu yapıları yakından
tanıyacağız.
Günlük Hayatta
İlişkisel Veritabanı
Bir çoğumuzun başına gelmiştir. Arkadaşlara, eşe dosta bir çok kitap, kaset, CD
veririz ve... Gidiş o gidiş! Böyle bir sorunla
nasıl başa çıkarız? Bu konuda bir proje
12
BYTE
Veritabanı Programlama 1
geliştirelim:
Öncelikle elimizdeki bütün Kitaplarımızın bir listesini yapalım. Ama bunu
yaparken, her bir kitaba numara vermeyi
ihmal etmeyelim. Çünkü elimizde aynı
kitaptan iki adet olabilir. Bunlardan
biri eski, öteki de yeni kitap olabilir. Bu
durumda bu iki kitaptan hangisini kime
verdiğimizi nasıl ayırt edeceğiz?
Daha sonra kitaplarımızı şu şekilde bir
listeye yazalım:
Listenin her bir sütununda sırasıyla şu
bilgiler yer alsın:
En başa Kitap No’nu, sonra Kitap Adı’nı ardından
ISBN numarası’nı sonra Sayfa Sayısı’nı, Özeti’ni
yazalım ve listeyi dolduralım.
Kitap No: Her bir kitaba verdiğimiz
numara
Kitap Ad: Her bir kitabın adı
ISBN Numarası: Her bir kitabın arkasında yer alan Uluslararası Standart Kitap
Numarası
Sayfa Sayısı: Kitabın kaç sayfa olduğu
Özeti: Kitabın bir özet açıklaması
Amacımız, kime hangi kitabı verdiğimizi
bilmek. O halde Kitap listesine ek olarak
şimdi bir de ödünç listesi yapalım:
Bu listede de, ödünç no, kitap no, ödünç alan,
verme tarihi, verme süresi, geri geldi mi şeklinde
bir liste daha yapalım.
Kütüphanemizden verdiğimiz her bir
kitabı bu listeye işlersek, hangi kitabımızın kimde kaldığını, süresi sonunda getirilip getirilmediğini kolayca takip edebiliriz. Buradaki Geri geldi mi hanesine gelen
her kitap için bir işaret koyabiliriz ya da
imza attırabiliriz.
Bu projeyi, bilgisayar ortamında
yapmak, kağıt üstünde yapmaktan çok
daha kolay olacaktır. Bu projede yer alan
listelerin karşılığı veritabanında tablolardır. Hayatta bir çok şeyi listelerle çözeriz.
Her bir listeye karşılık, veritabanı mantığında bir tablo gelir.
Temel Kavramlar
Veriler fiziksel hafızada Veri Dosyaları(DataFiles) halinde saklanır. Dosya,
bilgisayarların bilgileri birbirinden ayırarak saklamak için kullandığı temel bilgi
depolama yapısıdır. Bir dosyada, bir çok
veri yer alabilir.
Bir kütüphane otomasyonunu ele
alacak olursak, kitap ile ilgili bilgiler,
ödünç verilenler, kütüphaneden kitap
alma hakları olan üyeler, CD ve kasetler
ile ilgili bilgiler aynı veri dosyasında ama
farklı tablolar içerisinde yer alabilir.
Tablolar:
Bir tablo yani günlük hayattaki ‘liste’ kavramı, satırlardan ve sütunlardan oluşur.
Mesela Kitap listemizi(yani Kitap tablomuzu) ele alacak olursak, her bir satırda
bir kitaba ait bilgiler yer almaktadır.
Alan(Field), yapılandırılmış bilginin
her bir kısmını saklamak üzere yapılan
tanımlamadır.
Her bir alan, yapılandırılmış verinin bir
birimini tutmak üzere tanımlanır. Her bir
sütunun adı ile birlikte diğer bilgilerinin(en fazla kaç birimlik bilgi bu hücrede
saklanabilecek, ne tür bilgi saklanacak
vs.) ortaya koyduğu tanıma alan denir.
Alan, her bir sütun için tanımlayıcı bilgileri tutan
yapıdır.
Satır (Row): Bir tabloda yer alan her bir
kayıt bir satıra karşılık gelir. Örneğin Kitap
tablosunda her bir satırda farklı bir kitap
hakkındaki bilgi yer almaktadır.
Sütun (Column): Tablolar dikey sütunların yan yana gelmesiyle meydana gelmiştir. İlk sütunda kitap numaraları, ikinci
sütunda kitap isimleri, üçüncü sütunda,
ISBN numaraları yer almaktadır.
Kayıt (Record): Yapılandırılmış verilerden
Veritabanı Programlama 1
BYTE
13
her birine bir kayıt denir. Yani, alan bilgileri ile birlikte her bir satır bir kayıttır. Bir
kitap bilgisini ele alacak olursak,
Kayıt, alan tanımlamaları ile birlikte bir satırda yer
alan bilgilere denir.
Bu bir kayıttır. Kayıt ile satır arasındaki
temel fark, kayıt ile kastedilen yapının
sütunlar hakkındaki bilgileri de içermesidir.
Veri Tipi (Data Type): Bilgisayar, kayıtları
yapısal olarak tutarken, onların yapıları
hakkında fikir sahibi olabilmek için bazı
özelliklerinin önceden tanımlanması
gerekir. Örneğin, kitap numarası alanının
mutlaka bir tam sayı olacağını, Kitap
adının harf ya da rakamlardan oluşacağını anlatmamız gerekir. Bir veritabanı
oluşturulurken, her bir alanın tipinin
ne olacağı tanımlanmak zorundadır. Bir
alana tamsayı mı yoksa harf mi; tarih mi
yoksa ondalıklı bir sayı mı geleceği ancak
tanımlandıktan sonra kayıt girilebilir.
Ayrıca, “bir alanın uzunluğu ne kadar
olacak, harf girilebiliyorsa en fazla kaç
harf girilebilecek?”, “rakam ise en fazla
kaç basamaklı olabilir?” türünden soruları yanıtlamak için de yine VTYS bir alan
için veri tipi belirlememizi ister. Bir alan
için hangi tip seçeneklerimizin olduğunu
ilerleyen kısımlarda öğreneceğiz.
Zorlayıcı (Constraint): Herhangi bir
alan için girilebilecek verileri kısıtlayıcı
14
BYTE
Veritabanı Programlama 1
kurallara Zorlayıcılar denir. Kullanıcı, zorlayıcının istediği şekilde veri girmezse,
VTYS hata verir. Böylelikle veritabanına
kullanıcının keyfi değerler girmesi
önlenmiş olur. Örneğin, kitap listemizde
yer almayan bir kitabı ödünç vermeye
kalktığımızda hata verecek bir kısıtlama
tanımlayabiliriz.
Anahtar (Key): Anahtar bir veya birden
fazla alanın bir satır için niteleyici olarak
girilmesi için tanımlanan özel bir çeşit
zorlayıcıdır. Tekrarlamayacak bir anahtar
alan tanımlandığında, Bu anahtar alana
birincil anahtar alan denir. Primary Key,
Unique Key, Foreign Key gibi türevleri
vardır.
İlişkisel Veritabanı
Yönetim Sistemleri:
Veritabanı Yönetim sistemlerinden günümüzde kullanımı en yaygın olanı İlişkisel
Veritabanıdır. Hal böyle olunca da en
yaygın veritabanı yönetim sistemleri,
İlişkisel Veritabanı Yönetim Sistemleri’(RDBMS)dir. İlişkisel veritabanının en
önemli yanı, tablolardan oluşmasıdır.
Daha önemli yanı da bu tabloların bir biri
ile ilişkilerinin olmasıdır. Böyle olmasaydı
durup dururken bu VTYS’ler için ‘ilişkisel’
demezdik.
Bir veritabanında ilişkiden söz edebilmek için en az iki tablonun yer alması gerekir ve bu iki tablodaki verilerin bir biri ile bir
şekilde ilişkilendiriliyor olması gerekir. Yine
bir önceki örnek olaya dönecek olursak,
Kitap listesi ile ödünçler listesi arasında
Değişken İsimlendirme Kuralları
SQL’de tablo adları, alan(field) , veritabanı dosyası,
indeks vb. isimler değişken isimleridir. Genel geçer
değişken isimlendirme kurallarına burada da dikkat
etmek, sağlıklı uygulamalar meydana getirebilmek
için çok önemlidir. Bundan dolayı bu kurallara
burada yer verdik. Genel kanı bu türden bir kaygının
yersiz olduğu yönünde olsa da bazen oldukça kritik
hatalar ortaya çıkabilmektedir.
1. Değişken isimleri, harf ile başlamak zorundadır.
2. Değişken isimleri, harf, rakamlar ve ‘_’ dan oluşmak zorundadır.
3. Değişken isimlerinde Türkçe’de ki noktalı harfler
(İ,ı,Ğ,ğ,Ü,ü,Ş,ş,Ç,ç,Ö,ö,) yer alamaz.
4. Ayrılmış kelimeler değişken adı olamazlar (select,
like, not, or, delete, update vs.)
5. SQL büyük-küçük harf duyarlı değildir.
Değişken isimlendirme
notasyonları:
1.Deve notasyonu: degiskenAdi şeklinde yazılır.
2.Alt çizgi notasyonu: degisken_adi şeklinde
yazılır.
Veritabanı programlamada, büyük-küçük
harf duyarlılığı olmadığından genellikle alt çizgi
notasyonu kullanılır ve değişken adları küçük harf
olarak verilir. Ancak bu bir kural olmayıp sadece
okunurluğu artırmak için programcıların bir çoğu
tarafından tercih edilen bir yoldur.
NULL mu, boşluk mu?
Bir kayıt için, alanlardan biri hiç girilmediği için boş
olabilir veya bilgisayardaki space tuşunun karşılığı
ASCII değeri girilmiş olabilir. Space(ASCII-32 karakteri) tuşuna basılarak elde edilmiş boşluk ile daha
hiçbir bilgi girilmemiş olan boşluk bilgisayar dilinde
birbirinden farklıdır. Daha önce hiçbir şey girilmemiş
alan için NULL terimi kullanılır.
6. Değişken isimlerinde boşluk yer alamaz.
bir ilişki vardır. Çünkü Kitap listemizde
olmayan bir kitap bizde yoktur ve ödünç
veremeyiz. Haliyle de mantık olarak bu
türden bir ödünç bilgisi ödünç listemizde
yer alamamalıdır.
Olaya tersten bakacak olursak, geri
dönmeyen bir kitap hakkındaki detayları
öğrenmek istediğimizde ödünç listesindeki
kitap numarasını alırız. Daha sonra aynı
numaraya karşılık gelen kitabı, Kitap tablosundaki satırı buluruz. Bu satırdaki bilgiler
bize kitap hakkındaki tüm detayları verir.
Kitap tablosundaki kitapNo alanı aday
anahtar(indeks)’tir. Odunc tablosundaki
KitapNo alanı, ‘yabancı anahtar’ (foreign
key) alandır, çünkü Kitap tablosundaki bir
kaydı sembolize etmektedir.
Tüm bunların ardından VTYS’leri hakkında özet olarak diyebiliriz ki;
Bir İlişkisel Veritabanı Yönetim Sistemi
tablolar üstünde şu üç işlevi yerine getirmek zorundadır.
Veritabanı Programlama 1
BYTE
15
Birinci tabloda yer alan bir kayda karşılık, ikinci
tabloda bir veya daha çok kayıt yer alabilir. Ancak
İkinci tablodaki bir kitap numarasına karşılık birinci
tabloda sadece bir tek kayıt vardır. Bu ilişkiye bire
sonsuz bir ilişki denir. Birinci tablodaki her bir tekil
kaydı sembolize eden kitapNo için aday anahtar,
ikinci tabloda, ödünç verilen herhangi bir kitap
hakkındaki detayları görmek için 1. tabloya geçmemizi sağlayan kitapNo’na ise yabancı anahtar(foreign key) denir.
Kitaplar listesi üstünde bir seçme işlemi. Sayfa sayısı 200’den fazla olan kitapları seçiyoruz.
16
BYTE
Veritabanı Programlama 1
1. Seçme: Herhangi bir tabloda (listede)
yer alan tüm bilgileri gösterebilmelidir.
Örneğin, Kitap tablosunun bir dökümünü
verebilmelidir. Ya da kitap listesinden bazı
kitapların bilgilerini getirip diğer bir kısmını
getirmeyebilmelidir.
2. İzdüşürme: Herhangi bir tablodan
sadece belli sütunların yer aldığı seçme
işlevlerini yerine getirebilmelidir. Örneğin,
canı isteyen bir kullanıcı kitabın sadece
adını ve kaç sayfa olduğunu seçebilmelidir.
3. Birleştirme: Birden fazla tabloda yer
alan bilgileri, yeri geldiğinde tek bir tabloymuş gibi sunabilmelidir. Örneğin, ödünç
alınıp da geri getirilmeyen kitabın adlarını
ve kimler tarafından alındığını bir tek tabloymuş gibi gösterebilmelidir.
VTYS bu 3 temel işlevi yerine getirmelidir. Bunlardan üçünü, ikisini veya birini aynı
anda yerine getirmek durumunda kalabiliriz. Örneğin, sayfa sayısı 200’den büyük
kitapların sadece adını görmek istersek,
hem iz düşürme hem de seçme işlemine
ihtiyaç duyarız.
Veriler ve depolanma şekilleri farklı
olabilir. Önemli olan, VTYS’nin SQL ile
yönetilebilir olmasıdır. Böylelikle, verilerin
bilgisayarda fiziksel olarak ne şekilde depolandığı, kullanıcı bilmek zorunda kalmaz.
Yani, kullanıcı temel veri saklama işlem ve
yöntemlerinden izole edilmiş olur. Kullanıcının verileri etkili olarak kullanması için
bilmesi gereken tek şey SQL olmalıdır.
Verilerle ilgili yapılan işlemler iki ayrı
Kitaplar listesi üstünde bir iz düşürme işlemi Kitapların kitap No’nu, Adını ve sayfa sayısını alıyoruz.
Diğer sütunları almıyoruz.
grupta incelenir. Birincisi, veri tanımlama
işlemleridir. Bu grupta yapılan işlemler
daha çok verinin saklandığı ortama dair
işlemlerdir. Doğrudan verinin kendisi ile
ilgilenmek yerine, tablonun hangi alanlardan oluşacağı, hangi alana hangi aralıkta
veri girileceği vb. gibi işlemler bu gruptadır.
Veri işleme işlemleri ise verinin saklandığı ortam ile hiçbir ilgisi olmayan işlemlerdir. Bir tablonun içindeki tüm kayıtlar
silinse bile sonuçta tablo var olacaktır.
Çünkü bir tablonun silinmesi DDL’in görevidir.
SQL komutlarının bu şekilde gruplandırılmasının nedeni, SQL’den ziyade, veri
yönetimi konusundaki mantıktan kaynaklanmaktadır. Böylelikle işlemler daha anlaşılır bir hal almaktadır. Verinin kılıfı ile ilgili
işlemler ve verinin kendisi ile ilgili işlemler...
Sizce bir kitabın adının değiştirilmesi
Veritabanı Programlama 1
BYTE
17
hangi gruba girer? Peki ödünç verme süresinin 15 günden fazla olamaması? Ya kitap
fiyatlarının da saklanacağı bir sütunu Kitap
tablosuna ekleme işlemi? İpucu: ilk işlem
DDL ile yapılmaz. Diğerlerinin ikisi aynı
gruptan işlemlerdir.
2. Bölüm
SQL Veri Tanımlama Dili
(Data Definition Language)
SQL’i yeterince bilmiyorsanız, bu bölümden önce 3.Bölümü okumanız ve örnekleri bir veritabanı üstünde yapmanız
önerilir. Bundan sonra, bu bölümü kavramanız kolaylaşacaktır. Ancak bir proje
geliştirirken öncelikle veriyi tanımlamak
gerekir. Bu nedenle bu bölüme öncelik
verilmiştir.
Veri tanımlama dili, verinin ne
olduğundan ziyade verinin tipi ile ilgili
tanımlamaları yapmak için kullanılır. “Bir
veritabanında hangi tablolar yer alacak,
bu tablolarda hangi alanlar yer alacak
ve alanların türleri ne olacak, indeks ya
da anahtar olacak mı?” bunların hepsi
DDL ile belirlenir, değiştirilir veya olan
bir tanımlamadan vazgeçilip tanımlama
silinebilir.
Veritabanı üstünde herhangi bir
DİKKAT:
Bazı VTYS’lerde her bir SQL cümleciğinin
sonuna ‘;’ konulması istenir. Bu tür VTYS’lerde,
cümleciğin nerede bittiğini takip etmek kullanıcıya bırakılmıştır. Öte yandan bazı VTYS’lerde
bir SQL cümleciğinin bittiğini belirtmek için
cümle sonuna ‘;’ koymaya gerek yoktur. Bunu
VTYS’nin kendisi de algılayabilmektedir. Ancak
‘;’ konulmasının çoğu VTYS’de sorun çıkarmadığı
bir gerçektir. SYBASE’de ve ORACLE’da cümlelerin sonuna ; konulması gerekirken, Microsoft
tabanlı sistemlerde bu türden bir zorunluluk
bulunmamaktadır.
20
BYTE
Veritabanı Programlama 1
tanımlamada bulunulacaksa, bu tanımlama CREATE deyimi ile oluşturulur.
DROP deyimi ile de tanımlamadan vazgeçilip silinir. ALTER deyimi ise bir tanımlama üstünde değişiklik için kullanılır.
Bu bölümde ve takip eden bölümlerde, örneklerden hemen sonra ‘>>’
konulduktan sonra bir mesaja yer verilmiştir. Bu mesaj SQL ifadesinin sonucunda ne olduğunu göstermektedir.
UYARI:
Bu komutu, MS Access üstünde çalıştıramazsınız. Ancak MS SQLServer, Sybase gibi büyük ve
orta ölçekli veritabanlarında kullanılabilir.
Temel Veri Tipleri:
SQL’de yeni bir veri tipi tanımlayamayız.
Sadece var olan veri tiplerini kullanabiliriz. Burada hemen her yerde kullanılan
ortak veri tiplerine bir göz atacağız. Diğer
veri tipleri her bir VTYS’ye özel olarak
değişebileceğinden VTYS ile birlikte ele
alınması daha uygundur.
Bazı VTYS’leri kullanıcının veri tipi
tanımlamasına olanak sağlar ancak bu
SQL’in sunduğu bir özellik olmayıp VTYS
tarafından sağlanan bir özelliktir.
Veritabanı:
Veritabanı, içerisinde tabloları barındıran
veritabanı mimarisinin en büyük ögesidir.
Bir veritabanı şu şekilde açılır:
CREATE DATABASE database_name
DİKKAT:
TEMEL VERİ TİPLERİ
ANSI-SQL içerisinde metin olan değerler (CHAR,VARCHAR,MEMO,DATE) tek tırnak içerisine
alınarak yazılır. RAKAMSAL değerler ise olduğu
gibi yazılır.
Örnek:
WHERE tarih=‘20.01.2003’
(metin)
SET kitapNo=20
(sayı)
INTEGER(boyut): Tam Sayı
INT(boyut): Tam Sayı
SMALLINT(boyut): Küçük Tam Sayı
TINNYINT(boyut): Nümerik tam boyut:Sayının
en fazla kaç basamaklı olacağı belirtilir.
DECIMAL(boyut,d): Ondalık
FLOAT(boyut,d): Kesirli Sayı
boyut: Fazla kaç basamak tam kısım olacağı
belirtilir.
d: Ondalıklı basamak sayısını anlatmak için
kullanılır.
CHAR (boyut): Daha çok uzunluğu sabit(telefon numarası gibi) karakter verileri için
kullanılır.
VARCHAR (boyut): Değişken boyutta metin
alan belirlemek için kullanılır.
boyut: Bu alanda en fazla kaç karakter yer
alacağını belirtir.
DATETIME: Tarih
LOGICAL(BIT): BIT,true/false veya yes/no alan
diye de geçmektedir. En az yer kaplayan veri
tipidir. 1 ve 0 olmak üzere iki değer alabilir.
Örnek-1:
CREATE DATABASE dbKutuphane;
Ve şu şekilde silinir:
DROP DATABASE database_name
Örnek-2:
DROP DATABASE dbKutuphane
Tablolar:
Tablo Oluşturma
CREATE TABLE tablo_adi
(kolon_adi1 veri_tipi[NOT NULL][,
kolon_adi2 veri_tipi[NOT NULL],.......])
ile yeni bir tablo oluşturulur.
Örnek-3:
CREATE TABLE Kitap(
kitapNo INTEGER NOT NULL CONSTRAINT cnsKitapNo PRIMARY KEY,
kitapAdi VARCHAR(63) NOT NULL,
ISBNNo VARCHAR(15),
Turu VARCHAR(20),
sayfaSayisi INTEGER,
kitapOzeti VARCHAR(255)
)
ile örneğimizdeki tabloyu oluşturabiliriz.
>> OLUŞTURMA İŞLEMİ BAŞARI İLE
YAPILDI
Veritabanı Programlama 1
BYTE
21
Kısıtlar (Constraint) Oluşturma:
Kısıtlayıcılar, tabloların oluşturulması sırasında tabloların bir parçası olarak tanılanır. MS Access ve SQLServer’de kullanılır.
Aşağıdaki işlevleri yerine getirebilirler:
1. INDEX gibi, birincil anahtar alan tanımlayabilirler (PRIMARY KEY): Bu durumda
standart olarak Clustred Index gibi davranırlar.(bkz. INDEX’ler)
2. INDEX gibi tekil alan belirleyebilirler.
(UNIQUE KEY)
3. Tablo oluşturma esnasında da yapılabilen, (NOT NULL) alan belirleyebilirler
4. Yabancı Anahtar belirleyebilirler.(FOREIGN KEY)
Primary Key: Bir tablodaki, her bir satırın yerine vekil olabilecek bir anahtar
veridir. Tekrarlamaması gerekir. Standart
olarak bir tabloda verilerin, fiziksel hafıza
üstünde de hangi alana göre dizileceğini
de primary key belirler. Bu, bazen bir tek
alan olabileceği gibi, bazen birden fazla
alan da birleşerek bir birincil anahtar
oluşturabilir.
Unique Key: Unique Key olarak tanımlanan alan için bir değer sadece bir kere
girilebilir. Bir başka satıra daha aynı
verinin girilmesine izin verilmez. Primary
Key’den farklı olarak Unique Key, NULL
değerini alabilir.
22
BYTE
Veritabanı Programlama 1
Foreign Key: Bir tabloya girilebilecek
değerleri başka bir tablonun bir belli
alanında yer alabilecek veri grubu ile
sınırlandırmaya ve en önemlisi de ilişkilendirmeye yarar.
Örneğin, olmayan bir kitabın ödünç
tablosuna eklenememesi ve ödünç tablosuna eklene bir kitabın numarası aracılığıyla detay bilgilerine erişilmesi. Burada
Kitap.KitapNo birinicil anahtar alan;
Odunc.kitapNo ise yabancı anahtardır.
Genel yapısı şu şekildedir:
CONSTRAINT constraint_name PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES foreign_table [(foreign_field1[,foreign_field2,..])]
Tablolar oluşturulurken, bazı alanlara
girilebilecek değerler ile ilgili kısıtlar
koymak zorunda kalabiliriz. Böylesi
durumlarda CONSTRAINT’ler kullanılır.
CONSTRAINT’ler aslında INDEX’lere
benzerler ama indekslerden farklı olarak
bir tek tablo üstünde etkili olmayabilirler. Özellikle yabancı anahtar zorlayıcısı
ilişkisel veri girişi için oldukça etkili bir
zorlayıcıdır. Ancak bir Foreign Key tanımı
yapabilmek için, FOREIGN KEY yabancı
anahtarının asıl tablosunda birincil anahtar olması gerekir.
Örnek-4:
CREATE TABLE Kitap (
kitapNo int NOT NULL ,
kitapAdi varchar63),
ISBNNo varchar (15),
sayfaSayisi int ,
kitapOzeti varchar (255)
)
>>OLUŞTURULMA İŞLEMİ BAŞARI İLE
YAPILDI
veya
CREATE TABLE odunc(
oduncNo int NOT NULL ,
kitapNo int NOT NULL ,
uyeNo int NOT NULL ,
vermeTarihi datetime NOT NULL,
vermeSuresi int NOT NULL ,
geldiMi bit
)
>>OLUŞTURULMA İŞLEMİ BAŞARI İLE
YAPILDI
Tablo silme:
Bir tabloyu kullanmaktan vazgeçersek:
DROP TABLE tablo_adi
>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI
İLE YAPILDI
Örnek-6:
Bu sütunun boş geçilememesini istese
idik:
ALTER TABLE Kitap ALTER COLUMN kitapBedeli INTEGER NOT NULL;
>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI
İLE YAPILDI
dememiz gerekirdi.
Örnek-7:
Bu sütunu silmek için,
ALTER TABLE Kitap DROP COLUMN kitapBedeli;
>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI
İLE YAPILDI
İndeksler:
Tabloda Değişiklik Yapma:
Bir tabloya sütun eklemek veya tablodan
sütun silmek için ALTER TABLE deyimi
kullanılır.
ALTER TABLE tablo_adi
{ADD{COLUMN alan alan_tipi [(boyut)][NOT NULL][CONSTRAINT indeks]
CONSTRAINT coklu_indeks}
DROP{COLUMN alan | CONSTRAINT
constraint_adi}
}
Örnek-5:
Kitap tablosuna kitap bedeli adında
yeni bir tamsayı sütun ekleyelim.
ALTER TABLE Kitap ADD kitapBedeli
INTEGER;
Kütüphanemizdeki Kitapın raflardaki dizilişlerini ele alalım. Bir kitap aradığımızda,
Kitapımız bir kurala göre dizilmiyorsa, her
bir kitaba teker teker bakmamız gerekir. Kitapı raflara alfabetik dizersek, her
bir kitabı teker teker gözden geçirmek
zorunda kalmayız. Aradığımız kitap ile
bakmakta olduğumuz kitabın isimlerini
karşılaştırır, sağa ya da sola yönelip aramaya devam ederiz. Aynı şekilde yazarlarına ya da kütüphane numarasına göre
sıralanmış birer liste olursa, bu kriterlere
göre de aradığımız kitabı kolayca bulabiliriz.
Veritabanlarında indeks oluşturarak,
verileri veritabanındaki kayıtlı oldukları
sıradan başka bir sırada gösterebiliriz.
Veritabanı Programlama 1
BYTE
23
Temelde İndekslerin ilişkisel veritabanında şu üç işlevi vardır:
1. Tekil İndeksler, veri ilişkilerini ve veri
bütünlüğünü sağlayan birincil anahtar
alanlar oluşturmada kullanılır.
2. İndeks olan alanın değerine göre bir
kaydın kayıtlar arasındaki sırasını gösterirler.
3. Sorguların neticelenme sürelerini
kısaltırlar.
CREATE [UNIQUE] INDEX index_adi
ON tablo_adi(kolon_adi1[,kolon_adi2,...][DESC])
Örnek-8:
CREATE UNIQUE INDEX indKitapNo
ON Kitap(kitapNo)
>>OLUŞTURMA İŞLEMİ BAŞARI İLE
YAPILDI
Dedikten sonra, iki farklı kitaba aynı
kitap no’sunu vermek mümkün olamayacaktır. Bunu bizim yerimize VTYS denetleyecektir.
Bir indeksi silmek için:
DROP INDEX tablo_adi.indeks_adi
deyimi kullanılır. Bir tablo ya da indeks
alan silindiğinde, indeks de otomatik
olarak silinmiş olur.
Örnek-9:
Şimdi, oluşturduğumuz indeksi geri
silelim
DROP INDEX Kitap.indKitapNo
>>NESNE SİLİNME İŞLEMİ BAŞARI İLE
24
BYTE
Veritabanı Programlama 1
YAPILDI
SQL Server’de Index sırasına göre verilerin fiziksel olarak yeniden sıralanmasını
istersek,
CREATE UNIQUE CLUSTERED INDEX
indKitapNo
ON kitaplar(kitapNo)
diyebiliriz. Ancak bir tablo üstünde
sadece bir adet Clustred Index oluşturulabilir.(Bir çokluk kümesini fiziksel olarak
aynı anda kaç farklı şekilde sıralayabiliriz?Elbette bir kere...)
Sizin kullanmakta olduğunuz VTYS
de bu konuda ek işlevler sunuyor olabilir.
Yardım menüsünden bu konuda bilgi
alabilirsiniz.
Tablolar birbiri ile ilişkilendirilirken,
index alanlar üstünden ilişki kurulursa
daha hızlı sorgular elde edilir.
View’ler
Bazen, tabloları olduklarından farklı
gösterecek filtrelere ihtiyaç duyarız.
Bu türden işlevler için ANSI SQL VIEW
kullanmayı önerir. VIEW’ler, saklanmış
sorgulardan ibarettir. Aslında tablo gibi
kullanılsa da böyle bir tablo halihazırda
yoktur.
VIEW’ler şu görevler için kullanılır:
*Kullanıcıların bazı kritik tabloların
sadece belli sütunlarını veya satırlarını
görmesi istendiğinde,
*Kullanıcıların, çeşitli birim dönüşümlerinden geçmiş değerler görmeleri
gerektiğinde,
*Halihazırdaki tablolarda var olan
verilerin başka bir tablo formatında
DİKKAT:
1.MSAccess’de VIEW oluşturulamaz. SQLServer, SyBase, Oracle gibi orta ve büyük ölçekli
VTYS’lerde oluşturulabilir.
2.Bu kısımdaki SELECT komutunu anlamak için,
öncelikle 3.Ünite’ye göz atmanız önerilir.
sunulması gerektiğinde
*Çok kompleks sorguları basitleştirmek için
Örneğin Kitap tablomuzdaki sadece
Bilgi Teknolojileri türündeki kitabımızın
yer alacağı bir VIEW şu şekilde oluşturulabilir:
CREATE VIEW view_adi [(kolon1,
kolon2...)] AS
SELECT tablo1.kolon_adi_1
FROM tablo_adi;
Örnek-10
CREATE VIEW vwBTKitapi(kitapNo,KitapAdi,ISBNNo, SayfaSayisi,Ozeti)
AS
SELECT kitapNo,KitapAdi,ISBNNo,
SayfaSayisi,Ozeti
FROM Kitap
WHERE turu = ‘Bilgi Teknolojileri’;
>>NESNE OLUŞTURMA İŞLEMİ BAŞARI
İLE YAPILDI
Veya şu şekilde de oluşturabiliriz:
Örnek-11
CREATE VIEW vwBTKitaplari AS
SELECT *
FROM kitap
WHERE kitapNo > 5
>>NESNE OLUŞTURMA İŞLEMİ BAŞARI
İLE YAPILDI
View’ler, tablolar üstünde yapılan bir
çok işlemi destekler.
Örnek:Bir önceki View üstünde
seçme işlemi yapalım: Seçme işlemi de
ne demek diyorsanız, Lütfen öncelikle
3.bölüme bir göz gezdiriniz...
Örnek-12
SELECT *
FROM vwBTKitapi
Bir view, başka bir View’in alanlarına
referans içerebilir. Ya da bir view bir tablo
ile ilişkisel sorguya girebilir.
View’ler şu şekilde silinir:
DROP VIEW view_adi;
Örnek-13:
DROP VIEW vwBTKitapi;
>>NESNE SİLİNME İŞLEMİ BAŞARI İLE
YAPILDI
DİKKAT:
View’ler sonuç itibarı ile gerçek anlamdaki
tablolar değildir. Bundan dolayı View’ler
üstünde ekleme veya güncelleme yaparken
çeşitli kısıtlamalar vardır.
Veritabanı Tasarımı:
İyi bir veritabanı tasarımı yapabilmek
için yeteneğinizi, bilginizi ve tecrübenizi
kullanmanız gerekir. Bu iş için evrensel
geçerliliği olan metotlar maalesef yoktur.
Veritabanı Programlama 1
BYTE
25
Öncelikle, ilişkisel veritabanının tanımını
çok iyi bilmek gerekir. Bununla ilgili
olarak, 5 Normalizasyon kuralını okumanızda fayda vardır. Ancak 5N, tasarım
aşamasında size yol göstermek yerine
hangi şartlara uygun tasarım yapmanız
gerektiğini anlatır. Bazen, bu kurallardan
vazgeçmek durumunda kalabilirsiniz
ancak, veritabanında saklanacak verilerin
hacmi arttıkça bu kuralların daha sıkı
uygulanmasında fayda vardır.
1.Nesneleri Tanımlayın:
Herhangi bir proje önünüzde konduğunda öncelikle nesneleri tanımlayın.
Nesne, çeşitli özellikleri bulunan bir
varlıktır. Başlangıçta özellikleri ile ilgilenmeyeceğiz.
Örnek-14:
Birkaç örnek proje için nesneleri verecek olursak,
Kütüphane sistemi: Kitap, üyeler, türler,
ödünç hareketleri
E-ticaret sistemi: Ürünler, müşteriler,
siparişler,teslimat, fatura bilgileri,üreticiler,tedarikçiler,dağıtıcılar...
Futbol Ligi: Takımlar, sahalar, oyuncular,
fikstür, hakemler, antrenörler
Okul Sistemi: Öğrenciler, öğretmenler,
dersler, derslikler
Sözlük: kelimeler, anlamlar, diller
26
BYTE
Veritabanı Programlama 1
İPUCU
Tablolara isim verirken mümkünse tekil isimler
kullanın. Böyle yaparsanız hem daha anlaşılır
bir tasarım yapmış olursunuz hem de daha
sonra kodlama aşamasında karışıklığın önüne
geçmiş olursunuz.
Örneğin içinde Kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça
mantıklıdır.
2.Her nesne için bir tablo oluşturun:
Her bir nesne için bir tablo oluşturun
ve her bir tabloya içereceği veriyi en iyi
anlatan bir isim verin. Tablo oluşturma
işini, bir kağıt üstünde sembolik olarak
gösterebilirsiniz veya doğrudan MS
Access, SQL Server, MySQL,Oracle ...gibi
kullanmakta olduğunuz VTYS üstünden
de oluşturabilirsiniz. Ama tüm proje
bitinceye kadar bu tablolar üstünde
muhtemel değişiklikler olacaktır.
3.Her bir tablo için bir anahtar alan
seçin:
Veritabanındaki herhangi bir veriye
erişmeden önce tabloya erişilir. Bir veritabanında en çok muhatap olunan nesne
grubu genellikle tablolardır. Buraya kadar
hangi tabloları oluşturacağımıza karar
verdik. Her bir tablonun içinde hangi
bilgileri saklayacağımızı kabaca biliyoruz. Bu aşamada, tabloda yer alacak her
bir kaydı bir diğerinden ayırabilecek bir
sütuna ihtiyaç duyarız. Örneğin bir kitabı
seçmek istediğimizde, bu kitabın hangi
kitap olacağını öyle bir anlatabilmeliyiz
ki, başka hiçbir kitap ile karışmamalı.
Bunu yapmanın tek yolu, bir alanı birincil
anahtar alan olarak belirlemektir.
Anahtar alan seçerken, sizi kısıtlamadığı sürece, doğal alanlar seçmeye dikkat
etmenizde fayda vardır. Örneğin araçlar
ile ilgili bir tablo yaparken, plakalarını
anahtar alan olarak belirleyebilirsiniz.
Çünkü her bir plakadan bir tek araç trafiğe çıkabilir. Bu bizi kısıtlamaz. Öğrenci
tablosu için, öğrenci numarası doğal bir
anahtar alandır çünkü aynı okulda, aynı
numaradan bir öğrencinin daha bulunması söz konusu değildir.
Kitap tablosu için ISBN numarasını
anahtar alan olarak tanımlayabilirsiniz
ama, elinizde aynı kitaptan iki adet olduğunda, ISBN numarası sizi kısıtlayacaktır.
elinizde iki adet ‘Önümüzdeki Yol’ kitabı
varsa, her iki kitabın da ISBN numarası
aynıdır.Kitapdan biri eski biri yeni olabilir.Bu bir kargaşaya neden olabilir. Çünkü
eski kitabı kime, yeni kitabı kime verdiğinizin takibini ISBN numarası ile mümkün
değildir. Ancak bir E-Ticaret sitesi tasarlarken, stoktaki tüm kitaplar birbiri ile
eşdeğer olacağından ya da öyle olduğu
varsayıldığından ISBN numarası birincil
anahtar alan olabilir. Bu durumda, adet
diye bir niteliğin aynı tabloda yer alması
gerekecektir.
4.Nesnelerin gerekli her bir özelliği
için tabloya bir sütun ekleyin:
Tablo adlarını tamamladıktan ve anahtar
adlarını belirledikten sonra, tablolarınıza
İPUCU
1.En başa birincil anahtar olarak belirlediğiniz
alanı eklemek bir kural değildir, ancak tablonuzun anlaşılırlığı ve göze hoş görünmesi
açısından tercih etmenizin yararınıza olacak bir
tekniktir.
2. Genellikle,yapay birincil anahtar alanlar
tablo adı ile başlar ve sonunda ID vardır. ogrenci
tablosu için ogrenciID gibi.
sıradan adını veren nesnenin her bir özelliği için bir alan(sütun) ekleyin.
Örneğin, kitap için;
Kitap no, ISBN no, kitap adı, yazarı,
türü, sayfa sayısı, özeti, fiyatı, baskı yılı...
Üye için;
UyeNo, adı, soyadı, e-mail adresi, ev
telefonu, cep telefonu, iş telefonu....
Bu noktada, sizden istenen proje ile
ilgili basılı formlar vs. varsa, bir göz atmanız hangi özelliklerin yer alması gerektiği
konusunda karar vermenize yardımcı
olacaktır.
5.Tekrarlayan nesne özellikleri için ek
tablolar oluşturun
Aklınızda hep şu olmalı: veri tekrarı
olacak mı? Veri tekrarı olacaksa bir yerlerde hata yapıyorsunuzdur. Elinizdeki
tablonun en az bir tabloya daha ayrılması
gerekiyor demektir.
Şunu da unutmayın, her projeye
uyacak evrensel bir veritabanı tasarım
tekniği yoktur. Yani her şey sizin belli
kurallar etrafında ne kadar teferruatlı
Veritabanı Programlama 1
BYTE
27
düşünebildiğinize bağlıdır.
Örneğimizde, her bir kitap için tür
belirledik ama, bir kitap hem kişisel
gelişim kategorisine hem de hikaye
kategorisine girebilir. Ya da e-ticaret sisteminde bir ürünün birden fazla reyonda
yer alması gerekli olabilir. Veya bir kitap
birden fazla kişi tarafından yazılmış olabilir..
Bir kitap için birden fazla türü kaydedebilmeyi ele alalım:
Bu türden bir sorunu çözmek için ilk
akla gelen şey, Kitap için, 2.Tür,3.Tür diye
iki alan daha eklemek. Ama çoğu kitap
bir tek türdendir ve bu kitap için 2 alan
hep boş kalacaktır. Öte yandan, 4 türe
birden giren bir kitap olduğunda 4.tür
bilgisini nereye yazacağız? Aynı alana
mı? Ya da dört adet bölüm mü açacağız?
Bunlar, veritabanı tasarımının doğasına
terstir.
2.Çözüm yolu ise, bir kitabı iki kere
kaydedip, birincisini, ‘Kişisel Gelişim’
türü olarak; ikincisini de ‘Hikaye’ olarak
girmek. Ancak bu durumda da diğer bilgiler tekrar edecektir. Ya da bir süre sonra,
kitap hakkında girilen bilgilerin yanlış
olduğunu fark ettiniz. Hangi kaydı güncelleyeceksiniz? Ya birini düzeltip birini
unutursanız? Sonuçta veri tekrarı ve veri
bütünlüğünün bozulması söz konusudur.
Bu da yine ilişkisel veritabanı tasarımının
doğasına terstir.
Bu durumda, türler diye bir yeni tablo
oluşturup, bir de kitap_turler diye 2.
tablo’ yu oluşturduktan sonra bu türden
bilgileri burada tutmak gerekecektir.
28
BYTE
Veritabanı Programlama 1
Böylelikle, hiçbir türde yer almayan kitaptan 10 ayrı türde yer alan kitaba kadar
bütün olasılıklar için bir çözüm geliştirmiş oluruz.
6.Anahtar Alana Bağlı Olmayan
Alanları Belirleyin
İlişkisel veritabanında, tablodan herhangi
bir tek kayda erişmek için mutlaka bir
farklı özellik sağlanmalıdır ve bu özellik
de anahtar alan tarafından sağlanır.
Ancak bazen, anahtar alan ile aynı satırda
yer aldığı halde, anahtar alan ile birebir
ilişkisi olmayan bir alan yer alabilir. Bu
türden alanları elimine edip ayrı tablolara
ayırmak gerekir.
Örneğin, ödünç tablosunu ele alacak
olursak, ödünç verdiğimiz her kitabı
ödünç alanın adresini de bilmek istediğimizde, bunu ödünç tablosuna yazamayız.
Çünkü ödünç tablosunun birincil anahtar
alanı oduncNo’dur ve bu alan, ödünç
verme işlemi ile ilgilidir. Oysa ödünç
alanın adresi, ödünç alan kişinin kendisine bağlı bir özelliktir. Bu kişinin her
aldığı kitap için adresini tekrar yazmaya
gerek yoktur. Aynı şekilde otomasyon
içerisinde başka yerlerde de bu kişinin
adres bilgilerine muhtemelen ihtiyaç
duyulabilir çünkü adres, üyenin bir özelliğidir.
Ödünç verilen kitabın adresini bilmek
istediğimizde, üyeler adında bir tablo
daha açıp, burada herkesin adresini
tutmak durumundayız demektir. Ödünç
tablosunun ise, oduncAlan bilgisi olarak,
Üyeler tablosunun birincil anahtar ala-
nına bir bağlantı (yabancı anahtar) içermesi daha doğru olur.
7.Tablolar arasındaki ilişkileri
tanımlayın.
Her biri bir nesneye dair özellikleri barındıran tabloların tümünü göz önüne alın ve
birbirleri ile olan ilişkilerini tanımlamaya
çalışın. Örneğin kitabı ödünç veririz. Bu
durumda, ödünç tablosu ile Kitap tablosu
ilişkili olacaktır. Kitap üyelere ödünç verilir.
Bu durumda, ödünç ile üyeler arasında da
bir ilişki vardır. Türler ile Kitap arasında bir
ilişki vardır, bir kitabın en az bir türe dahil
olması gerekir.
Örnek-15:
Bizim projemizdeki nesneler (tablolar)
arasında aşağıdaki ilişkiler yer almaktadır:
Kitap.kitapNo (1)----(∞) odunc.kitapNo
Bu kısımda anlatılanlar doğrultusunda örnek projemizin
SQL Server 2000 üstünde görünen diyagramı. İlişkili
her iki tablo bir birincil alan ve bir yabancı anahtar alan
üstünden birbirine bağlanır. Aynı diyagramın bir benzerini MS Access ile de gerçekleştirebiliriz.
İPUCU
Farklı tablolardaki iki alan aynı veriyi tutuyorsa,
iki alana da aynı adı vermek, karışıklığa yol
açabilir gibi görünse de aslında daha düzgün
bir yapı ortaya çıkar. KitapNo alanı, Kitap tablosunda da ödünç tablosunda da kitap numarası
tutmaktadır. Bu alanlardan birine kitapNo
diğerine oduncGidenKitapNo demek, kafa
karışıklığına neden olabilir. En mantıklısı her
ikisine de kitapNo demektir.
Veritabanı Normalizasyonu
Aslında
Uyeler.uyeNo(1)---(∞)odunc.uyeNo
ilişkisel veri tabanı tasarımından ziyade, bir
tablo
Tur.turNo(1)---(∞)Kitap_tur.turNo
içerisinde yer alacak kaydın nelerden oluşmasına
Kitap.kitapNo(1)---(∞)Kitap_tur.kitapNo
karar vermeye yarayan normalizasyon kuralları
başlı
Yazar.yazarNo(1)--başına bir işlemdir. Sonuç
(∞)kitap_
itibari ile veritabanı
yazar.yazarNo
tasarım aşamasında gerekli bir işlem olduğundan bu
bölüme
İki tablo
almayıarasında
uygun bulduk.
ilişkiyi
Genelsağlayan
kabul görmüş
alanların
5 normalizasyon
aynı addakuralı
olması
vardır.zorunluluk
Burada her birdeğildir.
kuralı
Teorik
tam olarak
olarak
anlatmak
tabloları
mümkün
istediğiniz
değildir. Ancak
herhangi
bu
iki kurllar,
alanları
ilişkisel
üstünden
veritabanının
birleştirebilirsiniz.
tanımı ile birlikte ortaya
Ancak,
konmuştur.
türler
Özettablosundaki
olarak fikri vermesitürNo
açısından
ileyer
üyeler
tablosundaki
verilmiştir.
uyeNo alanını birleştirdiğinizde
1. Normalizasyon
hiçbir işinize
Kuralı:
yaramayacak anlamsız
birBirilişki
satırdaki
ortaya
bir alan
koymuş
yalnızca bir
olursunuz.
tek bilgi içerebilir.
Örneğin
Bu ilişkileri
kitap tablosunda,
analiz ederken,
birden fazla yazarı
her bir
olan
alanın
kitap için
hangi
yazar1,
tablo
yazar2,için
yazar3
birincil
diye alanlar
anahtar
açsaydık,
alan,
bu kurala
hangi
uymamış
tabloolurduk.
için yabancı
Böyle bir durumda,
anahtar
olduğunu
ayrıca yazarlar
nottablosu
etmeniz,
da oluşturarak
daha kuralı
sonra
çiğnefizikselmemiş
olarak
oluruz.
veritabanını tasarlarken işinizi
kolaylaştıracaktır.
Genellikle yapılanHatta
hata: bu bilgileri bir
şema Verileri
üstünde
virgülde
veyagösterebilirsiniz.
bir başka karakter ile ayırıp
İşte bir
çokaynı
VTYS
alanatarafından
girmek. Daha sonra
sağlanan
programörnek
içerisindebir
şema:
Veritabanı Programlama 1
BYTE
29
split ile bu değerleri ayırmak. Ancak bu ilişkisel veritabanının doğasına terstir.
2. Normalizasyon Kuralı:
Bir tablo için, anahtar olmayan her alan, birincil anahtar
olarak tanımlı tüm alanlara bağlı olmak zorundadır.
Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese
idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi
olacaktı ve oduncNo’na bağlı bir nitelik olmayacaktı.
Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak
sorunu çözdük.
Ya da anahtar alanın birden fazla alandan oluştuğu
tablolarda, anahtar alanlardan sadece birine bağlı veriler,
tabloda yer almamalı, ayrı bir tabloya taşınmalıdır.
Bunun tersi de geçerlidir. Yani iki ya da daha fazla
tablonun birincil anahtarı aynı olamaz. Şayet böyle ise,
bu iki tablo tek tabloya indirilmelidir.
3. Normalizasyon Kuralı:
Bir tablo için, anahtarı olmayan bir alan, anahtarı olmayan başka hiç bir alana bağlı olamaz. Örneğin, kitaplarımız için cilt tipi adında bir alan ekleyip burada da karton
kapak için K, deri cilt için D, spiral cilt için S yazsaydık,
bu kodlama, kitap tablosunun birincil anahtarı olan
kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü
bu kodlama bir başka anahtarı olmayan alana bağlıdır.
Bunun sonucunda da veritabanımızda, karşılığı olmayan
bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu
olarak tutan alan aslında cilt tipi açıklaması olan başka
bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.
Bu durumda, ciltSekli adında bir tablo açmamız
gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli
olmalıdır. Ancak bundan sonra, kitaplar tablosunda
ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları
yazabiliriz.
4. Normalizasyon Kuralı:
Birincil anahtar alanlar ile anahtarı olmayan alanlar
arasında, birden fazla bağımsız bire-çok ilişkisine izin
verilmez. Örneğin, tablomuzda yer alan bir kitap hem
hikaye kitabı hem de kişisel gelişim kitabı olabilir. (Bu
durumda kitabın adı, kişisel gelişim hikayeleri olurdu her
halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz?
4.Normal formu sağlamak için, her bağımsız bire çok
ilişki için ayrı bir tablo oluşturmak gerekir.
Bu örnekte, türler diye bir tablo açmamız gerekiyor.
Daha sonra kitapTurleri diye bir başka tablo daha açmamız gerekiyor. ‘Kişisel Gelişim Hikayeleri’ adlı kitap için,
öncelikle kitap numarası, Hikaye bölümünün kodunun
yer aldığı bir satır; ardından da yine kitap numarası,
ardından da kişisel gelişim türünün kodunun aldığı yeni
bir satır daha eklemek gerekir.
5. Normalizasyon Kuralı:
Tekrarlamaları ortadan kaldırmak için her bir tabloyu
mümkün olduğunca küçük parçalara bölmek gerekir.
Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar
kapsamında olmayan tekrarlamalar da 5 normalizasyon
kuralı ile giderilir.
Örneğin, kitaplarımız için bir edinme şekli bilgisi
girilecek sütun eklemek isteyelim: Bu bölüme girilebilecek bilgiler bellidir: Bağış veya satın alma.
Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle,
kullanıcıların bu alan gelişi güzel bilgiler girmesini
engellemiş oluruz. Bu da sorgulama esnasında verilerimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda,
tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler
başka bir tabloya taşınmış olur. Bu tablo için, veritabanı
programlamada ‘look-up table’ terimi kullanılır.
Ancak, veritabanı normalizasyon kuralları, bir
ilişkisel veritabanının tasarlanma aşamalarını değil de
ilişkisel veritabanında yer alacak kayıtların ilişkisel veritabanı ile uyumlu olup olmadığını denetlemeye yöneliktir.
Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi
barındırmalıdır.
* Veri tekrarı yapılmamalıdır.
* Boş yer mümkün olduğunca az olmalıdır.
* Veri bütünlüğü sağlanmalıdır.
* Veriler, aralarında bir ilişki tanımlanmaya müsait
olmalıdır.
3. Bölüm
SQL Veri İşleme Dili
(Data Maniplation Language)
Veri İşleme Dili, verinin şablonu üstünde
değişiklik yapmaz. Sadece var olan tablolardaki bilgileri uygun şekilde raporlamak
(SELECT), yeni kayıtlar eklemek (INSERT),
kayıtlar üstünde güncelleme yapmak(UPDATE) ve kayıtları silmek (DELETE) için
kullanılır. Veri İşleme Dili sadece veritabanında kaydı tutulan bilgilerle ilgilenir. Bu
bilgilerin nasıl tutulduğu ile ilgilenmez.
1.RESULTSET(RECORDSET, DATASET)
VTYS’de bir sorgu çalıştırıldığında, tablo
mantığında bir sonuç üretir. Bu sonuca
ResultSet denir. Bir ResultSet, birden fazla
tablodan kayıt içerebilir. Bir ResultSet’in
içeriği, veritabanı programları geliştirilirken, ADO nesnelerinden RecordSet içerisine aktarılır ve veriler program içerisinde
bu nesne aracılığıyla yönetilir. ADO.NET
içerisinde ise ResultSet’ler (birden fazla
recultSet) ADO.NET içerisinde ise DataSet
denilen nesnelere aktarılabilir . RecordSet
ve DataSet konusu, sonraki kitapçıkta
teferruatlı olarak incelenecektir.
2.SELECT
SELECT [DISTINCT] { * | alan_adi1, alan_
adi2, ....., [SUM(alan_adi)], [AVG(alan_
adi)], [MAX(alan_adi)], [MIN(alan_adi)],
[COUNT( * | alan_adi)]}
FROM tablo_adi1, [tablo_adi2], ...
LEFT [OUTER] JOIN | RIGHT [OUTER]
JOIN |INNER JOIN
GROUP BY {alan_adi}
HAVING koşul
32
BYTE
Veritabanı Programlama 1
ORDER BY sıralamanın yapılacağı
alan_adi1 ASC|DESC, alan_adi2 ASC|DESC , ....
WHERE koşullar
[alan_adi IN (veri kümesi) | (SELECT
işlemi)]
[alan_adi BETWEEN değer1 AND
değer2]
[alan_adi LIKE ‘%ifade ? _* %’]
[tablo_adi1.alan_adi = tablo_adi2.alan_adi]
[alan_adi matematiksel operatör
ANY|SOME|ALL (SELECT işlemi)]
[EXISTS|NOT EXISTS (SELECT işlemi)];
En Basit SELECT
En basit olarak bir tablodaki tüm
kayıtları seçmek için,
SELECT alan1[,alan2, alan3,..... | *]
FROM tablo_adi;
Yapısı kullanılır.
Örnek-1:
Kitaplar tablosundaki tüm kayıtları
seçelim:
SELECT * FROM Kitap
Koşula bağlı SELECT ve WHERE Yapısı:
Bazı koşullara uyan bilgileri almamız
gerekebilir. Bu durumda WHERE cümleciğini takip eden kısımda, bu şartı belirtebiliriz.
SELECT alan1[,alan2, alan3,..... | *]
FROM tablo_adi
WHERE şart1[AND şart2[OR şart3[NOT
şart4]]];
Örnek-2:
KitapNo 12’den büyük olan kitapları
seçelim:
SELECT * FROM Kitap
WHERE kitapNo>12;
Matematiksel
Karşılaştırma İşaretleri:
Koşullarda, verilerin durum Matematiksel
Karşılaştırma İşaretleri kullanılarak ifade edilir.
Bu işaretler Şunlardır:
=: Eşittir
>: Büyüktür
Örnek-3:
Sayfa sayısı 200’den fazla olan ve kitap
numarası da 12’den büyük olan kitapların
listesi:
SELECT * FROM Kitap
WHERE kitapNo > 12 AND sayfaSayisi
> 200;
<: Küçüktür
>=: Büyüktür veya Eşittir(Büyük-Eşit)
<=: Küçüktür Veya Eşittir(Küçük-Eşit)
<>: Eşit Değildir
!=: Eşit Değildir
Mantıksal İşaretler
Birden fazla koşula göre seçme işlemi
yapılırken, AND, OR, NOT mantıksal operatörlerinden faydalanılır.
Mantıksal fonksiyon tabloları şu şekildedir:
AND İŞARETİ:Şartlardan her ikisini de
sağlayan kayıtları seçmek için kullanılır..
OR İŞARETİ: Şartlardan en az birinin
sağlanması halinde, kayıtlar seçilir.
NOT İŞARETİ: Şartı sağlamayan kayıtları bulmak için kullanılır.
Bu fonksiyonların dışında XOR ve
XNOR işlemleri de bazı VTY’leri tarafından desteklenmektedir. Bu iki komutla
ilgili bir işleme ihtiyaç duyarsanız başka
LIKE: bkz Like
kaynaklardan detaylı olarak bakmanızda
yarar olabilir. Ancak bu iki komut pek
nadir kullanılmaktadır.
X(Şart)NOT X(Şartın tersi)
0
1(Seçilir)
1
0(Seçilmez)
Veritabanı Programlama 1
BYTE
33
kitapNo
kitapAdi
ISBNNo
sayfaSayisi
kitapOzeti
1
Visual Basic.NET
0-672-32203-X
204
Visual Basic.NET konusunda temel geçis bilgilerini
içeren bir kitap.
2
Telkin ve Hipnoz ile
Ögrenme Teknikleri
975-6700-15-7
274
Öğrenme ve sınav konusunda hipnoz tekniği
3
Yatırım Planı Yapma
975-381-263-9
74
Yatırım yapmak için nereden başlamalı, neler
yapmalı...
4
İş Başında Duygusal Zeka
975-434-224-5
447
Duygusal zekanın iş ve yaşam konusundaki etkileri
5
Hayat Yolunda Zorluklarla
Mücadele
975-362-135-3
119
Hayat yolunda zorluklarla mücadele
6
İş Hayatında Motivasyon
975-8243-98-5
140
İş başında motivasyon
7
İş hayatımdan Kesitler ve
Gençlere Tavsiyeler
975-8243-92-6
214
Üzeyir Garih’in hayatından kesitler
8
PERL ile CGI
975-316-609-5
247
Perl CGI konusunda kaynak kitap
9
Front Page 2000
975-316-565-7
349
Front Page
10
Bir Çift Yürek
975-7800-25-2
225
Aborijin aileleri, Avustralya’nın yerlileri
11
Marka Yaratmanın 22
Kuralı
975-8378-30-9
164
Marka olmaya karar verenlerin okuması gereken
bir kitap
12
Simyacı
975-510-682-0
166
Simyacı
13
Bellek Geliştirme
975-503-069-7
224
Bellek geliştirme konusunda bir kurs kitabı
14
Müşteri Bağlantıları
975-316-622-2
292
Bir Harvard işletme kitabı
15
İnsan Yönetme Sanatı
975-8243-00-4
144
Yöneticiler için iyi bir kitap
16
Önümüzdeki Yol
975-509-170-X
328
BT dünyasinin geleceğine dair Bill Gates’in görüşleri
34
BYTE
Veritabanı Programlama 1
X(1.Şart)Y(2.Şart)
SONUÇ(X AND Y)
0
0
0(Seçilmez)
1
0
0(Seçilmez)
0
1
0(Seçilmez)
1
1
1(Seçilir)
X(1.Şart)Y(2.Şart)SONUÇ(X OR Y)
0
0
0(Seçilmez)
1
0
1(Seçilir)
0
1
1(Seçilir)
1
1
1(Seçilir)
Örnek-4:
Kitap No 12’den büyük olan veya,
sayfa sayısı 200’den büyük olan veya adı
‘Visual Basic.NET’ olan kitapların listesi:
SELECT * FROM Kitap
WHERE kitapNo > 12
AND sayfaSayisi > 200
OR KitapAdi=’Visual Basic.NET’;
Örnek-5:
Kitap No 12’den büyük olan veya,
sayfa sayısı 200’den büyük olan veya adı
‘Visual Basic.NET’ olan ama ISBN NO
‘975-316-622-2’ olmayan kitapların listesi:
SELECT * FROM Kitap
WHERE (kitapNo > 12 AND sayfaSayisi
> 200 OR KitapAdi=’Visual Basic.NET’)
AND ISBNNO <> ‘975-316-622-2’;
Sadece Belli Alanları Seçmek:
Bir sorguda illa da tabloda yer alan tüm
sütunları görmek zorunda olmayabiliriz.
Sadece ihtiyacımız olan alalardaki verileri
seçmek için, SELECT’ten sonra bu alanların adını araya virgül koyarak yazarsak,
sadece bu alandaki veriler gelir.
Örnek-6:
select uyeNo,adi,soyadi
FROM uye;
Veritabanı Programlama 1
BYTE
35
DISTINCT:
Birden fazla tekrarlayan kayıt döndüren SELECT işlemlerinde, her bir kaydın
tekil olarak yer almasını istiyorsak DISTINCT deyimi kullanılır.
İPUCU
Birden fazla şartın yer aldığı koşullarda parantez kullanılarak şartların sırası değiştirilebilir,
mantıksal operatörlerin etkileyeceği şartlar
sınırlandırılabilir.şekilde tercih etmek okunurluğu artıracaktır.
Örnek-8:
1,5 ve 6 nolu kitapların ödünç hareketlerini görmek için
SELECT *
FROM odunc
WHERE kitapNo=1 OR kitapNo=5 OR
kitapNo=6;
Yerine
SELECT *
FROM odunc
WHERE kitapNo IN(1,5,6);
Kullanımı daha kolaydır.
Örnek-7:
Üye tablosundaki isimlerin tekil bir listesini almak
isteyelim:
SELECT DISTINCT adi
FROM uye;
Üyelerimizden adaş olanların adı sadece bir kez gelecektir.
IN
Bir veri kümesini belli bir alanında
içeren kayıtları bulmak istediğimizde, IN
sözcüğü kullanılırız:
36
BYTE
Veritabanı Programlama 1
İç içe SELECT yapısı:
Bazen bir sorgunun içinde başka bir
sorgu yer alabilir.
DİKKAT:
İç içe SELECT özelliği bazı küçük ve
orta ölçekli VTYS’lerde desteklenmemektedir.
Örnek-9:
Dışarıdaki kitaplarımızı bulmak istersek:
Dışarıdaki kitapların numaralarını
ödünç tablosundan çekecek bir sorgu
yazalım(GeldiMi=0 olan kitaplar dışarıda
olan kitaplar. Birileri tarafından ödünç
alınmış ve henüz iade edilmemiş demektir.)
SELECT kitapNo FROM odunc WHERE
geldiMi=0
Ve bu sorguyu, kitaplar tablosundan,
karşılık gelen kitap numaralarını seçecek
şekilde IN() komutuna girdi ürettirelim:
SELECT *
FROM Kitap
WHERE kitapNo IN(
SELECT kitapNo FROM
odunc WHERE geldiMi=0
);
Örnek-10:
Aynı yöntem ile içerdeki kitaplarımızı
bulalım:
İçerideki kitaplar, dışarıda olmayan
kitaplardır. Bundan dolayı da yukarıda içerde kullandığımız sorgu aynen
duracak ama bu sefer kitap numaraları
bunlara eşit olmayan kitapların listesini
bulacağız.
SELECT *
FROM Kitap
WHERE kitapNo NOT IN(
SELECT kitapNo FROM odunc WHERE
geldiMi=0
);
ANY, SOME, ALL
Bazı iç içe sorgularda, SOME, ANY
veya ALL deyimi ile dışarıdaki SELECT
ifadesinin seçeceği kayıtlar karşılaştırma
kriterine göre kullanılabilir.
ANY veya SOME :Dışarıdaki SELECT
ifadesi sonucunda çıkacak kayıtlar,
içerideki SELECT ifadesi ile seçilen alan
değerlerinden en az birine göre kıyası
sağlıyorsa ( küçük,büyük, eşit, büyük eşit,
küçük eşit) seçilir.
Örnek-11:
3,5 ve 11 nolu kitapların herhangi
birinden kalın olan ve kitap no da 11’den
büyük olan kitapların listesini bulalım:
SELECT kitapNo,kitapAdi,sayfaSayisi
FROM Kitap
WHERE sayfaSayisi > ANY( SELECT
sayfaSayisi
FROM Kitap
WHERE kitapNo IN(3,5,11)
)
AND kitapNo>11
ALL: Dışarıdaki SELECT ifadesi sonucunda
çıkacak kayıtlar, içerideki SELECT ifadesi
Veritabanı Programlama 1
BYTE
37
ile seçilen alan değerlerin tümüne göre
kıyası sağlıyorsa ( küçük,büyük, eşit,
büyük eşit, küçük eşit) seçilir.
Örnek-12:
3,5 ve 11 nolu kitapların tamamından
kalın olan ve kitap no da 11’den büyük
olan kitapların listesini bulalım:
SELECT kitapNo,kitapAdi,sayfaSayisi
FROM Kitap
WHERE sayfaSayisi > ALL( SELECT
sayfaSayisi
FROM Kitap
WHERE kitapNo IN(3,5,11)
)
AND kitapNo>11
EXISTS, NOT EXISTS
EXISTS kullanıldığında, dışarıdaki sorguda, bir veya daha fazla kayıt dönerse,
dışarıdaki sorgu çalıştırılır. Hiç kayıt
dönmezse, dışarıdaki sorgu çalıştırılmaz.
NOT EXISTS ise içerideki sorgunun sonucunda sıfır kayıt dönüyorsa, dışarıdaki
sorgunun çalıştırılması için kullanılır.
DİKKAT:
EXISTS yapılarda, içteki select ifadesinin
38
BYTE
Veritabanı Programlama 1
SELECT *
İle başladığına dikkat edin. Bu hep bu
şekilde kullanılır.
Örnek-13:
5 no’lu kitap ödünç verildi ise kitap
no’sunun ve kitap bilgilerini seçelim:
SELECT kitapNo,kitapAdi
FROM Kitap
WHERE EXISTS(SELECT * FROM odunc
WHERE kitapNo=5)
AND kitapNo=5;
UNION (BİRLEŞTİRME)
UNION komutu, iki SELECT sorgusunun
sonucunu veya iki tabloyu tek bir sonuç
halinde alabilmek için kullanılır. 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.
Genel kullanımı şu şekildedir:
1.SELECT İFADESİ....
UNION
2.SELECT İFADESİ....
Örnek-14:
Sisteme kayıtlı kişilerin bir kısmını
(kitap yazarları ve üye isimlerini) bir tek
listede görmek isteyelim:
Yazarlardan ilk 2’sini seçelim:
SELECT adi,soyadi
FROM yazar
WHERE yazarNo < 3;
Üyelerin ilk 2’sini seçelim:
SELECT adi,soyadi
FROM uye
WHERE uyeNo < 3;
SELECT adi,soyadi
FROM yazar
WHERE yazarNo < 3
UNION
SELECT adi,soyadi
FROM uye
WHERE uyeNo < 3;
KESİŞİM BULMA:
İki tablonun veya iki SELECT sorgusunun sonucunun kesişimini bulmaya yarar.
Yani her iki tabloda da bulunan kayıtları
bulma işine KESİŞİM denir.
Birkaç yolu vardır:
Örnek-15:
Hangi yazar isimleri aynı anda üye adı
olarak da yer almaktadır?
Şu isimler Yazarlar tablosunda bulunmaktadır:
Şu isimler üyeler tablosunda bulunmaktadır:
SELECT adi
FROM yazar
WHERE EXISTS
(SELECT *
FROM uye
WHERE yazar.adi = uye.adi)
EXCEPT (FARK BULMA)
İki SELECT sorgusu sonucu veya iki
tablo arasındaki farkı bulmaya denir. Bu
işlem için de bir çok yöntem kullanılabilir.
NOT IN, NOT EXISTS bunlardan ikisidir.
Veritabanı Programlama 1
BYTE
39
Örnek-16:
Hangi kitaplar ödünç verilmemiştir?
SELECT *
FROM Kitap
WHERE kitapNo NOT IN(
SELECT kitapNo FROM odunc WHERE
geldiMi=0
);
Örnek-17:
Şu ifade tüm kayıtları seçecektir.
SELECT *
FROM Kitap
WHERE 1=1;
Çünkü 1=1 doğru bir ifadedir.
Örnek-18:
Şu ifade, hiç bir kaydı seçemez.
SELECT *
FROM Kitap
WHERE 1=0;
Çünkü 1=0 doğru değildir.
Bu iki durum, veritabanı programları
yazarken özellikle arama-sorgulama
ekranlarında çok büyük dertlerden kurtarabilir.
BETWEN.... AND....
Bir Aralık içersinde sorgulama yapmak
için BETWEEN altSinir AND ustSinir şeklindeki yapı kullanılır.
Örnek-19:
Sayfa Sayısı, 300 ile 500 arasındaki
Kitapların listesini almak istediğimizde,
SELECT *
FROM Kitap
WHERE sayfaSayisi>300 AND sayfaSayisi < 500;
Yerine
SELECT *
FROM Kitap
WHERE sayfaSayisi BETWEEN 300 AND
500; de diyebiliriz.
İPUCU
Bir WHERE cümleciğinden sonra gelen şart
ne olursa olsun, doğru olduğu sürece SELECT
kısmından sonra gelen kısım çalıştırılır. Bu
şartta yer alan değerlerden bir tarafın illa da
alanlardan biri olması gerekmez. İkisi de sabit
birer değer olabilir. 1=1 doğru bir şarttır. Bunun
tersi de geçerlidir. Yanlış bir şart varsa, SELECT’i
takip eden alanlar asla seçilmez 1=0 yanlış bir
şarttır.
40
BYTE
Veritabanı Programlama 1
Karakter Karşılaştırmaları:
Karakter ifadelerin (tarih ve metin tipli
veriler) karşılaştırması da rakamlarla
aynıdır.
Örnek-20:
Adı Önümüzdeki Yol olan kitabı
seçmek için
SELECT *
FROM Kitap
WHERE kitapAdi= ‘Önümüzdeki Yol’;
Kullanılabilir.
Ancak karakter ifadelerin nasıl yazıldığı ve içeriğinin tam olarak ne olduğunu
birebir kestirmek zor olduğu için, bazen
seçimi genişletmek üzere = yerine LIKE
deyiminden de faydalanılır.
LIKE
Örnek-21:
Adı Önümüzdeki Yol olan kitabı LIKE
komutu ile seçmek için
SELECT *
FROM Kitap
WHERE kitapAdi LIKE ‘Önümüzdeki
Yol’;
Aslında bu yapının bir önceki örnekten bir farkı yok. Ancak takip eden örneklerde, LIKE2in avantajlarını öğreneceğiz.
Joker Karakterler:
Seçimi biraz genişletelim ve adında ‘yol’
geçen Kitapları listelemek istesek?Bu
durumda joker karakterleri kullanmamız
gerekecektir. ‘%’ ve ‘_’ veya ‘?’ karakterlerine joker karakterler denir.
Örnek-22:
Adında yol geçen kitapların bir listesini alalım:
Tüm kitapların listesini görmek için:
SELECT *
Joker Karakterler
%: Birden fazla harf veya rakamın yerini tutar.
*: Bazı sistemlerde, birden fazla harf ve rakam
yerini tutar.
_: Bir tek harf veya rakam yerini tutar (Bir çok
sistemde)
?: Bir tek harf veya rakam yerini tutar (Bazı
diğer sistemlerde)
[ABC]: Herhangi bir harf yerine gelebilecek
harfleri belirtir.(SQLServer,Sybase)
[^ABC]: Herhangi bir harf yerine gelemeyecek
harfleri belirtir.(SQL Server, Sybase)
FROM Kitap
WHERE kitapAdi LIKE ‘%Yol%’;
Örnek-23:
Adının ilk harfi ‘Y’ olan üyelerin listesi.
Tüm üyelerin listesini görmek için:
SELECT *
FROM uye
WHERE Adi LIKE ‘Y%’;
Örnek-24:
Adının Son harfi ‘R’ olan listesini
kitapların listesini alalım:
Veritabanı Programlama 1
BYTE
41
Tüm kitaplar için:
SELECT *
FROM Kitap
WHERE kitapAdi LIKE ‘%R’;
Örnek-25:
İkinci harfi ‘A’ olan Kitapların listesi:
SELECT *
FROM Kitap
WHERE kitapAdi LIKE ‘_A%’;
Şeklinde arama yapabiliriz.
Örnek-26:
İkinci harfi A, B, D veya C’den biri olan
Kitapların listesi
SELECT *
FROM Kitap
WHERE kitapAdi LIKE ‘_[AE]%’
Örnek-27:
İkinci harfi E, S, R, I ya da N den biri
olmayan kitaplarının listesi
SELECT *
42
BYTE
Veritabanı Programlama 1
DİKKAT:
Joker karakterler ‘=’ ile kullanılamaz. Sadece
LIKE ile kullanılabilir.
FROM Kitap
WHERE kitapAdi LIKE ‘_[^ESRIN]%’;
Null Karşılaştırma
Bazen bir alana değer girilmiş olup olmadığın karşılaştırmak zorunda kalabiliriz.
Örneğin, kitaplığımızda yer alan kitaptan
hangileri için yazar bilgileri girilmediğini
bilmek isteriz.
NULL için karşılaştırma yaparken, IS
NULL deyimi kullanılır. Boşluk olmayan
alanlar için karşılaştırma yaparken ise IS
NOT NULL deyimi kullanılır.
SELECT alanlar
FROM tablo_adi
WHERE alan_1 IS [NOT] NULL;
Örnek-28:
ISBN numarası olmayan kitapların
listesi:
SELECT *
FROM Kitap
WHERE ISBNNo IS NULL;
3.ORDER BY
SELECT işlemi ile elde edilen sonucun bir
alana göre sıralanmış olarak listelenmesini
isteyebiliriz. Bu durumda ORDER BY deyimi
kullanılır.
Genel Yapısı şu şekildedir:
SELECT alanlar
FROM tablo_adi
WHERE şartlar
ORDER BY sutun1 [DESC|ASC][,sutun2
[DESC|ASC],.....];
ASC bir alana göre ARTAN sıralatmak
için kullanılır. Aslında artan-azalan şartı
verilmediğinde de normalde artan sıralanır.
Ancak kayıtların azalan sırada sıralanması
isteniyorsa, mutlaka DESC kullanılmak
zorundadır.
Örnek-29:
Soyadında ‘e’ geçen yazarları alfabetik
sıralatalım; Öncelikle soyadlara göre sıralansın, soyadı aynı yazarlar için de ada bakılsın:
SELECT *
FROM yazar
WHERE soyadi LIKE ‘%e%’
SELECT *
FROM yazar
WHERE soyadi LIKE ‘%e%’
ORDER BY soyadi,adi
İPUCU
Sıralama yapılan sütunların mutlaka seçilen
sütunlar arasında yer almasına gerek yoktur.
Örnek-30:
Soyadını seçmeden de soyadına
göre sıralayabiliriz:
SELECT yazarNo,adi
FROM yazar
WHERE adi LIKE
‘%e%’
ORDER BY soyadi
DESC,adi
Veritabanı Programlama 1
BYTE
43
4.GROUP BY
Bazen verileri gruplandırarak işlem yapmak
zorunda kalabiliriz. Genellikle veriler gruplandığında her bir grup için şu işlemlerden
biri yapılmak isteniyor demektir; grup toplamı, grup ortalaması, grubun en düşüğü,
en fazlası.... Bu bölümde, kitap tablomuzun
biraz değişik bir hali üstünde çalışacağız.
Bu yapı, normalizasyon kurallarına uymaz,
ancak GRUPLAMA konusunu anlamak açısından oldukça yararlı bir yapıdır.
GRUPLAMALI işlemler için kitap tablosu
Bu türden işlemleri yapan fonksiyonlara
GRUPLAMALI FONKSİYONLAR (Aggregate
Functions) denir.
Gruplamalı Fonksiyonlar
(Aggregate Functions):
SUM(sutun_adi): İstenilen bir sütundaki
değerlerin toplamını verir. Sayı türü olan
veriler için geçerlidir.
Örnek-32:
Bir önceki örneği alana takma ad ile
yaparsak:
SELECT SUM(sayfaSayisi) as TOPLAM
FROM Kitap;
AVG(sutun_adi):İstenilen bir sütun için
ortalama değeri hesaplamada kullanılır.
Sayı türü veriler için geçerlidir.
Örnek-33:
Örnek-31:
Kitaplığımızda toplam kaç sayfa kitap
olduğunu bulmak istersek (bkz. karşıdaki
tablo):
SELECT SUM(sayfaSayisi)
FROM Kitap;
>>3611
Alana Takma Ad (Alias):
Bazı durumlarda, sorgu sonucunda yer
alan bir alanın adını farklı bir ad olarak
kullanmak isteyebiliriz. Bu tür durumlarda
alan adından sonra AS deyimi gelir ve
takma ad belirtilir.
44
BYTE
Veritabanı Programlama 1
Kitaplığımızdaki her bir kitap için ortalama sayfa sayısı (Aritmetik ortalama):
SELECT AVG(sayfaSayisi) AS ORTALAMA
FROM Kitap;
MAX(sutun_adi): Referans sütuna
göre en büyük değeri bulmada kullanılır.
BIT türden alanlarla birlikte kullanılmaz.
kitapNo
kitapAdi
ISBNNo
turu
sayfaSayisi
kitapOzeti
1
Visual Basic.NET
0-672-32203-X
Programlama
204
Visual Basic.NET
konusunda temel geçiş
bilgilerini içeren bir
kitap.
2
Telkin ve Hipnoz ile
Öğrenme Teknikleri
975-6700-15-7
Kişisel Gelişim
274
Ögrenme ve sınav
konusunda hipnoz
tekniği
3
Yatırım Planı Yapma
975-381-263-9
İş dünyası
74
Yatırım yapmak için
nereden başlamalı, neler
yapmalı...
4
İş Başında Duygusal Zeka
975-434-224-5
Kişisel Gelişim
447
Duygusal zekanın iş ve
yaşam konusundaki
etkileri
5
Hayat Yolunda
Zorluklarla Mücadele
975-362-135-3
Kişisel Gelişim
119
Hayat Yolunda Zorluklarla Mücadele
6
İş Hayatında Motivasyon
975-8243-98-5
İş dünyası
140
İş başında motivasyon
7
İş Hayatımdan Kesitler ve
Gençlere Tavsiyeler
975-8243-92-6
Kişisel Gelişim
214
Üzeyir Garih’in
hayatından kesitler
8
PERL ile CGI
975-316-609-5
Programlama
247
Perl CGI konusunda
kaynak kitap
9
Front Page 2000
975-316-565-7
Programlama
349
Front Page
10
Bir Çift yürek
975-7800-25-2
Hikaye
225
Aborijin aileleri,
Avustralya’nın yerlileri
11
Marka Yaratmanın 22
Kurali
975-8378-30-9
İş dünyası
164
Marka olmaya karar
verenlerin okuması
gereken bir kitap
12
Simyacı
975-510-682-0
Hikaye
166
Simyacı
13
Bellek Geliştirme
975-503-069-7
Kişisel Gelişim
224
Bellek geliştirme
konusunda bir kurs kitabı
14
Müşteri Bağlantıları
975-316-622-2
İş dünyası
292
Bir Harvard işletme
kitabı
15
İnsan Yönetme Sanatı
975-8243-00-4
İş dünyası
144
Yöneticiler için iyi bir
kitap
16
Önümüzdeki Yol
975-509-170-X
BT
328
BT dünyasının
geleceğine dair Bill
Gates’in görüşleri
Veritabanı Programlama 1
BYTE
45
Örnek-34:
Kitaplığımızdaki en kalın kitap:
SELECT MAX(SayfaSayisi) AS EnKalinKitap
FROM Kitap;
STDDEV(grup_adi): Grup standart
sapmasını bulur.
COUNT(*): Kayıtların tamamını
saymak için kullanılır. Sayı olmasına gerek
yoktur.
Örnek-36:
Kitaplığımızdaki Kitapın sayısı:
SELECT COUNT(*)
FROM Kitap;
>>16
MIN(sutun_adi): Referans sütuna
göre en küçük değeri bulmada kullanılır.
BIT türden alanlarla birlikte kullanılmaz.
Örnek-35:
Kitaplığımızdaki en ince kitap:
SELECT MIN(SayfaSayisi) AS EnInceKitap
FROM Kitap;
Pek kullanılmasa da şu iki fonksiyon
da gruplamalı fonksiyondur.
VARIANCE(sutun_adi): Grup varyansını bulur.
46
BYTE
Veritabanı Programlama 1
COUNT(sutun_adi): Referans sütuna
göre toplam kaç kayıt yer aldığını bulur.
İPUCU
COUNT(*) ile COUNT(sutun_1) arasındaki fark:
COUNT(*) tüm kayıtların sayısını verirken,
COUNT(sutun_1) sadece sutun_1 adlı alan için
NULL olmayan kayıtların sayısını verir.
Örnek-37:
Yazarlar tablosunda, tüm yazarların doğum tarihi henüz girilmemiştir.
Bu durumda iken, yazarların sayısını
COUNT(*) ve bir de COUNT(dogum)
olmak üzere iki farklı şekilde seçelim:
SELECT COUNT(*)
FROM yazar;
>> 20
SELECT COUNT(dogum)
FROM yazar;
>> 0
COUNT DISTINCT sutun_1: sutun_
1’de kaç farklı değer tekrarladığını sayar.
Örnek-38:
Kütüphanedeki üye sayısı:
SELECT COUNT(*)
FROM UYE
>>9
Kütüphanedeki üyelere ait farklı isim
sayısı:
SELECT COUNT(DISTINCT adi)
FROM uye;
>>6
Örnek-40:
Elimizdeki kitapları türlerine göre
grupladığımızda her bir türden toplam
kaç sayfa kitabımız var?
İPUCU
GROUP BY’ı ORDER BY ile işlev olarak karıştırmamak gerekir. GROUP BY verilerin gruplara
göre sıralanmış olmasından ziyade, gruplara
göre hesaplama yapılması ihtiyacı olduğunda
kullanılmalıdır. Sonuçların sıralaması ile ilgili
her şey için ORDER BY kullanmak gerekir.
Bu kısa örneklerden sonra, grupsal
fonksiyonların gruplar üstünde nasıl kullanıldığına yakında bakalım.
Örnek-39:
Elimizdeki Kitapları türüne göre gruplandırdığımızda, her bir grupta kaç kitap
yer alıyor?
SELECT turu,COUNT(*)
FROM Kitap
GROUP BY turu;
>>
SELECT turu,SUM(sayfaSayisi) AS
grupBasiToplamSayfa
FROM Kitap
GROUP BY turu;
Örnek-41:
Elimizdeki kitapları türlerine göre
grupladığımızda her bir tür için ortalama kitap sayfa adedini bulalım ama
sayfa sayısı 400’den fazla olan Kitapları
ve 75’den az olan Kitapları ortalamanın
dışında tutalım (Hesaba katmayalım).
Veritabanı Programlama 1
BYTE
47
“Her bir türden toplam kaç kitabın
var?”
Ve ekledi: “Bu arada, 2 kitaptan az olan
türleri saymayacaksın...”
İşte cevabı:
SELECT turu,COUNT(*)
FROM Kitap
GROUP BY turu
HAVING COUNT(*)>=2;
SELECT turu as TURLER, AVG(SayfaSayisi) AS grupOrtalamaSayfa
FROM Kitap
WHERE sayfaSayisi BETWEEN 75 AND
400
GROUP BY turu;
İPUCU
Kayıt filtrelemede kullanılacak şartlar arasında
gruplamalı Fonksiyonu kullanmayı gerektiren
bir şart varsa, HAVING deyimi ile belirtilir.
Örnek-42:
Bir arkadaşınız sizin kütüphanede
otomasyona geçtiğinizi gördü ve şöyle
bir soru yöneltti:
48
BYTE
Veritabanı Programlama 1
Örnek-43:
Aynı arkadaşınız abarttı ve şu soruyu
yöneltti:
Her bir türde toplam kaç sayfa kitabın
var?
Ve ekledi
Bu arada, kitap numarası 10’dan
küçük olan Kitapın muhtemelen eskidir,
sayma. Bir de Ortalaması 175 sayfayı
aşmayan türleri de görmek istemiyorum,
çünkü muhtemelen bu türlerde yeterince
kalın kitaplar yok.
En az sayfa kitap bulunan tür en altta
yer alacak şekilde liste verebilir misin?
Öncelikle şu ifadenin sonucuna bakalım:
SELECT turu,SUM(sayfaSayisi) sayfaSayisi
FROM Kitap
WHERE kitapNo>10
GROUP BY turu
SELECT turu,SUM(sayfaSayisi) sayfaSayisi
FROM Kitap
WHERE kitapNo>10
GROUP BY turu
HAVING AVG(sayfaSayisi)>175
ORDER BY SUM(sayfaSayisi) DESC;
HAVING ifadesinden sonra, hikaye
türü gelmemektedir. Çünkü grup ortalaması 166’dır ve bu da HAVING şartında
verilen değerin altındadır.
5.JOINING
Bu kısımda kullanılan tabloların ilişkisel
yapılarını anlamak için, bu sayfanın sol
altındaki diagrama bakabilirsiniz. İlişkisel
veritabanının en temelinde birden fazla
tablo üstünde birlikte işlem yapabilmek
yatar. Bu sayede verilerin tekrarlaması
önlenmiş olur ve sonuçta veri yönetimi
kolaylaşır.
Örneğin, Kitap tablomuzda, Kitapın
bir tekil numara ile listesini tutuyoruz ve
odunc listesinde de bu Kitapın kim tarafından alındığının, geri getirilip getirilmediğinin kaydını tutuyoruz.
Bazen, bu iki tablodaki bilgilere de bir
tek sorgu sonucu olarak ihtiyaç duyarız.
Örneğin elimizde öyle bir sonuç olmalıdır
ki, hangi kitabın kim tarafından ödünç
alındığını bir listede görmemiz gereksin.
Bu iki tablo birbirine, kitapNo alanı ile
bağlıdır. Çünkü, ödünç verilen bir kitap
hakkında detaylı bilgi edinmek istediğimizde, odunc listesinden kitap numarasını alırız, daha sonra Kitap tablosundan
aynı numarayı bulur ve karşılığındaki
kitap hakkındaki detayları görebiliriz.
İPUCU
Tabloların birbiri ile arasında bir ilişki tanımlanmadan ilişkisel sorgu yapılırsa, kartezyen
çarpımı bulunur. Bu, ‘1.Tablodaki her bir kayıt
ile 2. Tablodaki her bir kayıt ilişkilidir’ demektir
ve ilişkisel veritabanın doğasına terstir.
Veritabanı Programlama 1
BYTE
49
Örnek-44:
SELECT *
FROM Kitap, odunc;
Sorgusunun sonucunda, Kitap tablosunda 50, odunc tablosunda 100 kayıt
varsa, (50*100=5000) 5000 satırlık bir bu
iki tablo için kartezyen çarpım sonucu
bulunur.
Klasik Join
İki tabloyu birlikte sorgulamanın en kolay
yolu, asıl tablodaki birincil anahtar ile
ikinci tablodaki yabancı anahtarı birbirine eşitlemektir.
SELECT tablo1.alan1|tablo2.alan1[tablo1.alan2,...]
FROM tablo1, tablo2
WHERE tablo1.birincilAnahtar=Tablo2.yabanciAnahtar [AND diğer şartlar]
Örnek-45:
Şu anda dışarıda olan Kitapın listesini
alalım:
SELECT Kitap.*
FROM Kitap,odunc
WHERE Kitap.kitapNo=Odunc.kitapNo
AND odunc.geldiMi=0;
Tabloya Takma Ad (Alias)
Birden fazla tablo üstünde işlem yaparken, sık sık tablo isimleri kullanılır. Bu da
bir kelime kalabalığı olarak karşımıza
çıkar. Bunun önüne geçmek için tablola-
50
BYTE
Veritabanı Programlama 1
rın yerine takma ad verip o adları kullanabiliriz.
İPUCU
Takma adlar tabloların ismini kısaltmanın yanı
sıra başka işlerde de kullanılır. Genellikle tablolar için takma ad seçilirken kısa olması açısından 2 veya tek harf lakaplar tercih edilir.
Örnek-46:
Dışarıda olan Kitapların adlarını,hangi
tarihte alındığını ve kimde olduklarını
bulalım:
SELECT K.kitapAdi,O.vermeTarihi,u.Adi,U.Soyadi
FROM Kitap K, odunc O,Uye U
WHERE K.kitapNo = O.kitapNo AND
O.UyeNo=U.uyeNo AND O.geldiMi=0;
>>
Bir Tabloyu Kendisi İle İlişkilendirme
(Self-join)
Bir tabloyu kendisi ile ilişkilendirerek
sorgulamamız gerektiğinde aynı tabloya
farklı iki takma adı atayıp, farklı iki tablo
üstünde ilişkili sorgu yapıyormuş gibi
ilişkili sorgu yapılabilir. İyi tasarlanmış
bir veritabanında bu tür ilişki pek kullanılmaz.Genellikle verilerin doğruluğunu
(veya tutarsızlığını) test etmede kullanılır.
Örnek-47:
Kitap tablomuzda, bazı Kitapın adları
hatalı okunduğu için aynı ISBN numarası
ile farklı kitap adları girilmiş olup olmadığını test etmek ve sonucu görmek
istersek:
SELECT K1.KitapAdi,K1.ISBNNo,K2.kitapAdi,K2.ISBNNO
FROM Kitap K1, Kitap K2
WHERE K1.ISBNNo=K2.ISBNNo AND
K1.KitapAdi<>K2.KitapAdi;
>>0 kayıt seçildi.
Çünkü ISBN numaralarında bir hata
yok.
Left [Outer] Join
İki tablo arasında ilişkili sorgu yapılırken, LEFT OUTER
JOIN kullanıldığında, birinci tablodaki tüm kayıtlar
getirilir. 2. Tabloda
ise sadece ilişkiye
göre uygun kayıtlar
sağ tarafına eklenir.
Genel kullanımı,
...
FROM tablo1
LEFT JOIN tablo2
ON tablo1.alan1
karşılaştırma tablo2.alan2;
Şeklindedir.
Tüm üyelerin bir listesini, yanına da
ödünç aldıkları kitap varsa, kitap numarasını sıralayalım
SELECT uye.Adi,odunc.KitapNo
FROM uye LEFT JOIN odunc ON
odunc.uyeNo=uye.uyeNo
Right [Outer] Join
İki tablo arasında ilişkili sorgu yapılırken,
RIGHT OUTER JOIN kullanıldığında, ikinci
tablodaki tüm kayıtlar getirilir. 1. Tabloda
ise sadece ilişkiye göre uygun kayıtlar sağ
tarafına eklenir.
Genel kullanımı,
FROM tablo 1 RIGHT JOIN tablo 2
ON tablo1.alan1 karşılaştırma tablo2.alan2;
Şeklindedir.
Örnek-49:
Ödünç alınmış Kitaplardan dışarıda
olanların listesini bulunuz:
SELECT Kitap.kitapAdi
FROM Kitap
RIGHT JOIN odunc ON
odunc.KitapNo=Kitap.KitapNo
WHERE odunc.geldiMi=0;
Örnek-48:
Veritabanı Programlama 1
BYTE
51
[Inner] Join
INNER JOIN en çok kullanılan tablo birleştirme yöntemidir. İki tablo arasında
birleştirme yaparken, tablolardan her
ikisinde de yer alan değerler seçilir, tek
tabloda yer alan değerler seçilmez.
İPUCU
LEFT JOIN ve RIGHT JOIN, aslında birer OUTER
JOIN ifadeleridir. Bir çok sistem OUTER ifadesinin yazılmasını isterken, MS temelli sistemlerde
kod yazıyorsanız, böyle davranmak zorunda
değilsiniz.
FROM uye INNER JOIN odunc ON
odunc.uyeNo=uye.uyeNo
Sadece iki tabloyu JOIN edilebilir diye
bir kısıtlama yoktur. İkiden fazla tabloyu
da ihtiyacımıza göre JOIN edebiliriz.
Örnek-51:
Bu güne kadar kimin hangi kitabı
ödünç aldığının dökümünü bulmak
istersek:
Aslında, Klasik Join ile INNER JOIN aynı
şeydir. Sadece birleştirmede kullanılan
teknik farklıdır.
FROM tablo1 INNER JOIN tablo2
ON tablo1.alan1 karşılaştırma tablo2.alan2;
Örnek-50:
LEFT JOIN
örneğindeki sorguyu INNER JOIN
ile çalıştıralım. Bu
durumda, hiç kitap
ödünç almayan
üyelerin sonuçta
yer almadığına
dikkat edin.
SELECT
uye.Adi,odunc.KitapNo
52
BYTE
Veritabanı Programlama 1
SELECT Kitap.kitapAdi,uye.Adi,uye.Soyadi
FROM (odunc INNER JOIN Kitap ON
Kitap.KitapNo=Odunc.kitapNo) INNER
JOIN uye ON uye.UyeNo = odunc.uyeNo;
Bazı sistemlerde kodlama yaparken,
INNER ifadesi yer almamalıdır. Aksi halde
sorgunuz çalışmayabilir. Bu farklılığın
nedeni, JOIN ON ifadesi ANSI-SQL’in bir
parçası değildir. Ancak VTYS üreticileri,
WHERE şartında yer alan diğer koşullar
ile, tablo ilişkilendirme koşullarının bir
birinden kolayca ayırt edilmesi için standartlarda yer alan klasik join ile birlikte
bu türden ifadeleri de desteklemektedirler.
6.INSERT
Bir tabloya SQL ile kayıt eklemek için
INSERT deyimi kullanılır.
INSERT INTO tablo_adi(alan1[,alan2,....])
VALUES(deger1[,deger2,....])
Alan adı sırası ile, değer sıralamasının
aynı olması gerekir. NULL değeri alabilen (girilmesi zorunlu olmayan alanlar)
alanlar için değer girilmeyecekse boş
bırakılabilir.
Örnek-52
Yeni bir kitap ekleyelim.
INSERT INTO Kitap(KitapAdi,SayfaSayisi, kitapOzeti)
VALUES(‘Photoshop Efektleri’,330,’Photoshop efektlerini yakından
tanıyın’);
>> 1 adet Kayıt Eklendi
DİKKAT:
Bir tabloya metin ifadeler eklenirken, metinlerin tek tırnak arasına alınması bir kuraldır.
Bazen değer olarak tek tırnak (‘) girmek gerekebilir. Bu durumda, ‘ yerine ‘‘ yazılır. Aksi halde
SQL’in sentaksının bozulacağına dikkat edin. Bu
türden durumlara kaçınma anlamında ‘escape’
durum denir.
Örnek-53:
INSERT INTO Kitap(KitapAdi, ISBNNo,
SayfaSayisi, kitapOzeti)
VALUES(‘Ahmet’in Günlüğü’, ‘975-509-
170-X’, 330,’Bir polisin anıları’);
>> Incorrect syntax near the keyword
‘in’.
Bu kayıt eklenemeyecektir. Aksine
in kelimesi SQL komutu olan In zannedilecek ve arkasından açılan tek tırnak
kapanmamış olarak algılanacaktır.
Bunun yerine
INSERT INTO Kitap(KitapAdi, ISBNNo,
SayfaSayisi, kitapOzeti)
VALUES(‘Ahmet’’in Günlüğü’, ‘975-509170-X’, 330,’Bir polisin anıları’);
>> 1 adet Kayıt Eklendi
demek gerekir.
Bir Tablodan Seçilen Kayıtları
Başka bir Tabloya Ekleme:
Bazı durumlarda, bir tabloda yer alan
kayıtları başka bir tabloya aktarmak durumunda kalabiliriz.
Örnek-54:
Dışarıdaki Kitapımızı tutmak üzere bir
tablo oluşturmamız gerekirse, bunları
doğrudan bir seçme işleminin sonucunu
bu yeni tabloya ekleme şeklinde de yapabiliriz:
INSERT INTO disardakiKitap(kitapNo,KitapAdi,Bedeli)
SELECT kitapNo,KitapAdi,Bedeli
FROM Kitap
INNER JOIN odunc ON
odunc.KitapNo=kitap.kitapNo
WHERE odunc.GeldiMi=0;
>> 3 adet Kayıt Eklendi
Veritabanı Programlama 1
BYTE
53
7.UPDATE
8.DELETE
Bir kayıt üstünde değişiklik yapmak
gerektiğinde, UPDATE deyimi kullanılır.
Yapısı şu şekildedir:
UPDATE tablo_adi
SET alan1=yeniDeger1[, alan2=yeniDeger2, ....]
[WHERE sart]
Örnek:
UPDATE kitap
SET kitapBedeli = kitapBedeli*1,18;
>>17 KAYIT GÜNCELLENDİ
DİKKAT:
Bir UPDATE cümlesinde WHERE şartı olmazsa,
istenilen değişiklik tabloda yer alan tüm kayıtlar için yapılacağından dikkat edilmelidir. Böyle
bir durumda data kaybı ile karşılaşabilirsiniz.
54
BYTE
Veritabanı Programlama 1
DİKKAT:
Bir DELETE cümlesinde WHERE şartı olmazsa,
istenilen silme işlemi tabloda yer alan tüm
kayıtlar için yapılacağından dikkat edilmelidir.
Böyle bir durumda data kaybı ile karşılaşabilirsiniz.
Tabloda yer alan kayıtların tamamını veya
bir kısmını silmek için DELETE deyimi
kullanılır.
Genel kullanımı şu şekildedir:
DELETE
FROM tablo_adi
[WHERE sart];
Örnek-55:
Soyadı ‘OZAN’ olan üyeleri silmek
istersek:
DELTE
FROM uye
WHERE soyad LIKE ‘%OZAN%’
>>1 KAYIT SİLİNDİ
9.GENEL SQL
FONKSİYONLARININ KULLANIMI
Bir DELETE cümleciğine şart konmazsa tabloda yer alan tüm kayıtlar silinir. Bir Sorguyu çalıştırmadan önce doğru
kayıtları silmek istediğinizden emin
olunuz. Böyle bir durumda data kaybı ile
karşılaşabilirsiniz.
SQL’de çok fazla sayıda fonksiyon yer
almamaktadır. Bundan dolayı bazı VTYS
tarafından ek fonksiyonlar da sağlanabilmektedir. Kullanmakta olduğunuz
VTYS’nin kılavuzuna bakarak daha fazla
sayıda fonksiyonun kullanımı hakkında
bilgi edinebilirsiniz. Burada sistem bazlı
ama sık kullanılan bazı fonksiyonlar
hakkında da bilgi verilecektir. SQL Server
2000’in sunduğu fonksiyonları bir sonraki
bölümde ve ek kısmımızda bulabilirsiniz.
Tarih-Zaman Fonksiyonları:
GETDATE(): Microsoft ve Sybase
temelli sistemlerde sitem tarihini bulur.
DATE() olarak da geçebilmektedir.
SYSDATE(): Oracle’de aynı işlevi yerine
getirir.
NOW(): MS temelli sistemlerde, anlık
detaylı zamanı(gün-ay-yıl-saat-dk-sn)
verir.
Örnek-56:
Üstünde çalıştığımız VTYS’de şu anki
vakti almak için;
SELECT GETDATE()
>>6/22/2003 11:39:19 PM
Dememiz yeterli olacaktır.(MS SQLServer için)
Aritmetik Fonksiyonlar:
MOD(sayi,mod): Sayı’nın mod değerine
bölümünden kalanını veririr. ORACLE’de
geçerlidir. MS sistemlerde bir operatör
gibi görev yapar.
Örnek-57:
Ödünç verme sürelelerinin 15 güne
göre modunu alalım:
MS Access için:
SELECT vermeSuresi MOD 15 AS
GUNMOD15
FROM odunc
WHERE kitapNo=1
MS SQL Server için:
SELECT vermeSuresi % 15 AS
GUNMOD15
FROM odunc
WHERE kitapNo=1
Oracle için:
SELECT MOD(vermeSuresi ,15)
FROM odunc;
Şeklinde yazmamız gerekecektir.
ABS(sayi): Sayının mutlak değerini
bulur.
COS(),SIN(),TAN(),COSH(),SINH(),TANH(): Trigonometrik fonksiyonların
aynısıdır. Ancak, Oracle Sistemler için açı
değeri olarak verilen değerin RADYAN
cinsinden olması gerekir.
LN(sayi): Doğal logaritma almak
için(e tabanlı logaritma) kullanılır.
LOG(sayi,taban): İstenilen bir sayının
Veritabanı Programlama 1
BYTE
55
yine istenilen bir tabanda logaritmasını
almak için kullanılır.
FROM Kitap
Şeklinde kullanılabilir.
POWER(sayi,us): Bir sayının üssünü
almak için kullanılır.
INITCAP(karakter): İlk harfi büyük
yapar.(Oracle)
SIGN(sayi): Bir sayının yönünü belirtir.
Negatif için –1, Pozitif için +1 sıfır için 0
döndürür.
REPLACE(karakter,ifade,yerinegelecekIfade): İfadeleri bulup değiştirir.
(SQLServer2000,SYBASE)
SQRT(sayi): Bir sayının karekökünü
alır.
LOWER(metin), UPPER(metin) :
Tamamı Küçük veya tamamı büyük harf
yapmak için kullanılır.(Oracle)
Karakter İşleme Fonksiyonları:
CHR(): Bir ASCI kodunun karakter
karşılığını döndürür.
LCASE(metin) ve UCASE(metin):
Tamamı Küçük ve tamamı büyük harf
yapmak için kullanılır. (MS)
CONCAT(metin1,metin2): İki veya
daha fazla karakter ifadeyi uç uca eklemek için kullanılır.
LTRIM(metin), RTRIM(metin), TRIM(metin): Soldaki, sağdaki veya her iki
taraftaki boşlukları atmak için kullanılır.
MS temelli sistemlerde, + ile bu iş
yapılabilirken ORACLE’de ancak || operatörü veya CONCAT fonksiyonu ile bu iş
yapılabilir.
LENGHT(metin): Bir metnin uzunluğunu verir.(Oracle)
Örnek-58:
Kitap Adları ile yazarlarının adlarını bir
tek alan olarak seçtirmek istersek:
SELECT kitapAdi + yazarAdi
FROM Kitap
Oracle’de
SELECT kitapAdi || yazarAdi
FROM Kitap;
veya
SELECT CONCAT(kitapAdi,yazarAdi)
56
BYTE
Veritabanı Programlama 1
LEN(metin): Bir metnin uzunluğunu
verir.(MS temelli Sistemler)
Dönüştürme Fonksiyonları
CONVERT(veritipi[(uzunluğu)], sütu adı,
format): Bir verinin bir formattan başka
bir formata dönüştürülmesi için kullanılır.
Örnek-59:
Üyelik Numarasının sonu 1 olan üyelerimizin listesini alalım:
SELECT uyeNo,Adi,soyadi
FROM uye
WHERE CONVERT(VARCHAR(4),uyeNo) LIKE ‘%1’
CAST(kolonAdi as CevirilecekVeriTipi(N)): Bir sütunun ya da verinin türünü
başka bir türe değiştirmek için kullanılır.(SYBASE,MS SQL Server)
Örnek-60:
SELECT CAST(yazarNo as VARCHAR(4))
+ ‘ ‘+adi +’ ‘+soyadi
FROM yazar
ARİTMETİK İŞARETLER
Her yerde olan aritmetik işlemleri SQL’de de
geçerlidir.
+
:Toplama
:Çıkartma
*
:Çarpma
/
:Bölme
%
:Mod(Bazı Sistemlerde MOD da kullanılır)
Veritabanı Programlama 1
BYTE
57
Download