Professional Documents
Culture Documents
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
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.
Kitaplar listesi üstünde bir seçme işlemi. Sayfa sayısı 200’den fazla olan kitapları seçiyoruz.
=: Eşittir
>: Büyüktür
4 İş Başında Duygusal Zeka 975-434-224-5 447 Duygusal zekanın iş ve yaşam konusundaki etkileri
İş 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
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
Ö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:
Ö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.
IN
Bir veri kümesini belli bir alanında
içeren kayıtları bulmak istediğimizde, IN
sözcüğü kullanılırız:
Ö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
Ö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
SELECT adi
FROM yazar
WHERE EXISTS
(SELECT *
FROM uye FROM uye
WHERE uyeNo < 3; WHERE yazar.adi = uye.adi)
Ö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 *
Ö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 *
Ö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 *
Ö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
Ö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.
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
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
Örnek-36:
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:
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
Ö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.
İ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.
Ö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
Örnek-48:
Ö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.
Ö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-