TEMEL KAVRAMLAR

advertisement
TEMEL KAVRAMLAR
1.1 Klasik Dosya Yapıları
Bilgisayarların ilk ortaya çıktığından bu yana hem donanım hem de yazılım alanında pek
çok değişim ortaya çıkmıştır. Doğal olarak bu değişim, kuruluşların ve kişilerin
gereksinimlerine daha iyi cevap verebilmek amacıyla ortaya çıkmaktadır. Pek çok
kuruluşta eskiye oranla çok daha fazla veri üretildiğinden, geleneksel veri saklama ve
işleme tekniklerinin yetersiz kaldığı gözlemlenmiştir. Veri saklama birimlerinde depolanan
veri topluluklarına “dosya” (file) denir.
1.1.1 Kayıt ve Alan
Dosyalar kendi içinde kayıtlara bölünmüştür. Bir sınıftaki öğrenci listesini göz önüne
alalım. Bu liste çok sayıda veri içerebilir. O halde, listenin ana bellekte tutulması söz
konusu olamaz. Ana bellekte tutulduğu takdirde, bilgisayarın kapatılması durumunda bu
bilgiler yok olacaktır. O halde bu verilerin kalıcı bir ortamda, örneğin sabit disk üzerinde
yer alması gerekecektir. Disk üzerinde tutulan bu bilgiler, yeni öğrenci eklendiğinde
büyüyecek veya çıkarıldığında küçülecektir. Ayrıca zaman zaman içeriği değişecektir. Bu
listedeki her bir öğrenci bilgisi bir mantıksal kayıt oluşturur. Her kayıt da farklı bilgiler
içerebilir. Örneğin; öğrencinin adı, baba adı, doğduğu yer vb gibi bilgileri içerebilir.
Sayılan bu bilgilerin herbirine alan (field) adını veriyoruz.
1.1.2 Sıralı Dosyalar
Klasik bilgisayar dosyaları birbirinden bağımsız; muhasebe, stok, pazarlama, üretim ve
diğer uygulamalarda kullanılmak üzere hazırlanır. Bu dosyalar, sıralı ya da doğrudan
erişim yöntemleri kullanılarak işlenir. Sıralı erişimde, dosyanın tüm kayıtları tek tek
taranarak istenilen kayıtlara ulaşılır. Doğrudan erişim yönteminde ise, kayıtlar tek tek
sırayla okutulmaz, istenilen kayıda doğrudan erişerek işlenir.
Sıralı dosyalar, bir başka deyişle ardışık dosyalar, içerdiği kayıtlara birinci kayıttan
başlamak üzere sırayla erişim yapmak üzere tasarlanmış dosyalardır. Bu tür dosyaların
kayıtlarına ardışık olarak erişilebilmesine karşılık, kayıtlar fiziksel olarak ardışık
olmayabilir. Sıralı dosyaların herbir kayıtına ardışık olarak erişilmesi bazı durumlarda
yararlı olmasına rağmen, bazı uygulamalarda sorunlar yaratır.
1 / 192
Örneğin; okuldaki tüm öğrencilerin tümü listelenecek ise, kayıtlara peşpeşe erişim söz
konusudur. Bu durumda dosyanın sıralı olarak tasarlanmış olması sorun yaratmaz. Ancak
sadece birkaç öğrencinin listelenmesi isteniliyorsa, tüm öğrencilerin okunarak bu listenin
elde edilmesi uygun bir yöntem olmayacaktır. Söz konusu öğrencilere doğrudan erişilmesi
en uygun yoldur.
1.1.3 İndeksli Dosyalar
Sıralı dosyalarda tüm kayıtlar ardarda gelmesi gerekiyordu. Bu soruna çözüm bulmak
amacıyla doğrudan erişimli dosyalar kullanılır. Bu tür dosyalarda, herbir arama işlemi
dosyanın başından itibaren yapılmaz. Belirlenen kayıtlara doğrudan erişilerek üzerinde
işlem yapılır.
Doğrudan erişimli dosyaların en tanınmışı, indeksli dosyalar olarak bilinir. İndeksli
dosyalar veya bir başka deyişle indeks sıralı dosyalar, veri dosyasından ayrı olarak bir
indeks dosyasının oluşturulması ile birlikte hazırlanır.
Bir dosya için oluşturulan indeks; söz konusu dosyanın anahtarları ile bu anahtarların disk
üzerinde bulunduğu adresi içerir. Anahtar alan, erişimde kulanılmak üzere seçilen alan
olarak değerlendirilir.
Örneğin; öğrenci dosyasında, öğrenci numarasını içeren alanının indeks alanı olarak
tasarlandığını varsayalım. Herhangi bir öğrencinin bilgilerine ulaşmak söz konusu
olduğunda; bu numara önce indeks üzerinde aranılarak bulunur ve söz konusu kayıda
ilişkin adres bilgisi elde edilerek, bu adrese doğrudan erişilir.
2 / 192
1.2 Veri Tabanı Sistemleri
Karmaşık dosya yapıları ve çok sayıda dosya arası ilişki ve kullanıcıların dosyalara erişimi
söz konusu olduğunda, geleneksel dosya sisteminin yetersiz kaldığı görülmüştür. Bu
sorunu çözmek üzere, veriyi saklama ve veriye erişim konusunda yeni yazılım
teknolojilerine yönelme başlamış ve Veri Tabanı Yönetim Sistemleri (VTYS) yaklaşımı
ortaya çıkmıştır.
Veri Tabanı Yönetim Sistemleri (VTYS) yaklaşımında veri girişi ve depolanması, veriye
erişen uygulama programlarından bağımsızdır. Klasik dosya kullanımında ise, kayıt
desenleri ve dosya yapılarında ortaya çıkabilecek en ufak bir değişiklik bile uygulama
programlarının değişmesine ve yeniden derlenmesine neden olmaktadır.
Veri tabanı sistemleri bilgisayar sistemlerinin önemli bir bileşeni olarak değerlendirilir.
Veri tabanı yönetim sistemleri (VTYS), birbirleriyle ilişkili veri ve programlar
topluluğundan oluşmaktadır. Veri topluluğu bir “veri tabanı” olarak değerlendirilir. Veri
tabanı bir kuruluşa ilişkin bilgilerin yer aldığı ortamdır. Veri tabanı sistemleri, veri
kümelerinin düzenli bçimde tutulduğu ve bu verilerin çeşitli yazılımlar aracılığıyla
yönetildiği ortamlardır.
1.3 Veri Tabanı Sistemlerinin Üstünlükleri
Veri tabanı kullanımı, geleneksel dosya kullanımına göre birçok yönden üstünlük
sağlamaktadır.
3 / 192
4 / 192
5 / 192
6 / 192
VARLIK İLİŞKİ MODELİ
2.1 Varlık İlişki Modeli
Zaman içinde, her bir veri modeli için birçok VTYS’leri üretilmiştir. Ancak şu ana kadar
hiçbir VTYS içinde kullanılmamış bir veri modeli daha bulunmaktadır. Bu veri modeli
varlık-ilişki modeli (Entity-Relationship Model) adıyla bilinmektedir. Varlık İlişki
modelini kısaca Türkçe kelimelerinin baş harflerinden türeterek Vİ veya İngilizce
kelimelerinin baş harflerinden türeterek kısaca ER modeli olarak isimlendirilir.
Varlık-ilişki modeli herhangi bir VTYS’de kullanılmasa bile, veri çözümlemede,
modellemede ve ilişkilerin ortaya konulması açısından çok kullanılan bir araçtır. Bu model
kullanılarak, VTYS’den bağımsız olarak veri çözümlenir, modellemesi ve ilişkileri
tamamlandıktan sonra herhangi bir VTYS veri tabanı şemasına dönüştürülür.
Örnek bir varlık ilişki modeli şeması
2.2 Varlık
Varlık (Entity), var olan ve diğer varlıklardan ayırt edilebilen bir nesnedir. Örneğin,




bir
bir
bir
bir
bilgisayar,
kaplan,
savaş uçağı,
kız çocuğu
birer varlık olarak değerlendirilir. Bu kavram, aslında dünyamızdaki var olan nesneleri,
olayları ve kavramları tanımlamaktadır. Yandaki nesnelerden her biri bir varlık olarak
değerlendirilir.
7 / 192
2.4 Varlık ve İlişki Kümeleri
Varlıklar arasındaki bağlantıya ilişki adı verilir. Örneğin, “Burak” varlığı ile “Dersler”
varlığı arasında bir ilişki vardır çünkü; “Burak” bir öğrencidir ve aldığı dersler “Dersler”
varlığı ile gösterilmektedir.
İlişki kümesi, aynı türdeki ilişkilerin bir kümesidir. Biçimsel olarak, bu varlık seti
üzerindeki bir matematiksel ilişki olarak ifade edilebilir. Aynı tür ilişkilerin oluşturduğu
kümeye ilişki kümesi denir ve bu ilişki kümelerini R ile gösterilir.
E1, E2,.... En varlık kümeleri ise, bu kümeler arasındaki R ilişkisi şu şekilde tanımlanır:
8 / 192
Örnek
Aşağıdaki iki varlık kümesini gözönüne alalım. Bu varlık kümelerinden birincisi öğrencileri,
ikincisi ise bu öğrencilerin aldıkları dersleri içermektedir.
E1= {Burak, Begüm}
E2= {Matematik, Fizik}
Bu iki küme arasındaki ilişki, öğrencilerle dersler arasında olan ilişkidir. Bu ilişkileri,
öğrenci-ders çiftleri biçiminde ifade edebiliriz. Tüm öğrencilerle tüm dersler arasındaki
ilişki ise kartezyen çarpım yapılarak ortaya konulur. Kartezyen çarpım, iki küme arasında
olası tüm çiftleri ifade etmektedir. İki varlık kümesi için kartezyen çarpım şu şekildedir:
E1 x E2 = {(Burak, Matematik), (Burak, Fizik), (Begüm, Matematik), (Begüm, Fizik)}
Aşağıda gösterildiği biçimde üç ilişki kümesi tanımlayalım:
R1 = {(Burak, Matematik)}
R2 = {(Burak, Fizik)}
R3 = {(Burak, Matematik), (Begüm, Matematik)}
Bu ilişki kümeleri için aşağıdaki bağıntıların doğru olduğu görülür:
R1  E 1 x E 2
R2  E1 x E2
R3  E1 x E2
Bu örnek bize, iki veri kümesi arasında geçerli tüm ilişki kümelerinin, R ilişki kümesinin
bir alt kümesi olduğunu göstermektedir.
Örnek
Bir bankanın müşterileri ve bu müşteriler için bankanın düzenlediği hesaplar birer varlık
olarak kabul edilir. Bu iki varlık arasında müşteri-hesap no biçiminde ifade edilen bir ilişki
bulunmaktadır.
"Müşteri" ve "Hesaplar" varlıkları arasında ikili ilişki bulunmaktadır. Bu ilişki kümeleri şu
şekilde ifade edilebilir:
R1
R2
R3
R4
R5
=
=
=
=
=
{(Burak, 1350), (Burak, 1400)}
{(Begüm, 1525}
{(Selin,1111)}
{(Sezin, 1200)}
{(Dilay, 1500), (Dilay, 1750)}
9 / 192
2.5.2 Türetilen Nitelik
Bir nitelik kullanılarak, bir başka varlık niteliği elde edilebiliyorsa, bu yeni niteliğe
türetilen nitelik adı verilir. Örneğin; “PERSONEL” varlığının “doğum tarihi” niteliğinden
yararlanılarak, “yaş” niteliği elde edilebilir.
10 / 192
2.5.3 Çok Değere Sahip Nitelikler
Bir nitelik birden fazla değer ile eşlenebiliyorsa, çok değere sahip nitelik adı verilen bir
kavramdan söz edilir.
ÖRNEK: Bir kişinin “beğendiği araba markaları” isimli nitelik, birden çok arabayı
kapsayacağı için bu niteliğin çok değere sahip bir nitelik olduğu kabul edilir.
2.5.5 Rol
Bir ilişki varlığın bir fonksiyonu ise, buna rol adı verilir. Örneğin, “PERSONEL” varlığı hem
yöneticileri hem de işçileri kapsayacaktır. Bu varlıklar arasında bazıları diğerlerinin
yöneticisidir. “Kim kimin yöneticisidir?” biçimindeki bir ilişkiyi göz önüne alalım. Bu ilişki;
(Yönetici, İşçi) çiftleriyle karakterize edilir. Ancak bu çiftler arasında,
(İşçi, Yönetici) çiftleri göz ardı edilir.
11 / 192
ÖRNEK:
“PERSONEL” varlığı ile niteliklerini göz önüne alalım. Bu varlığın nitelikleri ve etki alanı,
yani içerdiği değerler gösterilmiştir.
Buna hangi PERSONELin, diğerinin yöneticisi olduğunu belirleyen “çalıştığı kişi” ilişkisini
göz önüne alarak rol çiftlerini belirleyelim.
(Begüm, Burak)
(Begüm, Dilay)
(Selin, Sezin)
2.6.1 Birden-bire İlişki
A varlık kümesi içindeki bir varlık, B varlık kümesi içindeki sadece bir varlık ile ilişkili ve B
varlık kümesi içindeki bir varlık, A varlık kümesi içinde sadece bir varlık ile ilişkili ise
birden-bire ilişki söz konusudur.
A ve B kümelerinin,
biçiminde olduğunu varsayalım. A kümesinin her bir elemanının, B kümesindeki bir
elemanla ilişkide olması bire-bir ilişkiyi ifade etmektedir.
12 / 192
ÖRNEK 1:
Müşteri-hesaplar ilişkisini göz önüne alalım. Her müşteri için sadece bir hesap
açtırılabildiğini ve birden fazla kişi için ortak hesap açılmasına izin verilmediğini
varsayalım.
Şekil üzerinde gösterildiği gibi, her bir müşteri sadece bir hesap numarası ile
eşlenebilmektedir. Aynı biçimde bir hesap numarası sadece bir müşteriye
verilebilmektedir. O halde bu birden-bire ilişkidir.
13 / 192
14 / 192
2.6.4 Çoktan-çoğa İlişki
A varlık kümesi içindeki bir varlık B varlık kümesi içindeki birden fazla varlık ile ilişkili ise
ve B kümesindeki bir varlık A kümesindeki birden fazla varlık ile eşleniyorsa çoktançoğa ilişki vardır.
ÖRNEK:
Müşteri-hesap ilişkilerinde, aile üyelerinin ortak hesap açabilmesi durumunda çoktançoğa ilişki söz konusu olmaktadır.
15 / 192
Bu şekil, müşteri-hesap ilişkisinin çoktan-çoğa biçiminde olduğunu göstermektedir.
Müşteriler birden fazla hesaba sahip olabilmekte ve birden fazla müşteri aynı hesabı
açabilmektedir. Örneğin, “Burak” isimli kullanıcı 4500 ve 2310 numaralı iki hesaba
sahiptir. Buna karşılık, 4500 numaralı hesabın aynı aileye üye “Burak” dışında “Begüm”
isimli bir başka müşterisi bulunmaktadır.
2.7 Varoluş Koşulu
Eğer X varlığının bulunması, Y varlığının bulunmasına bağlı ise, X’in Y’ye bağlı olduğundan
söz edilir. Bir başka deyişle, Y silinirse X’in bir anlamı kalmayacaktır. O halde “X’ de
silinmelidir” sonucuna ulaşılır. Böyle bir durumda Y’ye baskın varlık (dominant entity),
X’e bağımlı varlık (subordinate entity) adı verilir.
16 / 192
2.8.1 Süper Anahtar
Varlık kümesi içinde yer alan bir varlığı kesin olarak tanımlamaya yarayan anahtara
süper anahtar denir. Bu anahtar sadece bir nitelikten oluşabileceği gibi, birden fazla
niteliğin birleşiminden de oluşabilir. Süper anahtarlar süper küme oluşturur. Bir süper
anahtarın herhangi bir süper kümesi daima bir süper anahtar olarak kabul edilir.
ÖRNEK:
SSK numarası bir PERSONELi diğerinden ayırt etmek için yeterlidir. Çünkü bir ülkedeki
tüm çalışanların sadece bir SSK numarası vardır ve iki farklı kişinin aynı SSK numarasına
sahip olması olanaksızdır.
PERSONELin “adı” süper anahtar olarak tanımlanamaz. Çünkü aynı isme sahip birçok
PERSONEL var olabilir. Ancak, “SSK numarası” bir süper anahtar olması nedeniyle, "SSK
numarası" ve "PERSONELin adı" birlikte süper anahtar olarak değerlendirilebilir. Hatta
“SSK Numarası, Adı, Bölümü” nitelikleri birlikte bir süper anahtar olarak kabul edilebilir.
2.8.2 Aday Anahtar
Varlık kümesi içinde yer alan bir varlığı kesin olarak tanımlamaya yarayan bir başka
anahtar da aday anahtar olarak bilinmektedir. Bir varlık kümesinin süper anahtarı bir
veya daha fazla niteliğin birleşiminden oluşabiliyordu. Bu tür bir süper anahtarın herhangi
17 / 192
bir alt kümesi aynı zamanda bir süper anahtar değil ise, bu anahtara aday anahtar ya
da kısaca anahtar adı verilir.
Bazı durumlarda; varlıklara ilişkin birkaç nitelik, birlikte bir anahtar olarak tanımlanabilir.
Personel için; “SSK No, Adı, Bölümü” nitelikleri, birlikte "PERSONEL" varlığı içindeki her
bir varlığı diğerinden ayırt etmek için kullanılabilir. Süper anahtar, varlıkları kesin olarak
birbirinden ayırt etme özelliğine sahip olmasına karşılık, bu özelliği kazanmak için
gerekenden fazla niteliği içerebilir. Anahtar ise, aynı tanıma uygundur. Ancak gerekenden
fazla nitelik içermeme özelliğine sahiptir. Yukarıda görüldüğü gibi, “SSK No” niteliği süper
anahtarın bir parçası olmasına karşılık, tek başına varlıkları birbirinden kesin olarak ayırt
etmekte kullanılabilir. O halde “SSK No” niteliği bir anahtardır.
ÖRNEK:
Bir “PERSONEL” varlığının aşağıda belirtilen niteliklere sahip olduğunu varsayalım.
18 / 192
“İsim ve soyadı”
“Doğduğu il”
“Eğitim düzeyi”
Bu üç nitelikten oluşan varlık kümesi, bir zayıf varlık kümesi olarak değerlendirilir. Çünkü,
bu küme içinde aynı isim ve soyadına sahip çok sayıda PERSONEL olabilir. O halde bir
anahtar olarak kabul edilemez. Benzer biçimde “doğduğu il” ve “eğitim düzeyi” nitelikleri
de aynı nedenlerden ötürü birer anahtar olamaz. Bu niteliklerin tümünün birleşimi bile bir
anahtar olamaz.
2.9.1 İlişki Türlerinin Gösterilmesi
İlişki türleri,




Birden-bire
Birden-çoğa
Çoktan-bire
Çoktan-çoğa
biçiminde tanımlanmıştı. Bu ilişkiler varlık-ilişki, yani ER şemaları ile aşağıdaki şekilde
gösterilebilir.
19 / 192
ÖRNEK 1:
Bir “PERSONEL” varlığının aşağıda belirtilen niteliklere sahip olduğunu varsayalım.






Adı
Cadde
Sokak
Apartman
Doğum tarihi
Sevdiği yiyecekler
a) “Cadde”, “sokak” ve “apartman” nitelikleri “adres” isimli adıyla birleştirilecektir.
b)
“Doğum tarihi” isimli nitelikten yararlanılarak “yaşı” isimli yeni bir nitelik elde
edilecektir.
Yapılan tanımlara uygun olarak varlık-ilişki şemasını şöyle oluşturabiliriz:
20 / 192
ÖRNEK 2:
“Müşteri” ve “Hesap” isimli iki varlık kümesi birbirine “musHes” isimli ilişki ile bağlıdır.
“Müşteri” varlığının nitelikleri:



Adı
SSK no
Adres
“Hesap” varlığının nitelikleri:


Hesap no
Bakiye
Varlık-ilişki şeması yanda belirtilen şekilde olabilir:
ÖRNEK 3:
“PERSONEL” isimli varlık kümesini göz önüne alalım. Bu varlık kümesinin nitelikleri
şunlardır:



Adı
Adresi
Tel no
Bu “PERSONEL” varlık kümesindeki PERSONELin bir kısmı diğerlerinin yöneticisidir. Bu
ilişki şu şekilde gösterilebilir:
21 / 192
2.10 Varlık İlişki Modelinin Tablolaştırılması
Bir veri tabanı, tablolardan oluşur. Varlık-ilişki şemaları biçiminde çizilen bir veri tabanı
tablolar halinde gösterilebilir. Veri tabanının her varlık kümesi ve her ilişki kümesi için, bu
isimlerle simgelenen birer tablo düzenlenir.
22 / 192
23 / 192
24 / 192
25 / 192
26 / 192
27 / 192
28 / 192
İLİŞKİSEL VERİ MODELİ
3.1 İlişkisel Model
İlişkisel model (relational model), günümüzde en yaygın biçimde kullanılan ( veri tabanı
modelidir ) bir modeldir. Ticari veri tabanı yönetim sistemlerinin hemen hemen tümünde
bu model kullanılmaktadır. İlişkisel model, varlıklar arasındaki bağlantının, içerdiği
değerlere göre sağlanması esasına dayanır. İlişkisel model, varlıklar arasında oluşan
karmaşık ilişkileri basite indirgemek amacıyla geliştirilmiştir. Bu yaklaşımda, veri
tabanındaki tüm ilişkiler tablolar biçiminde tanımlanmaktadır.
3.2 İlişkisel Veri Tabanı
İlişkisel veri tabanı, her biri özel isimlere sahip tablolardan oluşur. İlişkisel veri tabanında
her bir tablo bir varlığa veya bir ilişkiye karşılık gelmektedir. Tablonun sütunları
nitelikleri; satırlar ise bu niteliklerin değerlerini ifade eder. Her bir satır bir “kayıt” olarak
da düşünülebilir. Anahtar alan, tablonun tanımlayıcısıdır.
29 / 192
3.2.1 Tabloların Özellikleri
İlişkisel veri tabanı içinde yer alan her bir tablo;






Sütunlardan (kolonlardan) oluşur ve
Her bir sütunun ayrı bir adı vardır.
Her bir sütun, aynı niteliğin tanımlandığı aynı etki alanının (domain) belirlediği
değerleri içerir.
Her bir satır birbirinden farklıdır.
Satırların sırası önemsizdir.
Sütunların sırası önemsizdir.
3.2.2 Veri Tabanı Şeması
Veri tabanının mantıksal tasarımına “veri tabanı şeması” adı verilir. Tablolar ve onların
nitelikleri; veri tabanı şemasını oluşturur. Veri tabanı şemalarını iki ana grup altında
ortaya koymak mümkündür
Veri tabanı şeması veya bir başka deyişle kavramsal şema tasarlandıktan sonra, her bir
uygulama için alt-şemalar hazırlanır. Örneğin, muhasebe uygulaması bir alt şemadır.
Çünkü bu uygulama veri tabanının tümü ile ilgilenmez.
30 / 192
Alt şema, veri tabanı şemasının herhangi bir uygulama programı tarafından gereksinim
duyulan alt-düzey mantıksal görünümüdür. Bir uygulama programının veri tabanının her
noktasına erişmesi gerekmez. Çoğunlukla kendisi ile ilgili bölümlere yani alt-şemaya
ulaşması yeterlidir. Örneğin, firmanın satışlarla ilgili alt-şeması, ürünler ve müşterilerle
ilgili verileri kapsayacaktır. Bu uygulama, veri tabanının diğer kaynakları ile ilgilenmez.
3.2.3 Veri Tabanı Örneği
Veri tabanları, zaman içinde veri eklemeleri ya da veri silinmesi gibi işlemlere tabi
tutulurlar. Bu işlemler sonucunda veri tabanı sürekli olarak değişime uğrar. Ancak veri
tabanının herhangi bir andaki durumu önem taşır. Veri tabanının herhangi bir andaki
durumuna “Veri Tabanı Örneği” (database instance) adı verilir.
3.3 Veri Tabanı Bütünlüğü
Veri tabanının doğru ve tutarlı biçimde çalışması ve işlemleri yerine getirmesi gerekir.
Verinin doğru ve tutarlı olmasına "veri bütünlüğü" denir. Veri bütünlüğünün sağlanması
sonucunda, veri tabanının eksik, yanlış, tutarsız ve çelişkili olmaması sağlanır.
31 / 192
Veri tabanında veri bütünlüğünü sağlamak için birçok yol bulunmaktadır. Bunlardan en
önemlisi, “bütünlük sınırlamaları” (integrity constraints) adını almaktadır. Bütünlük
sınırlamaları, veri tabanı yönetim sistemi veya uygulama programları tarafından
tanımlanır. Sözü edilen sınırlamalar; kullanıcı tarafından yapılması gereken ekleme, silme
ve güncelleştirme işlemlerinden önce bir denetim yapılmasına neden olur. Bu denetim
sonucunda, sadece sınırlamalara uyan işlemlerin yapılmasına izin verilir. Diğerleri
reddedilir.
3.3.1 Anahtar Sınırlamaları
Bütünlük sınırlamalarının sağlanmasında anahtarlar önemli rol oynar. Anahtar türü
belirlenerek, bu sınırlamaların veri tabanı yönetim sistemi tarafından otomatik olarak
yapılması sağlanır. Söz konusu anahtarlar:


Birincil anahtar (Primary key)
Yabancı anahtar (Foreign key)
3.3.1.1 Birincil Anahtar Sınırlamaları
İlişkisel veri tabanlarında bir tablonun benzer değerler içermeyen (unique) bir sütunu ya
da birkaç sütunu birlikte “birincil anahtar” olarak tanımlanabilir. Birincil anahtar, bir aday
anahtardır ve söz konusu varlığın kayıtlarını en iyi biçimde karakterize eder. Birincil
anahtar tanımlandığında, şu şekilde bir sınırlama konulmuş olacaktır; “Birincil anahtar
NULL değerleri veya birbirinin aynı değerleri içeremez.” “Boş” olan değerlere NULL adını
veriyoruz. Bu sınırlamanın kontrolünü ise veri tabanı yönetim sistemi yapacaktır.
32 / 192
Birincil anahtar tek bir sütundan oluşabileceği gibi, birden fazla sütunun birleşiminden de
oluşabilir. Bu durumda “bileşik birinci anahtar” dan söz edilir. Bileşik birincil anahtarın
içerdiği değer “tek” olmalıdır. Ancak bileşik anahtarı oluşturan sütunların her biri çift
değerler içerebilir. Bununla birlikte birincil anahtarı oluşturan sütunların hiçbiri NULL
değer içeremez.
Örnek
PERSONEL tablosunun No isimli sütunu birincil anahtar olarak tanımlanmıştır. Bu
tabloya, şekil üzerinde görüldüğü biçimde 25 numaraya sahip yeni bir PERSONEL
eklemeye çalışıyoruz. Bu isteğimiz gerçekleşmeyecektir. Çünkü, bir tabloda birincil
anahtara sahip bir sütunda birbirinin aynı olan değerlere yer verilmez.
3.3.1.2 Dış Anahtar Sınırlamaları
Bir dış anahtar, bir sütun veya çok sayıdaki sütunların birleşiminden oluşur. Dış anahtar,
aynı tablo ya da bir başka tabloda yer alan bir birincil anahtarla eşleştirilir.
Dış anahtarın değeri bir birincil anahtar değeriyle eşleşmeli veya NULL olmalıdır. Eğer dış
anahtar birincil anahtarın bir kısmını oluşturuyorsa, doğal olarak NULL değer içeremez.
33 / 192
3.3.1.3 İlişkisel Bütünlük
İki tablo birbirleriyle dış anahtar kullanılarak ilişkilendirildikten sonra, bu sınırlamalara
dayanarak, iki tablo arasında silme ve güncelleştirme işlemleri otomatik olarak yerine
getirilebilir.
Örneğin; PERSONEL ve BÖLÜM isimli iki tabloyu göz önüne alalım. PERSONEL tablosunun
“Bölüm no” isimli sütunu, BÖLÜM tablosuna ilişkin bir dış anahtar olarak tanımlanmıştır.
Bu tür bir tanım beraberinde ilişkisel bütünlük özelliklerini getirecektir. BÖLÜM isimli
tablodan bir satırı, örneğin “10” numaralı bölümü silmek istiyoruz. Bu satır silindiğinde,
PERSONEL tablosunda da aynı satır ile ilgili tüm kayıtlar otomatik olarak yok olacaktır
3.3.2 Veri Değerleri Sınırlaması
Tablonun herhangi bir sütununda yer alacak verilerin hangi değerlere sahip olabileceği
konusunda sınırlamalar getirilebilir. Bir değerin NULL olamayacağı belirtilerek bir
sınırlama yapılabilir.
Bunun yanı sıra, örneğin, PERSONELin şehir içi telefon numarasının 7 haneden fazla
olmasını önlemek için böyle bir sınırlama konulabilir. Benzer biçimde, bir öğrencinin
doğduğu ilin trafik kodunun 3 haneden fazla olamayacağı ve 1 ile 81 rakamları arasında
olabileceği biçiminde sınırlamalar getirilebilir.
34 / 192
ÖRNEK:
PERSONEL tablosu için şöyle bir sınırlama tanımlandığını varsayalım; “Bölüm numaraları
1-99 arasında, yani iki haneli olacaktır.” Bu sınırlamaya uymayan bir giriş yapılmaya
çalışıldığında, örneğin bölüm numarası 400 olan bir kayıt girilmeye çalışıldığında,
sınırlama nedeniyle kayıt ekleme işlemi yerine getirilmeyecektir.
3.3.3 İşletme Kuralları Sınırlaması
Tablolar üzerinde işletme kurallarına dayalı sınırlamalar yapılabilir. Bu sayede, işletme
kurallarına uygun olarak veri bütünlüğü söz konusu olabilir. Örneğin, işletmenin
muhasebe bölümünde “programcı” kadrosuna sahip eleman çalıştırmak anlamlı değildir.
Bunu denetlemek gerekecektir. Veri tabanına bilgi girişleri esnasında, muhasebe
bölümüne yeni PERSONEL kaydı eklemek gerektiğinde, söz konusu işletme kuralı,
uygunsuz veri girişlerini engelleyecektir. Bu tür sınırlamalar çoğunlukla uygulama
programları aracılığıyla denetlenir.
3.3.4 Nitelikler Arası Bağımlılıkların Kullanılması
Veri bütünlüğünün ve tutarlılığının sağlanmasında, nitelikler arasındaki bağımlılıkların
kullanılması yararlı olabilir. Niteliklerin birbirleriyle olan bağımlılığı göz önüne alınmadan
veri tabanı tasarımının yapılması sorunlara neden olacaktır. Nitelikler arasındaki
fonsiyonel bağımlılıklar belirlenerek, şema üzerinde düzenlemeler yapılır.
35 / 192
36 / 192
İLİŞKİSEL VERİ TABANI TASARIMI
4.2 Fonksiyonel Bağımlılık
R bir ilişki şeması olsun. X ve Y niteliklerinin R'nin iki alt kümesi olduğunu varsayalım.
,
Eğer X nitelikler kümesinin değerleri Y nitelikler kümesinin değerlerini belirliyorsa; Y, X 'e
fonksiyonel bağımlıdır denir. O halde; R ilişkisinin Y niteliği, R'nin X niteliğine ilişkisel
olarak bağımlıdır. X 'in her bir değeri Y'nin bir değerine karşılık geliyorsa da fonksiyonel
bağımlılıktan söz edilir. Bu işlevsel bağımlılık,
biçiminde ifade edilir. Eğer bu bağıntı geçerli ise ve X'den bir nitelik çıkarıldığı halde bu
bağımlılık hala geçerli oluyorsa; burada kısmi bağımlılık söz konusudur.
Fonksiyonel bağımlılığı bir örnek ile ortaya koymak istiyoruz.
Örnek
Bir şirketin müşterilerine partiler biçiminde ürün gönderdiğini varsayalım. Her bir müşteri
ayrı bir ilde yer almaktadır. Bir şehir birden fazla müşteri içerebilir. Her bir şehir "şehir
kodu" na sahiptir. Her bir müşteriye birden fazla parti ürün gönderebilir. Bu bilgileri
saklamak için bir ilişkisel tablo yaratıldığını varsayalım. Bu tablonun adı DAĞITIM olsun.
Söz konusu DAĞITIM şeması şu şekilde gösterilebilir;
DAĞITIM (m#, şehir_kodu, şehir, p#, miktar)
37 / 192
Burada m#, şehir_kodu ve şehir alanları müşteri bilgilerini, p# ve miktar ise dağıtım
işlemi bilgilerini oluşturmaktadır. Bir müşteriye birden fazla parti ürün gönderilebilir.
Verinin tekrarlı olmasını önlemek için m# ve p# birleşik anahtar olarak tanımlanmıştır.
Bu verilere dayanarak fonksiyonel bağımlılıkları şu şekilde ifade edebiliriz:
m#şehir_kodu,şehir
şehirşehir_kodu
(m#,p#)miktar
Burada iki türlü bağımlılık tanımlanmıştır. Birinci ve üçüncüsü anahtarlara göre
bağımlılıkları ortaya koymaktadır. İkinci bağımlılık ise, anahtara bağımlı olmayan, geçişli
bağımlılıklardır.
4.3 Birinci Normal Form
Aşağıdaki tablo birinci normal form olarak tanımlanır. İlişkisel veri tabanı modelinin
temel kuralıdır. Bütün niteliklerin aldığı değerler atomik olmak zorundadır.
Birinci formdaki bir tablo, belirli bazı alanlarda tekrarlı verilere sahiptir. Örneğin; sehir
kodu ve şehir verileri her müşteri için tekrarlıdır. Bu tekrarlar güncelleme sorunlarına yol
açacaktır. Ayrıca bu formda bilgi girişi ve silme işlemlerinde sorunlara neden olacaktır.
38 / 192
4.3.1.1 Satır Ekleme Sorunu
Bir başka şehirdeki, örneğin "İZMİR" deki müşterinin m#, şehir_kodu ve şehir
bilgilerinin girilebilmesi için; mutlaka bir dağıtım işleminin gerçekleştirilmesi gerekir.
Ekleme işleminin yapılabilmesi için, bu müşteriye ilişkin bir dağıtım işleminin yapılmış
olması ve p# ile miktar değerlerinin belirlenmiş olması gerekir. Bu değerler olmadan
kayıt ekleme işlemi yapılamaz.
39 / 192
4.3.1.2 Satır Silme Sorunu
Bir dağıtım işleminin iptal edilerek ilgili kaydın silinmeye çalışıldığını varsayalım. Bir satır
silindiğinde, sadece dağıtım ve miktarı değil, müşteri hakkındaki diğer bilgiler de yok
olacaktır. Örneğin, M3 müşterisi ile ilgili satır silindiğinde, müşterinin şehir_kodu ve
şehir bilgileri de yok olacaktır.
4.3.1.3 Güncelleme Sorunu
M1 müşterisinin yeri İSTANBUL'dan ANKARA'ya taşınırsa, bu yeni bilgi nedeniyle tablo
içinde M1'e ait beş satırın güncelleştirilmesi gerekecektir. Eğer tablo çok büyük ise,
sadece bir müşteri ile ilgili bu tür küçük bir değişiklik belki de binlerce kaydın
güncelleştirilmesi sorununu yaratacaktır.
40 / 192
4.4 İkinci Normal Form
Birinci normal formun, veri tabanı tasarımı esnasında bazı sorunlara neden olduğunu
öğrendik. Bu sorunlardan bir kısmını çözmek için birinci normal formdaki tablolar, başka
normal formlara dönüştürülür.
Tabloların sütunları arasındaki fonksiyonel bağımlılıktan yararlanarak, 1NF (birinci normal
form) tablolarının birden fazla tabloya dönüştürülmesi sonucunda; ikinci normal forma
(2NF) ulaşılır.
Eğer bir ilişki şemasındaki birincil anahtar olmayan bir nitelik, R'nin herhangi bir anahtar
niteliğine kısmi fonksiyonel olarak bağımlı değilse (yani tam fonksiyonel bağımlı ise), bu
ilişki ikinci normal formdadır.
İkinci normal formda ilişkisel tablonun her bir anahtar olmayan sütunu, birincil anahtara
tam fonksiyonel bağımlıdır. Bu; anahtar olmayan her kolon, birincil anahtara bağımlı
olmalıdır demektir. DAĞITIM tablosu birinci normal formdadır. Çünkü, şehir_kodu ve
şehir sütunları (m#, p#) birleşik anahtarının sadece m# sütunu üzerinde fonksiyonel
bağımlıdır.
İkinci normal form, kendisi anahtar olmayan tüm sütunların anahtara bağlanarak yeni
tablolara ayrıştırılması ile oluşturulur.
Örnek; DAĞITIM isimli tabloda m# ve p# anahtarları göz önüne alınarak, bu tablo iki
ayrı tabloya dönüştürülebilir. Bu tablodaki fonksiyonel bağımlılıklar şu şekilde ifade
edilebilir:
m# -> şehir_kodu, şehir
şehir -> şehir_kodu
(m#,p#) -> miktar
Bu fonksiyonel ilişkilerden birincisi ve üçüncüsü, anahtarlara fonksiyonel bağlı olarak
tanımlanmıştır. Bu tanımlar 2NF formunun yapısını belirler. 2NF durumunda DAĞITIM
tablosu ŞEHİRLER ve MİKTARLAR isimli iki tabloya dönüşür.
DAĞITIM(m#, şehir_kodu, şehir, p#, miktar)
ŞEHİRLER(m#, şehir_kodu, şehir)
MİKTARLAR(m#, p#, miktar)
41 / 192
Bu tabloların görünümü aşağıdaki animasyonda canlandırılmıştır.
4.4.1.1 Satır Ekleme Sorunu
ŞEHIRLER isimli tabloya yeni bir müşteri kayıtı girilmediği sürece, yeni bir şehir kodu ve
şehir adı girilmesine olanak yoktur. Örneğin bu tabloya, 61 şehir koduna sahip TRABZON
ilini eklemek gerektiğinde bir sorunla karşılaşılacaktır. Bu ili tabloya dahi etmek için, bu
ilde yerleşmiş bir müşteriye ihtiyaç vardır. Böyle bir müşteri olmadığı sürece şehir ile ilgili
bu tür bilgiler tabloya eklenemez.
42 / 192
4.4.1.2 Satır Silme Sorunu
Tablodan bir müşteri silindiğinde, şehir kodu ve şehir adı bilgileri de yok olacaktır.
Örneğin, ŞEHİRLER tablosundan M5 müşterisi silindiğinde, o müşterinin yerleştiği
İZMİR iline ilişkin veriler de tablodan yok olur.
43 / 192
4.5 Üçüncü Normal Form
R'deki herhangi bir anahtar içinde yer almayan nitelik, R'nin herhangi bir niteliğine geçişli
fonksiyonel bağımlı değil ve ayrıca 2NF özelliklerine sahip ise; bu ilişkinin üçüncü
normal formda (3NF) olduğu söylenir.
İkinci normal formda sadece anahtarlara ilişkin fonksiyonel bağımlılıklar kullanılmıştı.
Bunun dışındaki geçişli bağımlılıklar da tablolara dönüştürülerek, üçüncü normal form
elde edilir. Örneğimizdeki fonksiyonel bağımlılıkları şu şekilde tanımlamıştık;
m# -> şehir_kodu, şehir
şehir -> şehir_kodu
(m#,p#) ->miktar
Bu durumda, bir anahtara bağlı olmayan,
şehir -> şehir_kodu
geçişli bağıntısı da ayrı bir tabloya dönüştürülerek, 3NF'deki aşağıdaki tablo tanımlarına
ulaşılır;
MÜŞTERİ_ŞEHİR(m#, şehir)
ŞEHİR_KOD(şehir_kodu, şehir)
MİKTARLAR(m#, p#, miktar)
Tablolar bu tanımlara göre yeniden düzenlenir.
44 / 192
4.6 Boyce-Codd Normal Formu
2NF, 3F durumunda olup geçişli bağımlılık içermeyen bir ilişkidir. Kendisi anahtar
olmayan özellikler, anahtara fonksiyonel olarak bağlı bulunmamaktadır.
3NF'da da bazı sorunlarla karşılaşılabilir. Bu sorunları önlemek için Boyce-Codd normal
formu (BCNF) kullanılır.
Örnek olarak aşağıdaki ilişkiyi göz önüne alalım;
ÖĞRENCİ(öğrenci_no, bölüm, öğretim_üyesi)
Burada birincil anahtar; (öğrenci_no, bölüm) olarak belirlenmiştir. Aday anahtar ise;
(öğrenci_no, öğretim üyesi) biçimindedir. Fonksiyonel bağıntı ise şu şekilde ifade
edilebilir;
Öğretim_üyesi -> bölüm
Şekil üzerindeki ilişki 3NF durumuda olup bazı sorunlara sahiptir. Örneğin, bir öğrenci
birden çok bölüme yazılabildiği gibi; bir bölümde birden fazla öğretim üyesi de yer
alabilmektedir. Bu durumda, öğrenci birden çok bölüme yazılabildiği için, öğrenci_no
anahtarı bölümü ve öğretim üyesini belirleyememektedir.
Burada öğrenci_no ile bölüm anahtarları birlikte, öğretim üyesi niteliğini; öğrenci_no ile
öğretim_üyesi anahtarları da bölüm niteliğini belirlemektedir. Bu kombinasyonların her
ikisi de anahtar olabilir.
ÖĞRENCİ şeması tanım olarak, birinci normal formdadır. Anahtarsız nitelikler, bir
anahtara bağlı olduğu için de ikinci normal formdadır. Ayrıca geçişli bağımlılık
bulunmadığı için, üçüncü normal formdadır.
Buna rağmen yukarıdaki şema yine bazı sorunlara sahiptir. Örneğin, 98 numaralı
öğrencinin kaydının silinmesi durumunda, B.ÖZKAN 'a ait olan bilgi de yok olacaktır. Aynı
şekilde, yeni bir öğrenci EKONOMİ bölümüne yazılıncaya kadar bu bölüm tablo üzerinde
görülmeyecektir.
Bu sorunları önlemek için, Boyce-Codd normal formu elde edilmeye çalışılır. BCNF, her
belirleyicinin bir anahtar oluşu halidir. ÖĞRENCİ şemasında öğretim_üyesi bir aday
anahtar değil, bir belirleyici olduğu için, bu ilişki BCNF'da bulunmamaktadır. ÖĞRENCİ
şeması aşağıda görüldüğü biçimde iki ilişkiye ayrılması halinde, BCNF oluşturulur ve
yukarıda sayılan sorunlara son verilmiş olur.
45 / 192
4.7 Dördüncü Normal Form
Bazı durumlarda BCNF'daki bir ilişkide de sorunlar görülebilmektedir. Örnek olarak
aşağıdaki tabloyu göz önüne alalım:
ÖĞRENCİ(öğrenci_no, bölüm, spor)
Bu ilişki; değerlerin atomik oluşu, anahtarlarının bulunuşu, geçişli belirleyicilerinin
olmaması ve belirleyicilerinin anahtar oluşu özellikleri nedeniyle 1NF, 2NF, 3NF ve BCNF
koşullarına uymaktadır. Buna karşılık, yine de bazı sorunları bulunmaktadır.
Burada bir öğrenci, birden çok sayıda bölüme ve spor etkinliğine sahip olabilmektedir. Bu
nedenle, öğrenci_no ile bölüm ve öğrenci_no ile spor arasındaki ilişkiler birer fonksiyonel
bağıntı değil; çok değerli bağımlılık halindedir. Çok değerli bağımlılıklar -> -> simgesi
ile ifade edilir .
Bir ilişki şemasında bir A anahtar olmak üzere, bütün fonksiyonel bağımlılıklar için; A ->
X ve bütün çok değerli bağımlılıklar için; A -> -> Y biçiminde ise, dördüncü normal form
söz konusudur.
46 / 192
Çoklu bağıntılarda ekleme ve silme esnasında sorunlarla karşılaşılabilir. Örneğin,
MATEMATİK ve MUHASEBE bölümleri ile KAYAK ve TENİS spor etkinliklerine katılan
65 numaralı öğrenci için 4 ayrı kayıt yapılmaktadır. Bu öğrencinin FUTBOL etkinliğine
katılabilmesi için ayrıca 2 kayıt daha eklenmesi söz konusudur. Böylece çok sayıda
yineleme sorunu ortaya çıkmaktadır. Bu sorunu önlemek için, yukarıda verilen ilişki iki
ayrı ilişkiye ayrılarak, çoklu bağımlılık durumu eklenmekte ve dördüncü normal form
(4NF) oluşturulmaktadır.
Beşinci normal form; ilişki içerisindeki her birleşik bağıntının, bu ilişkideki aday
anahtarlardan oluşturulması ile sağlanmaktadır. Örnek olarak, aşağıdaki şemayı göz
önüne alalım:
ÖDÜNÇ (şube_adı, toplam_mevduat, şube_şehri, kredi_no, müşteri_adı, miktar)
47 / 192
Bu şema; silme, ekleme ve değiştirme işlemlerinde kaydın tamamının yazılmasını
gerektirdiği için, iyi bir veri tabanı şeması olarak değerlendirilmez. Bu şema, önce iki ayrı
şemaya bölünür.
ŞUBE (şube_adı, toplam_mevduat, şube_şehri)
KREDİ (şube_adı,kredi_no, müşteri_adı, miktar)
KREDİ şeması da aşağıda belirtildiği biçimde ikiye ayrılır:
KREDI_MİKTAR (şube_adı, kredi_no, miktar)
MÜŞTERİ_KREDİ (kredi_no,müşteri_adı)
Böylece kayıpsız ayrıştırma işlemi gerçekleştirilmiş olur. Burada ortak özellik, kredi_no
olup;
Kredi_no -> miktar, şube_adı
bağıntısı kurulmaktadır. Böylece KREDİ şeması,
KREDİ1 (kredi_no, şube_adı)
KREDİ2 (kredi_no, müşteri_adı)
KREDİ3 (kredi_no, miktar)
biçiminde üç ayrı şemaya ayrılarak 5NF oluşmaktadır.
48 / 192
49 / 192
50 / 192
51 / 192
İLİŞKİSEL CEBİR
5.1.1 Seçim
Belirli bir ilişkiden, bazı sıraları (kayıtları) seçerek ortaya koymaya seçme işlemi denir.
Bu işlem
işareti ile gösterilir ve şu şekilde tanımlanır:
Seçim işleminde, bir seçim kriteri kullanılır. Seçim kriteri bir eşitlik biçiminde ortaya
konabilir. Bu tür bir işlemde "=" karşılaştırma işleci yerine "
biri de kullanılabilir.
Ayrıca mantıksal işleçlere de yer vermek mümkündür. "Ve" için "
işleçleri kullanılabilir.
" işleçlerinden
"; "veya" için "
"
52 / 192
Örnek
MÜŞTERİ ilişkisini (tablosunu) göz önüne alalım. "Beşiktaş" ilçesindeki müşterileri
seçmek için aşağıda belirtildiği biçimde bir sorgu düzenlenebilir;
Bu sorgu tablodan iki kayıdın seçilmesine neden olur. Sorgulamayı şu şekilde anime
edebiliriz :
53 / 192
Örnek
MÜŞTERİ tablosunu yeniden göz önüne alalım. İlçesi "Beşiktaş" ve bakiye miktarı
100'den büyük olan müşterileri seçmek istiyoruz. Amacımıza uygun sorgu şu şekilde
tanımlanabilir;
Bu sorgu, tablodan bir kayıdın seçilmesine neden olur. Sorgulamayı şu şekilde
göstebiliriz;
54 / 192
5.1.2 Atma İşlemi
Belirli bir ilişkiden bazı sütunları atmak suretiyle yapılan seçim işlemidir. Bu işlem
işareti ile gösterilir. Atma (projection) adı verilen bu işlem şu şekilde tanımlanır;
Örnek
MÜŞTERİ tablosunda yer alan kayıtlara bir sorgu uygulayarak, sadece müşteri adı ve
şehir bilgisi elde edilmek istenmektedir. Söz konusu sorgu ilişkisel cebir ifadeleriyle şu
şekilde ortaya konulabilir;
Sorgulamayı şu şekilde gösterebiliriz;
55 / 192
5.1.3 Çarpma
Belirli bir ilişkiden mümkün olabilecek tüm çiftleri elde ederek tek bir ilişki biçiminde
göstermek için kartezyen çarpım oluşturulur. Kartezyen çarpım
Kartezyen çarpım şu şekilde ifade edilir;
işareti ile gösterilir.
56 / 192
Örnek
Aşağıdaki ÖĞRENCİ ve DERSLER ilişkilerini göz önüne alalım. İki tablonun kartezyen
çarpımı, her iki tablonun tüm satırlarının birbirleriyle eşlenmesi sonucunda elde edilir.
Sonuç, mümkün olabilecek tüm eşleşmeleri kapsayacaktır. Söz konusu çarpım şu şekilde
ifade edilir;
Sorgulamayı şu şekilde gösterebiliriz;
57 / 192
Örnek
ÖĞRENCİ ve DERSLER ilişkilerini göz önüne alalım. "İktisat" bölümünde okuyan ve
tüm dersleri alan öğrencileri bulmak için;
sorgusu tanımlanabilir. Bu sorgu işleminde yer alan
ifadesi, ÖĞRENCİ ve DERSLER tablolarından elde edilebilecek tüm ikilileri ifade
etmektedir.
biçimindeki bir tanım
ise, bu sonuç üzerinden bölümü "İktisat" olan satırları seçmektedir. Sorgulamayı şu
şekilde gösterebiliriz;
58 / 192
Örnek
"İktisat" bölümünde okuyan ve hem "Matematik" hem de "İstatistik" dersi alan
öğrenciler listelenecektir. Ancak bunlara ilişkin olarak sadece ders ve öğrenci adı elde
edilecektir. Amacımıza uygun sorgu şu şekilde olabilir;
Sorgulamayı şu şekilde gösterebiliriz;
59 / 192
Örnek
Aşağıdaki ilişkileri göz önüne alalım. Bankanın "Beşiktaş" şubesinde mevduat ve/veya
kredi hesabı bulunan kişileri seçmek ve sadece isimlerini sunmak için şöyle bir ifade
tanımlanabilir;
Sorgulamayı şu şekilde gösterebiliriz;
60 / 192
Örnek
Aşağıdaki ilişkileri göz önüne alarak, bankanın "Beşiktaş" şubesinde hem mevduat hem
de kredi hesabı olan müşterileri bulmak için aşağıdaki sorgu düzenlenebilir;
Sorgulamayı şu şekilde gösterebiliriz;
61 / 192
Örnek
Aşağıdaki ilişkileri göz önüne alarak, bankanın "Ulus" şubesinde mevduatı olup kredisi
olmayan müşterilerin isimlerini bulmak için şu şekilde bir işlem tanımlanır;
Sorgulamayı şu şekilde gösterebiliriz;
62 / 192
5.1.7. Doğal Birleştirme
(A,B) ve (B,C) niteliklerine sahip iki ayrı ilişkinin, (A,B,C) niteliklerine sahip tek bir ilişki
haline dönüştürülmesine Doğal Birleştirme denir. Bu işlem
işareti ile gösterilir.
Örnek
Aşağıdaki ilişkileri göz önüne alarak, kredi hesabı olan ve aynı ilçede oturan tüm
müşterilerin isimlerini bulmak için şu şekilde bir ifade tanımlanır;
Bu tanım sonucunda KREDİ ve MÜŞTERİ tablolarında yer alan adı ve ilçe nitelikleri
karşılaştırılır ve birbirleriyle eşleşen kayıtlar birleştirilir. Sorgulamayı şu şekilde
gösterebiliriz;
63 / 192
5.1.8 Bölme
İkili ve birli; iki ayrı ilişkiyi karşılaştırarak, birli olan ilişkiye eş olan ikinci ilişkinin
değerlerinden oluşan, yeni bir ilişki oluşturulabilir. Bu tür bir işlem bölme işlemidir ve (:)
işareti ile gösterilir.
Örnek
Bir bankanın İSTANBUL ilindeki bütün şubelerinde mevduat hesabı olan müşterilerini
öğrenmek istiyoruz.
64 / 192
Adım 1:
Şube isimleri ŞUBE ilişkisi ile tanımlıdır. Önce İSTANBUL 'da yer alan tüm şubeleri elde
edelim.
Adım 2:
Bu kez aşağıdaki MEVDUAT tablosunu göz önüne alalım. MEVDUAT tablosundan tüm
müşterilerin adını ve şubesini elde etmek için aşağıda belirtilen işlem uygulanır;
Adım 3:
Bölme işlemi
biçiminde tanımlanır. Bu işlem sonucunda aşağıda belirtilen sonuç elde
edilir. Burada Adım 1'deki şube isimlerinin Adım 2'dekilerle karşılaştırıldığı ve eşleşen
kayıtların elde edildiği anlaşılmaktadır.
65 / 192
66 / 192
SQL YAPISAL SORGULAMA DİLİ
6.1. Sorgulama İşlemleri
SQL'de sorgulama işlemleri, SELECT deyimi yardımıyla yerine getirilir. SELECT deyimi
temel olarak üç farklı işlemi yerine getirmek için kullanılır:
6.1.1. SELECT Deyiminin Yapısı
SELECT deyimi en basit biçimde şu şekilde ifade edilmektedir;
SELECT [DISTINCT] { * |
sütun, ....}
FROM tablo;
Tanım içinde bazı SQL anahtar kelimelerine yer verilmektedir. Bu anahtar kelimeler, SQL
'in kendi özel kelimeleridir ve aynen bu şekilde ifade edilmelidir.
SELECT
SQL'in sorgulama deyimidir.
FROM
Hangi tablonun sorgulanacağını
ifade eder.
DISTINCT
Çift kayıtları önleyen anahtar
kelimedir.
Tanımdaki her bir işaretin veya farklı gösterimin hangi anlama geldiğini aşağıdaki
tablodan görebilirsiniz.
[]
Kullanılması zorunlu olmayan SQL
sözcükleri, bu işaretler arasında tanımlanır.
Altı çizili ve italik olan bu ifadeler, kullanıcı
tarafından verilen isimleri ifade etmektedir.
67 / 192
Bunlar SQL sözcüğü değildir.
{..|.. }
Bu biçimde gösterilen ifadeler, birden fazla
seçeneğin varlığını ve bu seçeneklerden
birinin mutlaka seçilmesi gerektiğini ifade
eder. Seçenekler birbirlerinden | işareti ile
ayrılmaktadır.
*
Tek bir sütunu değil, tüm sütunları ifade
eder.
6.1.2. SELECT Yazım Kuralları
SQL deyimleri düzenlenirken bazı kuralları ve önerileri göz önünde tutmak
gerekmektedir. Aksi takdirde sorgu hata verir ve çalışmaz.
SQL sorgu yazım kurallarını aşağıdaki animasyonu inceleyerek görebilirsiniz.
6.1.3 Bir Tablonun Tüm Satırlarını Seçmek
Bir tablonun tüm sütunlarını seçmek söz konusu ise, SELECT deyimi içinde sütun isimleri
yerine; * işareti kullanılır.
Örnek:
BÖLÜM isimli tablonun sütunları şunlardır;
Sütun
adı
Açıklama
68 / 192
Bölüm_no
Bölüm numarasıdır.
Bölüm_adı Bölümün adıdır.
Konumu
Bölümün bulunduğu
yerin adıdır.
Bu tablonun içerdiği tüm verileri görüntülemek istiyoruz. Bunun için aşağıda belirtilen
SELECT deyimi düzenlenir:
SELECT * FROM BÖLÜM;
Bu deyimi, daha izlenebilir olmasını sağlamak için şu şekilde de yazabiliriz;
SELECT * FROM
BÖLÜM;
Sorgunun nasıl çalıştığını aşağıda görebilirsiniz.
! Sorguyu çalıştırmak için "Çalıştır" düğmesine tıklayınız.
6.1.4. Belirli Sütunların Seçilmesi
69 / 192
Tablo içinde belirlenen sütunların elde edilmesi söz konusu ise, SELECT deyimi içinde bu
sütun isimlerine yer verilir. Sütun isimleri virgüllerle birbirlerinden ayrılır.
Örnek:
BÖLÜM tablosunun sadece bölüm numaralarını ve bölüm isimlerini içeren sütunlarını, yani
BÖLÜM_NO ve BÖLÜM_ADI sütunlarını seçerek görüntülemek istiyoruz. Amacımıza uygun
SELECT deyimi şu şekilde düzenlenebilir;
SELECT BÖLÜM_NO, BÖLÜM_ADI
FROM BÖLÜM;
Sütun isimleri, tablo isimleriyle birlikte ifade edilebilir.
Özellikle birden fazla tablo varsa bu yola başvurulur. Bunun
için, tablo ismi her bir alanın başına eklenir ve araya bir
nokta işareti konur.
SELECT BÖLÜM.BÖLÜM_NO, BÖLÜM.BÖLÜM_ADI
FROM BÖLÜM;
Sorgunun nasıl çalıştığını aşağıda görebilirsiniz.
! Sorguyu çalıştırmak için "Çalıştır" düğmesine tıklayınız.
70 / 192
Örnek
PERSONEL tablosunun PERSONEL ve ÜCRET isimli iki sütunu listelenecektir. Ayrıca
ÜCRET sütununun içerdiği değere; 1500 değeri eklenerek (yani ücretlere zam yapılıyor)
ayrı bir sütun elde etmek istiyoruz. Amacımıza uygun SELECT deyimi aşağıda görüldüğü
biçimde düzenlenebilir;
SELECT PERSONEL_NO, ADI, ÜCRET+1500
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
71 / 192
72 / 192
Örnek
Önceki kısımdaki örnekte 12*ÜCRET+500 biçiminde bir tanım yaparak, yıllık ücrete zam
yapmıştık. Bu kez aylık ücrete 500 zam yapmak istiyoruz. Amacımıza uygun ifade şu
şekilde olabilir:
12*(ÜCRET+500)
Bu durumda, ücret sütununun içerdiği değere 500 eklenir ve bulunan değer 12 ile
çarpılır. Amacımıza uygun SELECT deyimi şu şekilde olabilir;
SELECT PERSONEL_NO, ADI, 12*(ÜCRET+500)
FROM PERSONEL;
73 / 192
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
6.2.3 Aritmetik İfadelerde NULL Değerlerin Kullanımı
NULL Değer; var olmayan, atanamayan, bilinmeyen bir değer olarak kabul edilir. NULL
Değer, bir sıfır ya da boşluk olarak da değerlendirilmez. Eğer bir sütun NULL değerler
içeriyorsa, SELECT deyimi çalıştırıldığında bu değerler boş olarak görüntülenir.
Örnek
Eğer bir aritmetik ifade içinde NULL değer içeren bir sütun varsa, ifade ne olursa olsun o
satırlarla ilgili sonuç da NULL olarak elde edilir. KOMİSYON isimli sütunun NULL değerler
içerdiği bilinmektedir. O halde;
SELECT ADI, ÜCRET,KOMİSYON, 12*ÜCRET+KOMİSYON
FROM PERSONEL;
74 / 192
deyimi çalıştırıldığında, tanımlanan aritmetik ifade her satır için NULL değerler
üretecektir. NULL ile yapılan hesaplamalara dikkat ediniz. Örneğin,
12*7000+NULL  NULL
olduğu unutulmamalıdır.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
6.3. Sütunlar İçin Takma İsimler Kullanımı
SELECT deyimi çalıştırıldığında, elde edilen sonuçlar yine sütunlar biçiminde olacaktır.
Tablonun sütun isimleri, SELECT deyiminin çalışması sonucu elde edilen listenin sütun
başlıkları olacaktır.
Bunun yerine, çıktı sütunlarına istenilen başlıklar atanabilir. AS anahtar kelimesi bu
amaçla kullanılır. Eğer takma isim birden fazla kelimeden oluşuyorsa tırnak işaretleri
arasında belirtilebilir.
75 / 192
Örnek
PERSONEL tablosunun PERSONEL sütunu için İSİM, ücret sütunu için AYLIK_ÜCRET
takma isimlerini atayacağız. Ayrıca yıllık ücreti hesaplayarak bu sütuna da
YILLIK_ÜCRET takma ismini vermek istiyoruz. Amacımıza uygun SELECT deyimi şu
şekilde olabilir;
SELECT ADI AS İSİM, ÜCRET AS AYLIK_ÜCRET,
12*ÜCRET+KOMİSYON AS YILLIK_ÜCRET
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
76 / 192
Örnek
PERSONEL adı ve görev bilgisini birleştirerek, iki sütun bilgisi arasına "-" işaretini
yerleştirmek ve tek sütun biçiminde görüntülemek istiyoruz. SELECT deyimini ORACLE
veri tabanı için şu şekilde düzenleyebiliriz;
SELECT ADI || '-' || GÖREVİ AS ADI_GÖREVİ
FROM PERSONEL;
Aynı amaca SELECT deyimini MS Access veri tabanında şu şekilde kullanarak ulaşabiliriz;
SELECT ADI & "-" & GÖREVİ AS ADI_GÖREVİ
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
77 / 192
6.5. Aynı Değere Sahip Satırlar
Bir SELECT deyimi çalıştırıldığında, aynı değerlere sahip satırların görüntülenmesi
engellenemez. Örneğin,
SELECT BÖLÜM_NO
FROM PERSONEL;
deyimi çalıştırıldığında, PERSONEL tablosunun BÖLÜM_NO sütunu içerikleri aynen
listelenir. Bu sütunun içerdiği değerlerin çoğu birbirinin aynı olabilir. Eğer tekrarlı
değerlerin sadece bir tanesinin elde edilmesi söz konusu ise, SELECT deyimi DISTINCT
anahtar kelimesi ile birlikte kullanılır.
SELECT DISTINCT BÖLÜM_NO
FROM PERSONEL;
78 / 192
6.6. Verinin Sınırlandırılması
Veri tabanından veriyi alma sırasında, satırlara bazı kısıtlamalar koyarak, tablonun tüm
satırları yerine bir kısmı elde edilebilir.
Tablonun belirli kısımlarını seçmek için WHERE sözcüğü kullanılır. Bu sözcük SELECT
deyimi içinde aşağıda gösterildiği biçimde yer alır. WHERE sözcüğü içinde tanımlanan
koşul; sütun içindeki değerleri, literal değerleri, aritmetik ifadeleri veya fonksiyonları
içerebilir.
79 / 192
Örnek
PERSONEL tablosu içinde yer alan PERSONEL arasında görevi MEMUR olanları seçerek
listelemek istiyoruz. Amacımıza uygun SELECT deyimi şu şekilde düzenlenebilir;
SELECT ADI,GÖREVİ,BÖLÜM_NO
FROM PERSONEL
WHERE GÖREVİ='MEMUR';
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
80 / 192
6.6.2. Diğer Karşılaştırma İşleçleri
Şu ana kadar öğrendiğimiz karşılaştırma işleçleri dışında, bazı özel amaçlarla
kullanılabilecek başka karşılaştırma işleçleri de bulunmaktadır. Aşağıdaki etkileşimli
listeden bu işleçleri ve anlamlarını görebilirsiniz.
81 / 192
82 / 192
6.2.2.2 IN İşleci
Sütun değerlerinin, bir listedeki değerler ile karşılaştırılması söz konusu ise, SELECT
deyimi ile birlikte IN işleci kullanılır. Liste içindeki değerler birbirlerinden virgüllerle
ayrılır. IN işleci herhangi bir veri türü için kullanılabilir. Karakter ve tarih veri türleri,
tırnak işareti arasında yer almalıdır.
IN( liste)
Örnek
Görevi MEMUR veya PAZARLAMACI olan tüm personeli listelemek istiyoruz. Bunun için IN
işlecini kullanabiliriz.
SELECT ADI,GÖREVİ
FROM PERSONEL
WHERE GÖREVİ IN('MEMUR', 'PAZARLAMACI');
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
83 / 192
6.6.2.3 LIKE İşleci
WHERE sözcüğü ile, bir sütunun değerini tam olarak değil, sadece bir kısmını belirterek
arayabiliriz. Örneğin, adı "A" harfi ile başlayan personeli aramak gibi. Bu tür amaçlar için
LIKE işleci kullanılabilir. Bu operatör ile birlikte, farklı amaçlar için (%) veya (_)
işaretleri kullanılabilir.
Bunlardan (%) işareti, bu işaretten önce ya da sonra gelen karakterler için arama
yapılacağını belirtir. Örneğin, "A" harfi ile başlayanlar, 'A%' biçiminde; "S" harfi ile
bitenler, 'S%' biçiminde ifade edilir. (_) işareti ise herhangi bir tek karakteri simgeler.
LIKE ile birlikte kullanılan (%) işareti yerine, MS Access'de (*) işareti kullanılır.
LIKE ( kural)
Örnek
Adı "A" harfi ile başlayan tüm personeli listelemek istiyoruz. Amacımıza uygun SELECT
deyimi şu şekilde düzenlenebilir;
SELECT ADI, GÖREVİ
FROM PERSONEL
WHERE ADI LIKE "A*";
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
84 / 192
6.6.2.4 IS NULL İşleci
NULL değeri; var olmayan, atanamayan ve bilinmeyen bir değer olduğu için NULL ile ilgili
karşılaştırmalarda (=) işleci kullanılamaz. Bunun yerine, sütun değerlerinin NULL olup
olmadığını denetlemek için IS NULL işleci kullanılır.
Eğer söz konusu tabloda NULL olmayan alanlar
aranacak ise, bu kez IS NOT NULL işlecine
başvurmak gerekecektir.
Örnek
PERSONEL tablosu içinde komisyon alan personeli listelemek istiyoruz. Komisyon
almayan personelin bu sütunları NULL değerler içerdiği için, NULL olmayan değerleri
seçerek amacımıza ulaşıyoruz.
SELECT ADI, GÖREVİ,KOMİSYON
FROM PERSONEL
WHERE KOMİSYON IS NOT NULL;
85 / 192
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
6.6.3. Mantıksal İşleçler
Koşulları içeren karşılaştırma işlemlerinde mantıksal işleçlere de yer verilebilir. Bu
işleçlerden; AND ve OR iki koşulu birlikte değerlendirmek üzere kullanılırlar.
86 / 192
SELECT ADI, GÖREVİ, ÜCRET
FROM PERSONEL
WHERE ÜCRET>=2000
AND GÖREVİ='MEMUR';
Eğer belirli bir personelin ücreti 2000'e eşit veya daha fazla ise; ÜCRET>=2000 koşulu
doğru olacaktır. Yani TRUE değerini döndürür. Aynı personelin görevi memur ise yani,
GÖREVİ='MEMUR' koşulu doğru ise, bu koşul da TRUE değerini döndürür. Böylece her iki
koşul için TRUE değerlerine sahip olan personel isimleri listelenir.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
87 / 192
88 / 192
89 / 192
İşleçlerin öncelik sırasını göz önüne alarak değerlendirme yapmamız gerekiyor. AND
işleci OR dan daha öncelikli olduğu için, AND işlecini ilgilendiren koşulu öncelikle
değerlendirmemiz gerekiyor. Ardından geriye kalan koşulu göz önüne alıyoruz. O
halde aşağıda belirtildiği biçimde iki koşuldan söz edilebilir;
1) Görevi ŞEF olanlar ve ücreti 3000'den fazla olanlar
2) Görevi MEMUR olanlar
Bu iki koşulu öncelik sıralarını göz önüne alarak birleştirirsek, şöyle bir seçme
işlemiyle karşılaşırız;
"Görevi ŞEF olanlar ve ücreti 3000'den fazla olanlar veya görevi MEMUR olanların
seçimi"
Örnek
Görevi; ŞEF veya MEMUR olanlar ve ücreti 3000'den fazla olanların seçimini yapacak
SELECT deyimini yazınız.
SELECT ADI, GÖREVİ,ÜCRET
FROM PERSONEL
WHERE (GÖREVİ='MEMUR'
OR GÖREVİ='ŞEF')
AND ÜCRET>3000;
Parantezlerin öncelik sırasına sahip olduğunu unutmayınız.
90 / 192
6.7. Sıralama İşlemleri
Tabloların satırlarının, herhangi bir sütuna göre sıralı olarak elde edilmesi söz konusu ise,
SELECT deyimi ORDER BY sözcükleri ile birlikte kullanılır. Sıralama sözcükleri de dahil
olmak üzere SELECT deyimi şu şekilde tanımlanır;
SELECT [DISTINCT] { * | sütun, ....}
FROM tablo
[WHERE koşul [ORDER BY {sütun,
ifade} [ASC | DESC] ];
Örnek
Personeli işe giriş tarihine göre sıralamak istiyoruz. Bunun için SELECT deyimi şu şekilde
düzenlenebilir;
SELECT ADI, GÖREVİ, GİRİŞ_TARİHİ
FROM PERSONEL
ORDER BY GİRİŞ_TARİHİ;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
91 / 192
Örnek
Bu kez personeli ücretine göre her bölüm içinde sıralamak istiyoruz. Bu durumda,
bölümleri ve ücretleri birlikte sıralamız söz konusudur. SELECT deyimi şu şekilde
düzenlenebilir;
SELECT BÖLÜM_NO, ADI, ÜCRET
FROM PERSONEL
ORDER BY BÖLÜM_NO, ÜCRET DESC;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
92 / 192
93 / 192
SQL FONKSİYONLARININ KULLANIMI
Tek satır fonksiyonları, tablonun bir satırı için uygulanır ve her satır için bir sonuç üretilir.
Çoklu satır fonksiyonları ise, bir grup satıra uygulanır ve sonuç buna göre elde edilir.
Burada anlatılan SQL standart ANSI SQL 'dir. Ancak bazı
fonksiyonları tüm veri tabanlarının desteklemediğini
göreceksiniz. ANSI SQL'in tüm özelliklerini barındıran ORACLE
veri tabanı üzerinde çalıştığımızı varsayarak, fonksiyonları ona
göre anlatacağız.
7.3. Tek Satır Fonksiyonları
Tek satır fonksiyonları, tablonun her bir satırına uygulanan fonksiyonlardır. Tek satır
fonksiyonlarının birçok türü bulunmaktadır.
94 / 192
Bu derste, aksi söylenmedikçe "fonksiyon" sözcüğü ile tek satır fonksiyonlarından söz
edildiği anlaşılacaktır. Tek satır fonksiyonlarını aşağıda belirtildiği biçimde tanımlıyoruz;
7.3.1. Karakter Fonksiyonları
Karakter fonksiyonları; karakter verileri girdi olarak alan, karakter ya da sayısal değerler
döndürebilen fonksiyonlardır.
Bu fonksiyonların en çok kullanılanlarını şu şekilde sıralayabiliriz;
95 / 192
Bu eğitimde bahsedilen fonksiyonlar, ORACLE veri tabanı için verilmiştir. Bu fonksiyonlar,
bazı veri tabanlarında farklılık gösterebilir. Örneğin; MS Access'de bu fonksiyonların
bazıları farklı biçimdedir.
7.3.1.1 LOWER() ve UPPER() Fonksiyonları
Bu fonksiyonlar, bir karakterin büyük harfe ya da küçük harfe dönüştürülmesi söz konusu
olduğunda kullanılabilir.
a. LOWER() Fonksiyonu
LOWER() fonksiyonu, bir karakter katarının tüm harflerini küçük harflere dönüştürür.
Örnek
PERSONEL tablosunda personel isimleri büyük harflerle yazdırılmış olarak yer
almaktadır. Bu isimleri küçük harflerle görüntülemek için SELECT deyimi şu şekilde
düzenlenebilir;
SELECT LCASE(ADI) AS İSİMLER
FROM PERSONEL
WHERE BÖLÜM_NO=10 OR GÖREVİ='PAZARLAMACI'
Yukarıdaki SELECT deyimi MS Access
veri tabanı için düzenlenmiştir. MS
Access veri tabanında LOWER()
fonksiyonu yerine LCASE()
fonksiyonu kullanılmaktadır.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
96 / 192
b. UPPER () Fonksiyonu
UPPER() fonksiyonu, bir karakter katarındaki tüm harfleri büyük harflere çevirir.
7.3.1.2 LENGTH() Fonksiyonu
Bir karakter katarın kaç karakterden oluştuğunu veya uzunluğunu bulmak amacıyla
ORACLE veri tabanında LENGTH(); MS Access veri tabanında LEN() fonksiyonu kullanılır.
Lenght() fonksiyonu, bir sayısal değer döndürür.
Örnek
Personel isimlerinin kaç karakterden oluştuğunu bulmak istiyoruz. Bu amaçla SELECT
deyimi şu şekilde kullanılabilir;
SELECT ADI,LEN(ADI) AS İSİMLER
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
97 / 192
7.3.2. Sayısal Fonksiyonlar
Sayısal veriler üzerinde çeşitli işlemleri gerçekleştirmek üzere özel fonksiyonlar
bulunmaktadır. Sayısal fonksiyonlar, sayısal veriler alır ve yine sayısal sonuçlar üretirler.
Bu fonksiyonların en çok kullanılanlarını şu şekilde sıralayabiliriz:
Sayısal değeri yuvarlatmak
amacıyla kullanılır.
Sayısal değeri belirtilen ondalığa
göre budamak (kesmek)
amacıyla kullanılır.
İki sayısal değerin, m ve n 'nin
birbirine bölümünden elde edilen
kalanı döndürür.
7.3.2.1 ROUND() Fonksiyonu
ROUND() fonksiyonu, bir sütun değerinin veya bir ifadenin içerdiği sayısal değerin
yuvarlatılması amacıyla kullanılır. Yuvarlatma işlemi, bir n ondalık hanesine göre yapılır.
98 / 192
Eğer n sıfır ise veya fonksiyon içinde belirtilmemiş ise, yuvarlatma sonunda elde edilecek
tamsayının ondalık hanesi olmayacaktır. ROUND() fonksiyonu şu şekilde tanımlanır;
Örnek
PERSONEL tablosunun ÜCRET sütunundaki bilgiler aylık ücretleri kapsamaktadır. Görevi
MEMUR olanlar için, aylık ücretleri 30'a bölerek günlük ücretleri bulmak ve sonucu 2
ondalık haneye göre yuvarlatmak istiyoruz. Amacımıza uygun SELECT deyimi şu şekilde
olacaktır;
SELECT ADI,ÜCRET AS AYLIK,
ROUND(ÜCRET/30,2) AS GÜNLÜK
FROM PERSONEL
WHERE GÖREVİ='MEMUR';
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
7.3.2.2 TRUNC() Fonksiyonu
TRUNC() fonksiyonu, bir sütunun içerdiği sayısal değerin ya da bir ifade sonunda elde
edilen sayısal değerin, belirlenen haneye göre budanması (kesilmesi) amacıyla kullanılır.
Bu fonksiyon, ORACLE veri tabanında geçerlidir. Fonksiyon şu şekilde tanımlanır;
99 / 192
Tanımlamadaki n sayısal değerin ondalık noktadan itibaren kesileceği konumu belirler.
Sözü edilen n değeri sıfır ise veya belirtilmemiş ise, sayısal değerin ondalık noktadan
sonrası budanır. Eğer n negatif ise, ondalık noktanın sonundan itibaren budama işlemi
gerçekleşir.
Örnek
Personelin günlük ücretini hesaplayan ve sonucu yuvarlatmadan ondalık noktasından
itibaren budayan SELECT deyimi aşağıda gösterildiği biçimde düzenlenebilir:
SELECT ADI, ÜCRET AS AYLIK, TRUNC(ÜCRET/30) AS GÜNLÜK
FROM PERSONEL
.3.2.3 MOD() Fonksiyonu
İki sayısal değerin birbirine bölünmesi sonucunda elde edilen kalanı döndürmek için;
MOD() fonksiyonu kullanılır. Bu fonksiyon şu şekilde tanımlanır;
Burada m ve n birbirine bölünecek sayısal değerleri ifade etmektedir.
Örnek
Personel ücretlerinin komisyonlarına oranını hesaplayan ve kalanı bulan SELECT deyimi
aşağıda belirtildiği biçimde olabilir;
SELECT ADI, ÜCRET, KOMİSYON, MOD(ÜCRET,KOMİSYON) AS KALAN
FROM PERSONEL;
7.3.3. Tarih Fonksiyonları
Tarih işlemlerinde kullanılan bazı tarih fonksiyonlarından söz edilebilir. Bu fonksiyonların
en çok kullanılanlarından biri SYSDATE fonksiyonudur. Bu fonksiyonun herhangi bir
argümanı bulunmamaktadır. O andaki tarih ve zaman bilgisini elde etmek amacıyla
kullanılır. Diğer tarih fonksiyonlarını aşağıdaki tablo üzerinde görebilirsiniz;
Fonksiyon
İşlevi
İki tarih arasında kaç aylık bir
süre olduğunu saptar.
Belirli bir tarih bilgisine n ay
ilave edildiğinde hangi tarihe
ulaşılacağını belirler.
Haftanın belirli bir gününün,
bir sonra hangi tarihe karşılık
geldiğini bulmak için
kullanılır.
Belirlenen tarihe ilişkin ayın
son gününü bulmak için
kullanılır.
100 / 192
Örnek 1
Personelin işe giriş tarihinden bu zamana kadar olan süreyi ay olarak hesaplatmak
istiyoruz. Amacımıza uygun SELECT deyimi şu şekilde olabilir;
SELECT ADI, GİRİŞ_TAR,
MONTHS_BETWEEN (SYSDATE,GİRİŞ_TAR) AS AY
FROM PERSONEL;
Örnek 2
İşe giriş süresi 200 aydan daha az olan personeli listelemek için şu şekilde bir sorgu
yapılabilir;
SELECT ADI,GİRİŞ_TAR,
MONTHS_BETWEEN(SYSDATE,GİRİŞ_TAR) AS AY
FROM PERSONEL
WHERE MONTHS_BETWEEN(SYSDATE,GİRİŞ_TAR)<200;
Örnek 3
Personelin işe giriş tarihinden 6 ay sonrasının hangi tarihe karşılık geldiğini hesaplayan
bir sorgu şu şekilde oluşturulabilir;
SELECT ADI, GİRİŞ_TAR, ADD_MONTHS (GİRİŞ_TAR,6)
FROM PERSONEL;
Örnek 4
Personelin işe giriş tarihlerini göz önüne alarak her bir tarihin ait olduğu ayın en son
gününü belirleyen sorgu ifadesi şu şekilde olabilir;
SELECT ADI, GİRİŞ_TAR, LAST_DAY(GİRİŞ_TAR)
FROM PERSONEL;
7.3.4. Dönüştürme Fonksiyonları
Karakter, sayısal ve tarih verilerinin birbirlerine dönüştürülmesi ve özellikle biçimlendirme
işlemlerinde çeşitli fonksiyonlardan yararlanılır. Bu fonksiyonları aşağıdaki tabloda
görebilirsiniz;
Fonksiyon
İşlevi
Tarih veya sayısal bilginin
istenildiği gibi biçimlendirilerek
karakter dizisine dönüştürülmesini
sağlar.
Bir karakter katarının içerdiği
sayısal değerleri istenildiği gibi
biçimlendirilerek sayısal veri
türüne dönüştürmek için kullanılır.
101 / 192
Bir karakter katarının içerdiği tarih
verilerini istenildiği gibi
biçimlendirilerek tarih veri türüne
dönüştürmek için kullanılır.
7.3.4.1 TO_CHAR Fonksiyonu
Bu fonksiyon, tarih veya sayısal bilginin istenildiği gibi biçimlendirilerek karakter dizisine
dönüştürülmesini sağlar. İki farklı uygulama alanı bulunmaktadır. Eğer tarih bilgisini
karakter dizisine, yani bir katara dönüştürmek söz konusu ise;
tanımı uygulanır.
Eğer, bir sayısal değerin karakter katarına dönüştürülmesi isteniyorsa,
tanımı kullanılır. Aşağıdaki canlandırmada TO_CHAR fonksiyonu; bir sayısal değeri
biçimlendirerek karakter dizisine çeviriyor.
Tarihle ilgili biçimlendirme ifadesi; bazı biçimlendirme elemanlarından ve kurallardan
oluşur. Biçimlendirme ifadesi, tek tırnaklar arasında yazılır ve büyük küçük harf ayrımına
karşı duyarlıdır. Tarih ile ilgili biçimlendirme ifadelerinde aşağıdaki tanımlardan
yararlanılır;
Eleman
Anlamı
YYYY
Dört haneli yıl bilgisi. Örneğin; 2002
YEAR
Yılın rakamlarla değil, okunduğu gibi
yazılması
MM
İki haneli ay bilgisi
MONTH
Ayın tam adı
DD
İki haneli gün bilgisi
DY
Haftanın günü. Üç karakterden
oluşur.
DAY
Günün tam adı
Zamanla ilgili biçimlendirme ifadeleri ise aşağıdaki elemanlardan oluşabilir;
Eleman
Anlamı
AM,PM
Meridyen göstergesi
HH
Günün saati
102 / 192
MI
Dakika bilgisi
SS
Saniye bilgisi
Sayısal değerleri kullanan TO_CHAR() fonksiyonu, aşağıdaki tabloda yer alan
biçimlendirme elemanlarını kullanabilir;
Eleman Anlamı
9
Sayısal değeri
ifade eder.
0
Sıfır değerini
ifade eder.
$
Dolar işaretini
yerleştirir.
L
Yerel para
işaretini
yerleştirir.
.
Ondalık hanesini
gösterir.
,
Binler hanesini
gösterir.
Örnek 1
Personelin işe giriş tarihlerini MM/YY biçiminde elde etmek için şu şekilde bir sorgu
düzenlenebilir;
SELECT ADI,TO_CHAR(GİRİŞ_TAR,'MM/YY')
FROM PERSONEL;
Örnek 2
Personel ücretlerini, binler hanesinden ayırarak elde etmek istiyoruz. Ayrıca ücret
rakamının sol tarafına ($) işaretini yerleştireceğiz. Amacımıza uygun sorgu şu şekilde
düzenlenebilir;
SELECT ADI,TO_CHAR(ÜCRET,'$99,999')
FROM PERSONEL;
.3.4.2 TO_NUMBER Fonksiyonu
Karakter alan olarak tanımlanmış bir sütunun içerdiği sayısal değerleri, sayısal veri türüne
dönüştürmek için TO_NUMBER() fonksiyonu kullanılır. Bu fonksiyon şu şekilde
tanımlanır;
103 / 192
Aşağıdaki canlandırmada, TO_NUMBER() fonksiyonu bir karakter katarı girdisini sayısal
veri türüne çeviriyor.
Biçimlendirme ifadesi, TO_CHAR() fonksiyonunda olduğu gibi, aşağıda yer alan işaretler
kullanılarak düzenlenir;
Eleman Anlamı
9
Sayısal değeri
ifade eder.
0
Sıfır değerini
ifade eder.
$
Dolar işaretini
yerleştirir.
L
Yerel para
işaretini
yerleştirir.
.
Ondalık hanesini
gösterir.
,
Binler hanesini
gösterir.
Örnek
İşe giriş tarihlerine göre PERSONEL tablosunu sorgulayacağız. Arama ifadesi "Ocak 1,
1980" biçiminde olabilir. Bu ifadeyi SELECT deyiminin yorumlayabileceği bir biçime
dönüştürmek gerekiyor. Amacımıza uygun SELECT deyimi şu şekilde olabilir;
104 / 192
SELECT ADI, GİRİŞ_TAR
FROM PERSONEL
WHERE GİRİŞ_TAR=TO_DATE('OCAK 1,1980',MONTH DD, YYYY');
105 / 192
7.3.5.2 DECODE() Fonksiyonu
Programlama dillerinde kullanılan CASE veya IF..THEN..ELSE denetim deyimlerinin SQL
içinde tam karşılığı olabilecek bir deyim yoktur. Onun yerine, aynı işlevi yerine getirmek
üzere DECODE() fonksiyonundan yararlanılır. Bu fonksiyon şu şekilde tanımlanır;
106 / 192
Örnek
Personel arasında görevi; MEMUR olanlara %10, ŞEF olanlara %15, MÜDÜR olanlara
ise, %20 zam yapılacaktır. Diğerlerinde ise herhangi bir değişiklik olmayacaktır. Bu
işlemleri yerine getirmek üzere aşağıdaki SELECT deyimini düzenliyoruz;
SELECT ADI,GÖREVİ,ÜCRET,
DECODE(GÖREVİ,'MEMUR', ÜCRET*1.10,
'ŞEF',ÜCRET*1.15,
'MÜDÜR'ÜCRET*1.20,
ÜCRET) AS "YENİ ÜCRETLER"
FROM PERSONEL;
7.4. İç İçe Fonksiyonlar
Bir SELECT deyimi içinde herhangi bir fonksiyonun nasıl kullanılabildiğini gördük. Bazı
uygulamalarda, bir fonksiyonun içinde bir başka fonksiyona yer vermek gerekebilir.
Örneğin,
DECODE(TRUNC(ücret,0), …)
biçiminde bir tanım yapılabilir. Burada DECODE() fonksiyonu içinde TRUNC()
fonksiyonunun kullanıldığı görülüyor. İç içe fonksiyonlarda, önce iç taraftaki fonksiyon
işlem görür, ardından elde edilen sonuç dıştaki fonksiyon tarafından kullanılır.
! Adımların sonuçlarını görmek için ADIM 1, ADIM 2 ve ADIM 3 düğmelerine tıklayınız.
107 / 192
108 / 192
VERİLERİ GRUPLAYARAK ANALİZ ETMEK
8.1. Grup Fonksiyonları
Tek satır fonksiyonları, tablonun bir satırına uygulanabiliyor ve buna karşılık gelen bir
sonuç satırı elde edilebiliyordu. Bir grup satıra bir fonksiyonun uygulanması söz konusu
ise; "çoklu satır" ya da bir başka deyişle "grup fonksiyonlarından" söz edilir. Grup
fonksiyonları tablonun tüm satırlarına uygulanabildiği gibi, GROUP BY sözcüğü
yardımıyla da alt gruplara uygulanabilir.
Bir tablonun tüm satırları için grup fonksiyonu uygulanacak ise, SELECT deyimi aşağıda
belirtildiği biçimde kullanılır;
8.1.1 AVG()Fonksiyonu
Herhangi bir sütunun içerdiği sayısal değerlerin aritmetik ortalamasını hesaplamak
amacıyla; AVG() fonksiyonu kullanılır. Bu fonksiyonun uygulandığı sütunun veri türü
sayısal olmalıdır.
Örnek 1
Personel ücretlerini göz önüne alalım. Ücretlerin ortalamasını bulmak için şöyle bir yol
izlenir;
SELECT AVG (ÜCRET) AS ORTALAMA
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
109 / 192
Örnek 2
Personel arasında görevi MEMUR olanların ortalama ücreti aşağıda gösterildiği biçimde
hesaplanabilir;
SELECT AVG (ÜCRET) AS ORTALAMA,
FROM PERSONEL
WHERE GÖREVİ='MEMUR';
8.1.2 SUM()Fonksiyonu
Sütunların içerdiği sayısal değerleri toplamak amacıyla SUM() fonksiyonundan
yararlanılır.
Örnek
Tüm personel ücretlerinin toplamını hesaplayan SELECT deyimi aşağıda gösterildiği
biçimde oluşturulabilir;
SELECT SUM(ÜCRET) AS TOPLAM
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
110 / 192
SELECT STDEV(ÜCRET) AS STANDART_SAPMA
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
111 / 192
SELECT VARP(ÜCRET) AS VARYANS
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
112 / 192
8.1.5 MAX() ve MIN() Fonksiyonları
Tablonun içerdiği değerlerin en büyük ve en küçük olanlarını bulmak için MIN() ve
MAX() fonksiyonları kullanılır. Bu fonksiyonlar herhangi bir veri türüne uygulanabilir.
Soldaki canlandırmalardan MAX() ve MIN() fonksiyonlarının çalışma şekillerini
öğrenebilirsiniz.
Örnek 1
Personel ücretlerini göz önüne alalım. En az ve en yüksek ücretin ne olduğunu
öğrenemek istiyoruz. Amacımıza uygun SELECT deyimi aşağıda belirtildiği biçimde
olabilir;
SELECT MIN(ÜCRET) AS EN_AZ, MAX(ÜCRET) AS EN_FAZLA
FROM PERSONEL;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
Örnek 2
İşe en son giren personelin işe giriş tarihini belirlemek için SELECT deyimi şu şekilde
düzenlenebilir;
SELECT MAX(GİRİŞ_TAR)
FROM PERSONEL;
Örnek 3
Personel isimlerini alfabetik olarak sıraladığımızda birinci sırada hangi ismin elde
edileceğini şu şekilde öğrenebiliriz;
113 / 192
SELECT MIN(ADI)
FROM PERSONEL;
8.1.6 COUNT() Fonksiyonu
Bir tablodaki kayıtların sayılması amacıyla COUNT() fonksiyonu kullanılır. Bu
fonksiyon iki farklı biçimde kullanılabilir;


COUNT(*)
COUNT(sütun)
COUNT(*) fonksiyonu, NULL değerleri de içeren tüm kayıtların sayılmasına neden
olur. WHERE ile birlikte kullanılırsa, bu koşula uygun tüm kayıtların sayısının
öğrenilmesini sağlar. İkinci biçim tercih edilirse, yani COUNT(sütun) biçiminde
kullanılırsa, söz konusu sütunda NULL değerler içermeyen tüm kayıtların sayılmasına
neden olur.
Örnek
30 numaralı bölümde görev yapan kaç tane personel olduğunu bulmak istiyoruz.
SELECT deyimi şu şekilde düzenlenir;
SELECT COUNT(*) AS PERSONEL_SAYISI
FROM PERSONEL;
WHERE BOLUM_NO=30;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
114 / 192
8.2. Gruplama İşlemleri
Bir tablonun satırları gruplara ayrılarak, grup fonksiyonlarının bunlara uygulanması
sağlanabilir. Böyle bir amaçla SELECT deyimi içinde GROUP BY sözcüğünden
yararlanılır.
SELECT sütun, grup fonksiyonu(sütun)
FROM tablo
[WHERE koşul] [GROUP BY sütun]
[ORDER BY sütun];
PERSONEL tablosunda bulunan personel ücretlerini; Bölüm_No'suna göre gruplayıp her
bölümdeki toplam personel harcamalarını bulabiliriz. Bunun için;
SELECT BÖLÜM_NO, SUM(ÜCRET) AS TOPLAM_ÜCRET
FROM PERSONEL
GROUP BY BÖLÜM_NO;
Örnek
PERSONEL tablosunu göz önüne alarak, her bölüm için personel sayısını, ücret toplamını
ve ortalama ücretleri hesaplayan SELECT deyimi şu şekilde oluşturulabilir;
SELECT BÖLÜM_NO,COUNT(ADI) AS SAYI,
SUM(ÜCRET) AS TOPLAM,
AVG(ÜCRET) AS ORTALAMA
FROM PERSONEL
GROUP BY BÖLÜM_NO;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
115 / 192
8.2.1 GROUP BY Kullanırken Dikkat Edilecek Noktalar
SELECT deyimi içinde grup fonksiyonları, sütun isimleri ile birlikte kullanılabilirler.
Ancak grup fonksiyonları; GROUP BY sözcüğü olmadan aşağıda gösterildiği
biçimde, sütun isimleri ve grup fonksiyonu ile birlikte kullanılamaz. Örneğin;
SELECT BÖLÜM_NO, COUNT(*)
FROM PERSONEL;
biçiminde bir tanım yapılamaz. Böyle bir amaca ancak aşağıda gösterildiği biçimde
varılabilir;
SELECT BÖLÜM_NO, COUNT(*)
FROM PERSONEL
GROUP BY BÖLÜM_NO;
Bu son sorgu; her bir bölüm numarasını ve bu bölümlerdeki personel sayısını
vermektedir.
GROUP BY ile birlikte sütunların takma isimleri kullanılamaz.
GROUP BY ie tanımlanan grupların, burada belirtilen sütunlara göre artan sırada
olduğu varsayılır. Sırayı test yönde değiştirmek söz konusu ise ORDER BY
kullanılır.
GROUP BY içinde belirtilen sütun isimleri, grup fonksiyonu içinde yer almak
zorunda değildir. Örneğin, her bölümün numarası ve ortalama ücretlerini birlikte
elde etmek için SELECT deyimi şu şekilde oluşturulabilir;
116 / 192
SELECT BÖLÜM_NO, AVG(ÜCRET)
FROM PERSONEL
GROUP BY BÖLÜM_NO;
GROUP BY içinde belirtilen sütun isimleri , SELECT listesinde yer almak zorunda
değildir. Örneğin; bölüm numarasına göre oluşturulan grupta, yani her bölümün
ücret ortalamalarının görüntülenmesi için şöyle bir tanım yapılabilir;
SELECT AVG(ÜCRET)
FROM PERSONEL
GROUP BY BÖLÜM_NO;
8.2.2 Birden Fazla Sütuna Göre Gruplama
GROUP BY ile bir sütuna göre gruplama yapılabildiği gibi, birden fazla sütun için de
gruplama yapılabilir.
Örnek
Her bölümü ve bölüm içindeki görevlere göre personeli gruplayarak bu bazda ücret
toplamları elde etmek amacıyla SELECT deyimi şu şekilde düzenlenebilir;
SELECT BÖLÜM_NO,GÖREVİ, SUM (ÜCRET) AS TOPLAM_ÜCRET
FROM PERSONEL
GROUP BY BÖLÜM_NO,GÖREVİ;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
117 / 192
118 / 192
Örnek 1
PERSONEL tablosunu göz önüne alalım. Ortalama ücreti 3500'den daha fazla olan
bölümlerin bölüm numarası ve o bölümdeki en yüksek ücret miktarı görüntülenecektir.
Amacımıza uygun SELECT deyimi şu şekilde olabilir;
SELECT BÖLÜM_NO, MAX(ÜCRET) AS EN_ÇOK
FROM PERSONEL
GROUP BY BÖLÜM_NO
HAVING AVG(ÜCRET)>3500;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
Örnek 2
PAZARLAMA bölümü dışında çalışan personeli görevlerine göre gruplandırılarak ücretleri
toplanacak ve toplam ücreti 5000 den fazla olanlar seçilecektir. Sonuçlar en düşük ücret
toplamından büyüğe doğru sıralı olacaktır. Amacımıza uygun SELECT deyimi şu şekilde
düzenlenebilir;
SELECT GÖREVİ, SUM(ÜCRET) AS TOPLAM
FROM PERSONEL
WHERE GÖREVİ <>'PAZARLAMACI'
GROUP BY GÖREVİ
HAVING SUM(ÜCRET)>5000
ORDER BY SUM(ÜCRET);
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
119 / 192
120 / 192
ÇOKLU TABLOLAR
9.1. Çoklu Tabloların Kullanımı
Bazı uygulamalarda veri birden fazla tablo üzerinde yer alabilir. Bu tablo verileri
birleştirilerek sonuçlar elde edilir. Bu bölümde PERSONEL ve BÖLÜM tablolarını bu
amaçla kullanacağız.



PERSONEL_NO sütunu PERSONEL tablosu üzerindedir.
BÖLÜM_NO sütunu hem PERSONEL hem de BÖLÜM tablosu üzerinde vardır.
KONUM sütunu BÖLÜM tablosundadır.
Bu iki tablo arasında ortak olan BÖLÜM_NO sütunları aracılığıyla bir ilişki kurulur ve her
iki tablo verilerinden oluşan bir sonuç elde edilir.
121 / 192
Tanımdan görüldüğü gibi, iki tabloyu birleştirmek için bir birleştirme koşulunun
düzenlenmesi gerekiyor. Bu koşul, her iki tablonun hangi sütunları kullanılarak
birleştirileceğini belirler. Sütun isimlerinin ön tarafına, tablo isimlerinin yazılması yararlı
olacaktır. Özellikle her iki tablodaki sütun isimleri aynı ise, söz konusu sütunların hangi
tablodan geldiğini belirtmek mümkün olamayacak ve bu durumda SELECT deyimi
çalışmayacaktır.
Sadece iki tablo değil n sayıda tablo da birleştirilebilir. Ancak bu durumda en az (n-1)
birleştirme koşulu tanımlanmalıdır. Yani, dört adet tabloyu birleştirmekiçin en az üç
birleştirme koşulu olmalıdır. Bu koşul, birleştirilmiş birincil anahtara sahip tablolar için
geçerli olmayacaktır.
9.3. Kartezyen Çarpım
İki tablo arasında birleştirme koşulu tanımlanmamış ise, sonuç olarak bir kartezyen
çarpım elde edilir. Bunun dışında, birleştirme koşulu geçersiz ise ve birinci tablodaki tüm
satırlar ikinci tablodaki tüm satırlarla birleştirilemiyorsa, yine kartezyen çarpımdan söz
edilir.
Örnek
PERSONEL ve BÖLÜM tablolarını göz önüne alalım. Bu iki tabloyu aşağıda görüldüğü
biçimde birleştirmek istiyoruz.
SELECT PERSONEL_NO, ADI,BÖLÜM_ADI
FROM PERSONEL, BÖLÜM
Bu sorgu çalıştırıldığında, PERSONEL ve BÖLÜM tabloları birleştirilerek bir sonuç elde
edilir. Ancak, herhangi bir birleştirme koşulu tanımlanmadığı için, her iki tablodaki
satırların sayısının birbirleriyle çarpımı kadar satırdan oluşan bir sonuç elde edilir.
Örneğin; PERSONEL tablosunda 20, BÖLÜM tablosunda ise 5 satır varsa, bu şekildeki
bir sorgu sonucunda 20x5=100 satordan oluşan bir sonuç bulunur.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
122 / 192
123 / 192
9.4.1. Eşiti Olan Birleştirme
Bu tür birleştirmelere "basit birleştirme", "eşiti olan birleştirme" ya da "iç birleştirme"
isimleri verilmektedir. Bu birleştirme aşağıda belirtildiği biçimde gerçekleştirilir;
Bir personelin çalıştığı bölümün adını elde etmek için; PERSONEL tablosu, BÖLÜM
tablosunun BÖLÜM_NO isimli sütununun içeriği ile karşılaştırılır. Yani her iki tablo
arasındaki BÖLÜM_NO sütununun içerdiği değerlerin eşit olması durumunda birleştirme
gerçekleştirilmiş olur.
Bu deyim şu şekilde yorumlanacaktır;
PERSONEL tablosundan alınan sütunlar PERSONEL ön ekiyle
tanımlanmıştır. Örneğin, PERSONEL.PERSONEL_NO gibi. Bu
durumda PERSONEL tablosundan, PERSONEL_NO,
PERSONEL_ADI,BÖLÜM_NO; BÖLÜM tablosundan ise,
BÖLÜM_NO ve KONUM isimli sütunlarının alınacağı
anlaşılmaktadır.
FROM sözcüğü ardından yazılan tablo isimleri, bu birleşme
işlemine tabi tutulacak tabloları belirlemektedir.
WHERE deyimi içinde tanımlanan koşul, PERSONEL tablosunun
BÖLÜM_NO sütunu içeriği ile BÖLÜM tablosunun BÖLÜM_NO
sütunu içeriğinin karşılaştırılmasına neden olacaktır. Bu koşul
gerçekleştiği takdirde, SELECT listesinde belirlenen sütunlar
görüntülenecektir.
124 / 192
9.4.1.3 Tablolar için Takma İsimlerin Kullanımı
Birleştirme işlemlerinde, birden fazla tablo kullanıldığı için, sütun isimleri ilgili tablo
isimleriyle birlikte kullanılıyordu. Özellikle uzun tablo isimlerinde bu tür sorguları ifade
etmek zorluklar yaratabilir. Gerçek tablo isimleri yerine daha kısa tablo isimleri vermek
mümkündür.
Bu tür bir tanıma FROM sözcüğü içinde yer verilir. Tablonun gerçek isminin hemen
ardından bir boşluk bırakılarak takma isim tanımlanır. SELECT deyiminin herhangi bir
yerinde, gerçek tablo ismi yerine bu takma isim kullanılabilir.
Örnek
Aşağıdaki SELECT deyimini göz önüne alalım;
SELECT PERSONEL.PERSONEL_NO,PERSONEL.ADI,
PERSONEL.BÖLÜM_NO,BÖLÜM.BÖLÜM_ADI,BÖLÜM.KONUM
FROM PERSONEL,BÖLÜM
WHERE PERSONEL.BÖLÜM_NO=BÖLÜM.BÖLÜM_NO;
Sorgu içinde PERSONEL tablosuna P; BÖLÜM tablosuna ise, B takma ismini vererek aynı
sorguyu aşağıda gösterildiği biçimde düzenleyebiliriz;
SELECT P.PERSONEL_NO,P.ADI,
P.BÖLÜM_NO,B.BÖLÜM_ADI,B.KONUM
FROM PERSONEL P,BÖLÜM B
WHERE P.BÖLÜM_NO=B.BÖLÜM_NO;
125 / 192
9.4.1.4 AND İşlecinin Kullanımı
Birleştirme koşuluna ek olarak, WHERE sözcüğü içinde başka koşullara da yer verilebilir.
Örneğin, BEGÜM isimli personelin; personel numarası, adı, bölüm numarası ve
bölümünün konumunu listelemek için şöyle bir sorgu tanımlanabilir:
SELECT P.PERSONEL_NO,P.ADI,B.BÖLÜM_ADI,B.KONUM
FROM PERSONEL P, BÖLÜM B
WHERE P.BÖLÜM_NO=B.BÖLÜM_NO
AND P.ADI='BEGÜM';
9.4.3. Dış Birleştirme
Eşiti olan birleştirmelerde; bir tablonun bir sütununun içerdiği değerler, diğer tablonun
ilgili sütununda eşleştiriliyor ve ancak eşleşebilen değerler birleştiriliyordu. Doğal olarak,
eşleşemeyen satırlar birleştirilemeyecek ve sonuca dahil edilemeyecektir.
Eğer bu şekilde eşleşemeyen kayıtların da sonuca dahil edilmesi isteniliyorsa; dış
birleştirme yönteminin uygulanması gerekecektir. Örneğin, PERSONEL ve BÖLÜM
tablolarının aşağıda gösterildiği biçimde olduğunu varsayalım.
126 / 192
Bu iki tablo incelendiğinde, BÖLÜM tablosunda yer alan REKLAM bölümünde herhangi
bir personelin çalışmadığı görülecektir. İki tablo; eşiti olan birleştirme yöntemine göre
birleştirilirse, sonuç içinde bu bölüm adı görüntülenmeyecektir. Böyle durumlarda
eşleşmeyen kayıtları da birleştirme işlemine katmak için; dış birleştirme yöntemi
uygulanır.
9.4.3.1 Dış Birleştirme Nasıl Tanımlanır ?
Dış birleştirmeler, eşleşmeyen kayıtlar hangi tabloda yer alıyorsa ona bağlı olarak iki
farklı biçimde düzenlenebilir:
SELECT tablo1.sütun1,
tablo2.sütun2
FROM tablo1, tablo2
WHERE
tablo1.sütun1(+)=tablo2.sütun2
veya
SELECT tablo1.sütun1,
tablo2.sütun2
FROM tablo1, tablo2
WHERE
tablo1.sütun1=tablo2.sütun2(+)
Tanımda (+) işaretlerinin yer alması, dış birleşme olayının olduğunu göstermektedir. Bu
işaret eksik bilginin olduğu tarafa yerleştirilir.
Örnek
PERSONEL ve BÖLÜM tablolarını göz önüne alalım. BÖLÜM tablosunda yer alan, ancak
PERSONEL tablosunda yer almayan ve REKLAM bilgisini içeren bir satır bulunmaktadır.
Bu iki tabloyu, karşılaşmayan kayıtları da görüntüleyecek biçimde birleştirmek ve sonucu
listelemek istiyoruz. Bunun için aşağıdaki yol izlenir:
SELECT P.ADI,P.BÖLÜM_NO,B.BÖLÜM_ADI
FROM PERSONEL P,BÖLÜM B
WHERE P.BÖLÜM_NO(+)=B.BÖLÜM_NO;
127 / 192
Bilgi eksikliği PERSONEL tablosundadır çünkü, BÖLÜM tablosunda yer alan REKLAM
satırı, PERSONEL tablosunda yoktur. O halde (+) işareti, PERSONEL tablosunun ilgili
sütunu yanında tanımlanmıştır. Bu işlemin aynısını MS Jet SQL'de gerçekleştirmek için
biraz daha farklı tanım yapmak gerekiyor. Bu tür bir dış birleşme için LEFT JOIN…ON
sözcükleri kullanılır.
SELECT P.ADI, B.BÖLÜM_ADI
FROM BÖLÜM B LEFT JOIN PERSONEL P
ON B.BÖLÜM_NO = P.BÖLÜM_NO;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
9.4.4. Kendine Birleştirme
Bazı uygulamalarda birleştirme işlemi, iki ayrı tablo yerine tek bir tablodaki veriler
kullanılarak yapılır. Örneğin, PERSONEL tablosunu aşağıda görüldüğü gibi, iki farklı tablo
biçiminde düşünebiliriz. Böylece bu iki tabloyu birleştirerek çeşitli sonuçlar elde etmek
imkânımız vardır.
128 / 192
Örnek
PERSONEL tablosunun YÖNETİCİSİ başlıklı sütunu; her bir personelin yöneticisinin,
personel numarasını içermektedir. Hangi yöneticilerin hangi personel ile çalıştığını
belirlemek istiyoruz. Bu amaçla SELECT deyimi şu şekilde düzenlenebilir:
SELECT P.PERSONEL_NO AS NO, P.ADI AS PERSONEL, Y.ADI AS YÖNETİCİSİ
FROM PERSONEL P, PERSONEL Y
WHERE Y.PERSONEL_NO=P.YÖNETİCİSİ;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
129 / 192
130 / 192
SELECT ADI, GÖREVİ
FROM PERSONEL
WHERE ADI LIKE 'A%'
UNION
SELECT ADI, GÖREVİ
FROM PERSONEL
WHERE GÖREVİ LIKE 'M%';
Bu deyim çalıştırıldığında, birbirinin aynı olan yani, çift kayıtlar görüntülenmez. Eğer çift
kayıtların da görüntülenmesi isteniliyorsa; UNION ALL işleci kullanılır.
131 / 192
132 / 192
KARMAŞIK SORGULAR
10.1. Alt Sorgu Kavramı
Şu ana kadar ele alarak incelediğimiz tüm sorgular; önceki bölümde öğrendiğimiz işleçler
yardımıyla yapılan birleştirmeler dışında, tek bir ana sorgudan oluşuyordu. Dolayısıyla,
sorgu içinde sadece bir SELECT deyimine yer veriliyordu.
Uygulamada, bir sorgudan elde edilen sonuç, bir diğer sorguyu ilgilendirebilir. Bu gibi
durumlarda alt sorgular ya da bir başka deyişle iç sorgular kullanılır.
Şu soruyu göz önüne alalım: "Hangi personelin ücreti, "HALİT" isimli personelin
ücretinden daha fazladır?" Bu problemi iki farklı sorguya ayırmak mümkündür:
Sorgu 1: "HALİT" isimli personelin aylık ücreti nedir?
Sorgu2: Hangi personelin ücreti, "HALİT" isimli personelin ücretinden daha fazladır?
Yukarıdaki iki sorguyu aşağıdaki şekilde analiz ederek bir sorgu biçimine döndürebiliriz.
Alt sorgular bu amaçla tanımlanır.
10.1.1. Alt Sorgunun Tanımlanması
Bir alt sorgu aşağıda gösterildiği biçimde tanımlanır:
SELECT liste
FROM tablo
WHERE ifade
işleç
(SELECT liste
FROM tablo);
Tanımda görüldüğü gibi, iki SELECT deyimi ile bir farklı sorgu tanımlanmıştır. Bu iki
sorgu birbirine WHERE koşul sözcüğü içinde bağlanmıştır. Bir alt sorgu, aşağıdaki
sözcükler içinde kullanılabilir:

WHERE
133 / 192


HAVING
FROM
Örnek
Personel numarası "110" olan personelin ücretinden daha fazla ücret alan personel
isimlerini listelemek istiyoruz. Amacımıza uygun SELECT deyimi şu şekilde olabilir:
SELECT ADI,ÜCRET
FROM PERSONEL
WHERE ÜCRET >
( SELECT ÜCRET
FROM PERSONEL
WHERE PERSONEL_NO=110 );
Bu sorgu çalıştırıldığında, şöyle bir yol izlenecektir:
a. Alt sorgu Personel numarası "110" olan personelin ücretini bulacaktır. Bu ücret;
"5000" dir.
b. Elde edilen ücret bilgisi ana sorgudaki WHERE sözcüğü içinde yerine konulacaktır.
Yani ana sorgunun WHERE koşulu şu şekli almış olacaktır:
WHERE ÜCRET > 5000
c. Ana sorgu bu şekilde çalışır. Yani ücreti "5000" den fazla olan personelin listesi
görüntülenir.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
134 / 192
10.1.2. Alt Sorgu Düzenleme Kuralları
Alt sorgular düzenlenirken aşağıdaki kurallara uymak gerekmektedir:
Bu sorgu çalıştırıldığında, alt sorgu sonucunda "140" numaralı personelin görevi, yani
"ŞEF" değeri elde edilir. Ana sorgu ise görevi "ŞEF" olanları sorgular.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
135 / 192
Örnek
Personel numarası "155" olan personelle aynı göreve sahip olan ve "350" numaralı
personelin ücretinden daha fazla ücret alan personeli
listelemek istiyoruz.
SELECT ADI,GÖREVİ,ÜCRET
FROM PERSONEL
WHERE GÖREVİ =
(SELECT GÖREVİ
FROM PERSONEL
WHERE PERSONEL_NO=155)
AND ÜCRET>
(SELECT ÜCRET
FROM PERSONEL
WHERE PERSONEL_NO=350);
Yukarıdaki sorgulamanın sonucunu görmek için linke
tıklayınız
136 / 192
10.2.1. Grup Fonksiyonlarının Kullanımı
Grup fonksiyonları sadece bir değer döndürdüğü için, bu tür fonksiyonlar tek satır alt
sorgularında kullanılabilir.
Örnek
Personel arasında en az ücret alanları listelemek istiyoruz. Bu sorgu doğal olarak alt
sorgularla yapılabilir. Önce alt sorgu içinde en az ücret alan personel belirlenecek,
bulunan değer ana sorgu içinde bu ücrete göre seçilecektir. Amacımıza uygun SELECT
deyimi şu şekilde olabilir:
SELECT ADI,ÜCRET
FROM PERSONEL
WHERE ÜCRET =
(SELECT MIN(ÜCRET)
FROM PERSONEL);
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
137 / 192
10.2.2. HAVING ile Grup Koşullarının Tanımlanması
Ana sorgu grup fonksiyonu içeriyorsa, doğal olarak grup koşullarının tanımlanması
gerekebilecektir. Yani HAVING sözcüğü de kullanılacaktır. Bu durumda SELECT deyimi şu
şekli alacaktır:
SELECT liste
FROM tablo
GROUP BY sütun
HAVING fonksiyon işleç
(SELECT fonksiyon
FROM tablo);
138 / 192
Örnek
En düşük ücreti "20" numaralı bölümün en düşük ücretinden daha büyük olan bölümleri
listelemek istiyoruz. Amacımıza ulaşmak için şu şekilde bir akıl yürüteceğiz: :
a) "20" numaralı bölümün en az ücret alan personeli belirlenecektir.
b) Bulunan bu değer, diğer tüm bölümlerin en düşük ücretleriyle karşılaştırılacak
c) Eğer bu değer bölümlerin en düşük ücretlerinden daha küçük ise ilgili bölüm
listelenecektir.
Belirtilen bu adımlara uygun SELECT deyimi şu şekilde olabilir:
SELECT BÖLÜM_NO,MIN(ÜCRET) AS ENAZ_ÜCRET
FROM PERSONEL
GROUP BY BÖLÜM_NO
HAVING MIN(ÜCRET) >
(SELECT MIN(ÜCRET)
FROM PERSONEL
WHERE BÖLÜM_NO=20);
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
139 / 192
Bu sorgu çalıştırıldığında, amaca ulaşılamayacaktır. Çünkü alt sorgu gruplandırılmıştır ve
doğal olarak grup fonksiyonu herbir grup için bir değer üretir. Yani birden fazla satır
listelenecektir. Ancak ana sorgunun WHERE sözcüğü içinde kullanılan (=) işleci bir tek
satır işlecidir. Alt sorgudan sadece bir değer beklemektedir. Bu durum gerçekleşmediği
için SELECT deyimi bir hata mesajı görüntüleyerek işlemi sonlandırır. Aynı sorgu şu
şekilde düzenlenseydi hata durumu ortaya çıkmayacaktı:
SELECT PERSONEL_NO,ADI
FROM PERSONEL
WHERE ÜCRET >
(SELECT MIN(ÜCRET)
FROM PERSONEL);
140 / 192
Yukarıda sayılan işleçlerden hiçbiri NOT işleci ile birlikte kullanılamaz!
141 / 192
biçimindeki bir sorgu, ÜCRET sütunu içeriğinin, IN işleci ile belirlenen listedeki değerlerle
karşılaştırılmalarını sağlıyordu. Bu tür bir işlem, alt sorgularda da gerçekleştirilebilir.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
142 / 192
143 / 192
Örnek
En düşük ücretli MEMUR dan daha fazla maaşı olan personeli listelemek için aşağıda
belirtilen yol izlenebilir:
SELECT ADI,ÜCRET,GÖREVİ
FROM PERSONEL
WHERE ÜCRET >ANY(
SELECT ÜCRET
FROM PERSONEL
WHERE GÖREVİ='MEMUR');
144 / 192
145 / 192
Örnek
"SEZİN" isimli personelin görevi ve ücretiyle aynı olan personeli listelemek istiyoruz.
Sorgu şu şekilde düzenlenebilir:
SELECT BÖLÜM_NO, ADI,ÜCRET
FROM PERSONEL
WHERE (GÖREVİ,ÜCRET) IN
(SELECT GÖREVİ,ÜCRET
FROM PERSONEL
WHERE ADI='SEZİN');
Ancak bu sorguya "SEZİN" in kendi bilgileri de dahil edilmiştir. Dahil edilmesi
istenmiyorsa şu şekilde bir tanım yapılır:
SELECT BÖLÜM_NO, ADI,ÜCRET
FROM PERSONEL
WHERE (GÖREVİ,ÜCRET) IN
(SELECT GÖREVİ,ÜCRET
FROM PERSONEL
WHERE ADI='SEZİN')
AND ADI<>'SEZİN';
10.5. FROM Sözcüğü İçinde Alt Sorgu Tanımlama
Normal olarak bir SELECT deyiminde kullanılabilecek tablolar, yani veri kaynağı FROM
sözcüğü içinde tanımlanır. Ancak gerektiğinde bir alt sorgunun sonuçları da tıpkı bir tablo
gibi değerlendirilerek, FROM içinde bu sorgu yer alabilir.
146 / 192
Örnek
Bir bölümün ortalama ücretinden daha fazla ücret alan tüm personelin ortalama
ücretlerini listelemek istiyoruz. Amacımıza uygun sorgulama şu şekilde olabilir:
SELECT P.BÖLÜM_NO, P.ADI,P.ÜCRET, S.MAAŞ
FROM PERSONEL P,(SELECT BÖLÜM_NO,AVG(ÜCRET) AS MAAŞ
FROM PERSONEL
GROUP BY BÖLÜM_NO) S
WHERE P.BÖLÜM_NO=S.BÖLÜM_NO
AND P.ÜCRET>S.MAAŞ;
Burada, PERSONEL tablosu yanısıra bir alt sorgu tanımlanmaktadır. Bu sorgu tıpkı bir
tablo gibi düşünülerek ona S adı verilmiştir. Bu sorgu bölümlerin ücret ortalamalarını
üretmektedir.
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
147 / 192
148 / 192
DML (Data Manipulation Language)
11.2. Tabloya Satır Ekleme
Bir tabloya yeni bir satır eklemek gerektiğinde INSERT INTO deyimi kullanılır. Bu deyim
aşağıda gösterildiği biçimde tanımlanıyor:
INSERT INTO tablo (sütunlar)
VALUES (değerler);
tablo
Kayıt ekleme işleminin yapılacağı tablonun
adı.
sütunlar Eklenecek satırların sütun isimleri.
değerler Herbir sütuna girilecek yeni değerler.
Bu deyim her çalıştığında tabloya yeni bir satır eklenir. INSERT INTO deyimi içinde
sütun isimlerini belirlemek zorunlu değildir. Ancak, bu durumda sütunların tablo
tanımındaki varsayılan sırası kabul edilir.
149 / 192
Örnek
BÖLÜM tablosunun aşağıda görüldüğü biçimde 6 adet kayıta sahip olduğunu varsayalım:
Yukarıda olduğu gibi, herhangi bir tablonun satırlarını nasıl görüntüleyeceğimizi geçen
derslerden biliyoruz. Bu işlem aşağıda belirtildiği biçimde SELECT sorgulama deyimi ile
yapılır:
SELECT *
FROM BÖLÜM;
Bu tabloya yeni bir bölüm eklemek istiyoruz. Eklenecek yeni bölüm ile ilgili veriler şu
şekildedir:
Bölümün
numarası
: 70
Bölümün adı
: EĞİTİM
Bölümün
konumu
: KADIKÖY
Söz konusu bir kayıtı eklemek için aşağıdaki deyim kullanılır:
INSERT INTO BÖLÜM(BÖLÜM_NO,BÖLÜM_ADI,KONUM)
VALUES(70,'EĞİTİM','KADIKÖY');
Bu şekilde kayıt ekleme işlemi gerçekleştirildikten sonra, BÖLÜM tablosu yeniden
görüntülenirse, tablonun en sonuna söz konusu kayıtın eklendiği görülür.
150 / 192
Örnek
BÖLÜM tablosuna yeni bir kayıt ekleyeceğiz. Eklenecek satırda KONUM sütununa NULL
değerini atamak için INSERT INTO deyimi aşağıda belirtilen biçimlerde kullanılabilir.
a. INSERT INTO BÖLÜM(BÖLÜM_NO,BÖLÜM_ADI)
VALUES(80,'BİLGİ İŞLEM');
b. INSERT INTO BÖLÜM
VALUES(80,'BİLGİ İŞLEM',NULL);
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
151 / 192
11.2.3. Bir Diğer Tablodan Satır Kopyalama
INSERT INTO deyimi ile, tabloya belirlenen değerleri içeren bir satır eklenebildiği gibi,
bir başka tablodan okunan satırlar da eklenebilir. Diğer tablodan satırları okumak için
SELECT sorgulama deyimi kullanılır. Bu durumda VALUES sözcüğü kullanılmaz.
Bir tablodan satır okuyarak, bir diğer tabloya eklemek için aşağıda belirtilen tanım
kullanılır:
152 / 192
INSERT INTO tablo (sütunlar)
alt sorgu;
Alt sorgudan elde edilecek sütunlar ile INSERT INTO içinde tanımlanan sütunlar karşılıklı
eşleşecektir. O nedenle, aynı veri türüne sahip olmalarına dikkat etmek gerekiyor.
Bir tablodan bir başka tabloya kayıt ekleme
Örnek
YÖNETİCİLER isimli bir tabloya, PERSONEL tablosunda yer alan ve görevi "MÜDÜR"
veya "ŞEF" olanları seçerek eklemek istiyoruz. Amacımıza uygun deyimler şu şekilde
olacaktır:
INSERT INTO YÖNETİCİLER(PERSONEL_NO,ADI,
GÖREVİ,ÜCRET,BÖLÜM_NO)
SELECT PERSONEL_NO,ADI,
GÖREVİ,ÜCRET,BÖLÜM_NO
FROM PERSONEL
WHERE GÖREVİ='MÜDÜR'
OR GÖREVİ='ŞEF';
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
153 / 192
11.3 Tablodaki verileri güncelleme
Bir tablonun içerdiği değerler gerektiğinde değiştirilecektir. Bu amaçla UPDATE
deyiminden yararlanılır. Bu deyim şu şekilde tanımlanır:
UPDATE tablo
SET sütun1=değer1,
sütun2=değer2,…
[WHERE koşul];
154 / 192
Verilerin güncelleştirilmesi için WHERE deyimi ile bir koşul tanımlanabilir. Bu tanımın
yapılmadığı durumlarda, söz konusu tablonun tüm satırları güncelleştirilmiş olacaktır.
Örnek
Personel numarası "300" olan personelin ücretini "2500" olarak değiştirmek istiyoruz.
Bunu sağlamak için şöyle bir yol izlenir:
UPDATE PERSONEL
SET ÜCRET=2500
WHERE PERSONEL_NO=300;
Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız
155 / 192
Örnek
Numarası "350" olan personel ile aynı göreve sahip tüm personelin bölüm numarasını,
"90" olarak değiştirmek istiyoruz. Amacımıza şu şekilde ulaşabiliriiz:
UPDATE PERSONEL
SET BÖLÜM_NO=90
WHERE GÖREVİ=(SELECT GÖREVİ
FROM PERSONEL
WHERE PERSONEL_NO=350);
PERSONEL ve BÖLÜM tabloları üzerinde bütünlük sınırlamaları tanımlandığını
varsayalım. PERSONEL ve BÖLÜM tablolarının birincil anahtarları bulunmaktadır.
BÖLÜM tablosunun birincil anahtarı BÖLÜM_NO'dur. Aynı alan PERSONEL tablosunda
dış anahtar olarak yer almaktadır. Bu iki tablonun BÖLÜM_NO alanlarına göre iki tablo
ilişkilendirilmiştir.
156 / 192
Sayılan bu sınırlamalar nedeniyle, PERSONEL tablosunun BÖLÜM_NO sütununda yer
alacak tüm değerlerin BÖLÜM tablosunun BÖLÜM_NO tablosundaki değerlerle aynı
olması gerekmektedir. Yukarıdaki UPDATE deyimi ise sadece PERSONEL tablosu
üzerinde bu alanı değiştirmeye çalışmaktadır. Sınırlama tanımları yüzünden bu işlem
yerine getirilmeyerek kullanıcı uyarılır.
11.4. Tablodan Satır Silme
Tabloda yer alan bir veya daha fazla sayıda satır silinebilir. Silme işlemi için DELETE
deyimi kullanılır. Bu deyim şu şekilde tanımlanıyor:
DEELETE [FROM] tablo
[WHERE koşul];
Örnek 1
BÖLÜM isimli tablonun tüm kayıtlarını silmek için şöyle bir yol izlenebilir:
DELETE FROM BÖLÜM;
Ancak bu tür bir silme işleminin gerçekleştirilebilmesi için, bu tablo üzerinde bütünlük
sınırlamalarının bulunmaması gerektiği unutulmamalıdır. Bu tablonun PERSONEL tablosu
arasında bütünlük ilişkilerinin tanımlandığını varsayacak olursak, bu silme işleminin
gerçekleşmeyeceğini söyleyebiliriz.
Örnek 2
BÖLÜM isimli tabloda yer alan ve bölüm kodu "60" olan bölümü silmek istiyoruz. Bunun
için DELETE deyimi şu şekilde düzenlenebilir:
DELETE FROM BÖLÜM
WHERE BÖLÜM_NO=60;
BÖLÜM ile PERSONEL arasında bütünlük sınırlamaları tanımlanmış olmasına rağmen,
amaçlanan silme işlemi gerçekleşir. Çünkü "60" numaralı bölüm BÖLÜM tablosunda
tanımlanmasına rağmen, PERSONEL tablosunda bu bölümle ilgili herhangi bir kayıt
bulunmamaktadır.
157 / 192
11.5. Hareket İşleme
Veri tabanlarını doğal olarak aynı anda çok sayıda kişi kullanacaktır. Kullanıcı; veri
ekleyebilir, veriyi değiştirebilir hatta silebilir. Bu değişikliklerin diğer kullanıcıları hemen
etkilemesi istenmez. Çünkü yapılan bazı işlemlerin iptal edilerek, veri tabanının önceki
hale dönüşmesi gerekebilir. Yani veri üzerinde bir değişiklik yaptığımızda, bunun
sonucunu sadece kendimiz görürüz. Gerek görülürse; bu değişikliklerin kalıcı hale
getirilerek diğer kullanıcılar tarafından da görülmesi sağlanabilir. Bu tür bir amaca
ulaşmak için hareket işleme (transaction processing) kavramını bilmek gerekir.
Verinin değiştirilmesi üzerinde etkili olan DML deyimleri çalıştırıldığında, "veri tabanı
hareketleri " (database transactions) oluşur. Başlayan bir hareket COMMIT ya da
ROLLBACK deyimleri çalıştırılıncaya dek sona ermez ve sonuçları kalıcı değildir. Bu
deyimlerden biri çalıştırıldığında veya bir başka DDL deyimi (örneğin CREATE)
çalıştırıldığında da hareket son bulur. Ayrıca bilgisayarın çalışması sona erince ya da
sistem bozulmalarında (crashes) veri tabanı hareketleri sona erecektir.
Veri tabanı hareketleri INSERT, UPDATE ve DELETE gibi deyimlerin çalıştırılması
sonucunda başlar.
158 / 192
Örnek
Veri tabanı kullanıcılarından birinin aşağıdaki deyimi çalıştırdığını varsayalım.
UPDATE PERSONEL
SET BÖLÜM_NO=10
WHERE PERSONEL_NO=300;
Bu deyimin çalıştırılması ardından, "300" numaralı personelin bölüm numarası "10"
olarak değiştirilir. Söz konusu değişiklik sadece bu deyimi çalıştıran kullanıcı için
yapılmıştır. Veri tabanına ulaşan diğer kullanıcılar bu değişikliğin sonucunu görmezler.
Çünkü kullanıcının yarattığı hareket sona ermemiştir. Aynı kullanıcı bu kez,
COMMIT;
deyimini çalıştıracak olursa, yaptığı tüm değişiklikler kalıcı hale gelir ve diğer veri tabanı
kullanıcıları da bu değişikliği algılamış olurlar.
159 / 192
Örnek
PERSONEL tablosunun tüm kayıtlarını silmek için,
DELETE FROM PERSONEL;
Deyiminin çalıştırıldığını varsayalım. Bu deyim çalıştırıldığında, bu deyimi çalıştıran
kullanıcı için PERSONEL tablosunun tüm kayıtları silinmiştir. Henüz COMMIT deyimi
çalıştırılmadığı için diğer kullanıcılar bu işlemden etkilenmez ve bu durumda, silinen
kayıtları geri alma olanağı bulunmaktadır. Silme işlemini iptal etmek için,
ROLLBACK;
deyimi çalıştırılırsa, PERSONEL tablosunun eski haline dönüştüğü görülür.
160 / 192
Veri Tabanı Nesneleri
12.2. Tablolar
Tablolar veri tabanının temel yapılarıdır. Tablo yapılarının en önemli özellikleri şunlardır:
a)
Tablolar herhangi bir anda, hatta veri tabanının bir kullanıcı
tarafından kullanılması esnasında bile yaratılabilir.
b)
Tablolar için bir boyut belirlemeye gerek yoktur. Ancak yine de
tablonun ne kadarlık bir hacime ulaşabileceğini tahmin etmekte
yarar vardır.
Veri tabanlarında iki türlü tablo yer almaktadır:
Kullanıcı
tabloları
Bu tablolar herhangi bir veri tabanı kullanıcısı
tarafından yaratılan tablolardır. Söz konusu
tabloların isimleri ve sütunları doğal olarak kullanıcı
tarafından belirlenmiştir.
161 / 192
Veri sözlüğü
Veri tabanı sunucusu tarafından kullanılan ve
bakımı onun tarafından yapılan tablolardır. Veri
tabanının yönetilmesine yönelik olan bu tablolar ve
görünümler (views), veritabanı sözlüğünü
(database dictionary) oluştururlar. Bu tablolara
sistem yöneticisi dışında herhangi bir kullanıcının
erişmesi ya da müdahale etmesi mümkün değildir.
12.2.1. Tabloları İsimlendirme
Tablolara doğal olarak bir isim vermek gerekecektir. İsimlendirirken bazı kurallara uymak
gerekmektedir :
Tablo isimleri büyük-küçük harf ayrımına karşı duyarlı değildir. Küçük harflerle ya da
büyük harflerle veya karışık yazılması fark etmez. Tablo isimleri verilirken aşağıda
sıralanan hususlara dikkat edilmesi tavsiye edilir:
a)
b)
Tablo ya da sütun isimleri ilişkili olduğu konuya uygun biçimde belirlenmelidir.
Aynı sütunlar birden fazla tablo içinde yer alıyorsa, aynı isimleri vermek yararlı
olacaktır. Örneğin PERSONEL ve BÖLÜM tablosu içindeki bölüm numarasını içeren
sütunlar BÖLÜM_NO biçiminde belirlenmiştir.
162 / 192
163 / 192
12.2.3. Tabloların Yaratılması
Tabloların yaratılabilmesi için CREATE TABLE deyimi kullanılır. Bu deyim şu şekilde
tanımlanır:
CREATE TABLE [şema.] tablo
(sütun veri türü [DEFAULT ifade],…);
şema
Tablonun sahibini belirler
tablo
Yaratılacak tablonun adı
sütunlar
Tablonun herbir sütunu
veri türü
Herbir sütunun veri türü
DEFAULT
ifade
Sütuna veri girişi yapılmadığında, o sütunun
varsayılan değerini belirler
Veri tabanındaki nesneler topluluğuna şema adı verilebilir. Şema nesneleri, veri tabanı
içindeki verilere doğrudan karşılık gelen mantıksal yapılardır. Şema nesneleri tablolar,
görünümler, dizinler ve diğer nesnelerdir. Bir tablo belirli bir kullanıcıya ait ise, tablo adı
kullanıcı adı ile birlikte ifade edilir.
Bir sütunun değeri, daha tablo yaratılırken varsayılan değer (default value) olarak
atanabilir. Burada doğrudan bir değer, bir ifade veya bir fonksiyon belirlenebilir. Ancak
belirtlenen değer, ilgili sütunun veri türüne uygun olmalıdır. Örneğin, PERSONEL
tablosunun GİRİŞ_TAR isimli alanı, personelin işe giriş tarihini içerecektir. Eğer herhangi
bir değer kaydedilmez ise, bu personelin tabloya kaydedildiği günün tarihini işe giriş tarihi
olarak kabul etmek istiyoruz. Bu amaçla DEFAULT sözcüğü,
… GİRİŞ_TAR DATE DEFAULT SYSDATE biçiminde kullanılabilir
Örnek
164 / 192
BÖLÜM tablosunun aşağıdaki sütunlardan oluşması gerektiğini varsayalım:
BÖLÜM_NO
Sayısal değerler içerecektir. En fazla 2 karakter
olabilir.
BÖLÜM_ADI
Bölüm adını içerecektir. En fazla 15 karakter
olabilir.
KONUM
Bölümün yerini belirleyecekitir. En fazla 13
karakter olabilir.
Bu tablo aşağıda belirtildiği biçimde yaratılabilir:
CREATE TABLE BÖLÜM
(BÖLÜM_NO
BÖLÜM_ADI
KONUM
NUMBER(2),
VARCHAR2(15),
VARCHAR2(13));
12.2.4. Bir Alt Sorgu İle Tabloların Yaratılması
Bir tablo yaratıldıktan sonra, INSERT INTO deyimi yardımıyla, bu tabloya bir başka
tablodan sorgulama işlemi yapılarak bilgi giriş yapılabilir. Ancak, bilgi giriş işlemi daha
tablo yaratılırken de yapılabilir. Bunun için, CREATE TABLE deyimi bir alt sorgu ile
birlikte kullanılabilir.
CREATE TABLE tablo
[(sütunlar)]
AS
altsorgu ;
CREATE TABLE deyiminde sütun tanımları yapılmamış ise, alt sorgudan elde edilen
sütunlar yeni yaratılacak olan tablonun sütunlarını oluşturacaktır. Eğer CREATE TABLE
deyimi içinde sütun tanımları verilmiş ise, bunların sayısı alt sorgudan elde edilen sütun
sayısı ile aynı olmalıdır. Bu durumda yeni tablo sütunları ile alt sorgu sütunları sıraya göre
eşleşir.
165 / 192
Örnek
PER20 isimli bir tablo yaratacağız. Bu tablo PERSONEL tablosunda yer alan ve "20"
numaralı bölüme ilişkin personel kayıtlarını içerecektir. PERSONEL tablosundaki aylık
ücret bilgileri yıllığa çevrilerek PER20 tablosuna yazdırılacaktır.
CREATE TABLE PER20
AS
SELECT PERSONEL_NO, ADI, ÜCRET*12 AS YILLIK
FROM PERSONEL
WHERE BÖLÜM_NO=20;
12.2.5. Tabloya Yeni Bir Sütun Ekleme
Bir tablo yaratıldıktan sonra, gerektiğinde yeni sütunlar eklenebilir. Bu amaçla ALTER
deyimi kullanılır. ALTER deyimi şu şekilde tanımlanıyor:
ALTER TABLE tablo
ADD ((sütun1 veri türü
[DEFAULT ifade]
[,sütun2 veri türü]…);
Örnek
Daha önce yaratılan PER20 isimli tabloya GÖREVİ isimli yeni bir sütun eklemek
istiyoruz. Bu sütun VARCHAR2 veri türüne sahip olacak ve en fazla 9 karakter
içerebilecektir. Bunun için şöyle bir yol izlenir:
ALTER TABLE PER20
ADD (GÖREVİ VARCHAR2(9));
12.2.6. Bir Sütun Tanımını Değiştirmek
Tablo yaratıldıktan sonra, gerektiğinde bir sütun ile ilgili tanımlarda bazı değişiklikler
yapılabilir. Bunun için ALTER deyimi MODIFY sözcüğü ile birlikte şu şekilde kullanılır:
166 / 192
ALTER TABLE tablo
MODIFY ((sütun1 veri
türü [DEFAULT ifade]
[,sütun2 veri türü]…);
Sütun tanımları istenildiği biçimde değiştirilemez. Bu işlemi yerine getirirken bazı
noktalara dikkat etmek gerekiyor:
Örnek
PER20 isimli tablonun ADI isimli sütunun genişliğini 15 karakter olarak değiştirmek
istiyoruz. Bunun için aşağıda belirtilen yol izlenir:
ALTER TABLE PER20
MODIFY (ADI VARCHAR2(15));
167 / 192
12.2.8 Tablonun Yok Edilmesi
Gerektiğinde bir tablo veri tabanından silinebilir. Böyle bir amaca ulaşmak için DROP
deyimi kullanılır. Söz konusu deyim şu şekilde tanımlanıyor:
DROP TABLE tablo
Bu deyim tehlikeli sonuçlara neden olabilecek bir deyimdir. O halde kullanırken bazı
noktalara dikkat etmek gerekiyor:
168 / 192
Örnek
PER20 isimli tabloyu yok etmek için aşağıda belirtilen yol izlenir:
DROP TABLE PER20;
12.2.9. Tablonun Budanması
Bir tablonun bazı satırları ve gerektiğinde tüm satırlarının nasıl silinebildiğini biliyoruz.
DELETE deyimini bu amaçla kullandık. Benzer biçimde, bir tablonun tüm satırlarını yok
etmek gerektiğinde TRUNCATE TABLE deyimi kullanılır. Bu deyim şu şekilde tanımlanır:
TRUNCATE TABLE
tablo
DELETE ve TRUNCATE deyimleri tablonun tüm satırlarının yok edilmesine neden olur.
Ancak, DELETE deyimi tablonun silinen satırlarından boşalan alanı yok etmez.
TRUNCATE ise bu alanı yok eder.
DELETE deyimi çalıştırıldıktan sonra ROLLBACK deyimi ile işlemler geri alınabiliyordu.
TRUNCATE deyimi çalıştırıldıktan sonra silinen satırlar geri alınamaz.
Örnek
BÖLÜM tablosunun tüm satırlarını silmek için TRUNCATE deyimi şu şekilde kullanılır:
TRUNCATE TABLE BÖLÜM;
169 / 192
Veri tabanında, veri bütünlüğünü sağlayan çeşitli sınırlamalar tanımlanabilir. Aşağıdaki
tablo bu sınırlamaları açıklamaktadır.
170 / 192
12.3.1.1 NOT NULL Sınırlaması
Bir tablonun herhangi bir sütununun hiçbir zaman boş kalmaması istenebilir. Yani bu
sütun NULL değerler içermeyecektir. Bu tür bir amaca NOT NULL sınırlaması yardımıya
ulaşılabilir. Böyle bir sınırlama tablo satırlar üzerine konulabilir.
Örnek
PERSON tablosuna bilgi girişlerinde, personel adı ve bölüm numarası ile ilgili sütunların
mutlaka dolu olmasını istiyoruz. Bu tür bir amaca ulaşmak için PERSON tablosu şu
şekilde yaratılabilir.
12.3.1.2 UNIQUE Sınırlaması
Tablonun bir sütununa girilen bir değerin, aynı sütun içinde tekrarlanmaması istenilebilir.
UNIQUE anahtar sınırlaması böyle bir amaç için kullanılır. Söz konusu anahtara "tek
171 / 192
anahtar" adı da verilmektedir. Bu tür bir anahtar tek bir sütun yardımıyla
oluşturulabileceği gibi, gerektiğinde birden fazla sütun bir araya getirilerek de
oluşturulabilir. Bu durumda "birleşik tek anahtar" kavramından söz edilir.
UNIQUE anahtarının tanımlandığı sütun için NOT NULL sınırlaması da tanımlanabilir.
Eğer tanımlanmaz ise, NULL değerler içeren çok sayıda satır eklenebillir. Çünkü NULL
değerler herhangi bir değerle eşleşmediği için, "tek olma" koşulunu bozmaz. CREATE
TABLE deyimi içinde UNIQUE sınırlaması şu şekilde tanımlanır:
CONSTRAINT UNIQUE
anahtar adı
UNIQUE( sütun adı );
Örnek
BÖLÜM tablosunun BÖLÜM_NO isimli sütunu çift değerlere izin vermeyecektir. Bu
koşula uygun tablo şu şekilde yaratılabilir:
CREATE TABLE BÖLÜM
(BÖLÜM_NO NUMBER(4),
BÖLÜM_ADI VARCHAR2(14),
KONUM VARCHAR2(13),
CONSTRAINT BL
UNIQUE(BÖLÜM_ADI));
Burada BÖLÜM isimli tablo yaratılırken, BÖLÜM_ADI için UNIQUE sınırlaması
tanımlanmış ve bu sınırlamaya BL adı verilmiştir. Bu tabloya artık bölüm adı aynı olan
ikinci bir kayıt eklenemez.
172 / 192
12.3.1.3 PRIMARY KEY Sınırlaması
Bir tablo için birincil anahtarın tanımlanması söz konusu ise, PRIMARY KEY sınırlaması
kullanılır. Bir tablo için sadece bir adet birincil anahtar yaratılabilir. Ancak birden fazla
sütun bir araya getirilerek de birincil anahtar oluşturulabilir. Birincil anahtar olarak
tanımlanan bir sütun NULL değerler veya tekrarlı değerler içeremez.
CREATE TABLE deyimi içinde birincil anahtar şu şekilde tanımlanır:
CONSTRAINT birincil anahtar
adı
PRIMARY KEY ( sütun adı );
Örnek
BÖLÜM tablosunun BÖLÜM_NO isimli sütununu birincil anahtar olarak tanımlamak
istiyoruz. Birincil anahtarın adı PR olacaktır. Bunun için aşağıdaki tanımı yapmak
yeterlidir:
CREATE TABLE BÖLÜM
(BÖLÜM_NO NUMBER(4),
BÖLÜM_ADI VARCHAR2(14),
KONUM VARCHAR2(13),
CONSTRAINT PR
PRIMARY KEY(BÖLÜM_NO));
Aynı anda birden fazla sınırlamayı da tanımlayabilir. Örneğin, birincil anahtar yanısıra,
BÖLÜM_ADI için, BL adını taşıyan UNIQUE anahtar tanımı birlikte yapılabilir:
173 / 192
CREATE TABLE BÖLÜM
(BÖLÜM_NO NUMBER(4),
BÖLÜM_ADI VARCHAR2(14),
KONUM VARCHAR2(13),
CONSTRAINT BL
UNIQUE(BÖLÜM_ADI),
CONSTRAINT PR
PRIMARY KEY(BÖLÜM_NO));
12.3.1.4 FOREIGN KEY Sınırlaması
İki tablo arasında ilişkisel bütünlüğü (referential integrity) sağlamak amacıyla
FOREIGN KEY, yani dış anahtar sınırlaması tanımlanır. Bu sınırlamalar bir sütun olarak
tasarlandığı gibi, bazı durumlarda birden fazla sütunun birleşimi olarak da düşünülebilir.
Bir tablo için tanımlanan dış anahtar, bir başka tablonun birincil anahtarı ile ilişkilendirilir.
CREATE TABLE deyimi içinde dış anahtar şu şekilde tanımlanır.
CONSTRAINT dışanahtarın
adı
FOREIGN ( sütun adı )
REFERENCES tablo(sütun
adı);
FOREIGN KEY sınırlamaları ile ilgili tanımlarda bazı özel sözcüklere yer vereceğiz.
Aşağıda bu sözcükler hakkında kısaca bilgi veriyoruz:
FOREIGN KEY
Yaratılacak tablonun dış anahtar olarak
seçilen sütununu tanımlar.
REFERENCES
Bu tablonun ilişkili olduğu tablonun birincil
anahtarını belirtir.
ON DELETE
CASCADE
Ana tablodan bir satır silindiğinde; ilişkili
olduğu tabloda, bu satır ile ilişkili tüm
kayıtların silinmesini sağlar.
174 / 192
Örnek
PERS isimli yeni bir tablo yaratılacaktır. PERS tablosu içindeki ADI ve BÖLÜM_NO
alanları NULL değerler içermeyecektir. Bu tablo BÖLÜM tablosu ile BÖLÜM_NO
sütununa göre ilişkili olacaktır. O halde, BÖLÜM tablosunun BÖLÜM_NO sütununa bağlı
olarak bir dış anahtar tanımlanacaktır. Bu anahtarın adı FK olacaktır. Amacımıza uygun
PERS tablosu şu şekilde yaratılabilir:
CREATE TABLE PERS
(PERSONEL_NO NUMBER(4),
ADI VARCHAR2(10) NOT NULL,
GÖREVİ VARCHAR2(9),
YÖNETİCİSİ VARCHAR(9),
GİRİŞ_TAR DATE
ÜCRET NUMBER(7,2),
KOMİSYON NUMBER(7,2),
BÖLÜM_NO NUMBER(2) NOT NULL),
CONSTRAINT FK
FOREIGN KEY(BÖLÜM_NO)
REFERENCES BÖLÜM(BÖLÜM_NO));
175 / 192
12.3.1.5 CHECK Sınırlaması
Tablonun herbir satırı için bir koşul tanımlanması söz konusu ise, CHECK sınırlaması
kullanılır. Koşul tanımlanırken SQL koşul işleçlerinden yararlanılır. CREATE TABLE deyimi
içinde koşul tanımları şu şekilde yapılır:
CONSTRAINT
koşul adı
CHECK (koşul)
Örnek
BÖLÜM tablosunun BÖLÜM_NO sütununa girilecek değerlerin 10 ile 99 arasındaki bir
değer olmasını istiyoruz. Koşulun adı KŞ olsun. Bu tür bir koşulu şu şekilde
tanımlayabiliriz:
CREATE TABLE BÖLÜM
(BÖLÜM_NO NUMBER(4),
BÖLÜM_ADI VARCHAR2(14),
KONUM VARCHAR2(13),
CONSTRAINT KŞ
CHECK (BÖLÜM_NO BETWEEN 10 AND 99));
NOT NULL sınırlamasının eklenmesi söz konusu ise, ALTER TABLE deyimi içinde
MODIFY sözcüğü kullanılır. Ancak bu tür bir sınırlamanın eklenebilmesi için, söz konusu
tablonun hiç satır içermemesi gerekiyor. ALTER TABLE deyimi ile sınırlamalar için
ekleme, silme, kapatma veya açma işlemleri yapılabilir. Ancak bir sınırlama mevcut ise,
bunun yapısını değiştiremeyiz.
Örnek
PERS tablosunun YÖNETİCİSİ sütununa girilen bir değer, aynı zamanda bu tablonun
PERSONEL_NO sütununda bulunan bir değer olmalıdır. Bu tür bir sınırlamayı, mevcut bir
tabloya şu şekilde ekleyebiliriz:
176 / 192
ALTER TABLE PERS
ADD CONSTRAINT TEST
FOREIGN KEY(YÖNETİCİSİ)
REFERENCES (PERSONEL_NO);
Örnek 1
BÖLÜM tablosu üzerindeki PRIMARY KEY sınırlamasını kaldırmak için şöyle bir yol
izlenebilir:
ALTER TABLE BÖLÜM
DROP PRIMARY KEY CASCADE;
Bu işlem, BÖLÜM tablosuyla ilişkili PERSONEL.BÖLÜM_NO sütunu üzerindeki dış
anahtar sınırlamalarını da kaldırır.
Örnek 2
Daha önce PERS tablosu için tanımlanan TEST isimli sınırlamayı yok etmek istiyoruz.
Bunun için şöyle bir yol izlenebilir:
ALTER TABLE PERS
DROP CONSTRAINT TEST
Bu işlem, BÖLÜM tablosuyla ilişkili PERSONEL.BÖLÜM_NO sütunu üzerindeki dış
anahtar sınırlamalarını da kaldırır.
12.4. Görünümler
Bir ya da daha fazla tablonun mantıksal alt kümelerini oluşturmak için görünümlerden
yararlanılır. Görünümler, bir tabloya dayalı mantıksal bir tablo olarak değerlendirilir.
Görünüm, tablolar gibi veriyi fiziksel olarak saklamaz. Görünümler, saklanmış
(depolanmış) SELECT deyimi olarak değerlendirilir. Bir SELECT deyiminin defalarca
kullanılması söz konusu ise, onu bir görünüm biçiminde tanımlayarak, bu görünümün
çalıştırılması mümkündür. Görünümler aşağıda sıralanan nedenlerle tercih edilir:
177 / 192
a)
Görünümler, veri tabanına erişimi sınırlayan olanaklardır
çünkü görünüm, tabloların sadece seçilen bir kısmını
görüntüleyebilir.
b)
Karmaşık sorguların kolayca yapılmasını sağlar.
c)
Aynı veriyi kullanan çok sayıda görünüm
tanımlanabilmektedir.
Bir görünümün yaratılabilmesi için CREATE VIEW deyimi kullanılır. Bu deyim en basit
biçimiyle, şöyle tanımlanıyor:
CREATE VIEW
görünüm
AS alt sorgu ;
Bir görünümün yaratılması esnasında kullanılacak alt sorgu içinde ORDER BY sözcüğü
yer alamaz. Bazı kurallara uymak koşuluyla görünümler DML işlemlerinin yerine
getirilmesi amacıyla da kullanılabilir. Aşağıda sıralanan sorgu türleri DML işlemlerinde
kullanılamaz.
a)
Grup fonksiyonlarını içeren alt
sorgular
b)
GROUP BY sözcüğünün yer
aldığı alt sorgular
c)
DISTINCT sözcüğünün yer aldığı
alt sorgular
Var olan bir görünümü yok etmek amacıyla DROP VIEW deyimi kullanılır.
178 / 192
DROP VIEW
görünüm ;
Örnek 1
PERSONEL tablosunun PERSONEL_NO, ADI ve GÖREVİ sütunlarına bağlı olarak,
PERGÖR isimli görünümü şu şekilde yaratabiliriz.
CREATE VIEW PERGÖR
AS SELECT PERSONEL_NO, ADI, GÖREVİ
FROM PERSONEL;
Örnek 2
Alt sorgu içinde alan takma isimler de kullanılabilir. Bu durumda görünümün alan isimleri,
söz konusu takma isimler olacaktır.
CREATE VIEW PERGÖR1
AS SELECT PERSONEL_NO, AS P_NO, ADI AS İSİM, ÜCRET AS MAAŞ
FROM PERSONEL
WHERE BÖLÜM_NO=20;
12.4.1. Görünümün Sorgulanması
Görünümler aynen bir tabloya benzer. SELECT deyimi ile bir görünümü okumak
mümkündür. Bir görünümün içerdiği tüm sütunlar seçilebildiği gibi, gerektiğinde bazı
sütunları da seçilebilir.
179 / 192
Örnek
PERS1 isimli görünümü PERSONEL_NO, ADI ve GÖREVİ isimli sütunlardan
oluşmaktadır. Bu görünümün çalıştırılarak (sorgulanarak), sadece ADI ve GÖREVİ isimli
sütunlarının seçilebilmesi için;
SELECT ADI,GÖREVİ
FROM PERS1;
biçiminde bir tanım yapmak yeterlidir. Bu görünüm çalıştırıldığında, PERSONEL
tablosunun sadece; ADI ve GÖREVİ sütunları görüntülenir.
180 / 192
Örnek
Daha önce yaratılmış PERGÖR isimli görünümü şu şekilde güncelleştirebiliriz.
CREATE OR REPLACE VIEW PERGÖR
AS SELECT PERSONEL_NO, ADI, GÖREVİ, ÜCRET, BÖLÜM_NO
FROM PERSONEL;
12.5. Indeksler
İndeksler (dizinler) bir tablodaki satırlara, belirli bir sütun üzerinden daha hızlı erişimi
sağlayan veri tabanı nesneleridir. İndeksler bir deyim yardımıyla kullanıcı tarafından
yaratılabileceği gibi otomatik olarak da yaratılabilir. Bir tablo tanımında PRIMARY KEY ya
da UNIQUE sınırlamalarına yer verilmiş ise, bu anahtarlara bağlı olarak otomatik indeksler
yaratılır.
PRIMARY KEY ve UNIQUE anahtar sınırlamaları sonunda yaratılan indeksler, bu
anahtarların özelliğine bağlı olarak tek değerli indeksler (unique index) ismiyle bilinir.
Buna karşılık tek olmayan indeksler de yaratmak mümkündür. Örneğin, FOREIGN KEY
alanı için indeks yaratarak, bu alana bağlı sorguların hızını artırabiliriz.
İndeksler tanımlandığında, disk için okuma/yazma miktarı azalır. Böylece veriye daha
hızlı erişilir. İndeksler tablodan bağımsız olarak oluşturulur ve hem kullanımı hem de
bakımı veri tabanı sunucusu tarafından otomatik olarak gerçekleştirilir. Bir tablo için
indeks tanımlanmamış ise, okuma işlemlerinde tüm tablo taranır.
Örnek
PERSONEL tablosunun BÖLÜM_NO alanına bağlı bir indeks oluşturacağız. Indeksin adı
PERBÖL olacaktır.
181 / 192
CREATE INDEX PERBÖL
ON PERSONEL(BÖLÜM_NO);
12.5.2. Bir İndeks Ne Zaman Yaratılır ?
Bir indeksin yaratılabilmesi için bazı koşulların gerçekleştirilmiş olması gerekmektedir.
Aksi takdirde indeksten beklenen yarar elde edilemez. Bir indeks, aşağıda sıralanan
koşullar ortaya çıktığında tanımlanır.
a)
Aynı alan birçok sorguda WHERE sözcüğü içinde ya da
bağlantı koşulu (join condition) içinde sık sık
kullanılıyorsa,
b)
Alan, geniş ardışık sayılar içeriyorsa,
c)
Alan, çok sayıda NULL değer içeriyorsa,
d)
İki ya da daha fazla alan birçok sorguda WHERE veya
bağlantı koşulu içinde birlikte sık sık kullanılıyorsa,
e)
Tablo çok büyük ve sorgudan elde edilecek sonuç
tablonun % 2-4 'den daha az ise,
Solda sıralanan durumlar geçerli ise indeks kullanılmaz.
182 / 192
183 / 192
Kullanıcı Erişiminin Denetlenmesi
Veri tabanları, çoğu şirket ve kurum için büyük öneme sahip verileri içerir. Veri
tabanlarının çoğu zaman birden fazla kullanıcının aynı anda hizmetinde olmaları gerekir.
Veri tabanlarını diğer kullanıcılara açarken, verilere ulaşma ve onlar üzerinde işlem
yapma gibi yetkilerin her kullanıcı için aynı olmamasına dikkat etmek gerekir. Bunun için,
veri tabanına erişimin dikkatle denetlenmesi gerekir. Günümüzdeki birçok Veri Tabanı
Yönetim Sistemi kullanıcı erşiminin denetlenmesi ile ilgili araçları ve yöntemleri içerir. Bu
bölümde bu tür araçları nasıl kullanacağımızı öğreneceğiz.
13.1 Kullanıcı Erişiminin Denetlenmesi
Bir veri tabanını doğal olarak çok sayıda kişi kullanacaktır. Bu kullanıcılar farklı kullanım
düzeyine sahip olacaktır. Her kullanıcı sistemin tüm kaynaklarına ulaşamayacaktır. Bunun
denetlenmesi gerekiyor. Kullanıcıların, veri tabanı sistemine tanıtılması ve erişim
yetkilerinin tanımlanması söz konusudur.
Bu bölümde kullanıcı erişimi ile ilgili konuları ele alarak inceleyeceğiz. Ancak burada
anlatılan konular ORACLE veri tabanı sunucusu göz önüne alınarak açıklanmıştır. Bu
noktaya dikkat etmek gerekiyor. Ayrıca, bu bölümde anlatılan işlemlerin çoğunu, sadece
Veri Tabanı Yöneticisinin (VTY) yapabileceğini unutmamalıyız.
Veri Tabanı Yöneticisi, veri tabanı üzerinde her türlü işlemi yapmaya yetkisi olan bir
kullanıcıdır. Diğer tüm kullanıcılar, veri tabanı yöneticisi tarafından yaratılır ve yetkileri
yine onun tarafından atanır.
13.2. Kullanıcıların Yaratılması
Veri Tabanı Yöneticisi (VTY), kullanıcıları veri tabanı sistemine tanıtır. Veri tabanını
kullanacak kişileri, sistemin kullanıcısı olarak tanıtmak için; CREATE USER deyimi
kullanılır. Bu deyim şu şekilde tanımlanır:
CREATE USER
kullanıcı
IDENTIFIED BY
(parola);
184 / 192
Örnek
BURAK isimli yeni bir kullanıcı sisteme aşağıda belirtildiği biçimde tanıtılır. Bu kullanıcının
parolası KAPLAN olarak belirtilecektir.
CREATE USER BURAK
IDENTIFIED BY KAPLAN;
185 / 192
13.3. Kullanıcılara Nesne Yaratma Yetkisinin Verilmesi
Veri Tabanı Yöneticisinin kullanıcıyı sisteme tanıttıktan sonra, kullanıcıya bazı yetkileri
ataması gerekmektedir. Kullanıcının bazı veri tabanı işlemlerini yerine getirebilmesi için,
bu tür yetkilere ihtiyacı olacaktır. Kullanıcılara veri tabanına erişim ve nesne yaratma
yetkilerinin verilmesi amacıyla GRANT deyimi kullanılır.
GRANT yetkiler TO
kullanıcılar ;
Kullanıcıya verilebilecek bazı yetkiler aşağıda sıralanmıştır:
CREATE_SESSION
Veri tabanına bağlanma yetkisi.
CREATE_TABLE
Tablo yaratma yetkisi.
CREATE_VIEW
Görünüm yaratma yetkisi.
Örnek
CREATE USER deyimini kullanarak BURAK isimli bir kullanıcı yaratmıştık. Bu kullanıcıya
tablo ve görünüm yaratma yetkisi vermek istiyoruz. Amacımıza şu şekilde ulaşabiliriz:
GRANT CREATE_TABLE, CREATE_VIEW TO BURAK;
186 / 192
13.4. Parolanın Değiştirilmesi
Kullanıcı yaratılırken, Veri Tabanı Yöneticisi tarafından söz konusu kullanıcı için bir erişim
parolası belirleniyordu. Bu parola, Veri Tabanı Yöneticisi tarafından değiştirilebileceği gibi,
onu yaratan kullanıcı tarafından da değiştirilebilir. Böyle bir amaca ulaşabilmek için;
ALTER USER deyimi kullanılır. Bu deyim şu şekilde tanımlanır:
ALTER USER kullanıcı
IDENTIFIED BY parola ;
Bu tür bir işlemin yapılabilmesi için, söz konusu kullanıcının ALTER USER yetkisine sahip
olması gerekmektedir. Bu yetki, doğal olarak Veri Tabanı Yöneticisi tarafından kullanıcıya
verilmektedir.
Örnek
BURAK isimli kullanıcının erişim parolasını KAPLAN olarak belirlemiştik. Bu parolayı
EYLÜL olarak değiştirmek istiyoruz. Parola değiştirme işlemini şu şekilde yapabiliriz:
ALTER USER BURAK
IDENTIFIED BY EYLÜL;
13.5. Yetki Gruplarının Tanımlanması
187 / 192
Yetki gruplarına rol adını veriyoruz. Bu yöntem, kullanıcılara aynı yetkilerin verilmesi söz
konusu olduğunda yararlı olmaktadır. Benzer biçimde, grup yetkisinin kaldırılabilmesi
işlemlerinde de rollerden yararlanılabilir. Roller, CREATE ROLE deyimi yardımıyla şu
şekilde oluşturulur:
CREATE ROLE rol adı;
Roller, Veri Tabanı Yöneticisi tarafından yaratılır. Rol yaratıldıktan sonra, rolün içerdiği her
bir yetki GRANT deyimi yardımıyla belirlenir. Rolün belirli kullanıcılara atanması işlemi de
yine; GRANT deyimi yardımıyla gerçekleştirilir.
Örnek
YÖNETİCİ isimli bir rol yaratmayı, bu rolün tablo ve görünüm yaratma yetkilerine sahip
olmasını istiyoruz. Ayrıca bu role BURAK ile BEGÜM isimli kullanıcılar sahip olacaktır.
Böyle bir amaca ulaşmak için şöyle bir yol izlenir :
a) YÖNETİCİ isimli rol tanımlanır:
CREATE ROLE YÖNETİCİ;
b) YÖNETİCİ isimli rol tanımlanmıştır. Bu rolün tablo yaratma ve görünüm yaratma
yetkilerini içermesi için GRANT deyimi şu şekilde kullanılır:
GRANT CREATE_TABLE, CREATE_VIEW TO YÖNETİCİ;
c) Bu yetkilere BURAK ve BEGÜM isimli kullanıcıların topluca sahip olmasını sağlamak
için rolün bu kullanıcılara atanması yeterlidir:
188 / 192
GRANT YÖNETİCİ TO BURAK,BEGÜM;
13.6. Nesnelere Erişim Yetkileri
Kullanıcılara, Veri Tabanı Yöneticisi tarafından yetkilerin nasıl atanabileceğini gördük. Bu
kez kullanıcılara nesne kullanma yetkisinin nasıl verilebileceği üzerinde duracağız.
Veri tabanı içindeki nesnelerin hangi yetkilerle kullanıcılara sunulacağını belirlemek üzere
GRANT deyimi kullanılır. Bu deyimle, bir nesne üzerinde ALTER, DELETE, INDEX,
INSERT, SELECT, UPDATE ve REFERENCES işlemleri için yetki verilebilmektedir. Bu
yetkiler, tablo ve görünümlere verilebilmektedir. GRANT deyimi böyle bir amaca yönelik
olarak en basit şu şekilde kullanılabilir:
GRANT yetkiler [(rol adı)]
ON nesneler
TO kullanıcılar
[roller][PUBLIC];
Tanımda sözü edilen PUBLIC sözcüğü, belirlenen nesneler üzerinde sahip olunan
yetkilerin tüm kullanıcılara verileceğini ifade eder.
Örnek 1
BURAK ve BEGÜM isimli kullanıcılara PERSONEL tablosu üzerinde SELECT deyimini
kullanma yetkisini şu şekilde verebiliriz:
GRANT SELECT
ON PERSONEL
TO BURAK, BEGÜM;
Örnek 2
BÖLÜM tablosunun BÖLÜM_ADI ve KONUM sütunlarında güncelleştirme yapma
yetkisini SELİN kullanıcısına ve YÖNETİCİ rolüne atamak istiyoruz. GRANT deyimi şu
şekilde olabilir:
189 / 192
GRANT UPDATE (BÖLÜM_ADI, KONUM)
ON BÖLÜM
TO SELİN, YÖNETİCİ;
Örnek 3
BURAK kullanıcısının PERSONEL tablosuna ilişkin olarak sahip olduğu SELECT yetkisini,
diğer tüm kullanıcılara vermek gerekiyorsa şu şekilde bir tanım yapılır:
GRANT SELECT
ON PERSONEL
TO PUBLIC;
13.7. Nesne Yetkilerinin Geri Alınması
GRANT deyimiyle verilen yetkiler, gerektiğinde geri alınabilir. Bunun için REVOKE
deyiminden yararlanılır. Bu deyim şu şekilde tanımlanır:
REVOKE yetkiler
ON nesneler
FROM kullanıcılar [roller]
[PUBLIC] ;
190 / 192
Örnek
BURAK kullanıcısının PERSONEL tablosu üzerindeki SELECT ve INSERT işlemleri
yetkilerini iptal etmek istiyoruz. Bu amaca ulaşmak için şu şekilde bir yol izlenir:
REVOKE SELECT,INSERT
ON PERSONEL
FROM BURAK;
191 / 192
192 / 192
Download