Professional Documents
Culture Documents
TBIL-403
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 biçimde tutulduðu ve bu verilerin çeþitli yazýlýmlar aracýlýðýyla yönetildiði ortamlardýr.
Bu derste; temel kavramlar ardýndan, veri tabaný tasarýmýnýn esasýný oluþturan "Varlýk-Ýliþki modeli" ele
alýnarak incelenecektir. Ardýndan "Ýliþkisel Model" ele alýnacak ve "Ýliþkisel Veri Tabaný" tasarýmý üzerinde durulacaktýr.
Veri Tabaný Yönetim Sistemlerinin temel sorgulama dili olan SQL, bu ders kapsamýnda ayrýntýlý biçimde ele
alýnarak incelenecekir. Bu dilin sorgulama olanaklarý ve veri tabanýný deðiþtirme özellikleri üzerinde durulacaktýr. Bu
dersi tamamlayan öðrenci, veri tabaný sistemleri üzerinde ayrýntýlý bilgi sahibi olacak, SQL sorgulama dilini etkin bir
biçimde kullanabilecektir.
TEMEL KAVRAMLAR
Bu bölümde,
anlatýlmaktadýr.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
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.
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.
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.
Ö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.
Sýralý dosyalarda tüm kayýtlar ardarda gelimesi gerkiyordu. 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.
Bir diðer doðrudan eriþimli dosya türü hesaba dayalý dosyalar (hashed files) olarak bilinir. Bu tür dosyalar, indeksli dosyalar gibi
ayrý bir indeksin tutulmasýný gerektirmez. Dosyanýn herhangi bir kaydýna doðrudan doðruya eriþebilmek için bir hesaplama
algoritmasý kullanýr.
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.
Veri tabaný kullanýmý, geleneksel dosya kullanýmýna göre birçok yönden üstünlük saðlamaktadýr.
Veri Tabaný Yönetim Sistemleri belirli bir veri modeline dayanýr. Bir veri tabaný yapýsýnýn temelini veri modeli
kavramý oluþturmaktadýr. Veriyi mantýksal düzeyde düzenlemek için; kullanýlan kavramlar, yapýlar ve iþlemler topluluðuna
“Veri Modeli” denir.
Þu ana dek birçok veri modeli geliþtirilmiþtir. Baþlýca veri modelleri yandaki animasyonda yer almaktadýr.
Sayýlan bu veri modellerinin ilk ikisi þu anda kullanýlmamaktadýr. En yaygýn kullanýlaný ise, Ýliþkisel Veri Modelidir.
Günümüzde kullanýlan VTYS’lerin hemen hemen tümü iliþkisel veri modeline dayalýdýr. Son zamanlarda ortaya çýkan
Nesneye Yönelik Veri Modeli, Ýliþkisel Veri Modeli ile birlikte bazý VTYS’lerde kullanýlmaktadýr.
Bu bölümde,
anlatýlmaktadýr.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
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.
2.2 Varlýk
Varlýk (Entity), var olan ve diðer varlýklardan ayýrt edilebilen bir nesnedir. Örneðin,
● bir bilgisayar,
● bir kaplan,
● bir savaþ uçaðý,
● bir 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.
Ayný türdeki varlýklar bir varlýk dizisi ya da bir baþka deyiþle varlýk kümesi oluþturur. Örneðin, bir okuldaki tüm
öðrenciler “öðrenci”, bu okuldaki tüm dersler “ders” isimli varlýk olarak deðerlendirilebilir. Çok sayýdaki öðrenci topluluðu da
bir varlýk oluþturur.
Örneðin; “Burak” bir varlýk olmasýna karþýlýk; onun yer aldýðý “öðrenci” tanýmý da bir varlýk olarak deðerlendirilir.
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:
Ö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.
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:
R1 = {(Burak, Matematik)}
R2 = {(Burak, Fizik)}
R3 = {(Burak, Matematik), (Begüm, Matematik)}
R1 ⊆ E1 x E2
R2 Í E x E
1 2
R3 Í E x E
1 2
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:
2.5 Nitelikler
Niteliðin aldýðý deðerlere etki alaný (domain) adý verilir. Örneðin, “PERSONEL” varlýðýnýn “adý ve soyadý” niteliði, birçok
PERSONEL adýný ve soyadýný içeren bir dizidir.
O halde nitelik, matematiksel anlamda bir fonksiyon olarak da deðerlendirilebilir. Bir varlýk kümesinden bir etki alanýna
eþlendirmeyi saðlar. Bu sayede her varlýk, nitelik ve veri deðeri olarak veri çiftleri biçiminde gösterilebilir.
çiftleri biçiminde ifade edilebilir. “PERSONEL” varlýðýnýn bir elemaný için veri çiftleri yandaki þekildeki gibi ifade edilebilir.
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.
ÖRNEK:
PERSONELin doðum tarihi 1960 ise, içinde bulunduðumuz yýldan yararlanýlarak, bu tarih çýkarýlýr ve PERSONELin yaþý
bulunur. O halde, PERSONELin “doðum tarihi” niteliði belirli ise, “yaþ” isimli bir nitelik tanýmlamaya gerek yoktur. “Yaþ” niteliði
bir türetilen nitelik olarak deðerlendirilir.
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.
Birden fazla nitelik birleþtirilerek yeni bir nitelik oluþturulabilir. Bu tür niteliklere birleþik nitelik adý verilir.
ÖRNEK:
PERSONELin “cadde” ve “þehir” nitelikleri birleþtirilerek “adres” isimli yeni bir nitelik oluþturulabilir.
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;
Ö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)
Bir varlýkla iliþkiye girebilecek varlýklarýn sayýsýna eþleme sayýsý denir. Eþleme sayýlarý n>2 varlýk için söz konusudur ve
ikili iliþkilerin ortaya konulmasý açýsýndan yararlýdýr. A ve B gibi iki varlýk kümesi arasýndaki R iliþki kümesi için dört
farklý eþleme durumlarý olabilir.
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.
Ö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.
ÖRNEK 2:
Aşağıdaki varlıkları gözönüne alalım:
R1 = {(a1,b2),(a2,b4)}
R2 = {(a2,b1),(a3,b2),(a4,b3)}
R3={(a1,b3),(a2,b2),(a3,b1)}
ÖRNEK 3:
Aşağıdaki iki kümeyi gözönüne alalım:
Bu iki küme içinde yer alan evli eşler birden-bire bir eşlemeye sahiptir.
ÖRNEK:
A varlýk kümesi anne isimlerinden oluþmaktadýr. B kümesi ise bu anne varlýklarýnýn çocuklarýndan
oluþmaktadýr.
Bu iki küme arasýndaki iliþki, doðal olarak birden-çoða biçiminde olacaktýr. Çünkü bir annenin bir veya daha
fazla çocuðu olabilir. Ancak bir çocuðun sadece bir annesi olacaktýr. O halde iki küme arasýndaki R iliþki
kümesi þu þekilde ifade edilebilir:
A varlýk kümesindeki birden fazla varlýk, B kümesindeki bir varlýk ile iliþkili ise, bu eþlemeye çoktan-bire iliþki adý verilir.
ÖRNEK:
A kümesi çocuklarý; B kümesi ise bu çocuklarýn annelerini içermektedir.
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.
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.
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.
ÖRNEK:
ürün={ürün isimleri}
Burada varlýklar arasýndaki iliþki birden çoða doðrudur. Her ürün birden fazla stok hareketi ile iliþkilidir. Bu
durumda, “stok hareket” varlýk kümesinden bir varlýðýn silinmesi durumunda, “ürün” varlýk kümesinden bir
varlýk silinmesi söz konusu olmaz. Çünkü bu varlýk “stok hareket” kümesindeki baþka varlýklarla da iliþkilidir.
Yukarýda söylenenin aksine “ürün” kümesinden bir varlýk silinmesi söz konusu ise, bu varlýkla iliþkili olan tüm
“stok hareket” varlýklarýnýn da silinmesi gerekecektir. Bu durumda “ürün” varlýðý baskýn varlýk, “stok
hareket” varlýðý ise baðýmlý varlýk olarak deðerlendirilir.
! 2.8 Anahtarlar
Varlýklarý ve iliþkileri tanýmlamýþ bulunuyoruz. Ancak, bir varlýk kümesi veya bir iliþki kümesi içinde yer alan
varlýklarý birbirinden nasýl ayýrt edebileceðiz sorunu karþýmýza çýkmaktadýr. Örneðin “öðrenci” varlýk kümesi içinde her
bir öðrenciyi diðerinden ayýrt eden nitelikler neler olabilir? Öðrencileri birbirinden ayýrt etmek için, öðrenci
numarasýný kullanabileceðimizi söyleyebiliriz. Varlýk kümesi içindeki varlýklarý birbirinden ayýrt etmek için kullanýlan bu
tür niteliklere varlýk kümesinin anahtarý denir. "Süper ve Aday Anahtar" olmak üzere iki tür anahtar vardýr.
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.
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 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.
ÖRNEK:
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.
Bazý durumlarda varlýk kümesi içinde bir anahtar bulmak mümkün olmayabilir. Hatta niteliklerinin
tümü biraraya getirildiðinde yine bir anahtar elde edilemeyebilir. Böyle varlýk kümelerine zayýf
varlýk kümesi adý verilir.
Buna karþýlýk, varlýk kümesinin içerdiði niteliklerden en az biri bir anahtar oluþturabiliyorsa bu
varlýk kümesine kuvvetli varlýk kümesi adý verilir.
ÖRNEK:
Bir “PERSONEL” varlýðýnýn aþaðýda belirtilen niteliklere sahip olduðunu varsayalým.
“Ý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.
Varlýk iliþki modelinde varlýklar ve iliþkileri tanýmlamak için aþaðýda belirtilen þema öðeleri kullanýlýr.
! Diðer Varlýk iliþki þema elementlerini görmek için "Devam" düðmesine týklayýnýz.
Ý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.
ÖRNEK 1:
● Adý
● Cadde
● Sokak
● Apartman
● Doðum tarihi
● Sevdiði yiyecekler
ÖRNEK 2:
“Müþteri” ve “Hesap” isimli iki varlýk kümesi birbirine “musHes” isimli iliþki ile baðlýdýr.
● Adý
● SSK no
● Adres
● Hesap no
● Bakiye
Ö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:
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.
ÖRNEK 1:
ÖRNEK 2:
ÖRNEK 3:
ÖRNEK 4:
Bu bölümde,
anlatýlmaktadýr.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
Ý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.
Ý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.
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.
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.
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.
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.
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.
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:
Ý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.
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.
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.
Ý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.
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.
Ö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.
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.
Bu bölümde,
● Normalleþtirme,
● Fonksiyonel Baðýmlýlýk,
● Birinci Normal Form ve Sorunlarý,
● Ýkinci Normal Form ve Sorunlarý,
● Üçüncü Normal Form,
● Boyce-Codd Normal Formu,
● Dördüncü Normal Form,
● Beþinci Normal Form,
anlatýlmaktadýr.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
4.1 Normalleþtirme
Ýliþkisel veri tabanýnýn tasarlanmasý aþamasýnda, verinin tekrarlanmasýný, veri kaybýný veya veri yetersizliðini önlemek
için normalleþtirme iþlemi uygulanýr. Normalleþtirme teorisi normal form kavramýna dayanýr.
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.
Ö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;
Burada m#, þehir_kodu ve þehir alanlarý müþteri bilgilerini, p# ve miktar ise daðýtým iþlemi bilgilerini oluþturmaktadýr.
file:///D|/Belgeler/Universite/Donem_III/Dersler/TBIL_403/VT04020.htm (1 of 2) [24.11.2006 21:26:40]
file:///D|/Belgeler/Universite/Donem_III/Dersler/TBIL_403/VT04020.htm
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.
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.
Birinci normal formda bazý sorunlarla karþýlaþabiliriz. Bu sorunlar yandaki animasyonda verilmiþtir.
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.
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.
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.
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:
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.
! Ýkinci normal form tablolarýný oluþturmak için aþaðý yöndeki oka týklayýnýz.
Ýkinci normal formda bazý sorunlarla karþýlaþabiliriz. Bu sorunlar yandaki animasyonda verilmiþtir.
Þ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.
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.
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;
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)
! Üçüncü normal form tablolarýný oluþturmak için aþaðý yöndeki oka týklayýnýz.
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.
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;
Þ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.
! Boyce-Codd normal formu tablosunu oluþturmak için aþaðý yöndeki oka týklayýnýz.
Bazý durumlarda BCNF'daki bir iliþkide de sorunlar görülebilmektedir. Örnek olarak aþaðýdaki tabloyu göz önüne alalým:
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.
Ç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.
! Dördüncü normal form tablolarýný oluþturmak için aþaðý yöndeki oka týklayýnýz.
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:
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.
Böylece kayýpsýz ayrýþtýrma iþlemi gerçekleþtirilmiþ olur. Burada ortak özellik, kredi_no olup;
ÝLÝÞKÝSEL CEBÝR
Bu bölümde,
anlatýlmaktadýr.
Bölüm Hedefi
Bu bölümde,
1. Seçimi,
2. Atma Ýþlemini,
3. Çarpmayý,
4. Birleþtirmeyi,
5. Kesiþmeyi,
6. Farký,
7. Doðal birleþtirmeyi,
8. Bölmeyi,
öðreneceksiniz.
Ýliþkisel cebir (relational algebra), bir iliþkisel sorgulama dilidir. Bir veya iki iliþkiyi girdi olarak alýp sonuç olarak yeni bir
iliþki üreten bir dizi iþlemden oluþur. Ýliþkisel cebir, bir veri tabaný sorgulama dilidir.
Ancak bu sorgulamalar sadece biçimsel olarak yapýlýr. Ýliþkisel Cebrin sorgulama dili için bir yorumlayýcý ya da bir
derleyici yoktur. Bu açýdan, sonraki bölümlerde inceleyeceðimiz SQL (Standart Sorgulama Dili)'den farklýdý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 " " iþleçlerinden biri de kullanýlabilir.
Ayrýca mantýksal iþleçlere de yer vermek mümkündür. "Ve" için " "; "veya" için " " iþleçleri kullanýlabilir.
Ö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 :
file:///D|/Belgeler/Universite/Donem_III/Dersler/TBIL_403/VT05020.htm (1 of 3) [24.11.2006 21:26:47]
file:///D|/Belgeler/Universite/Donem_III/Dersler/TBIL_403/VT05020.htm
Ö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;
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;
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 iþareti ile gösterilir. Kartezyen çarpým þu þekilde
ifade edilir;
! Kartezyen çarpým iþleminin nasýl yapýldýðýný görmek için "Çarp" düðmesine týklayýnýz.
Ö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;
Ö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;
ifadesi, ÖÐRENCÝ ve DERSLER tablolarýndan elde edilebilecek tüm ikilileri ifade etmektedir.
Ö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;
5.1.4 Birleþtirme
Ö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;
5.1.5 Kesiþme
Ö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;
5.1.6 Fark
Ö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;
(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.
! Doðal Birleþtirme iþleminin nasýl yapýldýðýný görmek için "Doðal Birleþtirme" düðmesine týklayýnýz.
Ö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;
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.
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.
● Oracle
● Sysbase
● Microsoft SQL Server
● DB2
● Informix
● MySQL
● Microsoft Acces
Bölüm Hedefi
Bu bölümde SQL'de;
öðreneceksiniz.
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:
Taným içinde bazý SQL anahtar kelimelerine yer verilmektedir. Bu anahtar kelimeler, SQL 'in kendi özel kelimeleridir ve aynen
bu þekilde ifade edilmelidir.
Tanýmdaki her bir iþaretin veya farklý gösterimin hangi anlama geldiðini aþaðýdaki tablodan görebilirsiniz.
Altý çizili ve italik olan bu ifadeler, kullanýcý tarafýndan verilen isimleri ifade etmektedir.
Bunlar SQL sözcüðü deðildir.
SQL deyimleri düzenlenirken bazý kurallarý ve önerileri göz önünde tutmak gerekmektedir. Aksi takdirde sorgu hata verir
ve çalýþmaz.
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:
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;
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;
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.
Aritmetik ifadeler; sütun isimleri, sabit sayýsal deðerler ve aritmetik iþleçlerden oluþur.
Örneðin, bir tablonun ÜCRET isimli sütunundaki sayýsal deðeri 12 ile çarpmak için,
ÜCRET*12
biçiminde bir ifade tanýmlanabilir. SELECT deyimi içinde bir ifade tanýmlandýðýnda, bu ifade ayrý bir sütun biçiminde
yaratýlmýþ olacaktýr.
Ö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;
Aritmetik iþleçler, SELECT deyiminin FROM sözcüðü dýþýnda herhangi bir yerinde kullanýlabilir.
Örnek
PERSONEL tablosunun, PERSONEL ve ÜCRET isimli iki sütunu listelenecektir. Burada ÜCRET, aylýk ücret
rakamýný içermektedir. Yýllýk ücrete 500 deðerini eklemek istiyoruz. Söz konusu hesaplamayý saðlayan ifade þu
þekilde olacaktýr;
12*ÜCRET+500
Buna göre * iþlecinin önceliðinden dolayý önce 12 ile ÜCRET çarpýlacak ve bulunan deðere 500 eklenecektir. Amacýmýza
uygun SELECT deyimi þu þekilde olabilir;
Parantezler, aritmetik ifadeler içinde diðer tüm iþleçlere göre bir önceliðe sahiptir. Önce parantez içindeki iþlemler
gerçekleþtirilir.
Ö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;
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;
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.
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.
Ö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;
Sütunlarýn içerdikleri deðerleri, birbiriyle ya da bir baþka karakter dizisi ile birleþtirerek yeni deðerler elde edilebilir.
Birleþtirme iþleci olarak (||) simgesi kullanýlabilir. Bu iþlecin kulllanýmý veri tabanlarýnda farklýlýk gösterebilir. Örneðin,
ORACLE veri tabanýnda (||); MS Access veri tabanýnda ise (&) iþleci ayný amaçla kullanýlýr.
Ö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;
Ayný amaca SELECT deyimini MS Access veri tabanýnda þu þekilde kullanarak ulaþabiliriz;
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.
Örnek
PERSONEL tablosunun BÖLÜM_NO sütunundaki verileri tekrarlatmadan listelemek istiyoruz. Bunun için aþaðýda belirtilen
yol izlenir;
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.
Ö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';
WHERE sözcüðü içinde tanýmlanan kýsýtlama ifadelerinde, yani koþul ifadelerinde çeþitli karþýlaþtýrma iþleçleri kullanýlýr.
Örnek
Ücreti 2500'den daha az ya da eþit olan PERSONELi seçerek listelemek istiyoruz. Amacýmýza uyan SELECT deyimi þu þekildedir;
SELECT ADI,GÖREVÝ,ÜCRET
FROM PERSONEL
WHERE ÜCRET<=2500;
Þ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.
Bu iþleç; iki deðer arasýnda kalan satýrlarý belirlemek ve bir alt deðer ile bir üst deðer arasýnda kalan deðerleri seçmek
için kullanýlabilir.
Örnek
Ücreti 3000 ile 5000 arasýnda olan personeli listelemek için SELECT deyimi þu þekilde kullanýlabilir;
SELECT ADI,ÜCRET
FROM PERSONEL
WHERE ÜCRET BETWEEN 3000 AND 5000;
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');
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;
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.
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.
AND iþleci; iki koþulun yandaki doðruluk deðeri tablosuna göre TRUE veya FALSE deðerinin döndürülmesini saðlar. Eðer, her
iki koþulun doðruluk deðeri TRUE ise istenen seçme iþlemi gerçekleþir.
Örnek
Ücreti 2000'e eþit veya daha büyük ve iþi MEMUR olan personeli listelemek istiyoruz. Amacýmýza uygun SELECT deyimi,
þu þekilde olabilir;
AND Ýþleci Doðruluk Tablosu
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.
6.6.3.2 OR Ýþleci
OR iþleci; iki koþulun yandaki doðruluk deðeri tablosuna göre TRUE veya FALSE deðerinin döndürülmesini saðlar. Eðer, her
iki koþulun doðruluk deðeri TRUE ise istenen seçme iþlemi gerçekleþir.
Örnek
Komisyon alan veya görevi MEMUR olan personeli listelemek istiyoruz. Amacýmýza uygun SELECT deyimi þu þekildedir;
NOT iþleci; bir koþulun doðruluk deðeri TRUE ise FALSE; FALSE ise TRUE deðerini döndürmesini saðlar. Bu iþleç IN,
LIKE, NULL ve BETWEEN iþleçleriyle birlikte kullanýlabilir.
Örnek
Mesleði MEMUR, ÞEF veya PAZARLAMACI olmayan personeli listelemek için aþaðýdaki SELECT deyimi kullanýlabilir;
WHERE sözcüðü içinde yer alan iþleçler, yanda gösterilen sýraya göre iþlem görürler. Bu iþleçlerin dýþýnda, parantezler
de kullanýlabilir. Parantezler tüm iþleçlere göre bir önceliðe sahiptir. Yani öncelikle parantez içindeki iþlemler yapýlýr, ardýndan
da yandaki tabloya göre iþlem sýrasý uygulanýr.
Örnek
Ýþ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;
! Karþýlaþtýrma Ýþleçleri ve anlamlarý 1) Görevi ÞEF olanlar ve ücreti 3000'den fazla olanlar
görmek için 'DEVAM' düðmesine 2) Görevi MEMUR olanlar
týklayýnýz.
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.
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;
Örnek
Personeli iþe giriþ tarihine göre sýralamak istiyoruz. Bunun için SELECT deyimi þu þekilde düzenlenebilir;
Ö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;
Bu bölümde, SQL yapýsal programlama dilinde standart olarak bulunan ve veri tabaný yönetiminde bizlere büyük
kolaylýkar saðlayan temel SQL fonksiyonlarýný ve bu fonksiyonlarýn nasýl kullanýlacaðýný öðreneceksiniz.
Bölüm Hedefi
Bu bölümde,
● Fonksiyon kavramýný,
● SQL'de fonksiyonlarýn yerini,
● Tek satýr fonksiyonlarýnýn kullanýmýný,
● Karakter fonksiyonlarýný,
● Sayýsal fonksiyonlarý,
● Tarih fonksiyonlarýný,
● Dönüþtürme fonksiyonlarýný,
● Diðer SQL fonksiyonlarýný,
● Ýç içe fonksiyon kullanýmýný,
öðreneceksiniz.
Fonksiyonlar veya bir baþka deyiþle iþlevler, SQL'e bazý güçlü özellikler katan olanaklar olarak deðerlendirilir.
SQL fonksiyonlarý, aynen programlama dillerinde olduðu gibi, kullanýcýya bazý özel iþlemleri ve hesaplamalarý otomatik
olarak saðlar. Bir fonksiyon; çeþitli argümanlarý girdi olarak alýp bir sonuç üreten hazýr bileþenlerdir. Kullanýcýnýn,
fonksiyonun adýný ve gerekli argümanlarý tanýmlamasý yeterlidir. Bu bilgilere dayalý olarak fonksiyon, bir sonuç
döndürür (üretir).
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.
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.
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;
fonksiyon Herhangi bir SQL fonksiyonunu simgeler. Örneðin LOWER bir fonksiyon ismidir.
Bu ismi deðiþtiremeyiz.
Karakter fonksiyonlarý; karakter verileri girdi olarak alan, karakter ya da sayýsal deðerler döndürebilen fonksiyonlardýr.
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.
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;
b. UPPER () Fonksiyonu
UPPER() fonksiyonu, bir karakter katarýndaki tüm harfleri büyük harflere çevirir.
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;
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.
Ýki sayýsal deðerin, m ve n 'nin birbirine bölümünden elde edilen kalaný döndürür.
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. 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;
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;
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:
Ý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;
Örnek
Personel ücretlerinin komisyonlarýna oranýný hesaplayan ve kalaný bulan SELECT deyimi aþaðýda belirtildiði biçimde olabilir;
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.
Ö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;
Ö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;
Ö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;
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
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.
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.
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.
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ý
Eleman Anlamý
HH
Günün saati
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ý
Ö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;
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;
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ý
Karakter dizisi olarak saklanan ifadeleri tarih bilgisine çevirmek söz konusu olduðunda TO_DATE() fonksiyonuna baþvurulur.
Bu fonksiyon þu þekilde tanýmlanýr;
Biçimlendirme ifadesi içinde, TO_CHAR() fonksiyonu için geçerli olan biçimlendirme ifadeleri kullanýlabilir.
Ö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;
Bu bölümde daha önce gördüðümüz fonksiyonlarýn dýþýnda SQL'in birçok fonksiyonu bulunmaktadýr. SQL
fonksiyonlarýnýn bir kýsmýný sonraki bölümde gruplama fonksiyonlarý olarak ele alarak inceleyeceðiz.
Ancak burada SQL'in önemli iki fonksiyonu üzerinde duracaðýz. Bu fonksiyonlar, NVL() ve DECODE()
fonksiyonlarýdýr.
Bir sütunun içeriði NULL ise, SELECT deyimi ile yapýlan sorgularda bu içerik boþ olarak görüntüleniyordu. Bunun yerine,
NULL deðer ile karþýlaþýldýðýnda, bir baþka ifadenin görüntülenmesi saðlanabilir. NVL() fonksiyonu, NULL deðerler yerine
bir baþka deðerin yer almasýný saðlar. NVL() fonksiyonu þu þekilde tanýmlanýr;
! NVL() fonksiyonunun EVET ve HAYIR durumlarýnda çalýþma þeklini görmek için; EVET ve HAYIR düðmelerine týklayýnýz.
Örnek 1
Yýllýk toplam ücretleri hesaplamak istiyoruz. Bunun için; aylýk ücret bilgisi, 12 ile çarpýlacak ve bulunan sonuca komisyon
miktarý eklenecektir. Ancak pek çok personelin komisyon bilgisi NULL deðerler içermektedir. NULL deðerler içeren
sütunlar üzerinde aritmetik iþlemler yapamayýz. NULL deðerler yerine 0 deðerini yerleþtirerek hesaplamalar yapýlabilir. O
halde, NVL() fonksiyonunu kullanmamýz söz konusudur. Amacýmýza uygun SELECT deyimi þu þekilde olmalýdýr;
SELECT ADI,ÜCRET,KOMÝSYON,ÜCRET*12+NVL(KOMÝSYON,0)
FROM PERSONEL;
Örnek 2
Ýþe giriþ tarihleri NULL olan personel için '01-01-2002' tarihini iþe baþladýðý tarih olarak görüntüleyen SELECT deyimi þu
þekilde olabilir;
SELECT ADI,GÝRÝÞ_TAR,NVL(GÝRÝÞ_TAR,'01-01-2002')
FROM PERSONEL;
Örnek 3
Görevi henüz belli olmayan personel için, görev olarak "GÖREVÝ BELÝRLENMEDÝ" mesajýný görüntüleyen SELECT deyimi
þu þekilde olabilir;
file:///D|/Belgeler/Universite/Donem_III/Dersler/TBIL_403/VT07095.htm (1 of 2) [24.11.2006 21:27:16]
file:///D|/Belgeler/Universite/Donem_III/Dersler/TBIL_403/VT07095.htm
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;
! DECODE() fonksiyonunun EVET ve HAYIR durumlarýnda çalýþma þeklini görmek için; EVET ve HAYIR düðmelerine týklayýnýz.
Ö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;
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.
Önceki bölümde SQL'in bize sunduðu hazýr fonksiyonlarýn tek satýrla ifade edilebilen tiplerini öðrendiniz. Bu bölümde ise, SQL
yapýsal sorgulama dilinde bulunan çok satýrlý fonksiyonlarý öðreneceksiniz.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
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
Örnek 1
týklayýnýz
Örnek 2
8.1.2 SUM()Fonksiyonu
Örnek
Tüm personel ücretlerinin toplamýný hesaplayan SELECT deyimi aþaðýda gösterildiði biçimde oluþturulabilir;
Standart sapma, sayýsal verilerin aritmetik ortalamalardan farklarýnýn kareli ortalamasý olarak bilinir. Standart sapma
þekil üzerinde görülen formül aracýlýðýyla hesaplanýr. Bu kavram istatistiksel veri analizlerinde sýkça kullanýlýr. Söz
konusu hesaplamayý yapan SQL fonksiyonu ise; STDDEV() 'dir. STDDEV() fonksiyonu MS Access'de; STDEV()
olarak kullanýlmaktadýr
Örnek
Personel ücretlerinin standart sapmasýný bulmak istiyoruz. Bunun için SELECT deyimi aþaðýda gösterildiði biçimde kullanýlýr;
Varyans, sayýsal deðerler arasýndaki deðiþkenliði ölçen bir kavramdýr. Ýstatistiksel veri analizlerinde yaygýn
biçimde kullanýlmaktadýr. Standart sapmanýn karesi olarak bilinmektedir. Soldaki animasyonda görüldüðü biçimde bir
formül yardýmýyla hesaplanýr. Bir dizi sayýsal deðerin varyansýný hesaplamak için VARIANCE() fonksiyonu kullanýlýr.
MS Access'de bu fonksiyon yerine; VARP() fonksiyonu kullanýlýr.
Örnek
Personel ücret bilgilerinin ne ölçüde deðiþken olduðunu belirlemek istiyoruz. Bunun için; VARIANCE() veya VARP()
fonksiyonu kullanýlabilir.
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.
Ö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;
Ö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;
SELECT MIN(ADI)
FROM PERSONEL;
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;
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.
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;
Ö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 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;
biçiminde bir taným yapýlamaz. Böyle bir amaca ancak aþaðýda gösterildiði biçimde varýlabilir;
Bu son sorgu; her bir bölüm numarasýný ve bu bölümlerdeki personel sayýsýný vermektedir.
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;
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;
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;
Ö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;
Ö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;
ÇOKLU TABLOLAR
Ýliþkisel veri tabaný yönetim sistemlerinde bazen iliþkili veriler birden fazla tablolara bölünebilir ve bu tablolarda bulunan verilere
ayný anda ihtiyacýmýz olabilir. Bu gibi durumlarda ilgili tablolarý birleþtirerek sorgulama yapmak zorunda kalabiriz. Bu bölümde
bu tip sorgulama yapmayý öðreneceksiniz.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
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.
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.
Birden fazla tablonun ele alýnarak, birleþtirilmesi ve tek bir sonucun üretilmesi söz konusu olabilir. Bu iþleme
"birleþtirme" (join) denir. Birleþtirme iþlemi, tablolarýn ayný deðerler içeren sütunlarý kullanýlmak suretiyle
yapýlýr. Birleþtirme iþlemi þu þekilde tanýmlanýr;
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.
Ý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.
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.
Tablolarý farklý þekillerde birleþtirme olanaðý bulunmaktadýr. Solda, tablolarý birleþtirme türleri verilmiþtir. Bu
birleþtirme türlerinin herbirini ayrýntýlý biçimde ele alarak inceleyeceðiz.
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.
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.
Birleþtirme iþleminde, SELECT listesindeki her bir sütunun, ilgili tablo ile gösterilebildiðini gördük. Bu, her iki tablodaki
alan isimlerinin ayný olmasý durumunda sorun yaratacaktýr. Örneðin; PERSONEL.BÖLÜM_NO ve BÖLÜM.BÖLÜM_NO
yerine sadece BÖLÜM_NO yazýlsaydý, SQL bunu yorumlayamayacaktý çünkü, bu sütunun hangi tablodan
alýnacaðý belirtilmemiþtir. Bu durumda SELECT deyimi hata mesajý verecektir.
Sadece bir tabloda yer alan sütun isimlerinin, yukarýda belirtildiði gibi, tablo isimleri ile birlikte belirtilmesi zorunluluðu yoktur.
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
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;
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';
Eþiti olan birleþtirmelerde, iki tablonun belirlenen iki sütununun içeriði karþýlaþtýrýlýyor ve her iki sütunda ayný
deðerle karþýlaþýnca ilgili bilgiler listeleniyordu. Eðer, birinci tablonun bir sütununa ikinci tabloda doðrudan uyan bir sütun
yoksa, eþiti olmayan birleþtirmelerden söz edilir.
Örnek
Yukarýdaki animasyonda bulunan PERSONEL ve ÜCRET_DÜZEY tablolarýný göz önüne alalým. PERSONEL tablosundaki her
bir personelin ücretlerinin hangi ücret grubuna girdiðini öðrenmek istiyoruz. Ücret gruplarý ÜCRET_DÜZEY tablosu
içinde tanýmlanmýþtýr.
Bu iki tabloyu, eþiti olan birleþtirme yoluyla birleþtirmek mümkün deðildir. Çünkü PERSONEL tablosu ile ÜCRET_DÜZEY
arasýnda bu tür bir iliþkiyi saðlayacak ortak bir sütun yoktur. Bu tür bir birleþtirmeyi saðlamak için WHERE sözcüðü içinde
(=) iþleci yerine BETWEEN…AND iþlecinden yararlanýlýr.
SELECT ADI,ÜCRET,DERECE
FROM PERSONEL,ÜCRET_DÜZEY
WHERE ÜCRET BETWEEN ENAZ AND ENÇOK;
Karþýlaþýlan problemin türüne göre BETWEEN iþleci yerine; "<=,>=" iþleçleri de kullanýlabilir.
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.
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.
Dýþ birleþtirmeler, eþleþmeyen kayýtlar hangi tabloda yer alýyorsa ona baðlý olarak iki farklý biçimde düzenlenebilir:
veya
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;
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.
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.
Ö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:
SQL deyimleri içinde küme iþlemlerini temel alarak, çeþitli sorgulamalar yapýlabilir. Bu tür sorgularda küme
iþleçlerinden yararlanýlýr. Küme iþleçleri sayesinde birden fazla tablo birleþtirilerek sonuçlar alýnabilir.
UNION iþleci; verilen koþul ifadesine uygun olarak çift kayýtlarý göz ardý eder ve her iki kümedeki tüm kayýtlarý seçer.
Buna karþýlýk, verilen koþul ifadesine uygun olarak çift kayýtlar da dahil olmak üzere, tüm kayýtlarýn seçilmesi söz konusu
ise; UNION ALL iþleci kullanýlýr.
Örnek
PERSONEL tablosunda, adý "A" ile baþlayanlarý veya görevi "M" ile baþlayanlarý topluca listelemek istiyoruz.
Burada iki ayrý koþuldan söz edilebilir. Bunlardan birincisi, adýnýn ilk harfi "A" ile baþlayan personelin oluþturduðu
kümedir. Ýkincisi ise; görevi "M" harfi ile baþlayanlarýn oluþturduðu kümedir.
Bu durumda sorgu içinde; UNION iþlecinin kullanýlmasý gerektiði anlaþýlmaktadýr. SELECT deyimi þu þekilde düzenlenir:
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.
Her iki koþula da uygun kayýtlarý elde etmek için; INTERSECT iþleci kullanýlýr. Bu iþleç, iki kümenin ara kesiti olarak
düþünülür ve iki bölgedeki kayýtlarýn seçilmesini saðlar.
Örnek
PERSONEL tablosunda, adý "A" ile baþlayanlarý ve görevi "M" ile baþlayan kayýtlarý bulacaðýz. Amacýmýza uygun
SELECT deyimi þu þekilde olabilir:
Birinci kümede olan, ikinci kümede olmayan kayýtlarý seçmek amacýyla; MINUS iþlecinden yararlanýlabilir.
Örnek
Adý "A" ile baþlayan ancak iþi, "M" ile baþlamayan kayýtlarý listelemek gerektiðinde; MINUS iþlecine baþvurulur. Bunun
anlamý, birinci sorguda ismi "A" ile baþlayanlar; ikinci sorguda da iþi, "M" ile baþlayanlar aranýlacaktýr. MINUS iþleci, bu
iki küme arasýndaki farký ortaya çýkaracaktýr.
KARMAÞIK SORGULAR
Veri Tabaný Yönetim Sistemleri, verilerin düzenli bir þekilde depolanýp gerektiði þekilde iþlenmelerini saðlar. Veri iþlemek
için sorgulama yapmak esastýr. Bazen istediðimiz sonuçlarý veri tabanýmýzdan almak için karmaþýk sorgular yazmak
zorunda kalabiliriz. Karmaþýk sorgularý yazarken, belirli kurallara göre ve dikkatli hareket etmemiz gerekir.
Bu bölümde incelediðimiz ve vurguladýðýmýz kurallara uymak; karmaþýk sorgularýmýzýn bize doðru çýktýlar
vermesini saðlayacaktýr.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
Þ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:
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.
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
● 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 );
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.
Sadece bir deðer döndüren alt sorgulardýr. Ýç taraftaki SELECT deyiminden sadece tek bir deðer elde edilir. Bu sorgularda
soldaki animasyonda yer alan iþleçler kullanýlýr.
Örnek
Personel numarasý "140" olan personelle ayný göreve sahip olan personelin isimlerini listelemek istiyoruz. Amacýmýza
aþaðýdaki sorgu yardýmýyla ulaþabiliriz:
SELECT ADI,GÖREVÝ
FROM PERSONEL
WHERE GÖREVÝ =
(SELECT GÖREVÝ
FROM PERSONEL
WHERE PERSONEL_NO=140);
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.
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);
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);
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);
Ö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: :
FROM PERSONEL
WHERE BÖLÜM_NO=20);
Tek satýr alt sorgularýnýn yapýsýný ve özelliklerini biliyoruz. Bu tür alt fonksiyonlar, sadece bir deðer üreterek, onu ana
sorguya aktarýr. Eðer alt sorgu tek satýrlý alt sorgu olarak düþünülüyorsa, bunu bozabilecek tanýmlardan kaçýnmak
gerekiyor. Aksi takdirde söz konusu sorgu çalýþmaz. Eðer alt sorgunun birden fazla deðer üretmesi söz konusu ise, çoklu satýr
alt sorgularýný tanýmlamak gerekiyor.
Örnek
SELECT PERSONEL_NO,ADI
FROM PERSONEL
WHERE ÜCRET >
(SELECT MIN(ÜCRET)
FROM PERSONEL
GROUP BY BÖLÜM_NO);
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);
Alt sorgudan bir satýr yerine, daha fazla sayýda satýr elde ediliyorsa, bu kez sorgu bir çoklu satýr alt sorgularý
olarak deðerlendirilir. Ancak bu tür sorgular farklý iþleçler yardýmýyla gerçekleþtirilir. Aþaðýdaki animasyonda çoklu
satýr iþleçlerine yer veriyoruz.
10.3.1. IN Ýþleci
Bir liste içindeki deðerlerden birini seçmek için IN iþlecini kullanýyorduk. Örneðin,
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.
Örnek
Bir liste içindeki deðerlerden birini seçmek için IN iþlecini kullanýyorduk. Örneðin,
SELECT ADI,ÜCRET,GÖREVÝ
FROM PERSONEL
WHERE ÜCRET IN(
SELECT MIN(ÜCRET)
FROM PERSONEL
GROUP BY BÖLÜM_NO);
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.
Alt sorgu tarafýndan üretilen herbir deðeri ana sorgu içinde belirlenen bir deðerle karþýlaþtýrmak söz konusu ise ANY
iþleci kullanýlýr. Bu iþleç "=,<,>" iþleçlerinden biri ile birlikte kullanýlýr. "=ANY" biçimindeki bir taným IN tanýmý ile
eþdeðerdir. "<ANY" ifadesi "en çoktan daha az"; ">ANY" ise "en azdan daha büyük" anlamýnda deðerlendirilir.
Örnek
En fazla kazanan MEMUR dan daha az maaþý olan personeli listelemek istiyoruz. Amacýmýza uygun sorgu þu þekilde olabilir.
SELECT ADI,ÜCRET,GÖREVÝ
FROM PERSONEL
WHERE ÜCRET <ANY(
SELECT ÜCRET
FROM PERSONEL
WHERE GÖREVÝ='MEMUR');
Ö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');
Alt sorgu tarafýndan üretilen tüm deðerlerin, ana sorgu için bir girdi olarak kullanýlmasý söz konusu ise ALL iþleci
kullanýlabilir. ">ALL" ifadesi "en büyükten daha büyük"; "<ALL" ise "en küçükten daha küçük" olanlarý ifade eder.
Örnek
Ücreti tüm bölümlerin ortalama ücretinden daha büyük olan personellerii listelemek istiyoruz. Amacýmýza uygun sorgu þu
þekilde olabilir:
SELECT ADI,ÜCRET
FROM PERSONEL
WHERE ÜCRET >ALL(
SELECT AVG(ÜCRET)
FROM PERSONEL
GROUP BY BÖLÜM_NO);
Önceki bölümde, alt sorgunun ürettiði bir sütun, ana sorgu için bir girdi olarak kullanýlýyordu. Bazý uygulamalarda alt
sorgunun birden fazla sütun üretmesi ve koþul içinde bu deðerlerin kulanýlmasý söz konusu olabilir. Böyle durumlarda
aþaðýda belirtildiði biçimde sorgu tanýmlanýr. Bu tür bir taným MS Access'de, yani MS Jet SQL'de geçerli deðildir.
SELECT liste
FROM tablo
WHERE sütun1, sütun2,... IN
( SELECT sütun1, sütun2,...
FROM tablo
WHERE koþul );
Örnek
"SEZÝN" isimli personelin görevi ve ücretiyle ayný olan personeli listelemek istiyoruz. Sorgu þu þekilde düzenlenebilir:
Ancak bu sorguya "SEZÝN" in kendi bilgileri de dahil edilmiþtir. Dahil edilmesi istenmiyorsa þu þekilde bir taným yapýlýr:
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.
Ö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:
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.
Veri Tabaný Yönetim Sistemlerinin tablolarýnda yer alan kayýtlarý; deðiþtirmek, silmek ve yeni kayýtlar eklemek için SQL
dilinin bir alt dili olan DML'i kullanabiliriz.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
SQL'de SELECT deyimi ile sorgulama iþlemleri yapýlýyordu. Bunlarý önceki bölümlerde ayrýntýlý biçimde ele alarak inceledik.
Bu tür iþlemler, sadece sorgulama yapar. Tablolar üzerinde herhangi bir deðiþikliðe yol açmaz.
Eðer bir tabloya yeni kayýt ilave edilmesi, var olan bir satýr üzerinde deðiþiklikler yapýlmasý veya bir satýrýn yok edilmesi
söz konusu ise, sorgulama deyimleri bir iþe yaramaz. Onun yerine baþka yöntemlere baþvurmak gerekir.
DML-(Data Manipulation Lanquage) adý verilen dil yardýmýyla; veri tabaný tablolarý üzerinde kayýt ekleme, veri
deðiþtirme ve kayýt silme gibi iþlemler yapýlabilir. Bu bölümde söz konusu dilin temel özelliklerini inceleyeceðiz.
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:
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.
Ö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
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.
Tablonun bir sütununa NULL deðerin girilmesi gerekebilir. Bu gibi durumlarda, iki yöntemden biri
kullanýlabilir. Birinci yöntemde, INSERT INTO deyimi içinde NULL deðeri girilecek sütun adý
belirtilmez. Ýkinci yöntemde ise, söz konusu sütuna doðrudan NULL deðeri atanýr.
Ö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.
INSERT INTO deyimi içinde bazý özel deðerlerin girilmesi söz konusu ise, SQL fonksiyonlarý kullanýlabilir.
Örnek
PERSONEL tablosuna yeni bir kayýt ekleme esnasýnda, GÝRÝÞ_TAR isimli alana o günün tarih ve zaman bilgisini kaydetmek
için þöyle bir yol izlenebilir:
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:
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.
Ö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:
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];
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;
Güncelleme iþlemi, bir tablodan okunan deðerlere baðlý olarak da yapýlabilir. Bunun için ikinci tablodan kayýt okuma
iþlemi SELECT deyimi ile gerçekleþtirilir.
Ö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);
Bir tablo üzerinde bütünlük sýnýrlamalarý yapýlmýþ olabilir. Bu gibi durumlarda güncelleþtirme iþlemlerinde
sorunlarla karþýlaþýlabilir. Sýnýrlama iþlemleri ile ilgili daha ayrýntýlý bilgiyi daha sonraki derslerde vereceðiz.
Örnek
"10" numaralý bölüme sahip tüm bölüm numaralarýný "55" olarak deðiþtirmek istiyoruz.
UPDATE PERSONEL
SET PERSONEL_NO=55
WHERE BÖLÜM_NO=10;
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.
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:
Örnek 1
BÖLÜM isimli tablonun tüm kayýtlarýný silmek için þöyle bir yol izlenebilir:
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:
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.
Bir tablodan doðrudan doðruya belirlenen satýrlarý silebileceðimiz gibi, bir baþka tablodan okunan verilere baðlý olarak da
ilgili satýrlar silinebilir.
Örnek
PERSONEL tablosundan "SATIÞ" bölümüne iliþkin tüm satýrlarý silmek istiyoruz. Bu amaçla aþaðýda belirtildiði biçimde bir
iþlem yapýlabilir:
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.
Veri tabaný hareketlerinin baþlamasý için INSERT,UPDATE veya DELETE deyimlerinden birinin çalýþtýrýlmasý yeterlidir.
Ancak bir kullanýcýnýn bu þekilde yaptýðý bir iþlemin sonucu diðer kullanýcýyý etkilemez. Bu þekilde baþlayan bir iþlemi
sona erdirmek için COMMIT kullanýlýr.
Örnek
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.
Veri tabaný üzerinde bir kullanýcý tarafýndan gerçekleþtirilen deðiþikliðin kalýcý hale gelmesi için COMMIT
deyiminden yararlanýyoruz. Bu deyim çalýþtýrýlmadýðý sürece, tüm DML deyimlerinin etkileri geri alýnabilir. Yani deðiþiklikler
iptal edilebilir. Böyle bir amaca ulaþmak için,
ROLLBACK;
deyimi kullanýlýr.
Örnek
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;
Bir veri tabaný için en önemli nesne; tablodur. Görünümler ve indeksler ise, veri tabanlarý için diðer önemli nesneler
olarak söylenebilir.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
Bir veri tabaný farklý yapýlara sahip birçok nesneden oluþmaktadýr. Tüm veri tabaný iþlemleri ve verinin yönetilmesi, bu
nesneler yardýmýyla olmaktadýr. Veri tabanlarý çeþitli amaçlara yönelik farklý birçok nesne içerebilir. Bu nesnelerin en
önemlilerini aþaðýda görebilirsiniz;
● Tablolar
● Görünümler
● Ýndeksler
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.
Bu tablolar herhangi bir veri tabaný kullanýcýsý tarafýndan yaratýlan tablolardýr. Söz konusu tablolarýn
Kullanýcý tablolarý
isimleri ve sütunlarý doðal olarak kullanýcý tarafýndan belirlenmiþtir.
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ü
Veri sözlüðü
(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.
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:
Ayný sütunlar birden fazla tablo içinde yer alýyorsa, ayný isimleri vermek yararlý olacaktýr. Örneðin PERSONEL ve
b) BÖLÜM tablosu içindeki bölüm numarasýný içeren sütunlar BÖLÜM_NO biçiminde belirlenmiþtir.
Tablolar yaratýlýrken, her bir sütunun veri türü mutlaka belirlenmelidir Çeþitli amaçlara uygun veri türleri bulunmaktadýr.
ORACLE sunucuda geçerli olan bu veri türlerinin temel olanlarýný soldaki ; tamamýný ise aþaðýdaki canlandýrmada görebilirsiniz:
Tablolarýn yaratýlabilmesi için CREATE TABLE deyimi kullanýlýr. Bu deyim þu þekilde tanýmlaný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üðü,
Örnek
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 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.
Ö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.
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:
Ö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:
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:
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:
Bir tablo veya diðer veri tabaný nesnelerinin adýný deðiþtirmek gerekebilir. Bu amaçla RENAME deyimi kullanýlýr. Bu deyim
þu þekilde tanýmlanýyor:
Örnek
Veri tabanýndaki BÖLÜM isimli tablounun adýný YENÝ_BÖLÜM olarak deðiþtirmek için þöyle bir yol izlenebilir:
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:
Bu deyim tehlikeli sonuçlara neden olabilecek bir deyimdir. O halde kullanýrken bazý noktalara dikkat etmek gerekiyor:
Örnek
PER20 isimli tabloyu yok etmek için aþaðýda belirtilen yol izlenir:
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:
DELETE ve TRUNCATE deyimleri tablonun tüm satýrlarýnýn yok edilmesi 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:
Veri tabaný tablolarýna geçersiz veri giriþlerinin önüne geçmek ve bazý denetimleri gerçekleþtirmek ve bütünlüðü saðlamak
üzere sýnýrlamalar (constraints) tanýmlanýr. Bu sýnýrlamalar tablo seviyesinde denetimleri saðlar. Sýnýrlamalar,
çoðunlukla aþaðýda sýralanan amaçlara uymak amacýyla kullanýlýr.
● Bir tablodan kayýt silme, tabloya satýr ekleme veya güncelleþtirme iþlemlerine sýnýrlamalar
getirmek,
● Bir tablo bir baþka tabloyla iliþkili ise, kayýt ilavelerinde ve kayýt silme iþlemlerindeki
tutarsýzlýklarý önlemek.
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.
Tablolara konulacak sýnýrlamalar, aþaðýda görüldüðü biçimde daha tablo yaratýlýrken belirlenebilir:
Bu tanýma göre, iki tür sýnýrlama olabilmektedir. Bunlardan birincisi, sütun düzeyinde; diðeri ise tablo düzeyindedir.
Sütun düzeyindeki sýnýrlamalar NOT NULL, UNIQUE olup, doðrudan ilgili sütunun karþýsýnda tanýmlanýrlar. Diðerleri
ise CONSTRAINT sözcüðü yardýmýyla tablo düzeyinde tanýmlanýr.
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.
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 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:
Ö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:
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.
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.
Ö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:
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:
Ý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.
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.
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.
Ö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:
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:
Ö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:
Tablolara konulacak sýnýrlamalar, aþaðýda görüldüðü biçimde daha tablo yaratýlýrken belirlenebilir:
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:
Bir tabloya sýnýrlama konulduktan sonra, gerektiðinde bu sýnýrlama kaldýrýlabilir. Bunun için ALTER ve DROP
sözcüklerinden yararlanýlýr. Sýnýrlamalarýn kaldýrýlmasý aþaðýda belirtildiði biçimde yapýlýr:
Örnek 1
BÖLÜM tablosu üzerindeki PRIMARY KEY sýnýrlamasýný kaldýrmak için þöyle bir yol izlenebilir:
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:
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:
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.
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:
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.
Var olan bir görünümü yok etmek amacýyla DROP VIEW deyimi kullanýlýr.
Ö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.
Ö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.
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.
Ö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.
Var olan herhangi bir görünümün güncelleþtirilmesi amacýyla, yani yeni bir görünümün ayný isimli bir baþka görünümün
yerini almasý için, CREATE OR REPLACE WITH deyimi kullanýlýr. Bu deyim þu þekilde tanýmlanýr:
Örnek
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.
Herhangi bir tablonun bir alanýna baðlý olarak indeks yaratýlabilir. Bunun için aþaðýdaki deyim kullanýlabilir:
Örnek
PERSONEL tablosunun BÖLÜM_NO alanýna baðlý bir indeks oluþturacaðýz. Indeksin adý PERBÖL olacaktý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,
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,
Bir tablo DROP TABLE deyimiyle yok edildiðinde bu tabloya baðlý indeksler de otomatik olarak silinir. Bir tablonun herhangi
bir indeksini yok etmek için DROP INDEX deyimi kullanýlmaktadýr. Bu deyim þu þekilde tanýmlanýyor.
Örnek
Daha önceki örnekte yarattýðýmýz PERBÖL indeksini yok etmek istiyoruz. Amacýmýza uygun deyim þu þekilde düzenlenebilir:
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.
Bölüm Hedefi
Bu bölümde,
öðreneceksiniz.
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.
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:
Ö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.
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.
Ö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:
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:
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:
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:
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 :
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:
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:
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:
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:
Ö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;
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
TO kullanýcýlar [roller] [PUBLIC] ;
Ö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
TO BURAK;
DERS SONU
Sınavlarınızda başarılar...