You are on page 1of 56

Veritabanı

Programlama
Temmuz 2003

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ü: kuruluşların ağır verilerine kadar, günü-
Murat Yıldız müzde bir çok alanda veritabanı uygu-
myildiz@byte.com.tr
lamalarına ihtiyaç duyulmaktadır. Seri
Yönetici Editör:
özellikle, Web projeleri gibi küçük çaplı
İbrahim Özdemir
iozdemir@byte.com.tr işlerinde Veritabanı kullanmak zorunda
kalan, ama bu konuda başlangıç aşa-
Editörler:
Burak Kahyaoğlu masında bile bilgi sahibi olmayan bir
bkahyaoglu@byte.com.tr çok kişiye ışık tutacak şekilde hazırlandı.
Üsame İldar Özdemir Bundan dolayı da SQL ve veritabanının
uildar@byte.com.tr dışında, bir veritabanının Web’e açılması,
Tasarım ve Uygulama: XML, Web servisleri ile başka sitelere
Yağız Akay hizmet sunma gibi konulara da nasıl
yakay@byte.com.tr
yapılacağı konusunda fikir vermesi açı-
sından bir noktaya kadar değinildi.
Tüm bunların yanında, SQL’i iyi bilen-
ler için bile seyrek kullanılan komutlara
ACAR Yayıncılık adına imtiyaz sahibi: bir yerlerden bakmak bazen bir zorunlu-
Murat Yıldız
luk arz edebilmektedir. İşte kitapta böyle
Reklam Müdürü: bir ihtiyacı da karşılamak üzere SQL’i
Ahmet Aslantürk
enine boyuna ele aldım. Özellikle yapıla-
Baskı: bilecek hataları, akla takılabilecek soru ve
ETAM A.Ş.
sorunları, program geliştirme esnasında
Film Çıkış:
önemli olduğunu gördüğüm teknikleri
Figür
püf noktaları halinde bulabilirsiniz.
Merkez Ofis:
Veritabanı uygulamalarının kurgu-
Fulya Cad. Fulya Bayırı Sk.
lamak bir çok platforma hakim olmayı
Bilsan Plaza 11/4 80300
gerektirir. Ciddi bir Web uygulaması
Mecidiyeköy - İSTANBUL
meydana getirebilmek için öncelikle, SQL
Tel: (212) 212 62 06
Faks: (212) 212 62 11 ve veritabanı konusunda temel bilgilere
sahip olmak gerekir. Çünkü tüm sistem,
www.byte.com.tr
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 Emeği geçen herkese teşekkürü borç
kullanıcının profesyonelliğin kapısından bilirim.
içeriye adım atacak hale gelebileceği bir
-Yaşar GÖZÜDELİ
kitap ortaya çıktı.
ygozudeli@hotmail.com
Özellikle SQL’e adanan ilk kitapçıkta
olmak üzere, kolay ama çok şey öğrenil-
mesi 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 adre-
sinde online simülasyon üstünde test
edebilirsiniz.

Veritabanı Programlama 1 BYTE 7


Bu Kitapta...
İ
lk olarak, İlişkisel Veritabanı kavramını GİRİŞ
yakından tanıyacağız. Böylelikle hayatta SQL(Es-kü-el okunur) insanların verita-
karşılaşılan bilgiye dayalı projelerin banı sistemleri ile konuşmasını sağlayan
nasıl veritabanı mimarisine uyarlanacağını popüler bir dildir. Bu dil sayesinde, bir veri-
öğreneceğiz. tabanından kayıtları alabilir, değiştirebilir
İkinci bölümde, SQL komutlarını iki ya da yeni kayıtlar ekleyebiliriz. SQL bir
gruba ayırarak inceleyeceğiz. Öncelikle, dildir; ancak bir programlama dili değildir.
veritabanı tasarlamaya yönelik komutları Program geliştirme aşamasında SQL’den
öğreneceğiz. Bu gruba giren komutlar için faydalanılır, ancak tek başına bu iş için
Veri İşaretleme Dili deyimini kullanacağız. yeterli değildir.
Veri İşaretleme Dili ile sadece verilerin sak- Verilerin belli özelliklerine göre grup-
lanacağı ortama dair düzenlemeler yapılır. lanıp diske kaydedilmesi işine veritabanı
Son olarak Veri İşleme Dili terimi yönetimi denir. Veritabanlarından en
altında, İlişkisel veritabanı destekli veri popüler olanı, ilişkisel veritabanıdır. İlişki-
işleme komutlarını öğreneceğiz. Bu sel veritabanın kökeni, 1970’li yıllarda IBM
komutlarla veritabanına kayıt eklemek, laboratuarlarında yapılan çalışmalarda
veritabanından kayıt silmek, var olan atılmıştır. Takip eden çalışmalarla, 1983’te
kayıtlar üstünde güncelleme yapmak gibi SQL (Structural Query Language) standart-
işlemleri öğreneceğiz. ları tanımlanmış ve ardından 1987 yılında
Bu konuya yeni başlamayı planlıyor- önce ISO ardından da ANSI tarafından
sanız, önce ilk bölümü, ardından hazır bir bir standart olarak kabul edilmiştir. Daha
veritabanı üstünde 3. bölümü uygulama- sonra, bu standartlar çerçevesinde bir çok
nız, son olarak ikinci bölümde kod yazarak veritabanı yönetim sistemleri geliştirilmiş-
nasıl veritabanı tasarlayabileceğinizi öğre- tir. Bunlardan belli başlıları, Oracle, Sybase,
nebilirsiniz. 2.bölümü anlamak zorunda MS SQL Server, Informix ve MySQL’dir. Bu
değilsiniz. VTYS’lerin işlerin daha kolay yürümesi için
Artık bir çok VTYS ortamında, verita- kendi adlarına standart dilden uzaklaşan
banı şemalarını düzenlemeniz için görsel tarafları vardır. Ancak genel işlemlerde kul-
arayüzler mevcuttur. Ancak bir proje lanılan dil tümü için de ortaktır ve SQL’dir.
üstünde çalışmak isterseniz, öncelikli
olarak nesneleri tasarlayıp veritabanı Veritabanı Yönetim
şemasını ortaya çıkarmak gerekir. Ancak Sistemleri (VTYS)
daha sonra veri işleme işlemlerine geçi- Veri Tabanı Yönetim Sistemleri, fiziksel
lebilir. hafızada bilgileri çeşitli özelliklerine göre

8 BYTE Veritabanı Programlama 1


gruplandırıp şekillendirdik-
ten sonra saklayan prog-
ramlardır. Kısaca VTYS diye
adlandıracağız. VTYS, sakla-
nan bu veriyi, SQL komut-
ları ile insanların istekleri
çerçevesinde işler, yeniden
şekillendirirler. Yani, Verita-
banı 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 ekran- lı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ğla- takip otomasyonu, bir hastane otomas-
nı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 verita-
kiş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üre-
gerektirir. 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 uygula- teker teker hesaplanır. Günde yüzbinlerce
maları yapabiliyor olmak bu iş için başlan- abonenin 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ı
geliştirelim:
Kavramı Öncelikle elimizdeki bütün Kitapla-
İlişkisel veritabanı günümüzde en yaygın rımızın bir listesini yapalım. Ama bunu
kullanılan ilişkisel veritabanı sistemle- yaparken, her bir kitaba numara vermeyi
rinden biridir. En çok kullanılan ilişkisel ihmal etmeyelim. Çünkü elimizde aynı
Veritabanı Yönetim Sistemlerine Oracle, kitaptan iki adet olabilir. Bunlardan
Ms SQL Server, Sybase, Informix, MySQL biri eski, öteki de yeni kitap olabilir. Bu
gibi veritabanı yönetim sistemlerini durumda bu iki kitaptan hangisini kime
örnek olarak verebiliriz. Bu bölümde verdiğimizi nasıl ayırt edeceğiz?
verilen uygulamaları test etmek için MS Daha sonra kitaplarımızı şu şekilde bir
Access de bir noktaya kadar kullanılabi- listeye yazalım:
lir ancak verilen örneklerin tamamı MS Listenin her bir sütununda sırasıyla şu
Access tarafından desteklenemez. Bu bilgiler yer alsın:
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 adresin-
den faydalanabilirsiniz.
Bilgisayar ortamında veri saklamak
için kullanılan yapılardan en büyüğüne En başa Kitap No’nu, sonra Kitap Adı’nı ardından
dosya dendiğini biliyorsunuzdur. İlişkisel ISBN numarası’nı sonra Sayfa Sayısı’nı, Özeti’ni
veritabanları, veritabanı denilen büyük yazalım ve listeyi dolduralım.
dosyalardan oluşur. Veritabanı, içerisinde
tabloları barındıran bir dosyadır. Her bir Kitap No: Her bir kitaba verdiğimiz
tablo, belli yapıya uygun verileri sakla- numara
mak üzere tasarlanır. Tablolar, satırlardan
ve sütunlardan oluşur. Kitap Ad: Her bir kitabın adı
Bu bölümde, bu yapıları yakından
tanıyacağız. ISBN Numarası: Her bir kitabın arka-
sında yer alan Uluslararası Standart Kitap
Günlük Hayatta Numarası
İlişkisel Veritabanı
Bir çoğumuzun başına gelmiştir. Arka- Sayfa Sayısı: Kitabın kaç sayfa olduğu
daşlara, eşe dosta bir çok kitap, kaset, CD Özeti: Kitabın bir özet açıklaması
veririz ve... Gidiş o gidiş! Böyle bir sorunla Amacımız, kime hangi kitabı verdiğimizi
nasıl başa çıkarız? Bu konuda bir proje bilmek. O halde Kitap listesine ek olarak

12 BYTE Veritabanı Programlama 1


şimdi bir de ödünç listesi yapalım: Tablolar:
Bir tablo yani günlük hayattaki ‘liste’ kav-
ramı, satırlardan ve sütunlardan oluşur.
Mesela Kitap listemizi(yani Kitap tablo-
Bu listede de, ödünç no, kitap no, ödünç alan, muzu) ele alacak olursak, her bir satırda
verme tarihi, verme süresi, geri geldi mi şeklinde bir kitaba ait bilgiler yer almaktadır.
bir liste daha yapalım. Alan(Field), yapılandırılmış bilginin
her bir kısmını saklamak üzere yapılan
Kütüphanemizden verdiğimiz her bir tanımlamadır.
kitabı bu listeye işlersek, hangi kitabımı- Her bir alan, yapılandırılmış verinin bir
zın kimde kaldığını, süresi sonunda geti- birimini tutmak üzere tanımlanır. Her bir
rilip getirilmediğini kolayca takip edebili- sütunun adı ile birlikte diğer bilgilerini-
riz. Buradaki Geri geldi mi hanesine gelen n(en fazla kaç birimlik bilgi bu hücrede
her kitap için bir işaret koyabiliriz ya da saklanabilecek, ne tür bilgi saklanacak
imza attırabiliriz. vs.) ortaya koyduğu tanıma alan denir.
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 tablolar-
dır. Hayatta bir çok şeyi listelerle çözeriz.
Her bir listeye karşılık, veritabanı mantı-
ğında bir tablo gelir.
Alan, her bir sütun için tanımlayıcı bilgileri tutan
Temel Kavramlar yapıdır.
Veriler fiziksel hafızada Veri Dosyala-
rı(DataFiles) halinde saklanır. Dosya, Satır (Row): Bir tabloda yer alan her bir
bilgisayarların bilgileri birbirinden ayıra- kayıt bir satıra karşılık gelir. Örneğin Kitap
rak saklamak için kullandığı temel bilgi tablosunda her bir satırda farklı bir kitap
depolama yapısıdır. Bir dosyada, bir çok hakkındaki bilgi yer almaktadır.
veri yer alabilir.
Bir kütüphane otomasyonunu ele Sütun (Column): Tablolar dikey sütun-
alacak olursak, kitap ile ilgili bilgiler, ların yan yana gelmesiyle meydana gel-
ödünç verilenler, kütüphaneden kitap miştir. İlk sütunda kitap numaraları, ikinci
alma hakları olan üyeler, CD ve kasetler sütunda kitap isimleri, üçüncü sütunda,
ile ilgili bilgiler aynı veri dosyasında ama ISBN numaraları yer almaktadır.
farklı tablolar içerisinde yer alabilir.
Kayıt (Record): Yapılandırılmış verilerden

Veritabanı Programlama 1 BYTE 13


her birine bir kayıt denir. Yani, alan bilgi- kurallara Zorlayıcılar denir. Kullanıcı, zor-
leri ile birlikte her bir satır bir kayıttır. Bir layıcının istediği şekilde veri girmezse,
kitap bilgisini ele alacak olursak, 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
Kayıt, alan tanımlamaları ile birlikte bir satırda yer
alan bilgilere denir. kalktığımızda hata verecek bir kısıtlama
tanımlayabiliriz.
Bu bir kayıttır. Kayıt ile satır arasındaki
temel fark, kayıt ile kastedilen yapının Anahtar (Key): Anahtar bir veya birden
sütunlar hakkındaki bilgileri de içerme- fazla alanın bir satır için niteleyici olarak
sidir. girilmesi için tanımlanan özel bir çeşit
zorlayıcıdır. Tekrarlamayacak bir anahtar
Veri Tipi (Data Type): Bilgisayar, kayıtları alan tanımlandığında, Bu anahtar alana
yapısal olarak tutarken, onların yapıları birincil anahtar alan denir. Primary Key,
hakkında fikir sahibi olabilmek için bazı Unique Key, Foreign Key gibi türevleri
özelliklerinin önceden tanımlanması vardır.
gerekir. Örneğin, kitap numarası alanının
mutlaka bir tam sayı olacağını, Kitap İlişkisel Veritabanı
adının harf ya da rakamlardan oluşaca- Yönetim Sistemleri:
ğını anlatmamız gerekir. Bir veritabanı Veritabanı Yönetim sistemlerinden günü-
oluşturulurken, her bir alanın tipinin müzde kullanımı en yaygın olanı İlişkisel
ne olacağı tanımlanmak zorundadır. Bir Veritabanıdır. Hal böyle olunca da en
alana tamsayı mı yoksa harf mi; tarih mi yaygın veritabanı yönetim sistemleri,
yoksa ondalıklı bir sayı mı geleceği ancak İlişkisel Veritabanı Yönetim Sistemle-
tanımlandıktan sonra kayıt girilebilir. ri’(RDBMS)dir. İlişkisel veritabanının en
Ayrıca, “bir alanın uzunluğu ne kadar önemli yanı, tablolardan oluşmasıdır.
olacak, harf girilebiliyorsa en fazla kaç Daha önemli yanı da bu tabloların bir biri
harf girilebilecek?”, “rakam ise en fazla ile ilişkilerinin olmasıdır. Böyle olmasaydı
kaç basamaklı olabilir?” türünden soru- durup dururken bu VTYS’ler için ‘ilişkisel’
ları yanıtlamak için de yine VTYS bir alan demezdik.
için veri tipi belirlememizi ister. Bir alan Bir veritabanında ilişkiden söz edebil-
için hangi tip seçeneklerimizin olduğunu mek için en az iki tablonun yer alması gere-
ilerleyen kısımlarda öğreneceğiz. kir ve bu iki tablodaki verilerin bir biri ile bir
şekilde ilişkilendiriliyor olması gerekir. Yine
Zorlayıcı (Constraint): Herhangi bir bir önceki örnek olaya dönecek olursak,
alan için girilebilecek verileri kısıtlayıcı Kitap listesi ile ödünçler listesi arasında

14 BYTE Veritabanı Programlama 1


Değişken İsimlendirme Kuralları

SQL’de tablo adları, alan(field) , veritabanı dosyası, Değişken isimlendirme


indeks vb. isimler değişken isimleridir. Genel geçer notasyonları:
değişken isimlendirme kurallarına burada da dikkat
etmek, sağlıklı uygulamalar meydana getirebilmek 1.Deve notasyonu: degiskenAdi şeklinde yazılır.
için çok önemlidir. Bundan dolayı bu kurallara
burada yer verdik. Genel kanı bu türden bir kaygının 2.Alt çizgi notasyonu: degisken_adi şeklinde
yersiz olduğu yönünde olsa da bazen oldukça kritik yazılır.
hatalar ortaya çıkabilmektedir. Veritabanı programlamada, büyük-küçük
harf duyarlılığı olmadığından genellikle alt çizgi
1. Değişken isimleri, harf ile başlamak zorundadır. notasyonu kullanılır ve değişken adları küçük harf
olarak verilir. Ancak bu bir kural olmayıp sadece
2. Değişken isimleri, harf, rakamlar ve ‘_’ dan oluş- okunurluğu artırmak için programcıların bir çoğu
mak zorundadır. tarafından tercih edilen bir yoldur.

3. Değişken isimlerinde Türkçe’de ki noktalı harfler NULL mu, boşluk mu?


(İ,ı,Ğ,ğ,Ü,ü,Ş,ş,Ç,ç,Ö,ö,) yer alamaz. Bir kayıt için, alanlardan biri hiç girilmediği için boş
olabilir veya bilgisayardaki space tuşunun karşılığı
4. Ayrılmış kelimeler değişken adı olamazlar (select, ASCII değeri girilmiş olabilir. Space(ASCII-32 karak-
like, not, or, delete, update vs.) teri) tuşuna basılarak elde edilmiş boşluk ile daha
hiçbir bilgi girilmemiş olan boşluk bilgisayar dilinde
5. SQL büyük-küçük harf duyarlı değildir. 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 bize kitap hakkındaki tüm detayları verir.
olmayan bir kitap bizde yoktur ve ödünç Kitap tablosundaki kitapNo alanı aday
veremeyiz. Haliyle de mantık olarak bu anahtar(indeks)’tir. Odunc tablosundaki
türden bir ödünç bilgisi ödünç listemizde KitapNo alanı, ‘yabancı anahtar’ (foreign
yer alamamalıdır. key) alandır, çünkü Kitap tablosundaki bir
Olaya tersten bakacak olursak, geri kaydı sembolize etmektedir.
dönmeyen bir kitap hakkındaki detayları Tüm bunların ardından VTYS’leri hak-
öğrenmek istediğimizde ödünç listesindeki kında özet olarak diyebiliriz ki;
kitap numarasını alırız. Daha sonra aynı Bir İlişkisel Veritabanı Yönetim Sistemi
numaraya karşılık gelen kitabı, Kitap tablo- tablolar üstünde şu üç işlevi yerine getir-
sundaki satırı buluruz. Bu satırdaki bilgiler mek zorundadır.

Veritabanı Programlama 1 BYTE 15


Birinci tabloda yer alan bir kayda karşılık, ikinci kaydı sembolize eden kitapNo için aday anahtar,
tabloda bir veya daha çok kayıt yer alabilir. Ancak ikinci tabloda, ödünç verilen herhangi bir kitap
İkinci tablodaki bir kitap numarasına karşılık birinci hakkındaki detayları görmek için 1. tabloya geçme-
tabloda sadece bir tek kayıt vardır. Bu ilişkiye bire mizi sağlayan kitapNo’na ise yabancı anahtar(fore-
sonsuz bir ilişki denir. Birinci tablodaki her bir tekil ign 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.
Kitaplar listesi üstünde bir iz düşürme işlemi Kitap-
2. İzdüşürme: Herhangi bir tablodan ların kitap No’nu, Adını ve sayfa sayısını alıyoruz.
sadece belli sütunların yer aldığı seçme Diğer sütunları almıyoruz.
işlevlerini yerine getirebilmelidir. Örneğin,
canı isteyen bir kullanıcı kitabın sadece grupta incelenir. Birincisi, veri tanımlama
adını ve kaç sayfa olduğunu seçebilmelidir. işlemleridir. Bu grupta yapılan işlemler
daha çok verinin saklandığı ortama dair
3. Birleştirme: Birden fazla tabloda yer işlemlerdir. Doğrudan verinin kendisi ile
alan bilgileri, yeri geldiğinde tek bir tabloy- ilgilenmek yerine, tablonun hangi alanlar-
muş gibi sunabilmelidir. Örneğin, ödünç dan oluşacağı, hangi alana hangi aralıkta
alınıp da geri getirilmeyen kitabın adlarını veri girileceği vb. gibi işlemler bu gruptadır.
ve kimler tarafından alındığını bir tek tab- Veri işleme işlemleri ise verinin saklan-
loymuş gibi gösterebilmelidir. dığı ortam ile hiçbir ilgisi olmayan işlem-
VTYS bu 3 temel işlevi yerine getirmeli- lerdir. Bir tablonun içindeki tüm kayıtlar
dir. Bunlardan üçünü, ikisini veya birini aynı silinse bile sonuçta tablo var olacaktır.
anda yerine getirmek durumunda kalabi- Çünkü bir tablonun silinmesi DDL’in göre-
liriz. Örneğin, sayfa sayısı 200’den büyük vidir.
kitapların sadece adını görmek istersek, SQL komutlarının bu şekilde gruplan-
hem iz düşürme hem de seçme işlemine dırılmasının nedeni, SQL’den ziyade, veri
ihtiyaç duyarız. yönetimi konusundaki mantıktan kaynak-
Veriler ve depolanma şekilleri farklı lanmaktadır. Böylelikle işlemler daha anla-
olabilir. Önemli olan, VTYS’nin SQL ile şılır bir hal almaktadır. Verinin kılıfı ile ilgili
yönetilebilir olmasıdır. Böylelikle, verilerin işlemler ve verinin kendisi ile ilgili işlemler...
bilgisayarda fiziksel olarak ne şekilde depo- Sizce bir kitabın adının değiştirilmesi
landığı, kullanıcı bilmek zorunda kalmaz.
Yani, kullanıcı temel veri saklama işlem ve
yöntemlerinden izole edilmiş olur. Kulla-
nı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ı

Veritabanı Programlama 1 BYTE 17


hangi gruba girer? Peki ödünç verme süre-
sinin 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
tanımlamada bulunulacaksa, bu tanım-
(Data Definition Language) lama CREATE deyimi ile oluşturulur.
SQL’i yeterince bilmiyorsanız, bu bölüm- DROP deyimi ile de tanımlamadan vaz-
den önce 3.Bölümü okumanız ve örnek- geçilip silinir. ALTER deyimi ise bir tanım-
leri bir veritabanı üstünde yapmanız lama üstünde değişiklik için kullanılır.
önerilir. Bundan sonra, bu bölümü kav- Bu bölümde ve takip eden bölüm-
ramanız kolaylaşacaktır. Ancak bir proje lerde, örneklerden hemen sonra ‘>>’
geliştirirken öncelikle veriyi tanımlamak konulduktan sonra bir mesaja yer veril-
gerekir. Bu nedenle bu bölüme öncelik miştir. Bu mesaj SQL ifadesinin sonu-
verilmiştir. cunda ne olduğunu göstermektedir.
Veri tanımlama dili, verinin ne
olduğundan ziyade verinin tipi ile ilgili
tanımlamaları yapmak için kullanılır. “Bir UYARI:
veritabanında hangi tablolar yer alacak, Bu komutu, MS Access üstünde çalıştıramazsı-
bu tablolarda hangi alanlar yer alacak nız. Ancak MS SQLServer, Sybase gibi büyük ve
ve alanların türleri ne olacak, indeks ya orta ölçekli veritabanlarında kullanılabilir.
da anahtar olacak mı?” bunların hepsi
DDL ile belirlenir, değiştirilir veya olan
bir tanımlamadan vazgeçilip tanımlama
silinebilir. Temel Veri Tipleri:
Veritabanı üstünde herhangi bir SQL’de yeni bir veri tipi tanımlayamayız.
Sadece var olan veri tiplerini kullanabi-
liriz. Burada hemen her yerde kullanılan
DİKKAT: ortak veri tiplerine bir göz atacağız. Diğer
Bazı VTYS’lerde her bir SQL cümleciğinin veri tipleri her bir VTYS’ye özel olarak
sonuna ‘;’ konulması istenir. Bu tür VTYS’lerde, değişebileceğinden VTYS ile birlikte ele
cümleciğin nerede bittiğini takip etmek kulla- alınması daha uygundur.
nıcıya bırakılmıştır. Öte yandan bazı VTYS’lerde Bazı VTYS’leri kullanıcının veri tipi
bir SQL cümleciğinin bittiğini belirtmek için tanımlamasına olanak sağlar ancak bu
cümle sonuna ‘;’ koymaya gerek yoktur. Bunu SQL’in sunduğu bir özellik olmayıp VTYS
VTYS’nin kendisi de algılayabilmektedir. Ancak tarafından sağlanan bir özelliktir.
‘;’ konulmasının çoğu VTYS’de sorun çıkarmadığı
bir gerçektir. SYBASE’de ve ORACLE’da cümle- Veritabanı:
lerin sonuna ; konulması gerekirken, Microsoft Veritabanı, içerisinde tabloları barındıran
tabanlı sistemlerde bu türden bir zorunluluk veritabanı mimarisinin en büyük ögesidir.
bulunmamaktadır. Bir veritabanı şu şekilde açılır:
CREATE DATABASE database_name

20 BYTE Veritabanı Programlama 1


DİKKAT: TEMEL VERİ TİPLERİ
ANSI-SQL içerisinde metin olan değerler (CHA- INTEGER(boyut): Tam Sayı
R,VARCHAR,MEMO,DATE) tek tırnak içerisine INT(boyut): Tam Sayı
alınarak yazılır. RAKAMSAL değerler ise olduğu SMALLINT(boyut): Küçük Tam Sayı
gibi yazılır. TINNYINT(boyut): Nümerik tam boyut:Sayının
Örnek: en fazla kaç basamaklı olacağı belirtilir.
WHERE tarih=‘20.01.2003’ DECIMAL(boyut,d): Ondalık
(metin) FLOAT(boyut,d): Kesirli Sayı
SET kitapNo=20 boyut: Fazla kaç basamak tam kısım olacağı
(sayı) belirtilir.
d: Ondalıklı basamak sayısını anlatmak için
kullanılır.
Örnek-1: CHAR (boyut): Daha çok uzunluğu sabit(-
CREATE DATABASE dbKutuphane; telefon numarası gibi) karakter verileri için
Ve şu şekilde silinir: kullanılır.
DROP DATABASE database_name VARCHAR (boyut): Değişken boyutta metin
alan belirlemek için kullanılır.
Örnek-2: boyut: Bu alanda en fazla kaç karakter yer
DROP DATABASE dbKutuphane alacağını belirtir.
DATETIME: Tarih
Tablolar: LOGICAL(BIT): BIT,true/false veya yes/no alan
diye de geçmektedir. En az yer kaplayan veri
Tablo Oluşturma tipidir. 1 ve 0 olmak üzere iki değer alabilir.
CREATE TABLE tablo_adi
(kolon_adi1 veri_tipi[NOT NULL][,
kolon_adi2 veri_tipi[NOT NULL],.......]) ISBNNo VARCHAR(15),
ile yeni bir tablo oluşturulur. Turu VARCHAR(20),
sayfaSayisi INTEGER,
kitapOzeti VARCHAR(255)
)
ile örneğimizdeki tabloyu oluştura-
Örnek-3: biliriz.
CREATE TABLE Kitap( >> OLUŞTURMA İŞLEMİ BAŞARI İLE
kitapNo INTEGER NOT NULL CONS- YAPILDI
TRAINT cnsKitapNo PRIMARY KEY,
kitapAdi VARCHAR(63) NOT NULL,

Veritabanı Programlama 1 BYTE 21


Kısıtlar (Constraint) Oluşturma: Foreign Key: Bir tabloya girilebilecek
Kısıtlayıcılar, tabloların oluşturulması sıra- değerleri başka bir tablonun bir belli
sında tabloların bir parçası olarak tanıla- alanında yer alabilecek veri grubu ile
nır. MS Access ve SQLServer’de kullanılır. sınırlandırmaya ve en önemlisi de ilişki-
Aşağıdaki işlevleri yerine getirebilirler: lendirmeye yarar.
Örneğin, olmayan bir kitabın ödünç
1. INDEX gibi, birincil anahtar alan tanım- tablosuna eklenememesi ve ödünç tab-
layabilirler (PRIMARY KEY): Bu durumda losuna eklene bir kitabın numarası aracı-
standart olarak Clustred Index gibi davra- lığıyla detay bilgilerine erişilmesi. Burada
nırlar.(bkz. INDEX’ler) Kitap.KitapNo birinicil anahtar alan;
Odunc.kitapNo ise yabancı anahtardır.
2. INDEX gibi tekil alan belirleyebilirler. Genel yapısı şu şekildedir:
(UNIQUE KEY) CONSTRAINT constraint_name PRI-
MARY KEY | UNIQUE | NOT NULL | REFE-
3. Tablo oluşturma esnasında da yapıla- RENCES foreign_table [(foreign_field1[,-
bilen, (NOT NULL) alan belirleyebilirler foreign_field2,..])]
Tablolar oluşturulurken, bazı alanlara
4. Yabancı Anahtar belirleyebilir- girilebilecek değerler ile ilgili kısıtlar
ler.(FOREIGN KEY) koymak zorunda kalabiliriz. Böylesi
durumlarda CONSTRAINT’ler kullanılır.
Primary Key: Bir tablodaki, her bir satı- CONSTRAINT’ler aslında INDEX’lere
rın yerine vekil olabilecek bir anahtar benzerler ama indekslerden farklı olarak
veridir. Tekrarlamaması gerekir. Standart bir tek tablo üstünde etkili olmayabilir-
olarak bir tabloda verilerin, fiziksel hafıza ler. Özellikle yabancı anahtar zorlayıcısı
üstünde de hangi alana göre dizileceğini ilişkisel veri girişi için oldukça etkili bir
de primary key belirler. Bu, bazen bir tek zorlayıcıdır. Ancak bir Foreign Key tanımı
alan olabileceği gibi, bazen birden fazla yapabilmek için, FOREIGN KEY yabancı
alan da birleşerek bir birincil anahtar anahtarının asıl tablosunda birincil anah-
oluşturabilir. tar olması gerekir.

Unique Key: Unique Key olarak tanım- Örnek-4:


lanan alan için bir değer sadece bir kere CREATE TABLE Kitap (
girilebilir. Bir başka satıra daha aynı kitapNo int NOT NULL ,
verinin girilmesine izin verilmez. Primary kitapAdi varchar63),
Key’den farklı olarak Unique Key, NULL ISBNNo varchar (15),
değerini alabilir. sayfaSayisi int ,
kitapOzeti varchar (255)

22 BYTE Veritabanı Programlama 1


) >> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI
>>OLUŞTURULMA İŞLEMİ BAŞARI İLE İLE YAPILDI
YAPILDI
veya Örnek-6:
CREATE TABLE odunc( Bu sütunun boş geçilememesini istese
oduncNo int NOT NULL , idik:
kitapNo int NOT NULL , ALTER TABLE Kitap ALTER COLUM-
uyeNo int NOT NULL , N kitapBedeli INTEGER NOT NULL;
vermeTarihi datetime NOT NULL, >> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI
vermeSuresi int NOT NULL , İLE YAPILDI
geldiMi bit dememiz gerekirdi.
)
>>OLUŞTURULMA İŞLEMİ BAŞARI İLE Örnek-7:
YAPILDI Bu sütunu silmek için,
ALTER TABLE Kitap DROP COLUM-
Tablo silme: N kitapBedeli;
Bir tabloyu kullanmaktan vazgeçer- >> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI
sek: İLE YAPILDI
DROP TABLE tablo_adi
İndeksler:
Tabloda Değişiklik Yapma: Kütüphanemizdeki Kitapın raflardaki dizi-
Bir tabloya sütun eklemek veya tablodan lişlerini ele alalım. Bir kitap aradığımızda,
sütun silmek için ALTER TABLE deyimi Kitapımız bir kurala göre dizilmiyorsa, her
kullanılır. bir kitaba teker teker bakmamız gere-
ALTER TABLE tablo_adi kir. Kitapı raflara alfabetik dizersek, her
{ADD{COLUMN alan alan_tipi [(boyut)][- bir kitabı teker teker gözden geçirmek
NOT NULL][CONSTRAINT indeks] zorunda kalmayız. Aradığımız kitap ile
CONSTRAINT coklu_indeks} bakmakta olduğumuz kitabın isimlerini
DROP{COLUMN alan | CONSTRAINT karşılaştırır, sağa ya da sola yönelip ara-
constraint_adi} maya devam ederiz. Aynı şekilde yazarla-
} rına ya da kütüphane numarasına göre
sıralanmış birer liste olursa, bu kriterlere
Örnek-5: göre de aradığımız kitabı kolayca bula-
Kitap tablosuna kitap bedeli adında biliriz.
yeni bir tamsayı sütun ekleyelim. Veritabanlarında indeks oluşturarak,
ALTER TABLE Kitap ADD kitapBedeli verileri veritabanındaki kayıtlı oldukları
INTEGER; sıradan başka bir sırada gösterebiliriz.

Veritabanı Programlama 1 BYTE 23


Temelde İndekslerin ilişkisel veritaba- YAPILDI
nında şu üç işlevi vardır: SQL Server’de Index sırasına göre veri-
lerin fiziksel olarak yeniden sıralanmasını
1. Tekil İndeksler, veri ilişkilerini ve veri istersek,
bütünlüğünü sağlayan birincil anahtar CREATE UNIQUE CLUSTERED INDEX
alanlar oluşturmada kullanılır. indKitapNo
ON kitaplar(kitapNo)
2. İndeks olan alanın değerine göre bir diyebiliriz. Ancak bir tablo üstünde
kaydın kayıtlar arasındaki sırasını göste- sadece bir adet Clustred Index oluşturu-
rirler. labilir.(Bir çokluk kümesini fiziksel olarak
aynı anda kaç farklı şekilde sıralayabiliri-
3. Sorguların neticelenme sürelerini z?Elbette bir kere...)
kısaltırlar. Sizin kullanmakta olduğunuz VTYS
CREATE [UNIQUE] INDEX index_adi de bu konuda ek işlevler sunuyor olabilir.
ON tablo_adi(kolon_adi1[,kolon_adi- Yardım menüsünden bu konuda bilgi
2,...][DESC]) alabilirsiniz.
Tablolar birbiri ile ilişkilendirilirken,
Örnek-8: index alanlar üstünden ilişki kurulursa
CREATE UNIQUE INDEX indKitapNo daha hızlı sorgular elde edilir.
ON Kitap(kitapNo)
>>OLUŞTURMA İŞLEMİ BAŞARI İLE View’ler
YAPILDI Bazen, tabloları olduklarından farklı
Dedikten sonra, iki farklı kitaba aynı gösterecek filtrelere ihtiyaç duyarız.
kitap no’sunu vermek mümkün olamaya- Bu türden işlevler için ANSI SQL VIEW
caktır. Bunu bizim yerimize VTYS denet- kullanmayı önerir. VIEW’ler, saklanmış
leyecektir. sorgulardan ibarettir. Aslında tablo gibi
Bir indeksi silmek için: kullanılsa da böyle bir tablo halihazırda
DROP INDEX tablo_adi.indeks_adi yoktur.
deyimi kullanılır. Bir tablo ya da indeks VIEW’ler şu görevler için kullanılır:
alan silindiğinde, indeks de otomatik *Kullanıcıların bazı kritik tabloların
olarak silinmiş olur. sadece belli sütunlarını veya satırlarını
görmesi istendiğinde,
Örnek-9: *Kullanıcıların, çeşitli birim dönü-
Şimdi, oluşturduğumuz indeksi geri şümlerinden geçmiş değerler görmeleri
silelim gerektiğinde,
DROP INDEX Kitap.indKitapNo *Halihazırdaki tablolarda var olan
>>NESNE SİLİNME İŞLEMİ BAŞARI İLE verilerin başka bir tablo formatında

24 BYTE Veritabanı Programlama 1


>>NESNE OLUŞTURMA İŞLEMİ BAŞARI
DİKKAT: İLE YAPILDI
1.MSAccess’de VIEW oluşturulamaz. SQLSer- Veya şu şekilde de oluşturabiliriz:
ver, SyBase, Oracle gibi orta ve büyük ölçekli
VTYS’lerde oluşturulabilir. Örnek-11
2.Bu kısımdaki SELECT komutunu anlamak için, CREATE VIEW vwBTKitaplari AS
öncelikle 3.Ünite’ye göz atmanız önerilir. SELECT *
FROM kitap
WHERE kitapNo > 5
sunulması gerektiğinde >>NESNE OLUŞTURMA İŞLEMİ BAŞARI
*Çok kompleks sorguları basitleştir- İLE YAPILDI
mek için View’ler, tablolar üstünde yapılan bir
Örneğin Kitap tablomuzdaki sadece çok işlemi destekler.
Bilgi Teknolojileri türündeki kitabımızın Örnek:Bir önceki View üstünde
yer alacağı bir VIEW şu şekilde oluşturu- seçme işlemi yapalım: Seçme işlemi de
labilir: ne demek diyorsanız, Lütfen öncelikle
CREATE VIEW view_adi [(kolon1, 3.bölüme bir göz gezdiriniz...
kolon2...)] AS
SELECT tablo1.kolon_adi_1 Örnek-12
FROM tablo_adi; SELECT *
FROM vwBTKitapi
Örnek-10 Bir view, başka bir View’in alanlarına
CREATE VIEW vwBTKitapi(kitapNo,Ki- referans içerebilir. Ya da bir view bir tablo
tapAdi,ISBNNo, SayfaSayisi,Ozeti) ile ilişkisel sorguya girebilir.
AS View’ler şu şekilde silinir:
SELECT kitapNo,KitapAdi,ISBNNo, DROP VIEW view_adi;
SayfaSayisi,Ozeti
FROM Kitap Örnek-13:
WHERE turu = ‘Bilgi Teknolojileri’; DROP VIEW vwBTKitapi;
>>NESNE SİLİNME İŞLEMİ BAŞARI İLE
YAPILDI
DİKKAT:
View’ler sonuç itibarı ile gerçek anlamdaki Veritabanı Tasarımı:
tablolar değildir. Bundan dolayı View’ler İyi bir veritabanı tasarımı yapabilmek
üstünde ekleme veya güncelleme yaparken için yeteneğinizi, bilginizi ve tecrübenizi
çeşitli kısıtlamalar vardır. 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 İPUCU
olarak, 5 Normalizasyon kuralını oku- Tablolara isim verirken mümkünse tekil isimler
manızda fayda vardır. Ancak 5N, tasarım kullanın. Böyle yaparsanız hem daha anlaşılır
aşamasında size yol göstermek yerine bir tasarım yapmış olursunuz hem de daha
hangi şartlara uygun tasarım yapmanız sonra kodlama aşamasında karışıklığın önüne
gerektiğini anlatır. Bazen, bu kurallardan geçmiş olursunuz.
vazgeçmek durumunda kalabilirsiniz Örneğin içinde Kitap ile ilgili bilgiler bulun-
ancak, veritabanında saklanacak verilerin duracak tablonun adını Kitap koymak oldukça
hacmi arttıkça bu kuralların daha sıkı mantıklıdır.
uygulanmasında fayda vardır.

1.Nesneleri Tanımlayın: 2.Her nesne için bir tablo oluşturun:


Herhangi bir proje önünüzde kondu- Her bir nesne için bir tablo oluşturun
ğunda öncelikle nesneleri tanımlayın. ve her bir tabloya içereceği veriyi en iyi
Nesne, çeşitli özellikleri bulunan bir anlatan bir isim verin. Tablo oluşturma
varlıktır. Başlangıçta özellikleri ile ilgilen- işini, bir kağıt üstünde sembolik olarak
meyeceğiz. gösterebilirsiniz veya doğrudan MS
Access, SQL Server, MySQL,Oracle ...gibi
Örnek-14: kullanmakta olduğunuz VTYS üstünden
Birkaç örnek proje için nesneleri vere- de oluşturabilirsiniz. Ama tüm proje
cek olursak, bitinceye kadar bu tablolar üstünde
muhtemel değişiklikler olacaktır.
Kütüphane sistemi: Kitap, üyeler, türler,
ödünç hareketleri 3.Her bir tablo için bir anahtar alan
seçin:
E-ticaret sistemi: Ürünler, müşteriler, Veritabanındaki herhangi bir veriye
siparişler,teslimat, fatura bilgileri,üretici- erişmeden önce tabloya erişilir. Bir verita-
ler,tedarikçiler,dağıtıcılar... banında en çok muhatap olunan nesne
grubu genellikle tablolardır. Buraya kadar
Futbol Ligi: Takımlar, sahalar, oyuncular, hangi tabloları oluşturacağımıza karar
fikstür, hakemler, antrenörler verdik. Her bir tablonun içinde hangi
bilgileri saklayacağımızı kabaca biliyo-
Okul Sistemi: Öğrenciler, öğretmenler, ruz. Bu aşamada, tabloda yer alacak her
dersler, derslikler bir kaydı bir diğerinden ayırabilecek bir
sütuna ihtiyaç duyarız. Örneğin bir kitabı
Sözlük: kelimeler, anlamlar, diller seçmek istediğimizde, bu kitabın hangi

26 BYTE Veritabanı Programlama 1


kitap olacağını öyle bir anlatabilmeliyiz
ki, başka hiçbir kitap ile karışmamalı. İPUCU
Bunu yapmanın tek yolu, bir alanı birincil 1.En başa birincil anahtar olarak belirlediğiniz
anahtar alan olarak belirlemektir. alanı eklemek bir kural değildir, ancak tab-
Anahtar alan seçerken, sizi kısıtlama- lonuzun anlaşılırlığı ve göze hoş görünmesi
dığı sürece, doğal alanlar seçmeye dikkat açısından tercih etmenizin yararınıza olacak bir
etmenizde fayda vardır. Örneğin araçlar tekniktir.
ile ilgili bir tablo yaparken, plakalarını 2. Genellikle,yapay birincil anahtar alanlar
anahtar alan olarak belirleyebilirsiniz. tablo adı ile başlar ve sonunda ID vardır. ogrenci
Çünkü her bir plakadan bir tek araç tra- tablosu için ogrenciID gibi.
fiğe çıkabilir. Bu bizi kısıtlamaz. Öğrenci
tablosu için, öğrenci numarası doğal bir
anahtar alandır çünkü aynı okulda, aynı sıradan adını veren nesnenin her bir özel-
numaradan bir öğrencinin daha bulun- liği için bir alan(sütun) ekleyin.
ması söz konusu değildir. Örneğin, kitap için;
Kitap tablosu için ISBN numarasını Kitap no, ISBN no, kitap adı, yazarı,
anahtar alan olarak tanımlayabilirsiniz türü, sayfa sayısı, özeti, fiyatı, baskı yılı...
ama, elinizde aynı kitaptan iki adet oldu- Üye için;
ğunda, ISBN numarası sizi kısıtlayacaktır. UyeNo, adı, soyadı, e-mail adresi, ev
elinizde iki adet ‘Önümüzdeki Yol’ kitabı telefonu, cep telefonu, iş telefonu....
varsa, her iki kitabın da ISBN numarası Bu noktada, sizden istenen proje ile
aynıdır.Kitapdan biri eski biri yeni olabi- ilgili basılı formlar vs. varsa, bir göz atma-
lir.Bu bir kargaşaya neden olabilir. Çünkü nız hangi özelliklerin yer alması gerektiği
eski kitabı kime, yeni kitabı kime verdiği- konusunda karar vermenize yardımcı
nizin takibini ISBN numarası ile mümkün olacaktır.
değildir. Ancak bir E-Ticaret sitesi tasar-
larken, stoktaki tüm kitaplar birbiri ile 5.Tekrarlayan nesne özellikleri için ek
eşdeğer olacağından ya da öyle olduğu tablolar oluşturun
varsayıldığından ISBN numarası birincil Aklınızda hep şu olmalı: veri tekrarı
anahtar alan olabilir. Bu durumda, adet olacak mı? Veri tekrarı olacaksa bir yer-
diye bir niteliğin aynı tabloda yer alması lerde hata yapıyorsunuzdur. Elinizdeki
gerekecektir. tablonun en az bir tabloya daha ayrılması
gerekiyor demektir.
4.Nesnelerin gerekli her bir özelliği Şunu da unutmayın, her projeye
için tabloya bir sütun ekleyin: uyacak evrensel bir veritabanı tasarım
Tablo adlarını tamamladıktan ve anahtar tekniği yoktur. Yani her şey sizin belli
adlarını belirledikten sonra, tablolarınıza kurallar etrafında ne kadar teferruatlı

Veritabanı Programlama 1 BYTE 27


düşünebildiğinize bağlıdır. Böylelikle, hiçbir türde yer almayan kitap-
Örneğimizde, her bir kitap için tür tan 10 ayrı türde yer alan kitaba kadar
belirledik ama, bir kitap hem kişisel bütün olasılıklar için bir çözüm geliştir-
gelişim kategorisine hem de hikaye miş oluruz.
kategorisine girebilir. Ya da e-ticaret sis-
teminde bir ürünün birden fazla reyonda 6.Anahtar Alana Bağlı Olmayan
yer alması gerekli olabilir. Veya bir kitap Alanları Belirleyin
birden fazla kişi tarafından yazılmış ola- İlişkisel veritabanında, tablodan herhangi
bilir.. bir tek kayda erişmek için mutlaka bir
Bir kitap için birden fazla türü kayde- farklı özellik sağlanmalıdır ve bu özellik
debilmeyi ele alalım: de anahtar alan tarafından sağlanır.
Bu türden bir sorunu çözmek için ilk Ancak bazen, anahtar alan ile aynı satırda
akla gelen şey, Kitap için, 2.Tür,3.Tür diye yer aldığı halde, anahtar alan ile birebir
iki alan daha eklemek. Ama çoğu kitap ilişkisi olmayan bir alan yer alabilir. Bu
bir tek türdendir ve bu kitap için 2 alan türden alanları elimine edip ayrı tablolara
hep boş kalacaktır. Öte yandan, 4 türe ayırmak gerekir.
birden giren bir kitap olduğunda 4.tür Örneğin, ödünç tablosunu ele alacak
bilgisini nereye yazacağız? Aynı alana olursak, ödünç verdiğimiz her kitabı
mı? Ya da dört adet bölüm mü açacağız? ödünç alanın adresini de bilmek istediği-
Bunlar, veritabanı tasarımının doğasına mizde, bunu ödünç tablosuna yazamayız.
terstir. Çünkü ödünç tablosunun birincil anahtar
2.Çözüm yolu ise, bir kitabı iki kere alanı oduncNo’dur ve bu alan, ödünç
kaydedip, birincisini, ‘Kişisel Gelişim’ verme işlemi ile ilgilidir. Oysa ödünç
türü olarak; ikincisini de ‘Hikaye’ olarak alanın adresi, ödünç alan kişinin ken-
girmek. Ancak bu durumda da diğer bil- disine bağlı bir özelliktir. Bu kişinin her
giler tekrar edecektir. Ya da bir süre sonra, aldığı kitap için adresini tekrar yazmaya
kitap hakkında girilen bilgilerin yanlış gerek yoktur. Aynı şekilde otomasyon
olduğunu fark ettiniz. Hangi kaydı gün- içerisinde başka yerlerde de bu kişinin
celleyeceksiniz? Ya birini düzeltip birini adres bilgilerine muhtemelen ihtiyaç
unutursanız? Sonuçta veri tekrarı ve veri duyulabilir çünkü adres, üyenin bir özel-
bütünlüğünün bozulması söz konusudur. liğidir.
Bu da yine ilişkisel veritabanı tasarımının Ödünç verilen kitabın adresini bilmek
doğasına terstir. istediğimizde, üyeler adında bir tablo
Bu durumda, türler diye bir yeni tablo daha açıp, burada herkesin adresini
oluşturup, bir de kitap_turler diye 2. tutmak durumundayız demektir. Ödünç
tablo’ yu oluşturduktan sonra bu türden tablosunun ise, oduncAlan bilgisi olarak,
bilgileri burada tutmak gerekecektir. Üyeler tablosunun birincil anahtar ala-

28 BYTE Veritabanı Programlama 1


nına bir bağlantı (yabancı anahtar) içer-
mesi daha doğru olur. İPUCU
Farklı tablolardaki iki alan aynı veriyi tutuyorsa,
7.Tablolar arasındaki ilişkileri iki alana da aynı adı vermek, karışıklığa yol
tanımlayın. açabilir gibi görünse de aslında daha düzgün
Her biri bir nesneye dair özellikleri barın- bir yapı ortaya çıkar. KitapNo alanı, Kitap tablo-
dıran tabloların tümünü göz önüne alın ve sunda da ödünç tablosunda da kitap numarası
birbirleri ile olan ilişkilerini tanımlamaya tutmaktadır. Bu alanlardan birine kitapNo
çalışın. Örneğin kitabı ödünç veririz. Bu diğerine oduncGidenKitapNo demek, kafa
durumda, ödünç tablosu ile Kitap tablosu karışıklığına neden olabilir. En mantıklısı her
ilişkili olacaktır. Kitap üyelere ödünç verilir. ikisine de kitapNo demektir.
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 Veritabanı Normalizasyonu
olması gerekir.
Uyeler.uyeNo(1)---(∞)odunc.uyeNo
Aslında ilişkisel veri tabanı tasarımından ziyade, bir
Örnek-15: Tur.turNo(1)---(∞)Kitap_tur.turNo
tablo içerisinde yer alacak kaydın nelerden oluşma-
Bizim projemizdeki nesneler (tablolar) Kitap.kitapNo(1)---(∞)Kitap_tur.kitapNo
sına karar vermeye yarayan normalizasyon kuralları
arasında aşağıdaki ilişkiler yer almaktadır: Yazar.yazarNo(1)---
başlı başına bir işlemdir. Sonuç (∞)kitap_
itibari ile veritabanı
Kitap.kitapNo (1)----(∞) odunc.kitapNo yazar.yazarNo
tasarım aşamasında gerekli bir işlem olduğundan bu
İki tablo
bölüme almayıarasında
uygun bulduk.ilişkiyi
Genelsağlayan
kabul görmüş alan-
ların aynı addakuralı
5 normalizasyon olmasıvardır.zorunluluk
Burada her birdeğildir.
kuralı
Teorik olarak
tam olarak tabloları
anlatmak mümkün istediğiniz herhangi
değildir. Ancak bu
iki kurllar,
alanları üstünden
ilişkisel veritabanının birleştirebilirsiniz.
tanımı ile birlikte ortaya
Ancak, türler
konmuştur. Özettablosundaki
olarak fikri vermesitürNo
açısındanileyer
üyeler
tablosundaki
verilmiştir. uyeNo alanını birleştirdiği-
1. Normalizasyon
nizde hiçbir işinize Kuralı:
yaramayacak anlamsız
birBirilişki ortaya
satırdaki koymuş
bir alan yalnızca birolursunuz.
tek bilgi içerebilir.
Bu ilişkileri
Örneğin analiz ederken,
kitap tablosunda, her bir
birden fazla yazarı olan
alanın hangi
kitap için tablo
yazar1, yazar2,için birincil
yazar3 anahtar
diye alanlar açsaydık,
alan, hangi
bu kurala tabloolurduk.
uymamış için yabancı anahtar
Böyle bir durumda,
olduğunu
ayrıca yazarlar nottablosu
etmeniz, daha kuralı
da oluşturarak sonra fizik-
çiğne-
Bu kısımda anlatılanlar doğrultusunda örnek projemizin selmemiş
olarak veritabanını tasarlarken işinizi
oluruz.
SQL Server 2000 üstünde görünen diyagramı. İlişkili kolaylaştıracaktır.
Genellikle yapılanHatta hata: bu bilgileri bir
her iki tablo bir birincil alan ve bir yabancı anahtar alan şema Verileri
üstünde virgülde
veyagösterebilirsiniz. İşte bir
bir başka karakter ile ayırıp
üstünden birbirine bağlanır. Aynı diyagramın bir benze- çokaynıVTYS
alanatarafından
girmek. Daha sonrasağlanan
programörnek
içerisindebir
rini MS Access ile de gerçekleştirebiliriz. şema:

Veritabanı Programlama 1 BYTE 29


split ile bu değerleri ayırmak. Ancak bu ilişkisel veritaba- durumda kitabın adı, kişisel gelişim hikayeleri olurdu her
nının doğasına terstir. halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz?
2. Normalizasyon Kuralı: 4.Normal formu sağlamak için, her bağımsız bire çok
Bir tablo için, anahtar olmayan her alan, birincil anahtar ilişki için ayrı bir tablo oluşturmak gerekir.
olarak tanımlı tüm alanlara bağlı olmak zorundadır. Bu örnekte, türler diye bir tablo açmamız gerekiyor.
Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese Daha sonra kitapTurleri diye bir başka tablo daha açma-
idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi mız gerekiyor. ‘Kişisel Gelişim Hikayeleri’ adlı kitap için,
olacaktı ve oduncNo’na bağlı bir nitelik olmayacaktı. öncelikle kitap numarası, Hikaye bölümünün kodunun
Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak yer aldığı bir satır; ardından da yine kitap numarası,
sorunu çözdük. ardından da kişisel gelişim türünün kodunun aldığı yeni
Ya da anahtar alanın birden fazla alandan oluştuğu bir satır daha eklemek gerekir.
tablolarda, anahtar alanlardan sadece birine bağlı veriler, 5. Normalizasyon Kuralı:
tabloda yer almamalı, ayrı bir tabloya taşınmalıdır. Tekrarlamaları ortadan kaldırmak için her bir tabloyu
Bunun tersi de geçerlidir. Yani iki ya da daha fazla mümkün olduğunca küçük parçalara bölmek gerekir.
tablonun birincil anahtarı aynı olamaz. Şayet böyle ise, Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar
bu iki tablo tek tabloya indirilmelidir. kapsamında olmayan tekrarlamalar da 5 normalizasyon
3. Normalizasyon Kuralı: kuralı ile giderilir.
Bir tablo için, anahtarı olmayan bir alan, anahtarı olma- Örneğin, kitaplarımız için bir edinme şekli bilgisi
yan başka hiç bir alana bağlı olamaz. Örneğin, kitapları- girilecek sütun eklemek isteyelim: Bu bölüme girilebile-
mız için cilt tipi adında bir alan ekleyip burada da karton cek bilgiler bellidir: Bağış veya satın alma.
kapak için K, deri cilt için D, spiral cilt için S yazsaydık, Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle,
bu kodlama, kitap tablosunun birincil anahtarı olan kullanıcıların bu alan gelişi güzel bilgiler girmesini
kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü engellemiş oluruz. Bu da sorgulama esnasında verile-
bu kodlama bir başka anahtarı olmayan alana bağlıdır. rimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda,
Bunun sonucunda da veritabanımızda, karşılığı olmayan tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler
bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu başka bir tabloya taşınmış olur. Bu tablo için, veritabanı
olarak tutan alan aslında cilt tipi açıklaması olan başka programlamada ‘look-up table’ terimi kullanılır.
bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır. Ancak, veritabanı normalizasyon kuralları, bir
Bu durumda, ciltSekli adında bir tablo açmamız ilişkisel veritabanının tasarlanma aşamalarını değil de
gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli ilişkisel veritabanında yer alacak kayıtların ilişkisel verita-
olmalıdır. Ancak bundan sonra, kitaplar tablosunda banı ile uyumlu olup olmadığını denetlemeye yöneliktir.
ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi
yazabiliriz. barındırmalıdır.
4. Normalizasyon Kuralı: * Veri tekrarı yapılmamalıdır.
Birincil anahtar alanlar ile anahtarı olmayan alanlar * Boş yer mümkün olduğunca az olmalıdır.
arasında, birden fazla bağımsız bire-çok ilişkisine izin * Veri bütünlüğü sağlanmalıdır.
verilmez. Örneğin, tablomuzda yer alan bir kitap hem * Veriler, aralarında bir ilişki tanımlanmaya müsait
hikaye kitabı hem de kişisel gelişim kitabı olabilir. (Bu olmalıdır.
3. Bölüm
SQL Veri İşleme Dili ORDER BY sıralamanın yapılacağı
(Data Maniplation Language) alan_adi1 ASC|DESC, alan_adi2 ASC|-
Veri İşleme Dili, verinin şablonu üstünde DESC , ....
değişiklik yapmaz. Sadece var olan tablo- WHERE koşullar
lardaki bilgileri uygun şekilde raporlamak [alan_adi IN (veri kümesi) | (SELECT
(SELECT), yeni kayıtlar eklemek (INSERT), işlemi)]
kayıtlar üstünde güncelleme yapmak(- [alan_adi BETWEEN değer1 AND
UPDATE) ve kayıtları silmek (DELETE) için değer2]
kullanılır. Veri İşleme Dili sadece veritaba- [alan_adi LIKE ‘%ifade ? _* %’]
nında kaydı tutulan bilgilerle ilgilenir. Bu [tablo_adi1.alan_adi = tablo_adi-
bilgilerin nasıl tutulduğu ile ilgilenmez. 2.alan_adi]
[alan_adi matematiksel operatör
1.RESULTSET(RECORDSET, DATASET) ANY|SOME|ALL (SELECT işlemi)]
VTYS’de bir sorgu çalıştırıldığında, tablo [EXISTS|NOT EXISTS (SELECT işlemi)];
mantığında bir sonuç üretir. Bu sonuca
ResultSet denir. Bir ResultSet, birden fazla En Basit SELECT
tablodan kayıt içerebilir. Bir ResultSet’in En basit olarak bir tablodaki tüm
içeriği, veritabanı programları geliştirilir- kayıtları seçmek için,
ken, ADO nesnelerinden RecordSet içeri- SELECT alan1[,alan2, alan3,..... | *]
sine aktarılır ve veriler program içerisinde FROM tablo_adi;
bu nesne aracılığıyla yönetilir. ADO.NET Yapısı kullanılır.
içerisinde ise ResultSet’ler (birden fazla
recultSet) ADO.NET içerisinde ise DataSet Örnek-1:
denilen nesnelere aktarılabilir . RecordSet Kitaplar tablosundaki tüm kayıtları
ve DataSet konusu, sonraki kitapçıkta seçelim:
teferruatlı olarak incelenecektir. SELECT * FROM Kitap

2.SELECT Koşula bağlı SELECT ve WHERE Yapısı:


SELECT [DISTINCT] { * | alan_adi1, alan_ Bazı koşullara uyan bilgileri almamız
adi2, ....., [SUM(alan_adi)], [AVG(alan_ gerekebilir. Bu durumda WHERE cümle-
adi)], [MAX(alan_adi)], [MIN(alan_adi)], ciğini takip eden kısımda, bu şartı belir-
[COUNT( * | alan_adi)]} tebiliriz.
FROM tablo_adi1, [tablo_adi2], ... SELECT alan1[,alan2, alan3,..... | *]
LEFT [OUTER] JOIN | RIGHT [OUTER] FROM tablo_adi
JOIN |INNER JOIN WHERE şart1[AND şart2[OR şart3[NOT
GROUP BY {alan_adi} şart4]]];
HAVING koşul

32 BYTE Veritabanı Programlama 1


Örnek-2:
KitapNo 12’den büyük olan kitapları Matematiksel
seçelim: Karşılaştırma İşaretleri:
SELECT * FROM Kitap Koşullarda, verilerin durum Matematiksel
WHERE kitapNo>12; Karşılaştırma İşaretleri kullanılarak ifade edilir.
Bu işaretler Şunlardır:

=: Eşittir

>: Büyüktür

Örnek-3: <: Küçüktür


Sayfa sayısı 200’den fazla olan ve kitap
numarası da 12’den büyük olan kitapların >=: Büyüktür veya Eşittir(Büyük-Eşit)
listesi:
SELECT * FROM Kitap <=: Küçüktür Veya Eşittir(Küçük-Eşit)
WHERE kitapNo > 12 AND sayfaSayisi
> 200; <>: Eşit Değildir

!=: Eşit Değildir

Mantıksal İşaretler LIKE: bkz Like


Birden fazla koşula göre seçme işlemi
yapılırken, AND, OR, NOT mantıksal ope-
ratörlerinden faydalanılır. kaynaklardan detaylı olarak bakmanızda
Mantıksal fonksiyon tabloları şu şekil- yarar olabilir. Ancak bu iki komut pek
dedir: nadir kullanılmaktadır.
AND İŞARETİ:Şartlardan her ikisini de
sağlayan kayıtları seçmek için kullanılır..
OR İŞARETİ: Şartlardan en az birinin X(Şart)NOT X(Şartın tersi)
sağlanması halinde, kayıtlar seçilir. 0
NOT İŞARETİ: Şartı sağlamayan kayıt- 1(Seçilir)
ları bulmak için kullanılır. 1
Bu fonksiyonların dışında XOR ve 0(Seçilmez)
XNOR işlemleri de bazı VTY’leri tarafın-
dan desteklenmektedir. Bu iki komutla
ilgili bir işleme ihtiyaç duyarsanız başka

Veritabanı Programlama 1 BYTE 33


kitapNo kitapAdi ISBNNo sayfaSayisi kitapOzeti

Visual Basic.NET konusunda temel geçis bilgilerini


1 Visual Basic.NET 0-672-32203-X 204
içeren bir kitap.

Telkin ve Hipnoz ile


2 975-6700-15-7 274 Öğrenme ve sınav konusunda hipnoz tekniği
Ögrenme Teknikleri

Yatırım yapmak için nereden başlamalı, neler


3 Yatırım Planı Yapma 975-381-263-9 74
yapmalı...

4 İş Başında Duygusal Zeka 975-434-224-5 447 Duygusal zekanın iş ve yaşam konusundaki etkileri

Hayat Yolunda Zorluklarla


5 975-362-135-3 119 Hayat yolunda zorluklarla mücadele
Mücadele

6 İş Hayatında Motivasyon 975-8243-98-5 140 İş başında motivasyon

İş hayatımdan Kesitler ve
7 975-8243-92-6 214 Üzeyir Garih’in hayatından kesitler
Gençlere Tavsiyeler

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

Marka Yaratmanın 22 Marka olmaya karar verenlerin okuması gereken


11 975-8378-30-9 164
Kuralı 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


SELECT * FROM Kitap
X(1.Şart)Y(2.Şart) WHERE kitapNo > 12
SONUÇ(X AND Y) AND sayfaSayisi > 200
0 OR KitapAdi=’Visual Basic.NET’;
0
0(Seçilmez)
1
0
0(Seçilmez)
0
1 Örnek-5:
0(Seçilmez) Kitap No 12’den büyük olan veya,
1 sayfa sayısı 200’den büyük olan veya adı
1 ‘Visual Basic.NET’ olan ama ISBN NO
1(Seçilir) ‘975-316-622-2’ olmayan kitapların listesi:
SELECT * FROM Kitap
WHERE (kitapNo > 12 AND sayfaSayisi
> 200 OR KitapAdi=’Visual Basic.NET’)
X(1.Şart)Y(2.Şart)SONUÇ(X OR Y) AND ISBNNO <> ‘975-316-622-2’;
0
0 Sadece Belli Alanları Seçmek:
0(Seçilmez) Bir sorguda illa da tabloda yer alan tüm
1
0
1(Seçilir)
0
1 sütunları görmek zorunda olmayabiliriz.
1(Seçilir) Sadece ihtiyacımız olan alalardaki verileri
1 seçmek için, SELECT’ten sonra bu alan-
1 ların adını araya virgül koyarak yazarsak,
1(Seçilir) sadece bu alandaki veriler gelir.

Örnek-6:
Örnek-4: select uyeNo,adi,soyadi
Kitap No 12’den büyük olan veya, FROM uye;
sayfa sayısı 200’den büyük olan veya adı
‘Visual Basic.NET’ olan kitapların listesi:

Veritabanı Programlama 1 BYTE 35


DISTINCT:
Birden fazla tekrarlayan kayıt döndü- İPUCU
ren SELECT işlemlerinde, her bir kaydın Birden fazla şartın yer aldığı koşullarda paran-
tekil olarak yer almasını istiyorsak DIS- tez kullanılarak şartların sırası değiştirilebilir,
TINCT deyimi kullanılır. mantıksal operatörlerin etkileyeceği şartlar
sınırlandırılabilir.şekilde tercih etmek okunur-
luğu artıracaktır.

Örnek-8:
1,5 ve 6 nolu kitapların ödünç hare-
ketlerini 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.

İç içe SELECT yapısı:


Örnek-7: Bazen bir sorgunun içinde başka bir
Üye tablosundaki isim- sorgu yer alabilir.
lerin tekil bir listesini almak DİKKAT:
isteyelim: İç içe SELECT özelliği bazı küçük ve
SELECT DISTINCT adi orta ölçekli VTYS’lerde desteklenmemek-
FROM uye; tedir.
Üyelerimizden adaş olan-
ları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


Örnek-9:
Dışarıdaki kitaplarımızı bulmak ister- ANY, SOME, ALL
sek: Bazı iç içe sorgularda, SOME, ANY
Dışarıdaki kitapların numaralarını veya ALL deyimi ile dışarıdaki SELECT
ödünç tablosundan çekecek bir sorgu ifadesinin seçeceği kayıtlar karşılaştırma
yazalım(GeldiMi=0 olan kitaplar dışarıda kriterine göre kullanılabilir.
olan kitaplar. Birileri tarafından ödünç ANY veya SOME :Dışarıdaki SELECT
alınmış ve henüz iade edilmemiş demek- ifadesi sonucunda çıkacak kayıtlar,
tir.) içerideki SELECT ifadesi ile seçilen alan
SELECT kitapNo FROM odunc WHERE değerlerinden en az birine göre kıyası
geldiMi=0 sağlıyorsa ( küçük,büyük, eşit, büyük eşit,
Ve bu sorguyu, kitaplar tablosundan, küçük eşit) seçilir.
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ı Örnek-11:
bulalım: 3,5 ve 11 nolu kitapların herhangi
İçerideki kitaplar, dışarıda olmayan birinden kalın olan ve kitap no da 11’den
kitaplardır. Bundan dolayı da yuka- büyük olan kitapların listesini bulalım:
rıda içerde kullandığımız sorgu aynen SELECT kitapNo,kitapAdi,sayfaSayisi
duracak ama bu sefer kitap numaraları FROM Kitap
bunlara eşit olmayan kitapların listesini WHERE sayfaSayisi > ANY( SELECT
bulacağız. sayfaSayisi
SELECT * FROM Kitap
FROM Kitap WHERE kitapNo IN(3,5,11)
WHERE kitapNo NOT IN( )
SELECT kitapNo FROM odunc WHERE AND kitapNo>11
geldiMi=0
); 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 SELECT *
kıyası sağlıyorsa ( küçük,büyük, eşit, İle başladığına dikkat edin. Bu hep bu
büyük eşit, küçük eşit) seçilir. şekilde kullanılır.

Ö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 Örnek-13:
WHERE kitapNo IN(3,5,11) 5 no’lu kitap ödünç verildi ise kitap
) no’sunun ve kitap bilgilerini seçelim:
AND kitapNo>11 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
EXISTS, NOT EXISTS veri tipinde sütundan oluşan (eş değer)
EXISTS kullanıldığında, dışarıdaki sor- sonuçlar veriyor olması gerekir.
guda, bir veya daha fazla kayıt dönerse, Genel kullanımı şu şekildedir:
dışarıdaki sorgu çalıştırılır. Hiç kayıt 1.SELECT İFADESİ....
dönmezse, dışarıdaki sorgu çalıştırılmaz. UNION
NOT EXISTS ise içerideki sorgunun sonu- 2.SELECT İFADESİ....
cunda 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 ifade-
sinin

38 BYTE Veritabanı Programlama 1


Örnek-14: KESİŞİM BULMA:
Sisteme kayıtlı kişilerin bir kısmını İki tablonun veya iki SELECT sorgusu-
(kitap yazarları ve üye isimlerini) bir tek nun sonucunun kesişimini bulmaya yarar.
listede görmek isteyelim: Yani her iki tabloda da bulunan kayıtları
Yazarlardan ilk 2’sini seçelim: bulma işine KESİŞİM denir.
SELECT adi,soyadi Birkaç yolu vardır:
FROM yazar
WHERE yazarNo < 3; Örnek-15:
Hangi yazar isimleri aynı anda üye adı
olarak da yer almaktadır?
Şu isimler Yazarlar tablosunda bulun-
maktadır:

Üyelerin ilk 2’sini seçelim:


SELECT adi,soyadi
FROM uye
WHERE uyeNo < 3; Şu isimler üyeler tablosunda bulun-
SELECT adi,soyadi maktadır:
FROM yazar
WHERE yazarNo < 3
UNION
SELECT adi,soyadi

SELECT adi
FROM yazar
WHERE EXISTS
(SELECT *
FROM uye FROM uye
WHERE uyeNo < 3; 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: ekranlarında çok büyük dertlerden kur-
Hangi kitaplar ödünç verilmemiştir? tarabilir.
SELECT *
FROM Kitap BETWEN.... AND....
WHERE kitapNo NOT IN( Bir Aralık içersinde sorgulama yapmak
SELECT kitapNo FROM odunc WHERE için BETWEEN altSinir AND ustSinir şek-
geldiMi=0 lindeki yapı kullanılır.
);

Örnek-17:
Şu ifade tüm kayıtları seçecektir.
SELECT * Örnek-19:
FROM Kitap Sayfa Sayısı, 300 ile 500 arasındaki
WHERE 1=1; Kitapların listesini almak istediğimizde,
Çünkü 1=1 doğru bir ifadedir. SELECT *
FROM Kitap
Örnek-18: WHERE sayfaSayisi>300 AND sayfaSa-
Şu ifade, hiç bir kaydı seçemez. yisi < 500;
SELECT * Yerine
FROM Kitap SELECT *
WHERE 1=0; FROM Kitap
Çünkü 1=0 doğru değildir. WHERE sayfaSayisi BETWEEN 300 AND
Bu iki durum, veritabanı programları 500; de diyebiliriz.
yazarken özellikle arama-sorgulama

İPUCU
Bir WHERE cümleciğinden sonra gelen şart
ne olursa olsun, doğru olduğu sürece SELECT Karakter Karşılaştırmaları:
kısmından sonra gelen kısım çalıştırılır. Bu Karakter ifadelerin (tarih ve metin tipli
şartta yer alan değerlerden bir tarafın illa da veriler) karşılaştırması da rakamlarla
alanlardan biri olması gerekmez. İkisi de sabit aynıdır.
birer değer olabilir. 1=1 doğru bir şarttır. Bunun
tersi de geçerlidir. Yanlış bir şart varsa, SELECT’i Örnek-20:
takip eden alanlar asla seçilmez 1=0 yanlış bir Adı Önümüzdeki Yol olan kitabı
şarttır. seçmek için
SELECT *

40 BYTE Veritabanı Programlama 1


FROM Kitap
WHERE kitapAdi= ‘Önümüzdeki Yol’; Joker Karakterler
Kullanılabilir. %: 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
Ancak karakter ifadelerin nasıl yazıl- sistemde)
dığı ve içeriğinin tam olarak ne olduğunu ?: Bir tek harf veya rakam yerini tutar (Bazı
birebir kestirmek zor olduğu için, bazen diğer sistemlerde)
seçimi genişletmek üzere = yerine LIKE [ABC]: Herhangi bir harf yerine gelebilecek
deyiminden de faydalanılır. harfleri belirtir.(SQLServer,Sybase)
[^ABC]: Herhangi bir harf yerine gelemeyecek
LIKE harfleri belirtir.(SQL Server, Sybase)

Örnek-21:
Adı Önümüzdeki Yol olan kitabı LIKE
komutu ile seçmek için
SELECT *
FROM Kitap FROM Kitap
WHERE kitapAdi LIKE ‘Önümüzdeki WHERE kitapAdi LIKE ‘%Yol%’;
Yol’;
Aslında bu yapının bir önceki örnek- Örnek-23:
ten bir farkı yok. Ancak takip eden örnek- Adının ilk harfi ‘Y’ olan üyelerin listesi.
lerde, LIKE2in avantajlarını öğreneceğiz. Tüm üyelerin listesini görmek için:
SELECT *
Joker Karakterler: FROM uye
Seçimi biraz genişletelim ve adında ‘yol’ WHERE Adi LIKE ‘Y%’;
geçen Kitapları listelemek istesek?Bu
durumda joker karakterleri kullanmamız
gerekecektir. ‘%’ ve ‘_’ veya ‘?’ karakterle-
rine joker karakterler denir.

Örnek-22: Örnek-24:
Adında yol geçen kitapların bir liste- Adının Son harfi ‘R’ olan listesini
sini alalım: kitapların listesini alalım:
Tüm kitapların listesini görmek için:
SELECT *

Veritabanı Programlama 1 BYTE 41


Tüm kitaplar için:
SELECT * DİKKAT:
FROM Kitap Joker karakterler ‘=’ ile kullanılamaz. Sadece
WHERE kitapAdi LIKE ‘%R’; LIKE ile kullanılabilir.

Örnek-25:
İkinci harfi ‘A’ olan Kitapların listesi: FROM Kitap
SELECT * WHERE kitapAdi LIKE ‘_[^ESRIN]%’;
FROM Kitap
WHERE kitapAdi LIKE ‘_A%’; Null Karşılaştırma
Şeklinde arama yapabiliriz. Bazen bir alana değer girilmiş olup olma-
dığı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
Örnek-26: 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:
İkinci harfi A, B, D veya C’den biri olan ISBN numarası olmayan kitapların
Kitapların listesi listesi:
SELECT * SELECT *
FROM Kitap FROM Kitap
WHERE kitapAdi LIKE ‘_[AE]%’ WHERE ISBNNo IS NULL;

Örnek-27:
İkinci harfi E, S, R, I ya da N den biri
olmayan kitaplarının listesi
SELECT *

42 BYTE Veritabanı Programlama 1


3.ORDER BY SELECT *
SELECT işlemi ile elde edilen sonucun bir FROM yazar
alana göre sıralanmış olarak listelenmesini WHERE soyadi LIKE ‘%e%’
isteyebiliriz. Bu durumda ORDER BY deyimi ORDER BY soyadi,adi
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ı İPUCU
isteniyorsa, mutlaka DESC kullanılmak Sıralama yapılan sütunların mutlaka seçilen
zorundadır. sütunlar arasında yer almasına gerek yoktur.

Örnek-29:
Soyadında ‘e’ geçen yazarları alfabetik
sıralatalım; Öncelikle soyadlara göre sıralan-
sın, soyadı aynı yazarlar için de ada bakılsın: Örnek-30:
SELECT * Soyadını seçme-
FROM yazar den de soyadına
WHERE soyadi LIKE ‘%e%’ göre sıralayabiliriz:
SELECT yazar-
No,adi
FROM yazar
WHERE adi LIKE
‘%e%’
ORDER BY soyadi
DESC,adi

Veritabanı Programlama 1 BYTE 43


4.GROUP BY Örnek-32:
Bazen verileri gruplandırarak işlem yapmak Bir önceki örneği alana takma ad ile
zorunda kalabiliriz. Genellikle veriler grup- yaparsak:
landığında her bir grup için şu işlemlerden SELECT SUM(sayfaSayisi) as TOPLAM
biri yapılmak isteniyor demektir; grup top- FROM Kitap;
lamı, 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.
AVG(sutun_adi):İstenilen bir sütun için
Gruplamalı Fonksiyonlar ortalama değeri hesaplamada kullanılır.
(Aggregate Functions): Sayı türü veriler için geçerlidir.
SUM(sutun_adi): İstenilen bir sütundaki
değerlerin toplamını verir. Sayı türü olan Örnek-33:
veriler için geçerlidir.

Örnek-31:
Kitaplığımızda toplam kaç sayfa kitap
olduğunu bulmak istersek (bkz. karşıdaki
tablo):
SELECT SUM(sayfaSayisi)
FROM Kitap;
>>3611
Kitaplığımızdaki her bir kitap için orta-
Alana Takma Ad (Alias): lama sayfa sayısı (Aritmetik ortalama):
Bazı durumlarda, sorgu sonucunda yer SELECT AVG(sayfaSayisi) AS ORTA-
alan bir alanın adını farklı bir ad olarak LAMA
kullanmak isteyebiliriz. Bu tür durumlarda FROM Kitap;
alan adından sonra AS deyimi gelir ve MAX(sutun_adi): Referans sütuna
takma ad belirtilir. göre en büyük değeri bulmada kullanılır.
BIT türden alanlarla birlikte kullanılmaz.

44 BYTE Veritabanı Programlama 1


sayfa-
kitapNo kitapAdi ISBNNo turu kitapOzeti
Sayisi

Visual Basic.NET
konusunda temel geçiş
1 Visual Basic.NET 0-672-32203-X Programlama 204
bilgilerini içeren bir
kitap.

Ögrenme ve sınav
Telkin ve Hipnoz ile
2 975-6700-15-7 Kişisel Gelişim 274 konusunda hipnoz
Öğrenme Teknikleri
tekniği

Yatırım yapmak için


3 Yatırım Planı Yapma 975-381-263-9 İş dünyası 74 nereden başlamalı, neler
yapmalı...

Duygusal zekanın iş ve
4 İş Başında Duygusal Zeka 975-434-224-5 Kişisel Gelişim 447 yaşam konusundaki
etkileri

Hayat Yolunda Hayat Yolunda Zorluk-


5 975-362-135-3 Kişisel Gelişim 119
Zorluklarla Mücadele larla Mücadele

6 İş Hayatında Motivasyon 975-8243-98-5 İş dünyası 140 İş başında motivasyon

İş Hayatımdan Kesitler ve Üzeyir Garih’in


7 975-8243-92-6 Kişisel Gelişim 214
Gençlere Tavsiyeler hayatından kesitler

Perl CGI konusunda


8 PERL ile CGI 975-316-609-5 Programlama 247
kaynak kitap

9 Front Page 2000 975-316-565-7 Programlama 349 Front Page

Aborijin aileleri,
10 Bir Çift yürek 975-7800-25-2 Hikaye 225
Avustralya’nın yerlileri

Marka olmaya karar


Marka Yaratmanın 22
11 975-8378-30-9 İş dünyası 164 verenlerin okuması
Kurali
gereken bir kitap

12 Simyacı 975-510-682-0 Hikaye 166 Simyacı

Bellek geliştirme
13 Bellek Geliştirme 975-503-069-7 Kişisel Gelişim 224
konusunda bir kurs kitabı

Bir Harvard işletme


14 Müşteri Bağlantıları 975-316-622-2 İş dünyası 292
kitabı

Yöneticiler için iyi bir


15 İnsan Yönetme Sanatı 975-8243-00-4 İş dünyası 144
kitap

BT dünyasının
16 Önümüzdeki Yol 975-509-170-X BT 328 geleceğine dair Bill
Gates’in görüşleri

Veritabanı Programlama 1 BYTE 45


Örnek-34: STDDEV(grup_adi): Grup standart
Kitaplığımızdaki en kalın kitap: sapmasını bulur.
SELECT MAX(SayfaSayisi) AS EnKa-
linKitap COUNT(*): Kayıtların tamamını
FROM Kitap; 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

COUNT(sutun_adi): Referans sütuna


MIN(sutun_adi): Referans sütuna göre toplam kaç kayıt yer aldığını bulur.
göre en küçük değeri bulmada kullanılır.
BIT türden alanlarla birlikte kullanılmaz.

Örnek-35: İPUCU
Kitaplığımızdaki en ince kitap: COUNT(*) ile COUNT(sutun_1) arasındaki fark:
SELECT MIN(SayfaSayisi) AS EnInce- COUNT(*) tüm kayıtların sayısını verirken,
Kitap COUNT(sutun_1) sadece sutun_1 adlı alan için
FROM Kitap; NULL olmayan kayıtların sayısını verir.
Pek kullanılmasa da şu iki fonksiyon
da gruplamalı fonksiyondur.
Örnek-37:
Yazarlar tablosunda, tüm yazarla-
rı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
VARIANCE(sutun_adi): Grup varyan- SELECT COUNT(dogum)
sını bulur. FROM yazar;
>> 0

46 BYTE Veritabanı Programlama 1


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; Örnek-40:
>>6 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ır-
mamak 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 SELECT turu,SUM(sayfaSayisi) AS


fonksiyonların gruplar üstünde nasıl kul- grupBasiToplamSayfa
lanıldığına yakında bakalım. FROM Kitap
GROUP BY turu;
Örnek-39:
Elimizdeki Kitapları türüne göre grup- Örnek-41:
landırdığımızda, her bir grupta kaç kitap Elimizdeki kitapları türlerine göre
yer alıyor? grupladığımızda her bir tür için orta-
SELECT turu,COUNT(*) lama kitap sayfa adedini bulalım ama
FROM Kitap sayfa sayısı 400’den fazla olan Kitapları
GROUP BY turu; 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(SayfaSa-
yisi) AS grupOrtalamaSayfa Örnek-43:
FROM Kitap Aynı arkadaşınız abarttı ve şu soruyu
WHERE sayfaSayisi BETWEEN 75 AND yöneltti:
400 Her bir türde toplam kaç sayfa kitabın
GROUP BY turu; var?
Ve ekledi
Bu arada, kitap numarası 10’dan
küçük olan Kitapın muhtemelen eskidir,
İPUCU sayma. Bir de Ortalaması 175 sayfayı
Kayıt filtrelemede kullanılacak şartlar arasında aşmayan türleri de görmek istemiyorum,
gruplamalı Fonksiyonu kullanmayı gerektiren çünkü muhtemelen bu türlerde yeterince
bir şart varsa, HAVING deyimi ile belirtilir. kalın kitaplar yok.
En az sayfa kitap bulunan tür en altta
yer alacak şekilde liste verebilir misin?
Örnek-42: Öncelikle şu ifadenin sonucuna baka-
Bir arkadaşınız sizin kütüphanede lım:
otomasyona geçtiğinizi gördü ve şöyle SELECT turu,SUM(sayfaSayisi) sayfa-
bir soru yöneltti: Sayisi

48 BYTE Veritabanı Programlama 1


FROM Kitap 5.JOINING
WHERE kitapNo>10 Bu kısımda kullanılan tabloların ilişkisel
GROUP BY turu yapılarını anlamak için, bu sayfanın sol
SELECT turu,SUM(sayfaSayisi) sayfa- altındaki diagrama bakabilirsiniz. İlişkisel
Sayisi veritabanının en temelinde birden fazla
FROM Kitap tablo üstünde birlikte işlem yapabilmek
WHERE kitapNo>10 yatar. Bu sayede verilerin tekrarlaması
GROUP BY turu önlenmiş olur ve sonuçta veri yönetimi
HAVING AVG(sayfaSayisi)>175 kolaylaşır.
ORDER BY SUM(sayfaSayisi) DESC; Örneğin, Kitap tablomuzda, Kitapın
HAVING ifadesinden sonra, hikaye bir tekil numara ile listesini tutuyoruz ve
türü gelmemektedir. Çünkü grup orta- odunc listesinde de bu Kitapın kim tara-
laması 166’dır ve bu da HAVING şartında fından alındığının, geri getirilip getirilme-
verilen değerin altındadır. diğ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ği-
mizde, odunc listesinden kitap numara-
sı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ım-
lanmadan 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: rın yerine takma ad verip o adları kulla-
SELECT * nabiliriz.
FROM Kitap, odunc;
Sorgusunun sonucunda, Kitap tablo-
sunda 50, odunc tablosunda 100 kayıt İPUCU
varsa, (50*100=5000) 5000 satırlık bir bu Takma adlar tabloların ismini kısaltmanın yanı
iki tablo için kartezyen çarpım sonucu sıra başka işlerde de kullanılır. Genellikle tablo-
bulunur. lar için takma ad seçilirken kısa olması açısın-
dan 2 veya tek harf lakaplar tercih edilir.
Klasik Join
İki tabloyu birlikte sorgulamanın en kolay
yolu, asıl tablodaki birincil anahtar ile
ikinci tablodaki yabancı anahtarı birbi- Örnek-46:
rine eşitlemektir. Dışarıda olan Kitapların adlarını,hangi
SELECT tablo1.alan1|tablo2- tarihte alındığını ve kimde olduklarını
.alan1[tablo1.alan2,...] bulalım:
FROM tablo1, tablo2
WHERE tablo1.birincilAnahtar=Tablo-
2.yabanciAnahtar [AND diğer şartlar]

Örnek-45:
Şu anda dışarıda olan Kitapın listesini SELECT K.kitapAdi,O-
alalım: .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;
>>
SELECT Kitap.*
FROM Kitap,odunc Bir Tabloyu Kendisi İle İlişkilendirme
WHERE Kitap.kitapNo=Odunc.kitapNo (Self-join)
AND odunc.geldiMi=0; Bir tabloyu kendisi ile ilişkilendirerek
sorgulamamız gerektiğinde aynı tabloya
Tabloya Takma Ad (Alias) farklı iki takma adı atayıp, farklı iki tablo
Birden fazla tablo üstünde işlem yapar- üstünde ilişkili sorgu yapıyormuş gibi
ken, sık sık tablo isimleri kullanılır. Bu da ilişkili sorgu yapılabilir. İyi tasarlanmış
bir kelime kalabalığı olarak karşımıza bir veritabanında bu tür ilişki pek kulla-
çıkar. Bunun önüne geçmek için tablola- nılmaz.Genellikle verilerin doğruluğunu

50 BYTE Veritabanı Programlama 1


(veya tutarsızlığını) test etmede kullanılır. Tüm üyelerin bir listesini, yanına da
ödünç aldıkları kitap varsa, kitap numara-
Örnek-47: sını sıralayalım
Kitap tablomuzda, bazı Kitapın adları SELECT uye.Adi,odunc.KitapNo
hatalı okunduğu için aynı ISBN numarası FROM uye LEFT JOIN odunc ON
ile farklı kitap adları girilmiş olup olma- odunc.uyeNo=uye.uyeNo
dığını test etmek ve sonucu görmek
istersek: Right [Outer] Join
SELECT K1.KitapAdi,K1- İki tablo arasında ilişkili sorgu yapılırken,
.ISBNNo,K2.kitapAdi,K2.ISBNNO RIGHT OUTER JOIN kullanıldığında, ikinci
FROM Kitap K1, Kitap K2 tablodaki tüm kayıtlar getirilir. 1. Tabloda
WHERE K1.ISBNNo=K2.ISBNNo AND ise sadece ilişkiye göre uygun kayıtlar sağ
K1.KitapAdi<>K2.KitapAdi; tarafına eklenir.
>>0 kayıt seçildi. Genel kullanımı,
Çünkü ISBN numaralarında bir hata
yok. FROM tablo 1 RIGHT JOIN tablo 2
ON tablo1.alan1 karşılaştırma tab-
Left [Outer] Join lo2.alan2;
İki tablo arasında ilişkili sorgu yapı- Şeklindedir.
lırken, LEFT OUTER
JOIN kullanıldı- Örnek-49:
ğında, birinci tab- Ödünç alınmış Kitaplardan dışarıda
lodaki tüm kayıtlar olanların listesini bulunuz:
getirilir. 2. Tabloda SELECT Kitap.kitapAdi
ise sadece ilişkiye FROM Kitap
göre uygun kayıtlar RIGHT JOIN odunc ON
sağ tarafına eklenir. odunc.KitapNo=Kitap.KitapNo
Genel kullanımı, WHERE odunc.geldiMi=0;
...
FROM tablo1
LEFT JOIN tablo2
ON tablo1.alan1
karşılaştırma tab-
lo2.alan2;
Şeklindedir.

Örnek-48:

Veritabanı Programlama 1 BYTE 51


[Inner] Join FROM uye INNER JOIN odunc ON
INNER JOIN en çok kullanılan tablo bir- odunc.uyeNo=uye.uyeNo
leştirme yöntemidir. İki tablo arasında
birleştirme yaparken, tablolardan her Sadece iki tabloyu JOIN edilebilir diye
ikisinde de yer alan değerler seçilir, tek bir kısıtlama yoktur. İkiden fazla tabloyu
tabloda yer alan değerler seçilmez. da ihtiyacımıza göre JOIN edebiliriz.

Örnek-51:
İPUCU Bu güne kadar kimin hangi kitabı
LEFT JOIN ve RIGHT JOIN, aslında birer OUTER ödünç aldığının dökümünü bulmak
JOIN ifadeleridir. Bir çok sistem OUTER ifadesi- istersek:
nin yazılmasını isterken, MS temelli sistemlerde
kod yazıyorsanız, böyle davranmak zorunda
değilsiniz.

Aslında, Klasik Join ile INNER JOIN aynı


şeydir. Sadece birleştirmede kullanılan
teknik farklıdır.
SELECT Kitap.kitapAdi,uye-
FROM tablo1 INNER JOIN tablo2 .Adi,uye.Soyadi
ON tablo1.alan1 karşılaştırma tab- FROM (odunc INNER JOIN Kitap ON
lo2.alan2; Kitap.KitapNo=Odunc.kitapNo) INNER
JOIN uye ON uye.UyeNo = odunc.uyeNo;
Örnek-50: Bazı sistemlerde kodlama yaparken,
LEFT JOIN INNER ifadesi yer almamalıdır. Aksi halde
örneğindeki sor- sorgunuz çalışmayabilir. Bu farklılığın
guyu INNER JOIN nedeni, JOIN ON ifadesi ANSI-SQL’in bir
ile çalıştıralım. Bu parçası değildir. Ancak VTYS üreticileri,
durumda, hiç kitap WHERE şartında yer alan diğer koşullar
ödünç almayan ile, tablo ilişkilendirme koşullarının bir
üyelerin sonuçta birinden kolayca ayırt edilmesi için stan-
yer almadığına dartlarda yer alan klasik join ile birlikte
dikkat edin. bu türden ifadeleri de desteklemekte-
SELECT dirler.
uye.Adi,odunc-
.KitapNo

52 BYTE Veritabanı Programlama 1


6.INSERT 170-X’, 330,’Bir polisin anıları’);
Bir tabloya SQL ile kayıt eklemek için >> Incorrect syntax near the keyword
INSERT deyimi kullanılır. ‘in’.
INSERT INTO tablo_adi(alan1[,a- Bu kayıt eklenemeyecektir. Aksine
lan2,....]) in kelimesi SQL komutu olan In zanne-
VALUES(deger1[,deger2,....]) dilecek ve arkasından açılan tek tırnak
Alan adı sırası ile, değer sıralamasının kapanmamış olarak algılanacaktır.
aynı olması gerekir. NULL değeri alabi- Bunun yerine
len (girilmesi zorunlu olmayan alanlar) INSERT INTO Kitap(KitapAdi, ISBNNo,
alanlar için değer girilmeyecekse boş SayfaSayisi, kitapOzeti)
bırakılabilir. VALUES(‘Ahmet’’in Günlüğü’, ‘975-509-
170-X’, 330,’Bir polisin anıları’);
Örnek-52 >> 1 adet Kayıt Eklendi
Yeni bir kitap ekleyelim. demek gerekir.
INSERT INTO Kitap(KitapAdi,SayfaSa-
yisi, kitapOzeti) Bir Tablodan Seçilen Kayıtları
VALUES(‘Photoshop Efektle- Başka bir Tabloya Ekleme:
ri’,330,’Photoshop efektlerini yakından Bazı durumlarda, bir tabloda yer alan
tanıyın’); kayıtları başka bir tabloya aktarmak duru-
>> 1 adet Kayıt Eklendi munda kalabiliriz.

Örnek-54:
DİKKAT: Dışarıdaki Kitapımızı tutmak üzere bir
Bir tabloya metin ifadeler eklenirken, metin- tablo oluşturmamız gerekirse, bunları
lerin tek tırnak arasına alınması bir kuraldır. doğrudan bir seçme işleminin sonucunu
Bazen değer olarak tek tırnak (‘) girmek gere- bu yeni tabloya ekleme şeklinde de yapa-
kebilir. Bu durumda, ‘ yerine ‘‘ yazılır. Aksi halde biliriz:
SQL’in sentaksının bozulacağına dikkat edin. Bu INSERT INTO disardakiKitap(kitapNo,-
türden durumlara kaçınma anlamında ‘escape’ KitapAdi,Bedeli)
durum denir. SELECT kitapNo,KitapAdi,Bedeli
FROM Kitap
INNER JOIN odunc ON
odunc.KitapNo=kitap.kitapNo
Örnek-53: WHERE odunc.GeldiMi=0;
INSERT INTO Kitap(KitapAdi, ISBNNo, >> 3 adet Kayıt Eklendi
SayfaSayisi, kitapOzeti)
VALUES(‘Ahmet’in Günlüğü’, ‘975-509-

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: DİKKAT:
UPDATE tablo_adi Bir DELETE cümlesinde WHERE şartı olmazsa,
SET alan1=yeniDeger1[, alan2=yeni- istenilen silme işlemi tabloda yer alan tüm
Deger2, ....] kayıtlar için yapılacağından dikkat edilmelidir.
[WHERE sart] Böyle bir durumda data kaybı ile karşılaşabi-
lirsiniz.
Örnek:
UPDATE kitap
SET kitapBedeli = kitapBedeli*1,18;
>>17 KAYIT GÜNCELLENDİ 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:
DİKKAT: DELETE
Bir UPDATE cümlesinde WHERE şartı olmazsa, FROM tablo_adi
istenilen değişiklik tabloda yer alan tüm kayıt- [WHERE sart];
lar için yapılacağından dikkat edilmelidir. Böyle
bir durumda data kaybı ile karşılaşabilirsiniz. Örnek-55:
Soyadı ‘OZAN’ olan üyeleri silmek
istersek:
DELTE
FROM uye
WHERE soyad LIKE ‘%OZAN%’
>>1 KAYIT SİLİNDİ

54 BYTE Veritabanı Programlama 1


9.GENEL SQL Aritmetik Fonksiyonlar:
FONKSİYONLARININ KULLANIMI MOD(sayi,mod): Sayı’nın mod değerine
Bir DELETE cümleciğine şart kon- bölümünden kalanını veririr. ORACLE’de
mazsa tabloda yer alan tüm kayıtlar sili- geçerlidir. MS sistemlerde bir operatör
nir. Bir Sorguyu çalıştırmadan önce doğru gibi görev yapar.
kayıtları silmek istediğinizden emin
olunuz. Böyle bir durumda data kaybı ile Örnek-57:
karşılaşabilirsiniz. Ödünç verme sürelelerinin 15 güne
SQL’de çok fazla sayıda fonksiyon yer göre modunu alalım:
almamaktadır. Bundan dolayı bazı VTYS MS Access için:
tarafından ek fonksiyonlar da sağlana- SELECT vermeSuresi MOD 15 AS
bilmektedir. Kullanmakta olduğunuz GUNMOD15
VTYS’nin kılavuzuna bakarak daha fazla FROM odunc
sayıda fonksiyonun kullanımı hakkında WHERE kitapNo=1
bilgi edinebilirsiniz. Burada sistem bazlı MS SQL Server için:
ama sık kullanılan bazı fonksiyonlar SELECT vermeSuresi % 15 AS
hakkında da bilgi verilecektir. SQL Server GUNMOD15
2000’in sunduğu fonksiyonları bir sonraki FROM odunc
bölümde ve ek kısmımızda bulabilirsiniz. WHERE kitapNo=1
Oracle için:
Tarih-Zaman Fonksiyonları: SELECT MOD(vermeSuresi ,15)
GETDATE(): Microsoft ve Sybase FROM odunc;
temelli sistemlerde sitem tarihini bulur. Şeklinde yazmamız gerekecektir.
DATE() olarak da geçebilmektedir.
SYSDATE(): Oracle’de aynı işlevi yerine ABS(sayi): Sayının mutlak değerini
getirir. bulur.
NOW(): MS temelli sistemlerde, anlık
detaylı zamanı(gün-ay-yıl-saat-dk-sn) COS(),SIN(),TAN(),COSH(),SINH()-
verir. ,TANH(): Trigonometrik fonksiyonların
aynısıdır. Ancak, Oracle Sistemler için açı
Örnek-56: değeri olarak verilen değerin RADYAN
Üstünde çalıştığımız VTYS’de şu anki cinsinden olması gerekir.
vakti almak için;
SELECT GETDATE() LN(sayi): Doğal logaritma almak
>>6/22/2003 11:39:19 PM için(e tabanlı logaritma) kullanılır.
Dememiz yeterli olacaktır.(MS SQLSer-
ver için) LOG(sayi,taban): İstenilen bir sayının

Veritabanı Programlama 1 BYTE 55


yine istenilen bir tabanda logaritmasını FROM Kitap
almak için kullanılır. Şeklinde kullanılabilir.

POWER(sayi,us): Bir sayının üssünü INITCAP(karakter): İlk harfi büyük


almak için kullanılır. yapar.(Oracle)

SIGN(sayi): Bir sayının yönünü belirtir. REPLACE(karakter,ifade,yerinege-


Negatif için –1, Pozitif için +1 sıfır için 0 lecekIfade): İfadeleri bulup değiştirir.
döndürür. (SQLServer2000,SYBASE)

SQRT(sayi): Bir sayının karekökünü LOWER(metin), UPPER(metin) :


alır. Tamamı Küçük veya tamamı büyük harf
yapmak için kullanılır.(Oracle)
Karakter İşleme Fonksiyonları:
LCASE(metin) ve UCASE(metin):
CHR(): Bir ASCI kodunun karakter Tamamı Küçük ve tamamı büyük harf
karşılığını döndürür. yapmak için kullanılır. (MS)

CONCAT(metin1,metin2): İki veya LTRIM(metin), RTRIM(metin), TRI-


daha fazla karakter ifadeyi uç uca ekle- M(metin): Soldaki, sağdaki veya her iki
mek için kullanılır. taraftaki boşlukları atmak için kullanılır.

MS temelli sistemlerde, + ile bu iş LENGHT(metin): Bir metnin uzunlu-


yapılabilirken ORACLE’de ancak || opera- ğunu verir.(Oracle)
törü veya CONCAT fonksiyonu ile bu iş
yapılabilir. LEN(metin): Bir metnin uzunluğunu
verir.(MS temelli Sistemler)
Örnek-58:
Kitap Adları ile yazarlarının adlarını bir Dönüştürme Fonksiyonları
tek alan olarak seçtirmek istersek: CONVERT(veritipi[(uzunluğu)], sütu adı,
SELECT kitapAdi + yazarAdi format): Bir verinin bir formattan başka
FROM Kitap bir formata dönüştürülmesi için kullanılır.
Oracle’de
SELECT kitapAdi || yazarAdi Örnek-59:
FROM Kitap; Üyelik Numarasının sonu 1 olan üyele-
veya rimizin listesini alalım:
SELECT CONCAT(kitapAdi,yazarAdi) SELECT uyeNo,Adi,soyadi

56 BYTE Veritabanı Programlama 1


FROM uye
WHERE CONVERT(VARCHAR(4),u- ARİTMETİK İŞARETLER
yeNo) LIKE ‘%1’ Her yerde olan aritmetik işlemleri SQL’de de
CAST(kolonAdi as CevirilecekVeriTi- geçerlidir.
pi(N)): Bir sütunun ya da verinin türünü +
başka bir türe değiştirmek için kullanı- :Toplama
lır.(SYBASE,MS SQL Server) -
:Çıkartma
Örnek-60: *
SELECT CAST(yazarNo as VARCHAR(4)) :Çarpma
+ ‘ ‘+adi +’ ‘+soyadi /
FROM yazar :Bölme
%
:Mod(Bazı Sistemlerde MOD da kullanılır)

Veritabanı Programlama 1 BYTE 57

You might also like