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