Professional Documents
Culture Documents
Veritabanı
Programlama
Temmuz 2003
c
ili.Yaşar Gözüdeli
Veritabanı Programlama
ad
jav
w.
ww
Eğitim dizisi
om
Veritabanı
Programlama
c
1
ili.
ad
Temmuz 2003
Yaşar GÖZÜDELİ
jav
om
Önsöz........................................................................ 6
Bu kitapta..................................................................................8
Veritabanı Yönetim Sistemleri.................................................................. 8
Veritabanı Nerelerde Kullanılır?............................................................... 9
c
1.İlişkisel Veritabanı Kavramı ..................................................12
Günlük Hayatta ilişkisel Veritabanı......................................................... 12
Temel Kavramlar1......................................................................................... 13
ili.
Tablolar: ........................................................................................................... 13
Değişken İsimlendirme Kuralları............................................................. 14
İlişkisel Veritabanı Yönetim Sistemleri: ................................................. 14
c
In......................................................................................................................... 36
İç içe Select Yapısı:........................................................................................ 36
Any, Some, All ................................................................................................ 37
ili.
Exists, not Exists ........................................................................................... 38
Union (Birleştirme)....................................................................................... 38
Kesişim Bulma:............................................................................................... 39
Except(Fark Bulma) ...................................................................................... 39
Between .... and .... ...................................................................................... 40
ad
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
jav
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
ww
Aritmetik İşaretler......................................................................................... 55
Tarih-Zaman Fonksiyonları:....................................................................... 55
Aritmetik Fonksiyonlar: .............................................................................. 55
Karakter İşleme Fonksiyonları: ................................................................. 56
Dönüştürme Fonksiyonları ....................................................................... 57
om
Ö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-
c
myildiz@byte.com.tr
lamalarına ihtiyaç duyulmaktadır. Seri
Yönetici Editör:
özellikle, Web projeleri gibi küçük çaplı
İbrahim Özdemir
ili.
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
ad
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-
jav
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ı
ww
c
ü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
ili.
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
ad
İ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
jav
c
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
ili.
İ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-
ad
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
jav
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,
w.
c
çerçevesinde işler, yeniden
şekillendirirler. Yani, Verita-
ili.
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
ad
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.
jav
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?
c
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
ili.
ö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
ad
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
jav
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
w.
İ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
c
bir liste daha yapalım. Alan(Field), yapılandırılmış bilginin
her bir kısmını saklamak üzere yapılan
ili.
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
ad
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.
jav
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-
ww
ö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
c
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.
ili.
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
ad
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:
jav
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-
ww
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
c
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
ili.
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
ad
mak zorundadır. tarafından tercih edilen bir yoldur.
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.
w.
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.
ww
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.
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.
w.
ww
Kitaplar listesi üstünde bir seçme işlemi. Sayfa sayısı 200’den fazla olan kitapları seçiyoruz.
c
getirmeyebilmelidir.
Kitaplar listesi üstünde bir iz düşürme işlemi Kitap-
ili.
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
ad
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-
jav
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-
w.
c
ili.
ad
jav
w.
ww
ww 2. Bölüm
w.
jav
ad
ili.
c om
om
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-
c
ramanız kolaylaşacaktır. Ancak bir proje lerde, örneklerden hemen sonra ‘>>’
geliştirirken öncelikle veriyi tanımlamak konulduktan sonra bir mesaja yer veril-
ili.
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ı-
ad
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:
jav
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.
w.
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ığı
ww
c
Örnek: en fazla kaç basamaklı olacağı belirtilir.
WHERE tarih=‘20.01.2003’ DECIMAL(boyut,d): Ondalık
ili.
(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(-
ad
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.
jav
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),
w.
Ö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,
c
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ı-
ili.
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-
ad
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.
jav
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ı
w.
alan da birleşerek bir birincil anahtar anahtarının asıl tablosunda birincil anah-
oluşturabilir. tar olması gerekir.
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)
c
kitapNo int NOT NULL , ALTER TABLE Kitap ALTER COLUM-
uyeNo int NOT NULL , N kitapBedeli INTEGER NOT NULL;
ili.
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,
ad
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:
jav
c
ON kitaplar(kitapNo)
2. İndeks olan alanın değerine göre bir diyebiliriz. Ancak bir tablo üstünde
ili.
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.
ad
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)
jav
c
öncelikle 3.Ünite’ye göz atmanız önerilir. SELECT *
FROM kitap
ili.
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
ad
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 *
jav
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
w.
c
gerektiğini anlatır. Bazen, bu kurallardan geçmiş olursunuz.
vazgeçmek durumunda kalabilirsiniz Örneğin içinde Kitap ile ilgili bilgiler bulun-
ili.
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.
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
w.
c
etmenizde fayda vardır. Örneğin araçlar tekniktir.
ile ilgili bir tablo yaparken, plakalarını 2. Genellikle,yapay birincil anahtar alanlar
ili.
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.
ad
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....
jav
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
w.
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ı
c
yer alması gerekli olabilir. Veya bir kitap Alanları Belirleyin
birden fazla kişi tarafından yazılmış ola- İlişkisel veritabanında, tablodan herhangi
ili.
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
ad
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.
jav
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
ww
c
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
ili.
ç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
ad
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
jav
İ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
w.
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-
ww
c
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
ili.
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
ad
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
jav
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
w.
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.
ww
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.
ww 3. Bölüm
w.
jav
ad
ili.
c om
om
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)]
c
kayıtlar üstünde güncelleme yapmak(- [alan_adi BETWEEN değer1 AND
UPDATE) ve kayıtları silmek (DELETE) için değer2]
ili.
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)];
ad
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;
jav
c
=: Eşittir
ili.
>: Büyüktür
c
Yatırım yapmak için nereden başlamalı, neler
3 Yatırım Planı Yapma 975-381-263-9 74
yapmalı...
ili.
4 İş Başında Duygusal Zeka 975-434-224-5 447 Duygusal zekanın iş ve yaşam konusundaki etkileri
8 PERL ile CGI 975-316-609-5 247 Perl CGI konusunda kaynak kitap
jav
13 Bellek Geliştirme 975-503-069-7 224 Bellek geliştirme konusunda bir kurs 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
c
1
0
ili.
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
ad
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
jav
Ö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:
c
luğu artıracaktır.
ili.
Örnek-8:
1,5 ve 6 nolu kitapların ödünç hare-
ketlerini görmek için
SELECT *
ad
FROM odunc
WHERE kitapNo=1 OR kitapNo=5 OR
kitapNo=6;
Yerine
SELECT *
FROM odunc
jav
IN
Bir veri kümesini belli bir alanında
içeren kayıtları bulmak istediğimizde, IN
sözcüğü kullanılırız:
c
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,
ili.
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:
ad
SELECT *
FROM Kitap
WHERE kitapNo IN(
SELECT kitapNo FROM
odunc WHERE geldiMi=0
);
jav
Ö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
w.
Örnek-12:
3,5 ve 11 nolu kitapların tamamından
c
kalın olan ve kitap no da 11’den büyük
olan kitapların listesini bulalım:
ili.
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
ad
) 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;
jav
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)
w.
c
FROM yazar
WHERE yazarNo < 3; Örnek-15:
ili.
Hangi yazar isimleri aynı anda üye adı
olarak da yer almaktadır?
Şu isimler Yazarlar tablosunda bulun-
maktadır:
ad
Ü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
jav
SELECT adi
FROM yazar
WHERE EXISTS
w.
(SELECT *
FROM uye FROM uye
WHERE uyeNo < 3; WHERE yazar.adi = uye.adi)
c
geldiMi=0 lindeki yapı kullanılır.
);
ili.
Ö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,
ad
Çü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 *
jav
İPUCU
w.
c
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ı
ili.
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)
ad
Ö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%’;
jav
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%’;
w.
Ö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 *
Örnek-25:
c
İkinci harfi ‘A’ olan Kitapların listesi: FROM Kitap
SELECT * WHERE kitapAdi LIKE ‘_[^ESRIN]%’;
ili.
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
ad
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
jav
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 *
w.
Örnek-27:
İkinci harfi E, S, R, I ya da N den biri
ww
c
SELECT alanlar
FROM tablo_adi
ili.
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.
ad
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
jav
FROM yazar
WHERE adi LIKE
‘%e%’
ORDER BY soyadi
DESC,adi
ww
c
en fazlası.... Bu bölümde, kitap tablomuzun
biraz değişik bir hali üstünde çalışacağız.
ili.
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
ad
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:
jav
Örnek-31:
Kitaplığımızda toplam kaç sayfa kitap
olduğunu bulmak istersek (bkz. karşıdaki
tablo):
SELECT SUM(sayfaSayisi)
w.
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-
ww
om
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
c
Yatırım yapmak için
3 Yatırım Planı Yapma 975-381-263-9 İş dünyası 74 nereden başlamalı, neler
yapmalı...
ili.
Duygusal zekanın iş ve
4 İş Başında Duygusal Zeka 975-434-224-5 Kişisel Gelişim 447 yaşam konusundaki
etkileri
Aborijin aileleri,
10 Bir Çift yürek 975-7800-25-2 Hikaye 225
Avustralya’nın yerlileri
Bellek geliştirme
13 Bellek Geliştirme 975-503-069-7 Kişisel Gelişim 224
konusunda bir kurs kitabı
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
c
Örnek-36:
ili.
Kitaplığımızdaki Kitapın sayısı:
SELECT COUNT(*)
FROM Kitap;
>>16
Örnek-35: İPUCU
Kitaplığımızdaki en ince kitap: COUNT(*) ile COUNT(sutun_1) arasındaki fark:
jav
FROM yazar;
>> 20
VARIANCE(sutun_adi): Grup varyan- SELECT COUNT(dogum)
sını bulur. FROM yazar;
>> 0
Örnek-38:
Kütüphanedeki üye sayısı:
SELECT COUNT(*)
c
FROM UYE
>>9
ili.
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
ad
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
jav
c
FROM Kitap
GROUP BY turu
ili.
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
ad
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,
jav
c
WHERE kitapNo>10 yatar. Bu sayede verilerin tekrarlaması
GROUP BY turu önlenmiş olur ve sonuçta veri yönetimi
ili.
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.
ad
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
jav
İPUCU
Tabloların birbiri ile arasında bir ilişki tanım-
lanmadan ilişkisel sorgu yapılırsa, kartezyen
ww
c
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-
ili.
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
ad
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]
jav
Ö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;
>>
w.
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
ww
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
c
dığını test etmek ve sonucu görmek
istersek: Right [Outer] Join
ili.
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ı,
ad
Çü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
jav
karşılaştırma tab-
lo2.alan2;
Şeklindedir.
Örnek-48:
c
Örnek-51:
İPUCU
ili.
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.
ad
Aslında, Klasik Join ile INNER JOIN aynı
şeydir. Sadece birleştirmede kullanılan
teknik farklıdır.
SELECT Kitap.kitapAdi,uye-
jav
c
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
ili.
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.
ad
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.
jav
Ö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:
w.
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-
c
Deger2, ....] kayıtlar için yapılacağından dikkat edilmelidir.
[WHERE sart] Böyle bir durumda data kaybı ile karşılaşabi-
ili.
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
ad
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
jav
c
olunuz. Böyle bir durumda data kaybı ile Örnek-57:
karşılaşabilirsiniz. Ödünç verme sürelelerinin 15 güne
ili.
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
ad
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:
jav
c
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.
ili.
döndürür. (SQLServer2000,SYBASE)
Ö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.
ww
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
c
lır.(SYBASE,MS SQL Server) -
:Çıkartma
ili.
Örnek-60: *
SELECT CAST(yazarNo as VARCHAR(4)) :Çarpma
+ ‘ ‘+adi +’ ‘+soyadi /
FROM yazar :Bölme
%
:Mod(Bazı Sistemlerde MOD da kullanılır)
ad
jav
w.
ww