SQL Tanım,Giriş,Temel Bilgiler,Uygulamalar,Kodlama Dili

Sponsorlu Bağlantılar

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Revengeful

Revengeful

Emekli Yönetici
    Konu Sahibi
SQL Tanım,Giriş,Temel Bilgiler,Uygulamalar,Kodlama Dili
Veritabanı Tasarımı​


İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır.İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır. Ancak 5N, tasarım aşamasında size yol göstermek yerine hangi şartlara uygun tasarım yapmanız gerektiğini anlatır.
Bazen, bu kurallardan vazgeçmek durumunda kalabilirsiniz ancak, veritabanında saklanacak verilerin hacmi arttıkça bu kuralların daha sıkı sağlanmasında fayda vardır.


1.Nesneleri Tanımlayın:​

Herhangi bir proje önünüzde konduğunda öncelikle nesneleri tanımlayın. Nesne, çeşitli özellikleri bulunan bir varlıktır. Başlangıçta özellikleri ile ilgilenmeyeceğiz.



Örnek:​

Birkaç örnek proje için nesneleri verecek olursak,
Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri
E-ticaret sistemi: Ürünler, müşteriler, siparişler,teslimat, fatura bilgileri,üreticiler,tedarikçiler,dağıtıcılar...
Futbol Ligi: Takımlar, sahalar, oyuncular, fikstür, hakemler, antrenörler
Okul Sistemi: Öğrenciler, öğretmenler, dersler, derslikler
Sözlük: kelimeler, anlamlar,diller



2.Her nesne için bir tablo oluşturun:​

Her bir nesne için bir tablo oluşturun ve her bir tabloya içereceği veriyi en iyi anlatan bir isim verin. Tablo oluşturma işini, bir kağıt üstünde sembolik olarak gösterebilirsiniz veya doğrudan MS Access, SQL Server, MySQL,Oracle ...gibi kullanmakta olduğunuz VTYS üstünden de oluşturabilirsiniz. Ama tüm proje bitinceye kadar bu tablolar üstünde muhtemel değişiklikler olacaktır.


İPUCU:​

Tablolar isim verirken mümkünse tekil isimler kullanın. Böyle yaparsanız hem daha anlaşılır bir tasarım yapmış olursunuz hem de daha sonra kodlama aşamasında karışıklığın önüne geçmiş olursunuz.

Örneğin içinde Kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça mantıklıdır.


3.Her bir tablo için bir anahtar alan seçin:​

Veritabanındaki herhangi bir veriye erişmeden önce tabloya erişilir.Bir veritabanında en çok muhatap olunan nesne grubu genellikle tabloalrdır. Buraya kadar hangi tabloları oluşturacağımıza karar verdik. Her bir tablonun içinde hangi bilgileri saklayacağımızı kabaca biliyoruz. Bu aşamada, tabloda yer alacak her bir kaydı bir diğerinden ayırabilecek bir sütuna ihtiyaç duyarız. Örneğin bir kitabı seçmek istediğimizde, bu kitabın hangi kitap olacağını öyle bir anlatabilmeliyiz ki, başka hiçbir kitap ile karışmamalı. Bunu yapmanın tek yolu, bir alanı birincil anahtar alan olarak belirlemektir.

Anahtar alan seçerken, sizi kısıtlamadığı sürece, doğal alanlar seçmeye dikkat etmenizde fayda vardır. Örneğin araçlar ile ilgili bir tablo yaparken, plakalarını anahtar alan olarak belirleyebilirsiniz. Çünkü her bir plakadan bir tek araç trafiğe çıkabilir. Bu bizi kısıtlamaz. Öğrenci tablosu için, öğrenci numarası doğal bir anahtar alandır çünkü aynı okulda, aynı numaradan bir öğrencinin daha bulunması söz konusu değildir.

Kitap tablosu için ISBN numarasını anahtar alan olarak tanımlayabilirsiniz ama, elinizde aynı kitaptan iki adet olduğunda, ISBN numarası sizi kısıtlayacaktır. elinizde iki adet ‘Önümüzdeki Yol’ kitabı varsa, her iki kitabın da ISBN numarası aynıdır.Kitapdan biri eski biri yeni olabilir.Bu bir kargaşaya neden olabilir. Çünkü eski kitabı kime yeni kitabı kime verdiğinizin takibini ISBN numarası ile mümkün değildir. Ancak bir E-Ticaret sitesi tasarlarken, stoktaki tüm Kitap birbiri ile eşdeğer olacağından ya da öyle olduğu varsayıldığından ISBN numarası birincil anahtar alan olabilir. Bu durumda, adet diye bir niteliğin aynı tabloda yer alması gerekecektir.



4.Nesnelerin gerekli her bir özelliği için tabloya bir sütun ekleyin​

Tablo adlarını tamamladıktan ve anahtar adlarını belirledikten sonra, tablolarınıza sıradan adını veren nesnenin her bir özelliği için bir alan(sütun) ekleyin.


İPUCU:​

1.En başa birincil anahtar olarak belirlediğiniz alanı eklemek bir kural değildir ancak tablonuzun anlaşılırlığı ve göze hoş görünmesi açısından tercih etmenizin yararınıza olacak bir tekniktir.
2. Genellikle,yapay birincil anahtar alanlar tablo adı ile başlar ve sonunda ID vardır. ogenci tablosu için ogrenciID gibi.

Örneğin, kitap için:
Kitap no, ISBN no, kitap Adı, Yazarı, türü,Sayfa Sayısı, Özeti, fiyatı, baskı yılı...
Üye için: UyeNo, Adı, soyadı, e-mail adresi, ev telefonu, cep telefonu, iş telefonu....

Bu noktada, sizden istenen proje ile ilgili basılı formlar vs. varsa, bir göz atmanız hangi özelliklerin yer alması gerektiği konusunda karar vermenize yardımcı olacaktır.

5.Tekrarlayan nesne özellikleri için ek tablolar oluşturun​

Aklınızda hep şu olmalı: veri tekrarı olacak mı? Veri tekrarı olacaksa bir yerlerde hata yapıyorsunuzdur. Elinizdeki tablonun en az bir tabloya daha ayrılması gerekiyor demektir.
Şunu da unutmayın, her projeye uyacak evrensel bir veritabanı tasarım tekniği yoktur. Yani her şey sizin belli kurallar etrafında ne kadar teferruatlı düşünebildiğinize bağlıdır.

Örneğimizde, her bir kitap için tür belirledik ama, bir kitap hem kişisel gelişim kategorisine hem de hikaye kategorisine girebilir. Ya da e-ticaret sisteminde bir ürünün birden fazla reyonda yer alması gerekli olabilir. Veya bir kitap birden fazla kişi tarafından yazılmış olabilir..

Bir kitap için birden fazla türü kaydedebilmeyi ele alalım:

Bu türden bir sorunu çözmek için ilk akla gelen şey, Kitap için, 2.Tür,3.Tür diye iki alan daha eklemek. Ama çoğu Kitap bir tek türdendir ve bu Kitap için 2 alan hep boş kalacaktır. Öte yandan, 4 türe birden giren bir kitap olduğunda 4.tür bilgisini nereye yazacağız? Aynı alana mı? Ya da dört adet bölüm mü açacağız? Bunlar, veritabanı tasarımının doğasına terstir.

2.Çözüm yolu ise, bir kitabı iki kere kaydedip, birincisini, ‘Kişisel Gelişim’ türü olarak; ikincisini de ‘Hikaye’ olarak girmek.. Ancak bu durumda da diğer bilgiler tekrar edecektir. Ya da bir süre sonra, kitap hakkında girilen bilgilerin yanlış olduğunu fark ettiniz.Hangi kaydı güncelleyeceksiniz? Ya birini düzeltip birini unutursanız... Sonuçta veri tekrarı ve veri bütünlüğünün bozulması söz konusudur. Bu da yine ilişkisel veritabanı tasarımının doğasına terstir.

Bu durumda, türler diye bir yeni tablo oluşturup, bir de kitap_turler diye 2. tablo yu oluşturduktan sonra bu türden bilgileri burada tutmak gerekecektir. Böylelikle, hiçbir türde yer almayan Kitapdan 10 ayrı türde yer alan Kitapa kadar bütün olasılıklar için bir çözüm geliştirmiş oluruz.



6.Anahtar Alana Bağlı Olmayan Alanları Belirleyin​

İlişkisel veritabanında, tablodan herhangi bir tek kayda erişmek için mutlaka bir farklı özellik sağlanmalıdır ve bu özellik de anahtar alan tarafından sağlanır. Ancak bazen, anahtar alan ile aynı satırda yer aldığı halde, anahtar alan ile birebir ilişkisi olmayan bir alan yer alabilir. Bu türden alanları elimine edip ayrı tablolara ayırmak gerekir.
Örneğin, ödünç tablosunu ele alacak olursak, ödünç verdiğimiz her kitabı ödünç alanın adresini de bilmek istediğimizde, bunu ödünç tablosuna yazamayız. Çünkü ödünç tablosunun birincil anahtar alanı oduncNo’dur ve bu alan, ödünç verme işlemi ile ilgilidir. Oysa ödünç alanın adresi, ödünç alan kişinin kendisine bağlı bir özelliktir. Bu kişinin her aldığı kitap için adresini tekrar yamaya gerek yoktur. Aynı şekilde otomasyon içerisinde başka yerlerde de bu kişinin adres bilgilerine muhtemelen ihtiyaç duyulabilir çünkü adres, üyenin bir özelliğidir.

Ödünç verilen kitabın adresini bilmek istediğimizde, üyeler adında bir tablo daha açıp, burada herkesin adresini tutmak durumundayız demektir. Ödünç tablosunun ise, oduncAlan bilgisi olarak, Üyeler tablosunun birincil anahtar alanına bir bağlantı(yabancı anahtar) içermesi daha doğru olur.



7.Tablolar arasındaki ilişkileri tanımlayın.​

Her biri bir nesneye dair özellikleri barındıran tabloların tümünü göz önüne alın ve birbirleri ile olan ilişkilerini tanımlamaya çalışın. Örneğin Kitapı ödünç veririz. Bu durumda, ödünç tablosu ile Kitap tablosu ilişkili olacaktır. Kitap üyelere ödünç verilir. Bu durumda, ödünç ile üyeler arasında da bir ilişki vardır. Türler ile Kitap arasında bir ilişki vardır, bir kitabın en az bir türe dahil olması gerekir.


Örnek:​


Bizim projemizdeki nesneler(tablolar) arasında aşağıdaki ilişkiler yer almaktadır:
Kitap.kitapNo (1)---(N) odunc.kitapNo
Uyeler.uyeNo(1)---(N)odunc.uyeNo
Tur.turNo(1)---(N)Kitap_tur.turNo
Kitap.kitapNo(1)---(N)Kitap_tur.kitapNo
Yazar.yazarNo(1)---(N)kitap_yazar.yazarNo

İki tablo arasında ilişkiyi sağlayan alanların aynı adda olması zorunluluk değildir. Teorik olarak tabloları istediğiniz herhangi iki alanları üstünden birleştirebilirsiniz. Ancak, türler tablosundaki türNo ile üyeler tablosundaki uyeNo alanını birleştirdiğinizde hiçbir işinize yaramayacak anlamsız bir ilişki ortaya koymuş olursunuz.

Bu ilişkileri analiz ederken, her bir alanın hangi tablo için birincil anahtar alan, hangi tablo için yabancı anahtar olduğunu not etmeniz, daha sonra fiziksel olarak veritabanını tasarlarken işinizi kolaylaştıracaktır. Hatta bu bilgileri bir şema üstünde de gösterebilirsiniz. İşte bir çok VTYS tarafından sağlanan örnek bir şema: diyagram_1: Bu kısımda anlatılanlar doğrultusunda örnek projemizin SQL Server 2000 üstünde görünen diyagramı. İlişkili her iki tablo bir birincil alan ve bir yabancı anahtar alan üstünden birbirine bağlanır. Aynı diyagramın bir benzerini MS Access ile degerçekleştirebiliriz.

İPUCU:
Farklı tablolardaki iki alan aynı veriyi tutuyorsa, iki alana da aynı adı vermek, karışıklığa yol açabilir gibi görünse de aslında daha düzgün bir yapı ortaya çıkar. KitapNo alanı, Kitap tablosunda da ödünç tablosunda da kitap numarası tutmaktadır. Bu alanlardan birine kitapNo diğerine oduncGidenKitapNo demek, kafa karışıklığına neden olabilir. En Mantıklısı her ikisine de kitapNo demektir.


Veritabanı Yönetim Sistemleri​

Veritabanı Yönetim Sistemleri, kullanıcılar adına düşük seviye veri işlemlerini yerine getirip, kullanıcıya standart bir komut arayüzü veya grafik arayüzü ile veri yönetimi fonksiyonları sağlayan uygulamalarıdır.Veri tabanı yönetim sistemi(VTYS), yeni bir veritabanı oluşturmak, veri tabanını düzenlemek, geliştirmek ve bakımını yapmak gibi çeşitli karmaşık işlemlerin gerçekleştirildiği birden fazla programdan oluşmuş bir yazılım sistemidir. Veri tabanı yönetim sistemi, kullanıcı ile veri tabanı arasında bir arabirim oluşturmaktadır ve veri tabanına her türlü erişimi sağlar.

Veri tabanı yönetim sistemi, veri tabanını tanımlama, veri tabanını oluşturma ve üzerinde işlem yapma yeteneği olan bir yazılım sistemidir. Veri tabanının tanımlanması: veri tabanını oluşturan verilerin tip ve uzunluklarının belirlenmesidir. Veri tabanını oluşturulması ise veri için yer belirlemesi ve saklama ortamına verilerin yüklenmesini ifade eder. Veri tabanı üzerinde işlem yapmak; belirli bir veri üzerinde sorgulama yapmak, meydana gelen değişiklikleri yansıtmak için veri tabanın güncellenmesi ve rapor üretilmedi gibi işleri temsil eder. Ayrıca veri tabanı yönetim sistemi, verinin geri çağrılmasını sağlar. Veri tabanına yeni kayıt eklemek, eskileri çağırmak ve gerekli düzeltmeleri yapmak yoluyla, verinin bakımını ve sürekliliğini gerçekleştirir, kayıtlara yeni veri eklemek ve yeni kayıtlar oluşturmakla, veri tabanını genişletir.


Bir veri tabanı yönetim sistemi yazılım, karışık ve kapsamlı bir yazılımdır. Kısaca şu işleri gerçekleştirir:


  1. Veri tabanını oluşturmak ve yönetmek
  2. Veri tabanına erişim yetkisi olan kullanıcılara erişim izni vermek
  3. Kullanıcı isteklerine uygun olarak veriye erişimi sağlamak
  4. Veri tabanında güncellemeler yapmak.

Veri tabanı yönetim sistemi bu işlerini bazı özel alt diller (Structured Query Language,SQL v.b) kullanarak gerçekleştirir. Veri tabanı yönetim sistemi SQL komutunu ve diğer işlevlerini, aşağıdaki adımları sırayla gerçekleştirerek yapar:

  1. Kullanıcı, veri tabanına erişimi olan bir yazılım içinde bu SQL komutunu yazar.
  2. Veri tabanı yönetim sistemi bu isteği alarak der ve analiz eder.
  3. Görünüm seviyeden kavramsal ve fiziksel seviyelere doğru denetleme yapar.
  4. Gerekli kayıtlan içeren disk dosyalarının yerini öğrenir.
  5. Gerekli olan kayıtları okumak için kontrolü işletim sistemine bırakır.
  6. İşletim sistemi gerekli veriyi disk dosyalarından okuyup veri tabanı yönetim sisteminin bufferlarına aktarır, kontrolü geri verir.
  7. Veritabanı yönetim sistemi bufferlarından verileri alarak oradan istenilen terminale gönderir.

Veri Tabanı Sistemi Kullanımının Avantajları
Veri tabanına duyulan ihtiyacın asıl nedeni merkezi kontroldür. Veri tabanı, veri tabanı yöneticisi tarafindan yönetilir ve sistem merkezi olarak veriler güncellenir. Veri tabanlarının avantajlarını kısaca şöyle sıralayabiliriz:


  1. Verilerin tekrarı azalır. Böylece verilerde meydana gelen karışıklıklar önlenmiş olup bellekten tasarruf edilir
  2. Yanlışlıkların giderilmesi. Tutarsız (hatalı) bilgilerin girişi engellenir. Dosya sisteminde bir değişildik olduğu zaman diğer bilgilerinde değiştirilmesi gerekiyordu
  3. Verinin paylaşımı sağlanır. Aynı veri tüm kolaylığıyla diğer kullanıcılar tarafindan da kullanılır
  4. Bilgilerin standartlaşması sağlanır. Belli standartlar varsa bu standartlara uyulması gerekir, ayrıca yeni standartlaşmalara doğru adımların atılması

Veri Tabanı Sistemlerinin Dezavantajları
Dosya sisteminden veritabanı sistemine geçmenin bir çok yararı olmakla beraber bazı dezavantajlarda beraber gelmektedir


  1. Veri tabanı sistemi iyi tasarlanmadığı taktirde, bazı bileşenler iyi bir şekilde oluşturulmamışsa sistem dosya sistemine göre çok daha kötü çalışabilir.
  2. Veri tabanı sisteminin kurulumu ve bakımı klasik dosya sistemine göre pahalı olabilir.

Verilerin tekrarı azalır. Böylece verilerde meydana gelen karışıklıklar önlenmiş olup bellekten tasarruf edilir,

Veri modeline göre veritabam yönetim sistemleri

Yapısal olarak bütün veri tabanları bir değildir. Veri tabanları verileri saklama ve onlara erişme bakımından farklı tiplere ayrılır.

Hiyerarşik Veri Tabanları

Bu veritabanı tipi, ana bilgisayar ortamlarında çalışan yazılımlar tarafından kullanılmaktadır. Bu türde en çok kullanılan yazılım, IBM tarafından çıkarılan IMS' dir. Uzun bir geçmişe sahip olmasına rağmen, PC ortamına uyarlanan hiyerarşik veri tabanları yoktur.
Hiyerarşik veri tabanları, bilgileri bir ağaç (tree) yapısında saklar. Kök (Root) olarak bir kayıt ve bu köke bağlı dal (Branch) kayıtlar bu tip veritabanının yapısını oluşturur. Yukarıda böyle bir veri tabanının yapısı gösterilmektedir.
Ağ Veri Tabanları
Hiyerarşik veri tabanlarının yetersiz kalmasından dolayı bilim adamlarının ortak çalışması sonucu ortay konulmuş bir veri tabanı türüdür
Ağ veri tabanları verileri ağaçların daha da gelişmiş hali olan graflar (ağacın kendiside özel bir graftır.) şeklinde saklarlar. Bu yapı en karışık yapılardan biridir.

İlişkisel Veri Tabanları
E.F. Codd Tarafından Geliştirilmiştir. Bu sistemde veriler tablo seklinde saklanır. Bu veri 'tabanı yönetim sisteminde veri alış verişi için özel işlemler kullanılır. Bu işlemlerde tablolar operandlar olarak kullanılır. Tablolar arasında ilişkiler belirtilir. Bu ilişkiler matematiksel bağıntılarla (ilişkilerle) temsil edilir. Günümüzde en çok tercih edilen ilişkisel veri tabanı ayrıca detaylı olarak anlatılacaktır.

Nesneye Yönelik Veri Tabanları
Günümüzde nesne kavramı her yerde kullanılmaya başladı. Pek çok kelime işlemci ve hesap tablosu programlarının alıştığımız görünümlerine artık bir de nesneler eklendi. Ancak bu gerçek anlamda bir nesneye yönelik yazılım demek değildir.
Yüzde yüz nesneye yönelik bir yazılımın tamamen nesneye temelli çalışması gerekir. Yazılımın mutlaka nesneye yönelik bir dilde yazılmış olması beklenir. Fakat Windows gibi işletim sistemi üzerinde çalışan yazılımlar bu özelliklere tümüyle sahip değiller. Sadece nesne kavramını kullanarak bazı ek özellikler sunar.
Nesneye yönelik veri tabanı da , C++ gibi nesneye dayalı bir dille (OOPL) yazılmış olan ve yine C++ gibi nesneye dayalı (OOPL) bir dille kullanılan veri tabanı anlamına geliyor. Günümüz teknolojisinde yüzde yüz nesneye yönelik bir veri tabanı yaygın olarak kullanıma sunulmuş değildir. Ancak nesneye yönelik veri tabanlarının bazı üstünlükleri olacağından söz ediliyor.


İlişkisel veri tabanları ile karşılaştırıldığında nesneye yönelik veri tabanlarının sahip olması gereken üstünlükler şunlardır:


  1. Nesneler, bir tabloda yer alan bir kayıttan çok daha karmaşık yapıya sahiplerdir ve daha esnek bir yapıda çok daha kullanışlı düzenlenebiliyorlar.
  2. Nesneye dayalı bir veri tabanında, yapısı gereği arama işlemleri çok hızlı yapılabilir. Özellikle büyük tablolarla uğraşırken ilişkisel veri tabanlarından çok daha hızlı sonuca ulaşırlar. Ancak çalışma mantığı tümüyle değişir
Tüm bu özellikler tamamen nesneye yönelik olan veri tabanları için geçerlidir. Bazı ilişkisel veri tabanları ile çalışan yazılımlarda da nesnelerin bazı özellikleri kullanır, ama nesneye yönelik veri tabanı bunu kendini ilişkisel veri tabanı kurallarına uydurarak gerçekleştirebilir


Veritabanı Normalizasyonu​

Genel kabul görmüş 5 normalizasyon kuralı vardır. Bu kurallar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuş kurallar olup burada özet olarak değinilmiştir.Aslında ilişkisel veri tabanı tasarımından ziyade bir tablo içerisinde yer alacak kaydın nelerden oluşma*sına karar vermeye yarayan normalizasyon kuralları başlı başına bir işlemdir. Sonuç itibari ile veritabanı tasarım aşamasında gerekli bir işlem olduğundan bu bölüme almayı uygun bulduk. Genel kabul görmüş 5 normalizasyon kuralı vardır. Burada her bir kuralı tam olarak anlatmak mümkün değildir. Ancak bu kurallar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuştur. Özet olarak fikri vermesi açısından yer verilmiştir.
Yazıda anlatılan ilişkileri kavramak için, alttaki şemaya bir göz atabilirsiniz.

1. Normalizasyon Kuralı


Bir satırdaki bir alan yalnızca bir tek bilgi içerebilir. Örneğin kitap tablosunda, birden fazla yazarı olan kitap için yazar1, yazar2, yazar3 diye alanlar açsaydık, bu kurala uymamış olurduk. Böyle bir durumda, ayrıca yazarlar tablosu da oluşturarak kuralı çiğne*memiş oluruz

DİKKAT:Verileri virgül veya bir başka karakter ile ayırıp aynı alana girmek. Daha sonra program içerisinde split ile bu değerleri ayırmak. Ancak bu ilişkisel veritaba*nının doğasına terstir.

2. Normalizasyon Kuralı


Bir tablo için, anahtar olmayan her alan, birincil anahtar olarak tanımlı tüm alanlara bağlı olmak zorundadır. Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi olacaktı ve oduncNo'na bağlı bir nitelik olmayacaktı. Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak sorunu çözdük.

Ya da anahtar alanın birden fazla alandan oluştuğu tablolarda, anahtar alanlardan sadece birine bağlı veriler, tabloda yer almamalı, ayrı bir tabloya taşınmalıdır.

Bunun tersi de geçerlidir. Yani iki ya da daha fazla tablonun birincil anahtarı aynı olamaz. Şayet böyle ise, bu iki tablo tek tabloya indirilmelidir.

3. Normalizasyon Kuralı


Bir tablo için, anahtarı olmayan bir alan, anahtarı olma*yan başka hiç bir alana bağlı olamaz. Örneğin, kitapları*mız için cilt tipi adında bir alan ekleyip burada da karton kapak için K, deri cilt için D, spiral cilt için S yazsaydık, bu kodlama, kitap tablosunun birincil anahtarı olan kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanımızda, karşılığı olmayan bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu olarak tutan alan aslında cilt tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.

Bu durumda, ciltSekli adında bir tablo açmamız gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli olmalıdır. Ancak bundan sonra, kitaplar tablosunda ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları yazabiliriz.

4. Normalizasyon Kuralı


Birincil anahtar alanlar ile anahtarı olmayan alanlar arasında, birden fazla bağımsız bire-çok ilişkisine izin verilmez. Örneğin, tablomuzda yer alan bir kitap hem hikaye kitabı hem de kişisel gelişim kitabı olabilir.(Bu durumda kitabın adı, kişisel gelişim hikayeleri olurdu her halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz?

4.Normalizasyon kuralını sağlamak için, her bağımsız bire çok ilişki için ayrı bir tablo oluşturmak gerekir.

Bu örnekte, türler diye bir tablo açmamız gerekiyor. Daha sonra kitapTurleri diye bir başka tablo daha açma*mız gerekiyor. ‘Kişisel Gelişim Hikayeleri' adlı kitap için, öncelikle kitap numarası, Hikaye bölümünün kodunun yer aldığı bir satır; ardından da yine kitap numarası, ardından da kişisel gelişim türünün kodunun aldığı yeni bir satır daha eklemek gerekir.

5. Normalizasyon Kuralı


Tekrarlamaları ortadan kaldırmak için her bir tabloyu mümkün olduğunca küçük parçalara bölmek gerekir. Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar kapsamında olmayan tekrarlamalar da 5.nolu normali*zasyon kuralı ile giderilir.

Örneğin, kitaplarımız için bir edinme şekli bilgisi girilecek sütun eklemek isteyelim: Bu bölüme girilebile*cek bilgiler bellidir: Bağış veya satın alma.

Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle, kullanıcıların bu alan gelişi güzel bilgiler girmesini engellemiş oluruz. Bu da sorgulama esnasında verile*rimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda, tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler başka bir tabloya taşınmış olur. Bu tablo için, veritabanı programlamada ‘look-up table' terimi kullanılır.

Ancak, veritabanı normalizasyon kuralları, bir ilişkisel veritabanının tasarlanma aşamalarını değil de ilişkisel veritabanında yer alacak kayıtların ilişkisel verita*banı ile uyumlu olup olmadığını denetlemeye yöneliktir.

Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi barındırmalıdır.


  • Veri tekrarı yapılmamalıdır.
  • Boş yer mümkün olduğunca az olmalıdır.
  • Veri bütünlüğü sağlanmalıdır.
  • Veriler, aralarında bir ilişki tanımlanmaya müsait olmalıdır.





ÖNSÖZ​


SQL’i iyi bilenler için bile seyrek kullanılan komutlara bir yerlerden bakmak bazen bir zorunluluk arz edebilmektedir. İşte kitapta böyle bir ihtiyacı da karşılamak üzere SQL’i enine boyuna ele aldım. Özellikle yapılabilecek hataları, akla takılabilecek soru ve sorunları, program geliştirme esnasında önemli olduğunu gördüğüm teknikleri püf noktaları halinde bulabilirsiniz.Basit bir Web uygulamasından, devasa kuruluşların ağır verilerine kadar, günümüzde bir çok alanda veritabanı uygulamalarına ihtiyaç duyulmaktadır. Seride özellikle, Web projeleri gibi küçük çaplı işlerinde Veritabanı kullanmak zorunda kalan ama bu konuda başlangıç aşamasında bile bilgi sahibi olmayan bir çok kişiye ışık tutacak şekilde hazırlandı. Bundan dolayı da SQL ve veritabanının dışında, bir veritabanının Web’e açılması, XML, Web servisleri ile başka sitelere hizmet sunma gibi konulara da nasıl yapılacağı konusunda fikir vermesi açısından bir noktaya kadar değinildi.

Tüm bunların yanında, SQL’i iyi bilenler için bile seyrek kullanılan komutlara bir yerlerden bakmak bazen bir zorunluluk arz edebilmektedir. İşte kitapta böyle bir ihtiyacı da karşılamak üzere SQL’i enine boyuna ele aldım. Özellikle yapılabilecek hataları, akla takılabilecek soru ve sorunları, program geliştirme esnasında önemli olduğunu gördüğüm teknikleri püf noktaları halinde bulabilirsiniz.

Veritabanı uygulamalarının kurgulamak bir çok platforma hakim olmayı gerektirir. Ciddi bir Web uygulaması meydana getirebilmek için öncelikle, SQL ve veritabanı konusunda temel bilgilere sahip olmak gerekir. Çünkü, tüm sistem, veritabanı şeması üstüne inşa edilir. Bunun üstüne, HTML ve ASP-ASP.NET-PHP gibi bir Web programlama tekniğine hakim olmak gerekir. Bu da yetmez, veri erişim bileşenlerini de yakından tanıyıp etkin olarak kullanabilmek gerekir. Bunun üstüne, güncel bir uygualma geliştirmek için XML’i yakından tanımak gerekir. XML Web Servisleri, Web’de kurumlar arası haberleşme açısından oldukça ciddi gelişmeler önermekte.

Seriyi hazırlarken, bu durumları göz önüne aldık. İlk kitapçıkta, İlişkisel Veritabanı ve SQL konuları ele alındı. İkinci ünitede bir popüler orta ve büyük ölçekli Veritabanı Yönetim Sistemi olan Microsoft SQL Server 2000, T-SQL ile VTYS üstünde dinamik programcıkların geliştirilmesi, belli başlı dinamik olarak SQL scriptleri oluşturma konularına da orta düzeye kadar yer verildi. Böylelikle, veritabanı işine sıfırdan başlayacak bir kullanıcının profesyonelliğin kapısından içeriye adım atacak hale gelebileceği bir kurs kitabı ortaya çıktı.

Üçüncü kitapta, VTYS uzayının dışında masa üstü uygulamalar veya Web uygulamaları geliştirmek için , VTYS’ye erişim sağlayan MDACs(Microsoft Data Access Compunents) inceleniyor. Bu konuda, OLE-DB, ADO, ADO.NET nesneleri tanıtılıyor. Son kitapta ise XML ve Web Servisleri konuları inceleniyor.

Özellikle SQL’e adanan ilk kitapçıkta olmak üzere, kolay ama çok şey öğrenilmesi gerektiğinden, serinin tamamındaki konu anlatımları sık sık ve kolaydan zora doğru giden örneklerle desteklendi.

Veritabanının tarihi gibi , uygulama geliştirme açısından çok da etkili olmayan konuları maalesef bu seride bulamayacaksınız. Bu türden, işe yaramayacak kuru bilgiler için bakılabilecek en iyi yer, bu konuda eğitim veren yüksek öğretim kurumlarımızda okutulan ders Kitapı olabilir.

Günlük hayatta, veritabanına hakim olamamış programcı arkadaşların, bu açıklarını daha fazla (SQL harici) kod ile kapatmaya çalıştıklarına defalarca şahit oldum. Böyle bir seri sayesinde, neyin veritabanı programlama kapsamında düşünülmesi, neyin istemci programa bırakılması konularının okurlar tarafından daha iyi anlaşılacağı kanaatindeyim.

Bu kitap sayesinde SQL’i öğrenen programcıların bunu nerede nasıl kullanacaklarını geniş örneklerle hem de güncel teknolojiler ışığında öğrenebilecekleri bir seri ortaya çıktı. Emeği geçen herkese teşekkürü borç bilirim.


GİRİŞ​

Veritabanı istemci programları yazmak, SQL dışında başka dillere de hakim olmayı gerektirir. VBScript’ten tutun da PHP, Perl, ASP, ASP.Net gibi teknikler ile Web sayfası geliştirmeye aşina olmak yahut C/C++/C#, Java, Visual Basic gibi diller ile basit uygulamaları yapabiliyor olmak gerekir.SQL(Es-kü-el okunur) insanların veritabanı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil sayesinde, bir veritabanından kayıtları alabilir, değiştirebilir ya da yeni kayıtlar ekleyebiliriz. SQL bir dildir; ancak bir programlama dili değildir. Program geliştirme aşamasında SQL’den faydalanılır, ancak tek başına bu iş için yeterli değildir.

Verilerin belli özelliklerine göre gruplanıp diske kaydedilmesi işine veritabanı yönetimi denir. Veritabanlarından en popüler olanı, ilişkisel veritabanıdır. İlişkisel veritabanın kökeni, 1970’li yıllarda IBM laboratuarlarında yapılan çalışmalarda atılmıştır. Takip eden çalışmalarla, 1983’te SQL(Structural Query Language) standartları tanımlanmış ve ardından 1987 yılında önce ISO ardından da ANSI tarafından bir standart olarak kabul edilmiştir. Daha sonra, bu standartlar çerçevesinde bir çok veritabanı yönetim sistemleri geliştirilmiştir. Bunlardan belli başlıları, Oracle, Sybase, MS SQL Server, Informix ve MySQL’dir. Bu VTYS’lerin işlerin daha kolay yürümesi için kendi adlarına standart dilden uzaklaşan tarafları vardır. Ancak genel işlemlerde kullanılan dil tümü için de ortaktır ve SQL’dir.

Veritabanı Yönetim Sistemleri


Veri Tabanı Yönetim Sistemleri, fiziksel hafızada bilgileri çeşitli özelliklerine göre gruplandırıp şekillendirdikten sonra saklarlar. Saklanan bu veriyi, verilen SQL komutları ile insanların istekleri çerçevesinde işler, yeniden şekillendirirler. Yani, Veritabanı Yönetim Sistemi’nin bir ucunda, bilgisayar disk(ler)inde saklanan düzenlenmiş veriler diğer ucunda ise bir kullanıcı (genellikle insan) vardır. Veritabanı Yönetim Sistemleri konusunda daha geniş bilgi bir sonraki kitapçıkta verilecektir.

şekil 1.1 : VTYS disk üstündeki verileri daha kolay işleyip yönetmemizi sağlar. SQL ile VTYS’ye veriler üstünde nasıl bir işlem yapması istendiği anlatılır. VTYS bunu bizim adımıza gerçekleştirir.

Veritabanı Yönetim sistemleri, her zaman bir kullanıcıya, yönetim ekranlarından bilgi vermek için kullanılmaz. Bazen kullanıcı konumunda doğrudan bir insan yerine bir program da olabilir. İşte bir veritabanı programcısı, veritabanını çekip çevirmenin yanında, VTYS’ye bağlanıp veri alış-verişi ve veri üstünde değişiklik yapan bu ‘istemci programları’ da yazabilen kişidir.

Veritabanı istemci programları yazmak, SQL dışında başka dillere de hakim olmayı gerektirir. VBScript’ten tutun da PHP, Perl, ASP, ASP.Net gibi teknikler ile Web sayfası geliştirmeye aşina olmak yahut C/C++/C#, Java, Visual Basic gibi diller ile basit uygulamaları yapabiliyor olmak gerekir.


Veritabanı Nerelerde Kullanılır?​

.Veritabanı programlama ile bir çok proje geliştirilebilir. Bir İngilizce-Türkçe sözlük bu yolla kolayca yazılabilir. Bir kütüphane takip otomasyonu, bir Hastane otomasyonu, Muhasebe programları ve daha bir çok otomasyon programı temelde veritabanı projesidir.

Günlük hayatta Veritabanı programlama telefon şirketleri tarafından yoğun olarak kullanılır. Konuşmaların süreleri ay boyunca veritabanlarında saklanır ve ay sonu geldiğinde istemci programlar tarafından her bir abonenin telefon faturası teker teker hesaplanır. Günde on binlerce abonenin birbirini aradığı bir durumun içinden başka hangi yolla çıkılabilir ki?

1.İlişkisel Veritabanı Kavramı​

Bu bölümde İlişkisel veritabanı hakkındaki temel terim ve teoremleri öğreneceğiz.İlişkisel veritabanı günümüzde en yaygın kullanılan ilişkisel veritabanı sistemlerinden biridir. En çok kullanılan ilişkisel Veritabanı Yönetim Sistemlerine Oracle, Ms SQL Server, Sybase, Informix, MySQL gibi Veritabanı yönetim sistemlerini örnek olarak verebiliriz. Bu bölümde verilen uygulamaları test etmek için MS Access de bir noktaya kadar kullanılabilir ancak verilen örneklerin tamamı MS Access tarafından desteklenemez. Bu nedenle, örneklerin büyük bir çoğunluğu MS Access MS SQL Server 2000 üstünde test edilmiştir. ONLINE olarak kitabın içerdiği uygulamaları test etmek için adresinden faydalanabilirsiniz.

Bilgisayar ortamında veri saklamak için kullanılan yapılardan en büyüğüne dosya dendiğini biliyorsunuzdur. İlişkisel veritabanları, veritabanı denilen büyük dosyalardan oluşur. Veritabanı, içerisinde tabloları barındıran bir dosyadır. Her bir tablo, belli yapıya uygun verileri saklamak üzere tasarlanır. Tablolar, satırlardan ve sütunlardan oluşur.

1.1.Günlük Hayatta ilişkisel Veritabanı​

'Ödünçalınan' kitaplarımıza bir çare bulmak için veritabanı uygulaması geliştirmeye ne dersiniz? Bu belki kitabımızı geri getirmez ama, hiç olmazsa kitabımızı getirmeyenin kim olduğunu bilebiliriz...Bir çoğumuzun başına gelmiştir. Arkadaşlara, eşe dosta bir çok kitap, kaset, CD veririz ve gidiş o gidiş. Böyle bir sorun ile nasıl başa çıkarız? Bu konuda bir proje geliştirelim:

Öncelikle elimizdeki bütün Kitaplarımızın bir listesini yapalım. Ama bunu yaparken, her bir kitaba numara vermeyi ihmal etmeyelim. Çünkü elimizde aynı kitaptan iki adet olabilir. Bunlardan biri eski öteki de yeni kitap olabilir. Bu durumda bu iki kitaptan hangisini kime verdiğimizi nasıl ayırt edeceğiz?

Daha sonra Kitaplarımızı şu şekilde bir listeye yazalım:

Şekil1.2 En başa Kitap No’nu, sonra Kitap Adı’nı ardından ISBN numarası’nı sonra Sayfa Sayısı’nı, Özeti’ni yazalım ve listeyi dolduralım.
Listenin her bir sütununda sırasıyla şu bilgiler yer alsın:
Kitap No :Her bir kitaba verdiğimiz numara
Kitap Ad :Her bir kitabın adı
ISBN Numarası:Her bir kitabın arkasında yer alan Uluslararası Standart Kitap Numarası
Sayfa Sayısı :Kitabın kaç sayfa olduğu
Özeti :Kitabın bir özet açıklaması

Amacımız, kime hangi kitabı verdiğimizi bilmek. O halde Kitap listesine ek olarak şimdi bir de ödünç listesi yapalım:


Şekil:1.3 Bu listede de, ödünç no, kitap no, ödünç alan, verme tarihi, Verme süresi, Geri Geldi mi şeklinde bir liste daha yapalım.
Kütüphanemizden verdiğimiz her bir kitabı bu listeye işlersek, hangi kitabımızın kimde kaldığını, süresi sonunda getirilip getirilmediğini kolayca takip edebiliriz. Buradaki Geri geldi mi hanesine gelen her kitap için bir işaret koyabiliriz ya da imza attırabiliriz.

Bu projeyi, bilgisayar ortamında yapmak, kağıt üstünde yapmaktan çok daha kolay olacaktır. Bu projede yer alan listelerin karşılığı veritabanında tablolardır. Hayatta bir çok şeyi listelerle çözeriz. Her bir listeye karşılık, veritabanı mantığında bir tablo gelir.

1.2.Temel Kavramlar​

Tamam bu uygulamayı geliştireceğiz ama geliştirme sürecine başlamadan önce kullanacağımız kelimeler ne anlama geliyor, ortak ağızdan konuşmak için bunları tanıyalım..Veriler fiziksel hafızada Veri Dosyaları(DataFiles) halinde saklanır. Dosya, bilgisayarların bilgileri birbirinden ayırarak saklamak için kullandığı temel bilgi depolama yapısıdır. Bir dosyada, bir çok veri yer alabilir.Bir kütüphane otomasyonunu ele alacak olursak, kitap ile ilgili bilgiler, ödünç verilenler, kütüphaneden kitap alma hakları olan üyeler, CD ve kasetler ile ilgili bilgiler aynı veri dosyasında ama farklı tablolar içerisinde yer alabilir.

1.2.A.Tablolar:
Bir tablo yani günlük hayattaki ‘liste’ kavramı, satırlardan ve sütunlardan oluşur. Mesela Kitap listemizi(yani Kitap tablomuzu) ele alacak olursak, her bir satırda bir kitaba ait bilgiler yer almaktadır.

Alan(Field), Yapılandırılmış bilginin her bir kısmını saklamak üzere yapılan tanımlamadır.


Şekil1.4:Alan,her bir sütun için tanımlayıcı bilgileri tutan yapıdır.

Her bir alan, yapılandırılmış verinin bir birimini tutmak üzere tanımlanır. Her bir sütunun adı ile birlikte diğer bilgilerinin(en fazla kaç birimlik bilgi bu hücrede saklanabilecek, ne tür bilgi saklanacak vs.) ortaya koyduğu tanıma alan denir.

Satır(Row): Bir tabloda yer alan her bir kayıt bir satıra karşılık gelir. Örneğin Kitap tablosunda her bir satırda farklı bir kitap hakkındaki bilgi yer almaktadır.

Sütun(Column): Tablolar dikey sütunların yan yana gelmesiyle meydana gelmiştir. İlk sütunda kitap numaraları, ikinci sütunda kitap isimleri, üçüncü sütunda, ISBN numaraları yer almaktadır.

Kayıt(Record): Yapılandırılmış verilerden her birine bir kayıt denir. Yani, alan bilgileri ile birlikte her bir satır bir kayıttır. Bir kitap bilgisini ele alacak olursak,


Şekil1.5:Kayıt, alan tanımlamaları ile birlikte bir satırda yer alan bilgilere denir.

Bir kayıttır. Kayıt ile satır arasındaki temel fark, kayıt ile kastedilen yapının sütunlar hakkındaki bilgileri de içermesidir.

Veri Tipi(Data Type): Bilgisayar, kayıtları yapısal olarak tutarken, onların yapıları hakkında fikir sahibi olabilmek için bazı özelliklerinin önceden tanımlanması gerekir. Örneğin, kitap numarası alanının mutlaka bir tam sayı olacağını, Kitap adının harf ya da rakamlardan oluşacağını anlatmamız gerekir. Bir veritabanı oluşturulurken, her bir alanın tipinin ne olacağı tanımlanmak zorundadır. Bir alana tamsayı mı yoksa harf mi; tarih mi yoksa ondalıklı bir sayı mı geleceği ancak tanımlandıktan sonra kayıt girilebilir.

Ayrıca, bir alanın uzunluğu ne kadar olacak, harf girilebiliyorsa en fazla kaç harf girilebilecek, rakam ise en fazla kaç basamaklı olabilir... türden soruları yanıtlamak için de yine VTYS bir alan için veri tipi belirlememizi ister. Bir alan için hangi tip seçeneklerimizin olduğunu ilerleyen kısımlarda öğreneceğiz.

Zorlayıcı(Constraint): Herhangi bir alan için girilebilecek verileri kısıtlayıcı kurallara Zorlayıcılar denir. Kullanıcı, zorlayıcının istediği şekilde veri girmezse, VTYS hata verir. Böylelikle veritabanına kullanıcının keyfi değerler girmesi önlenmiş olur. Örneğin, kitap listemizde yer almayan bir kitabı ödünç vermeye kalktığımızda hata verecek bir kısıtlama tanımlayabiliriz.
İki ana grup zorlayıcı vardır; programlanabilir zorlayıcılar ve tanımlanabilir zorlayıcılar. İleride detaylandırılacaktır.

Anahtar(): Anahtar bir veya birden fazla alanın bir satır için niteleyici olarak girilmesi için tanımlanan özel bir çeşit zorlayıcıdır. Tekrarlamayacak bir anahtar alan tanımlandığında, Bu anahtar alana birincil anahtar alan denir. Primary , Unique , Foreign gibi türeleri vardır.
 
  • Beğen
Tepkiler: Kobra_FighterTR


Revengeful

Revengeful

Emekli Yönetici
    Konu Sahibi
1.3.Değişken İsimlendirme​

Hazır terimlerden başlamışken, sadece veritabanına özgü olmayıp heryerde geçerli olan, değişken tanımlama kurallarına bir göz atalım; En önemlisi, değişkenlerinize az ve öz ama anlaşılır isimler verin. Boşluk ve Türkçe karakter kullanmayın...SQL’de tablo adları, alan(field) , veritabanı dosyası, indeks vb. isimler değişken isimleridir. Genel geçer değişken isimlendirme kurallarına burada da dikkat etmek, sağlıklı uygulamalar meydana getirebilmek için çok önemlidir. Bundan dolayı bu kurallara burada yer verdik. Genel kanı bu türden bir kaygının yersiz olduğu yönünde olsa da bazen oldukça kritik hatalar ortaya çıkabilmektedir.
1.Değişken isimleri, harf ile başlamak zorundadır.
2.Değişken isimleri, harf, rakamlar ve ‘_’ dan oluşmak zorundadır.
3.Değişken isimlerinde Türkçe’de ki noktalı harfler (İ,ı,Ğ,ğ,Ü,ü,Ş,ş,Ç,ç,Ö,ö,) yer alamaz.
4.Değişken isimlerinde ayrılmış kelimeler yer alamaz.(like, not,level... vs gibi.)
5.SQL büyük-küçük harf duyarlı değildir.
6.Değişken isimlerinde boşluk yer alamaz.
7.Ayrılmış kelimeler değişken adı olamazlar (select, like, not, or, delete, update ...vs)

Değişken isimlendirme notasyonları:
1.Deve Notasyonu: degiskenAdi şeklinde yazılır.
2.Alt çizgi notasyonu: degisken_adi şeklinde yazılır.
Veritabanı programlamada, büyük-küçük harf duyarlılığı olmadığından genellikle alt çizgi notasyonu kullanılır ve değişken adları küçük harf olarak verilir. Ancak bu bir kural olmayıp sadece okunurluğu artırmak için programcıların bir çoğu tarafından tercih edilen bir yoldur.
mu boşluk mu...
Bir kayıt için, alanlardan biri hiç girilmediği için boş olabilir veya bilgisayardaki space tuşunun karşılığı ASCII değeri girilmiş olabilir. Space(ASCII-32 karakteri) tuşuna basılarak elde edilmiş boşluk ile daha hiçbir bilgi girilmemiş olan boşluk bilgisayar dilinde birbirinden farklıdır. Daha önce hiçbir şey girilmemiş alan için terimi kullanılır.

Ama illa da ben bu kurallara uymak istemiyorum diyorsanız, mutlaka değişkenlerinizi SQL içerisinde kullanırken [değişken adı] şeklinde kullanmanız gerekir.

1.4.İlişkisel Veritabanı Yönetim Sistemleri​

Bir veritabanında ilişkiden söz edebilmek için en az iki tablonun yer alması gerekir ve bu iki tablodaki verilerin bir biri ile bir şekilde ilişkilendiriliyor olması gerekir.Veritabanı Yönetim sistemlerinden günümüzde kullanımı en yaygın olanı İlişkisel Veritabanıdır. Hal böyle olunca da en yaygın veritabanı yönetim sistemleri, İlişkisel Veritabanı Yönetim Sistemleri’(RDBMS)dir. İlişkisel veritabanının en önemli yanı, tablolardan oluşmasıdır. Daha önemli yanı da bu tabloların bir biri ile ilişkilerinin olmasıdır. Böyle olmasaydı durup dururken bu VTYS’ler için ‘ilişkisel’ demezdik.

Bir veritabanında ilişkiden söz edebilmek için en az iki tablonun yer alması gerekir ve bu iki tablodaki verilerin bir biri ile bir şekilde ilişkilendiriliyor olması gerekir. Yine bir önceki örnek olaya dönecek olursak, Kitap listesi ile ödünçler listesi arasında bir ilişki vardır çünkü Kitap listemizde olmayan bir kitap bizde yoktur ve ödünç veremeyiz. Haliyle de mantık olarak bu türden bir ödünç bilgisi ödünç listemizde yer alamamalıdır.

Olaya tersten bakacak olursak, geri dönmeyen bir kitap hakkındaki detayları öğrenmek istediğimizde ödünç listesindeki kitap numarasını alırız. Daha sonra aynı numaraya karşılık gelen kitabı, Kitap tablosundaki satırı buluruz.Bu satırdaki bilgiler bize kitap hakkındaki tüm detayları verir. Kitap tablosundaki kitapNo alanı aday anahtar(indeks)’tir. Odunc tablosundaki KitapNo alanı, ‘yabancı anahtar’ (foreign ) alandır, çünkü Kitap tablosundaki bir kaydı sembolize etmektedir.

Şekil:1.6: Birinci tabloda yer alan bir kayda karşılık, ikinci tabloda bir veya daha çok kayıt yer alabilir. Ancak İkinci tablodaki bir kitap numarasına karşılık birinci tabloda sadece bir tek kayıt vardır. Bu ilişkiye bire sonsuz bir ilişki denir. Birinci tablodaki her bir tekil kaydı sembolize eden kitapNo için aday anahtar, ikinci tabloda, ödünç verilen herhangi bir kitap hakkındaki detayları görmek için 1. tabloya geçmemizi sağlayan kitapNo’na ise yabancı anahtar(foreign ) denir.


Tüm bunların ardından VTYS’leri hakkında özet olarak diyebiliriz ki;
Bir İlişkisel Veritabanı Yönetim Sistemi tablolar üstünde şu üç işlevi yerine getirmek zorundadır.

1.SEÇME: Herhangi bir tabloda(listede) yer alan tüm bilgileri gösterebilmelidir. Örneğin, Kitap tablosunun bir dökümünü verebilmelidir. Ya da kitap listesinden bazı kitapların bilgilerini getirip diğer bir kısmını getirmeyebilmelidir.

Şekil1.7:Kitaplar listesi üstünde bir seçme işlemi. Sayfa sayısı 200’den fazla olan kitapları seçiyoruz.

2.İZDÜŞÜRME: Herhangi bir tablodan sadece belli sütunların yer aldığı seçme işlevlerini yerine getirebilmelidir. Örneğin, canı isteyen bir kullanıcı Kitabın sadece adını ve kaç sayfa olduğunu seçebilmelidir.

Şekil1.9:Kitaplar listesi üstünde bir iz düşürme işlemiKitapların kitap No’nu, Adını ve sayfa sayısını alıyoruz. Diğer sütunları almıyoruz.

3. BİRLEŞTİRME: Birden fazla tabloda yer alan bilgileri, yeri geldiğinde tek bir tabloymuş gibi sunabilmelidir. Örneğin, Ödünç alınıp da geri getirilmeyen Kitapların adlarını ve kimler tarafından alındığını bir tek tabloymuş gibi gösterebilmelidir.

VTYS bu 3 temel işlevi yerine getirmelidir. Bunlardan üçünü, ikisini veya birini aynı anda yerine getirmek durumunda kalabiliriz. Örneğin, sayfa sayısı 200’den büyük kitapların sadece adını görmek istersek, hem iz düşürme hem de seçme işlemine ihtiyaç duyarız.

Veriler ve depolanma şekilleri farklı olabilir. Önemli olan, VTYS’nin SQL ile yönetilebilir olmasıdır. Böylelikle, verilerin bilgisayarda fiziksel olarak ne şekilde depolandığı, kullanıcı bilmek zorunda kalmaz. Yani, kullanıcı temel veri saklama işlem ve yöntemlerinden izole edilmiş olur. Kullanıcının verileri etkili olarak kullanması için bilmesi gereken tek şey SQL olmalıdır.

Verilerle ilgili yapılan işlemler iki ayrı grupta incelenir. Birincisi, veri tanımlama işlemleridir. Bu grupta yapılan işlemler daha çok verinin saklandığı ortama dair işlemlerdir. Doğrudan verinin kendisi ile ilgilenmek yerine, tablonun hangi alanlardan oluşacağı, hangi alana hangi aralıkta veri girileceği vb. gibi işlemler bu gruptadır.

Veri işleme işlemleri ise verinin saklandığı ortam ile hiçbir ilgisi olmayan işlemlerdir. Bir tablonun içindeki tüm kayıtlar silinse bile sonuçta tablo var olacaktır. Çünkü bir tablonun silinmesi DDL’in görevidir.

SQL komutlarının bu şekilde gruplandırılmasının nedeni, SQL’den ziyade, veri yönetimi konusundaki mantıktan kaynaklanmaktadır. Böylelikle işlemler daha anlaşılır bir hal almaktadır. Verinin kılıfı ile ilgili işlemler ve verinin kendisi ile ilgili işlemler...
Sizce bir kitabın adının değiştirilmesi hangi gruba girer? Peki ödünç verme süresinin 15 günden fazla olamaması? Ya kitap fiyatlarının da saklanacağı bir sütunu Kitap tablosuna ekleme işlemi? İpucu: ilk işlem DDL ile yapılmaz. Diğerlerinin ikisi aynı gruptan işlemlerdir.

2.SQL Veri Tanımlama Dili​

SQL’i yeterince bilmiyorsanız, bu bölümden önce 3.üniteyi okumanız ve örnekleri bir veritabanı üstünde yapmanız önerilir. Ancak bundan sonra, bu bölümü kavramanız kolaylaşacaktır. Ancak bir proje geliştirirken öncelikle veriyi tanımlamak gerekir. Bu nedenle bu üniteye öncelik verilmiştir.Veri tanımlama dili, verinin ne olduğundan ziyade verinin tipi ile ilgili tanımlamaları yapmak için kullanılır. Bir veritabanında hangi tablolar yer alacak, bu tablolarda hangi alanlar yer alacak ve alanların türleri ne olacak, indeks ya da anahtar olacak mı... bunların hepsi DDL ile belirlenir, değiştirilir veya olan bir tanımlamadan vazgeçilip tanımlama silinebilir.

Veritabanı üstünde herhangi bir tanımlamada bulunulacaksa, bu tanımlama CREATE deyimi ile oluşturulur. DROP deyimi ile de tanımlamadan vazgeçilip silinir. ALTER deyimi ise bir tanımlama üstünde değişiklik için kullanılır.

Bu ünitede ve takip eden ünitelerde, örneklerden hemen sonra cevapları beyaz olarak yazılmıştır. Öncelikle boş alana kendi sorgunuzu çalıştırıp deneme yapabilirsiniz. Ama doğru cevabı bulamıyorsanız, fareniz ile bu alanı seçerek cevabı görebilirsiniz.

İPUCU:
1.SQL cümleciklerini BÜYÜK harfle yazmak bir kural olmasa da kabul gören bir yazma şeklidir. Bu durumda, değişken adlarını mümkün oldukça küçük harflerden oluşacak şekilde tercih etmek okunurluğu artıracaktır.
2.Bir çok dilin aksine, SQL ifadelerinin kaç satırda bittiğinin bir önemi yoktur. Cümleciğin herhangi bir yerinde alt satıra geçmiş olmanız, SQL ifadesinin çalışamayacağı anlamına gelmez.

DİKKAT:
Bazı VTYS’lerde her bir SQL cümleciğinin sonuna ‘;’ konulması istenir. Bu tür VTYS’lerde, cümleciğin nerede bittiğini takip etmek kullanıcıya bırakılmıştır. Öte yandan bazı VTYS’lerde bir SQL cümleciğinin bittiğini belirtmek için cümle sonuna ‘;’ koymaya gerek yoktur. Bunu VTYS’nin kendisi de algılayabilmektedir. Ancak ‘;’ konulmasının çoğu VTYS’de sorun çıkarmadığı bir gerçektir. SYBASE’de ve ORALE’de cümlelerin sonuna ; konulması gerekirken, MS tabanlı sistemlerde bu türden bir zorunluluk bulunmamaktadır

2.1.Temel Veri Tipleri:​


SQL’de yeni bir veri tipi tanımlayamayız. Sadece var olan veri tiplerini kullanabiliriz. Burada hemen her yerde kullanılan ortak veri tiplerine bir göz atacağız. Diğer veri tipleri her bir VTYS’ye özel olarak değişebileceğinden VTYS ile birlikte ele alınması daha uygundur.Bazı VTYS’leri kullanıcının veri tipi tanımlamasına olanak sağlar ancak bu SQL’in sunduğu bir özellik olmayıp VTYS tarafından sağlanan bir özelliktir ve yeni bir veritipi tanımlamak maksatlı değildir. Sadece veri bütünlüğü hedeflenmiştir.






TEMEL VERİ TİPLERİ
INTEGER(boyut) Tam sayı.
INT(boyut)Tam sayı.
SMALLINT(boyut)) Küçük tam sayı.Genellikle 0-99 arası sayılar
TINNYINT(boyut)) Nümerik tam sayı. Rakamlar (0-9) boyut:Sayının en fazla kaç basamaklı olacağı belirtilir.
DECIMAL(boyut,d)) Ondalık
FLOAT(boyut,d)) Kesirli Sayıboyut: fazla kaç basamak tam kısım olacağı belirtilir.d: ondalıklı basamak sayısını anlatmak için kullanılır.
CHAR (boyut)) Daha çok uzunluğu sabit(telefon numarası gibi) karakter verileri için kullanılır.
VARCHAR (boyut)) Değişken boyutta metin alan belirlemek için kullanılır.
boyut:Bu alanda en fazla kaç karakter yer alacağını belirtir..
DATETIME) Tarih.
BIT) LOGICAL,true/false veya yes/no alan diye de geçmektedir. En az yer kaplayan veri tipidir. 1 ve 0 olmak üzere iki değer alabilir..
DİKKAT:
ANSI-SQL içerisinde metin olan değerler (CHAR,VARCHAR,MEMO,DATE) tek tırnak içerisine alınarak yazılır. RAKAMSAL değerler ise olduğu gibi yazılır.

Örnek:
WHERE tarih='20.01.2003'
(metin)
SET kitapNo=20


2.2.Veritabanı:​

Veritabanı ile kastedilen, veritabanı nesne ve verilerini içinde saklayan dosyadır. MS Access ile uygulama geliştirirken, veritabanı oluşturamazsınız. Ancak Orta ve büyük ölçekli VTYS'lerde bu komut işe yarar ve oldukça fazla teferruatı vardır.Veritabanı, içerisinde tabloları barındıran veritabanı mimarisinin en büyük ögesidir. Bir veritabanı şu şekilde açılır:

UYARI:
Bu komutu, MS Access üstünde çalıştıramazsınız. Ancak MS SQLServer, Sybase gibi büyük ve orta ölçekli veritabanlarında kullanılabilir.

CREATE DATABASE database_name

Örnek-1:

CREATE DATABASE dbKutuphane;


Sonuc1.jpg

Ve şu şekilde silinir:

DROP DATABASE database_name

Örnek-2:

DROP DATABASE dbKutuphane

2.3.Tablolar:​

Tablolar, günlük hayattaki listelere karşılık gelir. Öğrencii listesi yerine öğrenci tablosu, öğretmen listesi yerine öğretmen tablosu, veli listesi yerine veli tablosu şeklinde tablolar tanımlayaibliriz.Günlük hayatta listelere karşılık, ilişkisel veritabanında tablolar yer alır. Bir tablo, normalizasyon kuralları çerçevesinde belirlenmiş bir varlığa ait bilgileri tutmak üzere tasarlanmalıdır. Daha sonra bu tablolar arasında bir ilişki tanımlanabileceği için, bu türden veritabanı yaklaşımlarına "İlişkisel Veritabanı Yönetim Sistemleri" denir.



Tablo Oluşturma için genel ifade şu şekildedir:


CREATE TABLE tablo_adi
(kolon_adi1 veri_tipi[NOT ][,
kolon_adi2 veri_tipi[NOT ],.......])



Örnek-3:

CREATE TABLE Kitap1(

kitapNo INTEGER IDENTITY(1,1) NOT CONSTRAINT cnsKitapNo PRIMARY ,

kitapAdi VARCHAR(63) NOT ,

ISBNNo VARCHAR(15),

Turu VARCHAR(20),

sayfaSayisi INTEGER,

kitapOzeti VARCHAR(255)

);


ile örneğimizdeki tabloyu oluşturabiliriz.



Kısıtlar(Constraint) oluşturma


Kısıtlayıcılar, tabloların oluşturulması sırasında tabloların bir parçası olarak tanılanır. MS Access ve SQLServer’de kullanılır. Aşağıdaki işlevleri yerine getirebilirler:

1. INDEX gibi, birincil anahtar alan tanımlayabilirler (PRIMARY ): Bu durumda standart olarak Clustred Index gibi davranırlar.(bkz. INDEX’ler)
2. INDEX gibi tekil alan belirleyebilirler. (UNIQUE )
3. Tablo oluşturma esnasında da yapılabilen, (NOT ) alan belirleyebilirler
4. Yabancı Anahtar Belirleyebilirler.(FOREIGN )

Primary : Bir tablodaki, her bir satırın yerine vekil olabilecek bir anahtar veridir. Tekrarlamaması gerekir. Standart olarak bir tabloda verilerin, fiziksel hafıza üstünde de hangi alana göre dizileceğini de primary belirler. Bu, bazen bir tek alan olabileceği gibi, bazen birden fazla alan da birleşerek bir birincil anahtar oluşturabilir.

Unique : Unique olarak tanımlanan alan için bir değer sadece bir kere girilebilir. Bir başka satıra daha aynı verinin girilmesine izin verilmez. Primary ’den farklı olarak Unique , değerini alabilir.

Foreign : Bir tabloya girilebilecek değerleri başka bir tablonun bir belli alanında yer alabilecek veri grubu ile sınırlandırmaya ve en önemlisi de ilişkilendirmeye yarar.

Örneğin, olmayan bir kitabın ödünç tablosuna eklenememesi ve ödünç tablosuna eklene bir kitabın numarası aracılığıyla detay bilgilerine erişilmesi. Burada Kitap.KitaNo Brinicil anahtar alan; Odunc.kitapNo ise yabancı anahtardır. (bkz. Şekil1.6)

Genel yapısı şu şekildedir.

...
CONSTRAINT constraint_name PRIMARY | UNIQUE | NOT | REFERENCES foreign_table [(foreign_field1[,foreign_field2,..])]


Tablolar oluşturulurken, bazı alanlara girilebilecek değerler ile ilgili kısıtlar koymak zorunda kalabiliriz. Böylesi durumlarda CONSTRAINT’ler kullanılır.

CONSTRAINT’ler aslında INDEX’lere benzerler ama indekslerden farklı olarak bir tek tablo üstünde etkili olmayabilirler. Özellikle yabancı anahtar zorlayıcısı ilişkisel veri girişi için oldukça etkili bir zorlayıcıdır. Ancak bir Foreign tanımı yapabilmek için, FOREIGN yabancı anahtarının asıl tablosunda birincil anahtar olması gerekir.

Örnek-4:

CREATE TABLE Kitap (

kitapNo int NOT ,

kitapAdi varchar63),

ISBNNo varchar (15),

sayfaSayisi int ,

kitapOzeti varchar (255)

);


>>OLUŞTURULMA İŞLEMİ BAŞARI İLE YAPILDI
veya


CREATE TABLE odunc(

oduncNo int NOT ,

kitapNo int NOT ,

uyeNo int NOT ,

vermeTarihi datetime NOT ,

vermeSuresi int NOT ,

geldiMi bit

);


>>OLUŞTURULMA İŞLEMİ BAŞARI İLE YAPILDI
Tablo silme:
Bir tabloyu kullanmaktan vazgeçersek:
DROP TABLE tablo_adi
Tabloda Değişiklik Yapma:
Bir tabloya sütun eklemek veya tablodan sütun silmek için ALTER TABLE deyimi kullanılır.

ALTER TABLE tablo_adi
{ADD{COLUMN alan alan_tipi [(boyut)][NOT ][CONSTRAINT indeks]
CONSTRAINT coklu_indeks}
DROP{COLUMN alan | CONSTRAINT constraint_adi}
}


Örnek-5:
Kitap tablosuna kitap bedeli adında yeni bir tamsayı sütun ekleyelim.

ALTER TABLE Kitap ADD kitapBedeli INTEGER;

>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI İLE YAPILDI


Örnek-6:
Bu sütunun boş geçilememesini istese idik:

ALTER TABLE Kitap ALTER COLUMN kitapBedeli INTEGER NOT ;

>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI İLE YAPILDI


dememiz gerekirdi.

Örnek-7:
Bu sütunu silmek için,

ALTER TABLE Kitap DROP COLUMN kitapBedeli;

>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI İLE YAPILDI


2.4.İndeksler​

Indeks'leri bir kütüphanede kitapların diziliş sıraları ve ek listeler yardımıyla bulunmalarını kolaylaştırma faaliyetlerine benzetebiliriz. Bu durumda kitapların diziliş sırası kümelenmiş(CLUSTRED) indeks, ek listeler ise kümelenmemiş indekselere karşılık gelir.Kütüphanemizdeki Kitapın raflardaki dizilişlerini ele alalım. Bir kitap aradığımızda, Kitapımız bir kurala göre dizilmiyorsa, her bir kitaba teker teker bakmamız gerekir. Kitapı raflara alfabetik dizersek, her bir kitabı teker teker gözden geçirmek zorunda kalmayız. Aradığımız kitap ile bakmakta olduğumuz kitabın isimlerini karşılaştırır, sağa ya da sola yönelip aramaya devam ederiz. Aynı şekilde yazarlarına ya da kütüphane numarasına göre sıralanmış birer liste olursa, bu kriterlere göre de aradığımız kitabı kolayca bulabiliriz.

Veritabanlarında indeks oluşturarak, verileri veritabanındaki kayıtlı oldukları sıradan başka bir sırada gösterebiliriz. Temelde İndekslerin ilişkisel veritabanında şu üç işlevi vardır:
1. Tekil İndeksler, veri ilişkilerini ve veri bütünlüğünü sağlayan birincil anahtar alanlar oluşturmada kullanılır.
2. İndeks olan alanın değerine göre bir kaydın kayıtlar arasındaki sırasını gösterirler.
3. Sorguların neticelenme sürelerini kısaltırlar.

CREATE [UNIQUE] INDEX index_adi
ON tablo_adi(kolon_adi1[,kolon_adi2,...][DESC])


Örnek-8:

CREATE UNIQUE INDEX indKitapNo

ON Kitap(kitapNo)

>>OLUŞTURMA İŞLEMİ BAŞARI İLE YAPILDI


Dedikten sonra, iki farklı kitaba aynı kitap no’nu vermek mümkün olamayacaktır. Bunu bizim yerimize VTYS denetleyecektir.
Bir indeksi silmek için:

DROP INDEX tablo_adi.indeks_adi

deyimi kullanılır. Bir tablo ya da indeks alan silindiğinde, indeks de otomatik olarak silinmiş olur.

Örnek-9:
Şimdi, oluşturduğumuz indeksi geri silelim

DROP INDEX Kitap.indKitapNo

>>NESNE SİLİNME İŞLEMİ BAŞARI İLE YAPILDI


SQL Server’de Index sırasına göre verilerin fiziksel olarak yeniden sıralanmasını istersek,

CREATE UNIQUE CLUSTERED INDEX indKitapNo
ON kitaplar(kitapNo)

diyebiliriz. Ancak bir tablo üstünde sadece bir adet Clustred Index oluşturulabilir.(Bir çokluk kümesini fiziksel olarak aynı anda kaç farklı şekilde sıralayabiliriz?Elbette bir kere...)

Sizin kullanmakta olduğunuz VTYS de bu konuda ek işlevler sunuyor olabilir. Yardım menüsünden bu konuda bilgi alabilirsiniz.

Tablolar birbiri ile ilişkilendirilirken, index alanlar üstünden ilişki kurulursa daha hızlı sorgular elde edilir.



2.6.Veritabanı Tasarımı:​

Önümüzde bir proje geliğinde, bunun bir veritabanı projesi olduğu aşikarsa, bir sonraki aşama hangi tablolardan oluşacağına karar vermektir. Bu bölümde, buna nasıl karar vereceğimiziöğreneceğiz. Bir sonraki konuda, doğru karar verip vermediğinizi anlamak için normalizasyon kurallarına göz atabilirsiniz.İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır. Ancak 5N, tasarım aşamasında size yol göstermek yerine hangi şartlara uygun tasarım yapmanız gerektiğini anlatır.
Bazen, bu kurallardan vazgeçmek durumunda kalabilirsiniz ancak, veritabanında saklanacak verilerin hacmi arttıkça bu kuralların daha sıkı sağlanmasında fayda vardır.

1.Nesneleri Tanımlayın:


Herhangi bir proje önünüzde konduğunda öncelikle nesneleri tanımlayın. Nesne, çeşitli özellikleri bulunan bir varlıktır. Başlangıçta özellikleri ile ilgilenmeyeceğiz.

Örnek-14:
Birkaç örnek proje için nesneleri verecek olursak,
Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri
E-ticaret sistemi: Ürünler, müşteriler, siparişler,teslimat, fatura bilgileri,üreticiler,tedarikçiler,dağıtıcılar...
Futbol Ligi: Takımlar, sahalar, oyuncular, fikstür, hakemler, antrenörler
Okul Sistemi: Öğrenciler, öğretmenler, dersler, derslikler
Sözlük: kelimeler, anlamlar,diller

2.Her nesne için bir tablo oluşturun:



Her bir nesne için bir tablo oluşturun ve her bir tabloya içereceği veriyi en iyi anlatan bir isim verin. Tablo oluşturma işini, bir kağıt üstünde sembolik olarak gösterebilirsiniz veya doğrudan MS Access, SQL Server, MySQL,Oracle ...gibi kullanmakta olduğunuz VTYS üstünden de oluşturabilirsiniz. Ama tüm proje bitinceye kadar bu tablolar üstünde muhtemel değişiklikler olacaktır.

İPUCU:
Tablolar isim verirken mümkünse tekil isimler kullanın. Böyle yaparsanız hem daha anlaşılır bir tasarım yapmış olursunuz hem de daha sonra kodlama aşamasında karışıklığın önüne geçmiş olursunuz.

Örneğin içinde Kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça mantıklıdır.


3.Her bir tablo için bir anahtar alan seçin:




Veritabanındaki herhangi bir veriye erişmeden önce tabloya erişilir.Bir veritabanında en çok muhatap olunan nesne grubu genellikle tabloalrdır. Buraya kadar hangi tabloları oluşturacağımıza karar verdik. Her bir tablonun içinde hangi bilgileri saklayacağımızı kabaca biliyoruz. Bu aşamada, tabloda yer alacak her bir kaydı bir diğerinden ayırabilecek bir sütuna ihtiyaç duyarız. Örneğin bir kitabı seçmek istediğimizde, bu kitabın hangi kitap olacağını öyle bir anlatabilmeliyiz ki, başka hiçbir kitap ile karışmamalı. Bunu yapmanın tek yolu, bir alanı birincil anahtar alan olarak belirlemektir.

Anahtar alan seçerken, sizi kısıtlamadığı sürece, doğal alanlar seçmeye dikkat etmenizde fayda vardır. Örneğin araçlar ile ilgili bir tablo yaparken, plakalarını anahtar alan olarak belirleyebilirsiniz. Çünkü her bir plakadan bir tek araç trafiğe çıkabilir. Bu bizi kısıtlamaz. Öğrenci tablosu için, öğrenci numarası doğal bir anahtar alandır çünkü aynı okulda, aynı numaradan bir öğrencinin daha bulunması söz konusu değildir.

Kitap tablosu için ISBN numarasını anahtar alan olarak tanımlayabilirsiniz ama, elinizde aynı kitaptan iki adet olduğunda, ISBN numarası sizi kısıtlayacaktır. elinizde iki adet ‘Önümüzdeki Yol’ kitabı varsa, her iki kitabın da ISBN numarası aynıdır.Kitapdan biri eski biri yeni olabilir.Bu bir kargaşaya neden olabilir. Çünkü eski kitabı kime yeni kitabı kime verdiğinizin takibini ISBN numarası ile mümkün değildir. Ancak bir E-Ticaret sitesi tasarlarken, stoktaki tüm Kitap birbiri ile eşdeğer olacağından ya da öyle olduğu varsayıldığından ISBN numarası birincil anahtar alan olabilir. Bu durumda, adet diye bir niteliğin aynı tabloda yer alması gerekecektir.


4.Nesnelerin gerekli her bir özelliği için tabloya bir sütun ekleyin:



Tablo adlarını tamamladıktan ve anahtar adlarını belirledikten sonra, tablolarınıza sıradan adını veren nesnenin her bir özelliği için bir alan(sütun) ekleyin.

İPUCU:
1.En başa birincil anahtar olarak belirlediğiniz alanı eklemek bir kural değildir ancak tablonuzun anlaşılırlığı ve göze hoş görünmesi açısından tercih etmenizin yararınıza olacak bir tekniktir.

2. Genellikle,yapay birincil anahtar alanlar tablo adı ile başlar ve sonunda ID vardır. ogenci tablosu için ogrenciID gibi.

Örneğin, kitap için:
Kitap no, ISBN no, kitap Adı, Yazarı, türü,Sayfa Sayısı, Özeti, fiyatı, baskı yılı...
Üye için: UyeNo, Adı, soyadı, e-mail adresi, ev telefonu, cep telefonu, iş telefonu....

Bu noktada, sizden istenen proje ile ilgili basılı formlar vs. varsa, bir göz atmanız hangi özelliklerin yer alması gerektiği konusunda karar vermenize yardımcı olacaktır.


5.Tekrarlayan nesne özellikleri için ek tablolar oluşturun




Aklınızda hep şu olmalı: veri tekrarı olacak mı? Veri tekrarı olacaksa bir yerlerde hata yapıyorsunuzdur. Elinizdeki tablonun en az bir tabloya daha ayrılması gerekiyor demektir.
Şunu da unutmayın, her projeye uyacak evrensel bir veritabanı tasarım tekniği yoktur. Yani her şey sizin belli kurallar etrafında ne kadar teferruatlı düşünebildiğinize bağlıdır.

Örneğimizde, her bir kitap için tür belirledik ama, bir kitap hem kişisel gelişim kategorisine hem de hikaye kategorisine girebilir. Ya da e-ticaret sisteminde bir ürünün birden fazla reyonda yer alması gerekli olabilir. Veya bir kitap birden fazla kişi tarafından yazılmış olabilir..

Bir kitap için birden fazla türü kaydedebilmeyi ele alalım:

Bu türden bir sorunu çözmek için ilk akla gelen şey, Kitap için, 2.Tür,3.Tür diye iki alan daha eklemek. Ama çoğu Kitap bir tek türdendir ve bu Kitap için 2 alan hep boş kalacaktır. Öte yandan, 4 türe birden giren bir kitap olduğunda 4.tür bilgisini nereye yazacağız? Aynı alana mı? Ya da dört adet bölüm mü açacağız? Bunlar, veritabanı tasarımının doğasına terstir.

2.Çözüm yolu ise, bir kitabı iki kere kaydedip, birincisini, ‘Kişisel Gelişim’ türü olarak; ikincisini de ‘Hikaye’ olarak girmek.. Ancak bu durumda da diğer bilgiler tekrar edecektir. Ya da bir süre sonra, kitap hakkında girilen bilgilerin yanlış olduğunu fark ettiniz.Hangi kaydı güncelleyeceksiniz? Ya birini düzeltip birini unutursanız... Sonuçta veri tekrarı ve veri bütünlüğünün bozulması söz konusudur. Bu da yine ilişkisel veritabanı tasarımının doğasına terstir.

Bu durumda, türler diye bir yeni tablo oluşturup, bir de kitap_turler diye 2. tablo yu oluşturduktan sonra bu türden bilgileri burada tutmak gerekecektir. Böylelikle, hiçbir türde yer almayan Kitapdan 10 ayrı türde yer alan Kitapa kadar bütün olasılıklar için bir çözüm geliştirmiş oluruz.


6.Anahtar Alana Bağlı Olmayan Alanları Belirleyin




İlişkisel veritabanında, tablodan herhangi bir tek kayda erişmek için mutlaka bir farklı özellik sağlanmalıdır ve bu özellik de anahtar alan tarafından sağlanır. Ancak bazen, anahtar alan ile aynı satırda yer aldığı halde, anahtar alan ile birebir ilişkisi olmayan bir alan yer alabilir. Bu türden alanları elimine edip ayrı tablolara ayırmak gerekir.
Örneğin, ödünç tablosunu ele alacak olursak, ödünç verdiğimiz her kitabı ödünç alanın adresini de bilmek istediğimizde, bunu ödünç tablosuna yazamayız. Çünkü ödünç tablosunun birincil anahtar alanı oduncNo’dur ve bu alan, ödünç verme işlemi ile ilgilidir. Oysa ödünç alanın adresi, ödünç alan kişinin kendisine bağlı bir özelliktir. Bu kişinin her aldığı kitap için adresini tekrar yamaya gerek yoktur. Aynı şekilde otomasyon içerisinde başka yerlerde de bu kişinin adres bilgilerine muhtemelen ihtiyaç duyulabilir çünkü adres, üyenin bir özelliğidir.

Ödünç verilen kitabın adresini bilmek istediğimizde, üyeler adında bir tablo daha açıp, burada herkesin adresini tutmak durumundayız demektir. Ödünç tablosunun ise, oduncAlan bilgisi olarak, Üyeler tablosunun birincil anahtar alanına bir bağlantı(yabancı anahtar) içermesi daha doğru olur.

7.Tablolar arasındaki ilişkileri tanımlayın



Her biri bir nesneye dair özellikleri barındıran tabloların tümünü göz önüne alın ve birbirleri ile olan ilişkilerini tanımlamaya çalışın. Örneğin Kitapı ödünç veririz. Bu durumda, ödünç tablosu ile Kitap tablosu ilişkili olacaktır. Kitap üyelere ödünç verilir. Bu durumda, ödünç ile üyeler arasında da bir ilişki vardır. Türler ile Kitap arasında bir ilişki vardır, bir kitabın en az bir türe dahil olması gerekir.

Örnek-15:
Bizim projemizdeki nesneler(tablolar) arasında aşağıdaki ilişkiler yer almaktadır:
Kitap.kitapNo (1)----(¥) odunc.kitapNo
Uyeler.uyeNo(1)---(¥)odunc.uyeNo
Tur.turNo(1)---(¥)Kitap_tur.turNo
Kitap.kitapNo(1)---(¥)Kitap_tur.kitapNo
Yazar.yazarNo(1)--- (¥)kitap_yazar.yazarNo

İki tablo arasında ilişkiyi sağlayan alanların aynı adda olması zorunluluk değildir. Teorik olarak tabloları istediğiniz herhangi iki alanları üstünden birleştirebilirsiniz. Ancak, türler tablosundaki türNo ile üyeler tablosundaki uyeNo alanını birleştirdiğinizde hiçbir işinize yaramayacak anlamsız bir ilişki ortaya koymuş olursunuz.

Bu ilişkileri analiz ederken, her bir alanın hangi tablo için birincil anahtar alan, hangi tablo için yabancı anahtar olduğunu not etmeniz, daha sonra fiziksel olarak veritabanını tasarlarken işinizi kolaylaştıracaktır. Hatta bu bilgileri bir şema üstünde de gösterebilirsiniz. İşte bir çok VTYS tarafından sağlanan örnek bir şema:


diyagram_1: Bu kısımda anlatılanlar doğrultusunda örnek projemizin SQL Server 2000 üstünde görünen diyagramı. İlişkili her iki tablo bir birincil alan ve bir yabancı anahtar alan üstünden birbirine bağlanır. Projenin tüm şekli yer alacaktır. Aynı diyagramın bir benzerini MS Access ile degerçekleştirebiliriz.

İPUCU:
Farklı tablolardaki iki alan aynı veriyi tutuyorsa, iki alana da aynı adı vermek, karışıklığa yol açabilir gibi görünse de aslında daha düzgün bir yapı ortaya çıkar. KitapNo alanı, Kitap tablosunda da ödünç tablosunda da kitap numarası tutmaktadır. Bu alanlardan birine kitapNo diğerine oduncGidenKitapNo demek, kafa karışıklığına neden olabilir. En Mantıklısı her ikisine de kitapNo demektir


2.7.Veritabanı Normalizasyonu​

Veritabanı normalizasyonu, ilişkisel veritabanında tablolara karar verme anayasasıdır. Veritabanı uygulamasının ciddiyeti arttıkça, bu kurallara uymak zorunluluk arzeder.Aslında ilişkisel veri tabanı tasarımından ziyade bir tablo içerisinde yer alacak kaydın nelerden oluşmasına karar vermeye yarayan normalizasyon kuralları başlı başına bir işlemdir. Sonuç itibari ile veritabanı tasarım aşamasında gerekli bir işlem olduğundan bu bölüme almayı uygun bulduk.Genel kabul görmüş 5 normalizasyon kuralı vardır. Burada her bir kuralı tam olarak anlatmak mümkün değildir.Ancak bu kurllar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuştur. Özet olarak fikri vermesi açısından yer verilmiştir.

1. Normalizasyon Kuralı:
Bir satırdaki bir alan yalnızca bir tek bilgi içerebilir. Örneğin kitap tablosunda, birden fazla yazarı olan kitap için yazar1, yazar2, yazar3 diye alanlar açsaydık, bu kurala uymamış olurduk. Böyle bir durumda, ayrıca yazarlar tablosu da oluşturarak kuralı çiğnememiş oluruz.

Genellikle yapılan hata:
Verileri virgül veya bir başka karakter ile ayırıp aynı alana girmek. Daha sonra program içerisinde split ile bu değerleri ayırmak. Ancak bu ilişkisel veritabanının doğasına terstir.

2. Normalizasyon Kuralı:
Bir tablo için, anahtar olmayan her alan, birincil anahtar olarak tanımlı tüm alanlara bağlı olmak zorundadır. Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi olacaktı ve oduncNo’na bağlı bir nitelik olmayacaktı. Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak sorunu çözdük.

Ya da anahtar alanın birden fazla alandan oluştuğu tablolarda, anahtar alanlardan sadece birine bağlı veriler, tabloda yer almamalı, ayrı bir tabloya taşınmalıdır.

Bunun tersi de geçerlidir. Yani iki ya da daha fazla tablonun birincil anahtarı aynı olamaz. Şayet böyle ise, bu iki tablo tek tabloya indirilmelidir.

3. Normalizasyon Kuralı:
Bir tablo için, anahtarı olmayan bir alan, anahtarı olmayan başka hiç bir alana bağlı olamaz. Örneğin, kitaplarımız için cilt tipi adında bir alan ekleyip burada da karton kapak için K, deri cilt için D, spiral cilt için S yazsaydık, bu kodlama, kitap tablosunun birincil anahtarı olan kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanımızda, karşılığı olmayan bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu olarak tutan alan aslında cilt tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.

Bu durumda, ciltSekli adında bir tablo açmamız gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli olmalıdır. Ancak bundan sonra, kitaplar tablosunda ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları yazabiliriz.


4. Normalizasyon Kuralı:
Birincil anahtar alanlar ile anahtarı olmayan alanlar arasında, birden fazla bağımsız bire-çok ilişkisine izin verilmez. Örneğin, tablomuzda yer alan bir kitap hem hikaye kitabı hem de kişisel gelişim kitabı olabilir.(Bu durumda kitabın adı, kişisel gelişim hikayeleri olurdu her halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz?


4.Normal formu sağlamak için, her bağımsız bire çok ilişki için ayrı bir tablo oluşturmak gerekir.

Bu örnekte, türler diye bir tablo açmamız gerekiyor. Daha sonra kitapTurleri diye bir başka tablo daha açmamız gerekiyor. ‘Kişisel Gelişim Hikayeleri’ adlı kitap için, öncelikle kitap numarası, Hikaye bölümünün kodunun yer aldığı bir satır; ardından da yine kitap numarası, ardından da kişisel gelişim türünün kodunun aldığı yeni bir satır daha eklemek gerekir.

5. Normalizasyon Kuralı:
Tekrarlamaları ortadan kaldırmak için her bir tabloyu mümkün olduğunca küçük parçalara bölmek gerekir. Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar kapsamında olmayan tekrarlamalar da 5.nolu normalizasyon kuralı ile giderilir.

Örneğin, kitaplarımız için bir edinme şekli bilgisi girilecek sütun eklemek isteyelim: Bu bölüme girilebilecek bilgiler bellidir: Bağış veya satın alma.

Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle, kullanıcıların bu alan gelişi güzel bilgiler girmesini engellemiş oluruz. Bu da sorgulama esnasında verilerimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda, tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler başka bir tabloya taşınmış olur. Bu tablo için, veritabanı programlamada ‘look-up table’ terimi kullanılır.

Ancak, veritabanı normalizasyon kuralları, bir ilişkisel veritabanının tasarlanma aşamalarını değil de ilişkisel veritabanında yer alacak kayıtların ilişkisel veritabanı ile uyumlu olup olmadığını denetlemeye yöneliktir.

Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi barındırmalıdır.
* Veri tekrarı yapılmamalıdır.
* Boş yer mümkün olduğunca az olmalıdır.
* Veri bütünlüğü sağlanmalıdır.
* Veriler, aralarında bir ilişki tanımlanmaya müsait olmalıdır.


3.SQL Veri İşleme Dili​

DDL ile tanımlanan nesneleri bir kaba benzetirsek, DML'in görevi bu kabın içini doldurup-boşaltmak ile ilgi şeylerdir.Veri İşleme dili, verinin şablonu üstünde değişiklik yapmaz. Sadece var olan tablolardaki bilgileri uygun şekilde raporlamak(SELECT), yeni kayıtlar eklemek(INSERT), kayıtlar üstünde güncelleme yapmak(UPDATE) ve kayıtları silmek(DELETE) için kullanılır. Veri işleme dili sadece veritabanında kaydı tutulan bilgilerle ilgilenir. Bu bilgilerin nasıl tutulduğu ile ilgilenmez.


RESULTSET, RECORDSET ve DATASET kavramları
VTYS’de bir sorgu çalıştırıldığında, tablo mantığında bir sonuç üretir. Bu sonuca resultset denir. Bir ResultSet, birden fazla tablodan kayıt içerebilir. Bir ResultSet’in içeriği, veritabanı programları geliştirilirken, ADO nesnelerinden RecordSet içerisine aktarılır ve veriler program içerisinde bu nesne aracılığıyla yönetilir. ADO.NET içerisinde ise ResultSet’ler (birden fazla recultSet) ADO.NET içerisinde ise DataSet denilen nesnelere aktyarılabilir . RecordSet ve DataSet konusunu, 3.Kitapçıkta teferruatlı olarak incelenecektir.

3.1.SELECT​

SELECT komutu ile bir veritabanından kayıtlar seçilir, sadece okunur ve gösterilir. SELECT komutunun tek işlevi, VTYS'nin depoladığı yapılandırılmış veriyi kullanıcıya, istediği şekilde sunmaktır.
SELECT [DISTINCT] { * | alan_adi1, alan_adi2, ....., [SUM(alan_adi)], [AVG(alan_adi)], [MAX(alan_adi)], [MIN(alan_adi)], [COUNT( * | alan_adi)]}



FROM tablo_adi1, [tablo_adi2], ...

LEFT [OUTER] JOIN | RIGHT [OUTER] JOIN |INNER JOIN

GROUP BY {alan_adi}

HAVING koşul

ORDER BY sıralamanın yapılacağı alan_adi1 ASC|DESC, alan_adi2 ASC|DESC ,



WHERE koşullar

[alan_adi IN (veri kümesi) | (SELECT işlemi)]

[alan_adi BETWEEN değer1 AND değer2]

[alan_adi LIKE ‘%ifade ? _* %’]

[tablo_adi1.alan_adi = tablo_adi2.alan_adi]

[alan_adi matematiksel operatör ANY|SOME|ALL (SELECT işlemi)]

[EXISTS|NOT EXISTS (SELECT işlemi)];


En Basit SELECT
En basit olarak bir tablodaki tüm kayıtları seçmek için,

SELECT alan1[,alan2, alan3,..... | *]

FROM tablo_adi;


Yapısı kullanılır.

Örnek-1:
Kitaplar tablosundaki tüm kayıtları seçelim:
SELECT * FROM Kitap

Koşula bağlı SELECT ve WHERE Yapısı:
Bazı koşullara uyan bilgileri almamız gerekebilir. Bu durumda WHERE cümleciğini takip eden kısımda, bu şartı belirtebiliriz.

SELECT alan1[,alan2, alan3,..... | *]

FROM tablo_adi

WHERE şart1[AND şart2[OR şart3[NOT şart4>];




Matematiksel Karşılaştırma İşaretleri:
Koşullarda, verilerin durum Matematiksel Karşılaştırma İşaretleri kullanılarak ifade edilir. Bu işaretler Şunlardır:
İşaretİşlev = Eşittir > Büyüktür < Küçüktür >= Büyüktür veya Eşittir(Büyük-Eşit) <= Küçüktür Veya Eşittir(Küçük-Eşit) <> Eşit Değildir != Eşit Değildir LIKE bkz Like

Örnek-2:
KitapNo 12&#8217;den büyük olan kitapları seçelim:



SELECT * FROM Kitap

WHERE kitapNo>12;




Örnek-3:
Sayfa sayısı 200&#8217;den fazla olan ve kitap numarası da 12&#8217;den büyük olan kitapların listesi:



SELECT * FROM Kitap

WHERE kitapNo > 12 AND sayfaSayisi > 200;





Mantıksal İşaretler
Birden fazla koşula göre seçme işlemi yapılırken, AND, OR, NOT mantıksal operatörlerinden faydalanılır.

Mantıksal fonksiyon tabloları şu şekildedir:
AND İŞARETİ:Şartlardan her ikisini de sağlayan kayıtları seçmek için kullanılır..

X(1.Şart)Y(2.Şart) SONUÇ(X AND Y)
0 0 0(Seçimez)
1 0 0(Seçilmez)
0 1 0(Seçilmez)
1 1 1(Seçilir)


OR İŞARETİ: Şartlardan en az birinin sağlanması halinde, kayıtlar seçilir.


X(1.Şart)Y(2.Şart)SONUÇ(X OR Y)
0 0 0(Seçilmez)
1 0 1(Seçilir)
0 1 1(Seçilir)
1 1 1(Seçilir)


NOT İŞARETİ: Şartı sağlamayan kayıtları bulmak için kullanılır.

X(Şart)NOT X(Şartın tersi)
0 1(Seçilir)
1 0(Seçilmez)

Bu fonklsiyonların dışında XOR ve XNOR işlemleri de bazı VTY&#8217;leri tarafından desteklenmektedir. Bu iki komutla ilgili bir işleme ihtiyaç duyarsanız başka kaynaklardan detaylı olarak bakmanızda yarar olabilir. Ancak bu iki komut pek nadir kullanılmaktadır.

Örnek-4:
Kitap No 12&#8217;den büyük olan veya, sayfa sayısı 200&#8217;den büyük olan veya adı &#8216;Visual Basic.NET&#8217; olan kitapların listesi:



SELECT * FROM Kitap

WHERE kitapNo > 12

AND sayfaSayisi > 200

OR KitapAdi='Visual Basic.NET';




İPUCU:
Birden fazla şartın yer aldığı koşullarda parantez kullanılarak şartların sırası değiştirilebilir, mantıksal operatörlerin etkileyeceği şartlar sınırlandırılabilir.şekilde tercih etmek okunurluğu artıracaktır.

Örnek-5:
Kitap No 12&#8217;den büyük olan veya, sayfa sayısı 200&#8217;den büyük olan veya adı &#8216;Visual Basic.NET&#8217; olan ama ISBN NO &#8216;975-316-622-2&#8217; olmayan kitapların listesi:



SELECT * FROM Kitap

WHERE (kitapNo > 12 AND sayfaSayisi > 200 OR KitapAdi='Visual Basic.NET') AND ISBNNO <> '975-316-622-2';
 
Revengeful

Revengeful

Emekli Yönetici
    Konu Sahibi
İleri Seviye Select Cümlecikleri​


Bu bölümde ileri seviye SELECT cümleciklerini ele alacağız.Sadece Belli Alanları Seçmek


Bir sorguda illa da tabloda yer alan tüm sütunları görmek zorunda olmayabiliriz. Sadece ihtiyacımız olan alalardaki verileri seçmek için, SELECT&#8217;ten sonra bu alanların adını araya virgül koyarak yazarsak, sadece bu alandaki veriler gelir.

Örnek-6:

select uyeNo,adi,soyadi

FROM uye;




DISTINCT ile Sonuçları Tekilleştirmek


Birden fazla tekrarlayan kayıt döndüren SELECT işlemlerinde, her bir kaydın tekil olarak yer almasını istiyorsak DISTINCT deyimi kullanılır.

Örnek-7:
Üye tablosundaki isimlerin tekil bir listesini almak isteyelim:

SELECT DISTINCT adi

FROM uye;



Üyelerimizden adaş olanların adı sadece bir kez gelecektir.

IN ile İç İçe Sorgular


Bir veri kümesini belli bir alanında içeren kayıtları bulmak istediğimizde, IN sözcüğü kullanılırız:

Örnek-8:
1,5 ve 6 nolu kitapların ödünç hareketlerini görmek için

SELECT *

FROM odunc

WHERE kitapNo=1 OR kitapNo=5 OR kitapNo=6;




Yerine



SELECT *

FROM odunc

WHERE kitapNo IN(1,5,6);

Kullanımı daha kolaydır.




İç içe SELECT yapısı:
Bazen bir sorgunun içinde başka bir sorgu yer alabilir.

DİKKAT:
İç içe SELECT özelliği bazı küçük ve orta ölçekli VTYS&#8217;lerde desteklenmemektedir.

Örnek-9:
Dışarıdaki Kitaplarımızı bulmak istersek:
Dışarıdaki kitapların numaralarını ödünç tablosundan çekecek bir sorgu yazalım(GeldiMi=0 olan kitaplar dışarıda olan kitaplar. Birileri tarafından ödünç alınmış ve henüz iade edilmemiş demektir.)



SELECT kitapNo FROM odunc WHERE geldiMi=0




Ve bu sorguyu, kitaplar tablosundan, karşılık gelen kitap numaralarını seçecek şekilde IN() komutuna girdi ürettirelim:



SELECT *

FROM Kitap

WHERE kitapNo IN(

SELECT kitapNo FROM odunc WHERE geldiMi=0

);




Örnek-10:
Aynı yöntem ile İçerdeki Kitaplarımızı bulalım:
İçerideki kitaplar, dışarıda olmayan kitaplardır. Bundan dolayı da yukarıda içerde kullanıdğımız sorgu aynen duracak ama bu sefer kitap numaraları bunlara eşit olmayan kitapların listesini bulacağız.



SELECT *

FROM Kitap

WHERE kitapNo NOT IN(

SELECT kitapNo FROM odunc WHERE geldiMi=0

);




ANY, SOME ve ALL Deyimleri ile Çoklu Sonuç Döndüren Alt Sorgu Sonuçlarını Karşılaştırmak


Bazı iç içe sorgularda, SOME, ANY veya ALL deyimi ile dışarıdaki SELECT ifadesinin seçeceği kayıtlar karşılaştırma kriterine göre kullanılabilir.

ANY veya SOME ışarıdaki SELECT ifadesi sonucunda çıkacak kayıtlar, içerideki SELECT ifadesi ile seçilen alan değerlerinden en az birine göre kıyası sağlıyorsa ( küçük,büyük, eşit, büyük eşit, küçük eşit) seçilir.

Örnek-11:
3,5 ve 11 nolu kitapların herhangi birinden kalın olan ve kitap no da 11&#8217;den büyük olan kitapların listesini bulalım:

SELECT kitapNo,kitapAdi,sayfaSayisi

FROM Kitap

WHERE sayfaSayisi > ANY( SELECT sayfaSayisi

FROM Kitap

WHERE kitapNo IN(3,5,11)

)

AND kitapNo>11




ALL:
Dışarıdaki SELECT ifadesi sonucunda çıkacak kayıtlar, içerideki SELECT ifadesi ile seçilen alan değerlerin tümüne göre kıyası sağlıyorsa ( küçük,büyük, eşit, büyük eşit, küçük eşit) seçilir.

Örnek-12:
3,5 ve 11 nolu kitapların tamamından kalın olan ve kitap no da 11&#8217;den büyük olan kitapların listesini bulalım:



SELECT kitapNo,kitapAdi,sayfaSayisi

FROM Kitap

WHERE sayfaSayisi > ALL( SELECT sayfaSayisi

FROM Kitap

WHERE kitapNo IN(3,5,11)

)

AND kitapNo>11




EXISTS ve NOT EXISTS ile İçerideki Sorgudan Kayıt Dönüp Dönmediğine Bakmak


EXISTS kullanıldığında, dışarıdaki sorguda, bir veya daha fazla kayıt dönerse, dışarıdaki sorgu çalıştırılır. Hiç kayıt dönmezse, dışarıdaki sorgu çalıştırılmaz. NOT EXISTS ise içerideki sorgunun sonucunda sıfır kayıt dönüyorsa, dışarıdaki sorgunun çalıştırılması için kullanılır.

DİKKAT:
EXISTS yapılarda, içteki select ifadesinin
SELECT *
İle başladığına dikkat edin. Bu hep bu şekilde kullanılır.

Örnek-13:
5 nolu kitap ödünç verildi ise kitapNonu ve kitap bilgilerini seçelim:

SELECT KiTAPNO,KiTAPADi

FROM KiTAP

WHERE EXISTS(SELECT * FROM ODUNC WHERE GELDiMi=0)

AND KiTAPNO=5;




UNION(BİRLEŞTİRME) ile Tablo ve Seçme Sonuçlarını Düşeyde Birleştirmek


UNION komutu, iki SELECT sorgusunun sonucunu veya iki tabloyu tek bir sonuç halinde alabilmek için kullanılır. Bunun için, iki SELECT ifadesinin eşit sayıda ve veri tipinde sütundan oluşan(eş değer) sonuçlar veriyor olması gerekir.

Genel kullanımı şu şekildedir:



1.SELECT İFADESİ....



UNION



2.SELECT İFADESİ....



Örnek-14:
Sisteme kayıtlı kişilerin bir kısmını (kitap yazarları ve üye isimlerini) bir tek listede görmek isteyelim:
Yazarlardan ilk 2&#8217;sini seçelim:



SELECT adi,soyadi

FROM yazar

WHERE yazarNo < 3;





Üyelerin ilk 2&#8217;sini seçelim:
SELECT adi,soyadi

FROM uye

WHERE uyeNo < 3;






SELECT adi,soyadi

FROM yazar

WHERE yazarNo < 3

UNION

SELECT adi,soyadi

FROM uye

WHERE uyeNo < 3;



Kesişim Bulma


İki tablonun veya iki SELECT sorgusunun sonucunun kesişimini bulmaya yarar. Yani her iki tabloda da bulunan kayıtları bulma işine KESİŞİM denir.
Birkaç yolu vardır:

Örnek-15:
Hangi yazar isimleri aynı anda üye adı olarak da yer almaktadır?
Şu isimler Yazarlar tablosunda bulunmaktadır:
Şu isimler üyeler tablosunda bulunmaktadır:






SELECT adi

FROM yazar

WHERE EXISTS

(SELECT *

FROM uye

WHERE yazar.adi = uye.adi)




EXCEPT Deyimi ile Fark Bulma


İki SELECT sorgusu sonucu veya iki tablo arasındaki farkı bulmaya denir. Bu işlem için de bir çok yöntem kullanılabilir. NOT IN, NOT EXISTS bunlardan ikisidir.

Örnek-16:
Hangi kitaplar ödünç verilmemiştir?



SELECT *

FROM Kitap

WHERE kitapNo NOT IN(

SELECT kitapNo FROM odunc WHERE geldiMi=0

);







İPUCU:
Bir WHERE cümleciğinden sonra gelen şart ne olursa olsun, doğru olduğu sürece SELECT kısmından sonra gelen kısım çalıştırılır. Bu şarta yer alan değerlerden bir tarafın illa da alanlardan biri olması gerekmez. İkisi de sabit birer değer olabilir. 1=1 doğru bir şarttır. Bunun tersi de geçerlidir. Yanlış bir şart varsa, SELECT&#8217;i takip eden alanlar asla seçilmez 1=0 yanlış bir şarttır.

Örnek-17:
Şu ifade tüm kayıtları seçecektir.



SELECT *

FROM Kitap

WHERE 1=1;



Çünkü 1=1 doğru bir ifadedir.


Örnek-18:
Şu ifade, hiç bir kaydı seçemez.



SELECT *

FROM Kitap

WHERE 1=0;




Çünkü 1=0 doğru değildir.
Bu iki durum, veritabanı programları yazarken özellikle arama-sorgulama ekranlrında çok büyük dertlerden kurtarabilir.

BETWEN.... AND.... ile Aralık Sorgulamak


Bir Aralık içersinde sorgulama yapmak için BETWEEN altSinir AND ustSinir şeklindeki yapı kullanılır.

Örnek-19:
Sayfa Sayısı, 300 ile 500 arasındaki Kitapların listesini almak istediğimizde,



SELECT *

FROM Kitap

WHERE sayfaSayisi>300 AND sayfaSayisi < 500;



Yerine



SELECT *

FROM Kitap

WHERE sayfaSayisi BETWEEN 300 AND 500;



de diyebiliriz.


Farklı Karşılaştırma Seçenekleri​

Karakter karşılaştırmaları ve Boşluk karşılaştırmaları bu bölümde anlatılacaktır.KARAKTER KARŞILAŞTIRMALARI:
Karakter ifadelerin (tarih ve metin tipli veriler) karşılaştırması da rakamlarla aynıdır.
Örnek-20:
Adı Önümüzdeki Yol olan kitabı seçmek için



SELECT *

FROM Kitap

WHERE kitapAdi= 'Önümüzdeki Yol';





Kullanılabilir.

Ancak karakter ifadelerin nasıl yazıldığı ve içeriğinin tam olarak ne olduğunu birebir kestirmek zor olduğu için, bazen seçimi genişletmek üzere = yerine LIKE deyiminden de faydalanılır.
Like
Örnek-21:
Adı Önümüzdeki Yol olan kitabı LIKE komutu ile seçmek için



SELECT *

FROM Kitap

WHERE kitapAdi LIKE 'Önümüzdeki Yol';





Aslında bu yapının bir önceki örnekten bir farkı yok. Ancak takip eden örneklerde, LIKE2in avantajlarını öğreneceğiz.

JOKER KARAKTERLER:

Seçimi biraz genişletelim ve adında &#8216;yol&#8217; geçen Kitapları listelemek istesek?Bu durumda joker karakterleri kullanmamız gerekecektir. &#8216;%&#8217; ve &#8216;_&#8217; veya &#8216;?&#8217; karakterlerine joker karakterler denir.


Joker Karakterler
% : Birden fazla harf veya rakamın yerini tutar.
* : Bazı sistemlerde, birden fazla harf ve rakam yerini tutar.
_ : Bir tek harf veya rakam yerini tutar (Bir çok sistemde)
? : Bir tek harf veya rakam yerini tutar (Bazı diğer sistemlerde)
[ABC] : Herhangi bir harf yerine gelebilecek harfleri belirtir.(SQLServer,Sybase)
[^ABC] : Herhangi bir harf yerine gelemeyecek harfleri belirtir.(SQL Server, Sybase)



DİKKAT:
Joker karakterler &#8216;=&#8217; ile kullanılamaz. Sadece LIKE ile kullanılabilir.

Örnek-22:
Adında yol geçen kitapların bir listesini alalım:




SELECT *

FROM Kitap

WHERE kitapAdi LIKE '%Yol%';





Örnek-23:
Adının ilk harfi &#8216;Y&#8217; olan üyelerin listesi.
Tüm üyelerin listesini görmek için bkz.


SELECT *
FROM uye
WHERE Adi LIKE 'Y%';



Örnek-24:
Adının Son harfi &#8216;R&#8217; olan listesini kitapların listesini alalım:



SELECT *
FROM Kitap
WHERE kitapAdi LIKE '%R';



Örnek-25:
İkinci harfi &#8216;A&#8217; olan Kitapların listesi:


SELECT *
FROM Kitap
WHERE kitapAdi LIKE '_A%';



Şeklinde arama yapabiliriz.

Örnek-26:
İkinci harfi A, B, D veya C&#8217;den biri olan Kitapların listesi



SELECT *

FROM Kitap

WHERE kitapAdi LIKE '_[AE]%'





Örnek-27:
İkinci harfi E, S, R, I ya da N den biri olmayan kitaplarının listesi



SELECT *

FROM Kitap

WHERE kitapAdi LIKE '_[^ESRIN]%';





KARŞILAŞTIRMA
Bazen bir alana değer girilmiş olup olmadığın karşılaştırmak zorunda kalabiliriz. Örneğin, kitaplığımızda yer alan Kitapdan hangileri için yazar bilgileri girilmediğini bilmek isteriz.

için karşılaştırma yaparken, IS deyimi kullanılır. Boşluk olmayan alanlar için karşılaştırma yaparken ise IS NOT deyimi kullanılır.
SELECT alanlar
FROM tablo_adi
WHERE alan_1 IS [NOT] ;

Örnek-28:
ISBN numarası olmayan kitapların listesi:



SELECT *

FROM Kitap

WHERE ISBNNo IS ;



3.4.ORDER BY​

ORDER BY, SELECT cümlesinin en sonunda yer alabilen cümlecik olup, seçilen sonucu sıralamya yarar.SELECT işlemi ile elde edilen sonucun bir alana göre sıralanmış olarak listelenmesini isteyebiliriz. Bu durumda ORDER BY deyimi kullanılır.
Genel Yapısı şu şekildedir:

SELECT alanlar
FROM tablo_adi
WHERE şartlar
ORDER BY sutun1 [DESC|ASC][,sutun2 [DESC|ASC],.....];

ASC bir alana göre ARTAN sıralatmak için kullanılır. Aslında artan-azalan şartı verilmediğinde de normalde artan sıralanır. Ancak kayıtların azalan sırada sıralanması isteniyorsa, mutlaka DESC kullanılmak zorundadır.
Örnek-29:
soyadında &#8216;e&#8217; geçen yazarları alfabetik sıralatalım; Öncelikle soyadlara göre sıralansın, soyadı aynı yazarlar için de ada bakılsın:



SELECT *

FROM yazar

WHERE soyadi LIKE '%e%'







SELECT *

FROM yazar

WHERE soyadi LIKE '%e%'

ORDER BY soyadi,adi





İPUCU:
Sıralama yapılan sütunların mutlaka seçilen sütunlar arasında yer almasına gerek yoktur.

Örnek-30:
Soyadını seçmeden de soyadına göre sıralayabiliriz:



SELECT yazarNo,adi

FROM yazar

WHERE adi LIKE '%e%'

ORDER BY soyadi DESC,adi


4.GROUP BY Komutu ve Gruplamalı Fonksiyonlar​

Bazne elimizdeki verileri önce gruplara ayırıp daha sonra bu gruplardan her birinin;-en büyük, en küçük, toplam, ortalama gibi değerlerini bulmak durumunda kalabiliriz. Bu durumda Gruplamalı fonksiyonlar ve GROUP BY komutu kullanılır.Bazen verileri gruplandırarak işlem yapmak zorunda kalabiliriz. Genellikle veriler gruplandığında her bir grup için şu işlemlerden biri yapılmak isteniyor demektir; grup toplamı, grup ortalaması, grubun en düşüğü, en fazlası.... Bu bölümde, kitap tablomuzun biraz değişik bir hali üstünde çalışacağız. Bu yapı, normalizasyon kurallarına uymaz, ancak GRUPLAMA konusunu anlamak açısından oldukça yararlı bir yapıdır.




Bu türden işlemleri yapan fonksiyonlara GRUPLAMALI FONKSİYONLAR (Aggrigate Functions) denir.
Gruplamalı Fonksiyonlar(Aggregate Functions):
SUM(sutun_adi): İstenilen bir sütundaki değerlerin toplamını verir. Sayı türü olan veriler için geçerlidir.

Örnek-31:
Kitaplığımızda toplam kaç sayfa kitap olduğunu bulmak istersek:




SELECT SUM(sayfaSayisi)

FROM Kitap;

>>3611



ALANA TAKMA AD(ALIACE): Bazı durumlarda, sorgu sonucunda yer alan bir alanın adını farklı bir ad olarak kullanmak isteyebiliriz. Bu tür durumlarda alan adından sonra AS deyimi gelir ve takma ad belirtilir.

Örnek-32:
Bir önceki örneği alana takma ad ile yaparsak:



SELECT SUM(sayfaSayisi) as TOPLAM

FROM Kitap;





AVG(sutun_adi):İstenilen bir sütun için ortalama değeri hesaplamada kullanılır. Sayı türü veriler için geçerlidir.

Örnek-33:
Kitaplığımızdaki her bir kitap için ortalama sayfa sayısı (Aritmetik ortalama):



SELECT AVG(sayfaSayisi) AS ORTALAMA

FROM Kitap;





MAX(sutun_adi): Referans sütuna göre en büyük değeri bulmada kullanılır. Sayı türden veriler için geçerlidir

Örnek-34:
Kitaplığımızdaki en kalın kitap:



SELECT MAX(SayfaSayisi) AS EnKalinKitap

FROM Kitap;





MIN(sutun_adi): Referans sütuna göre en küçük değeri bulmada kullanılır. Sayı türden veriler için geçerlidir.

Örnek-35:
Kitaplığımızdaki en ince kitap:



SELECT MIN(SayfaSayisi) AS EnInceKitap

FROM Kitap;





Pek kullanılmasa da şu iki fonksiyon da gruplamalı fonksiyondur.
VARIANCE(sutun_adi): Grup varyansını bulur.
STDDEV(grup_adi): Grup standart sapmasını bulur.

COUNT(*): Kayıtların tamamını saymak için kullanılır. Sayı olmasına gerek yoktur.

Örnek-36:
Kitaplığımızdaki Kitapın sayısı:



SELECT COUNT(*)

FROM Kitap;

>>16



COUNT(sutun_adi): Referans sütuna göre toplam kaç kayıt yer aldığını bulur.


İPUCU:
COUNT(*) ile COUNT(sutun_1) arasındaki fark:
COUNT(*) tüm kayıtların sayısını verirken, COUNT(sutun_1) sadece sutun_1 adlı alan için olmayan kayıtların sayısını verir.

Örnek-37:
Yazarlar tablosunda, tüm yazarların doğum tarihi henüz girilmemiştir. Bu durumda iken, yazarların sayısını COUNT(*) ve bir de COUNT(dogum) olmak üzere iki farklı şekilde seçelim:



SELECT COUNT(*)

FROM yazar;

>> 20





SELECT COUNT(dogum)

FROM yazar;

>> 0




COUNT DISTINCT sutun_1 : sutun_1&#8217;de kaç farklı değer tekrarladığını sayar.
Tüm üyeler için bkz.

Örnek-38:
Kütüphanedeki üye sayısı:



SELECT COUNT(*)

FROM UYE

>>9



Kütüphanedeki üyelere ait farklı isim sayısı:


SELECT COUNT(DISTINCT adi)
FROM uye;
>>6


İPUCU:
GROUP BY&#8217;ı ORDER BY ile işlev olarak karıştırmamak gerekir. GROUP BY verilerin gruplara göre sıralanmış olmasından ziyade, gruplara göre hesaplama yapılması ihtiyacı olduğunda kullanılmalıdır. Sonuçların sıralaması ile ilgili her şey için ORDER BY kullanmak gerekir.

Bu kısa örneklerden sonra, grupsal fonksiyonların gruplar üstünde nasıl kullanıldığına yakında bakalım.

Örnek-39:
Elimizdeki Kitapları türüne göre gruplandırdığımızda, her bir grupta kaç kitap yer alıyor?



SELECT turu,COUNT(*)

FROM Kitap

GROUP BY turu;

>>





Örnek-40:
Elimizdeki Kitapı türlerine göre grupladığımızda her bir türden toplam kaç sayfa kitabımız var?



SELECT turu,SUM(sayfaSayisi) AS grupBasiToplamSayfa

FROM Kitap

GROUP BY turu;





Örnek-41:
Elimizdeki Kitapları türlerine göre grupladığımızda her bir tür için ortalama kitap sayfa adedini bulalım ama sayfa sayısı 400&#8217;den fazla olan Kitapları ve 75&#8217;den az olan Kitapları ortalamanın dışında tutalım(Hesaba katmayalım).



SELECT turu as TURLER, AVG(SayfaSayisi) AS grupOrtalamaSayfa

FROM Kitap

WHERE sayfaSayisi BETWEEN 75 AND 400

GROUP BY turu;





İPUCU:
Kayıt filtrelemede kullanılacak şartlar arasında gruplamalı Fonksiyonu kullanmayı gerektiren bir şart varsa, HAVING deyimi ile belirtilir.

Örnek-42:
Bir arkadaşınız sizin kütüphane olayında otomasyona geçtiğinizi gördü ve şöyle bir soru yöneltti:
Her bir türden toplam kaç kitabın var?
Ve ekledi: ha bu arada, 2 kitaptan az olan türleri saymayacaksın...
İşte cevabı:



SELECT turu,COUNT(*)

FROM Kitap

GROUP BY turu

HAVING COUNT(*)>=2;




Örnek-43:
Aynı arkadaşınız abarttı ve şu soruyu yöneltti:
Her bir türde toplam kaç sayfa kitabın var?
Ve ekledi
Bu arada, kitap numarası 10&#8217;dan küçük olan Kitapın muhtemelen eskidir, sayma. Bir de Ortalaması 175 sayfayı aşmayan türleri de görmek istemiyorum, çünkü muhtemelen bu türlerde yeterince kalın kitaplar yok.

En az sayfa kitap bulunan tür en altta yer alacak şekilde liste verebilir misin?
Öncelikle şu ifadenin sonucuna bakalım:



SELECT turu,SUM(sayfaSayisi) sayfaSayisi

FROM Kitap

WHERE kitapNo>10

GROUP BY turu






SELECT turu,SUM(sayfaSayisi) sayfaSayisi

FROM Kitap

WHERE kitapNo>10

GROUP BY turu

HAVING AVG(sayfaSayisi)>175

ORDER BY SUM(sayfaSayisi) DESC;




HAVING ifadesinden sonra, hikaye türü gelmemektedir. Çünkü grup ortalaması 166&#8217;dır ve bu da HAVING şartında verilen değerin altındadır.


5.JOINING(Tabloları Birlikte Sorgulama)​

İlişkisel veritabanı demek, kayıtları az yer kaplayacak kadar parçalama ve hiç parçalanmamış gibi bir arada kullanabilmek demektir.Bu kısımda kullanılan tabloların ilişkisel yapılarını anlamak için bkz. (Diyagram_1.jpg)
İlişkisel veritabanının en temelinde birden fazla tablo üstünde birlikte işlem yapabilmek yatar. Bu sayede verilerin tekrarlaması önlenmiş olur ve sonuçta veri yönetimi kolaylaşır.

Örneğin, Kitap tablomuzda, Kitapın bir tekil numara ile listesini tutuyoruz ve odunc listesinde de bu Kitapın kim tarafından alındığının, geri getirilip getirilmediğinin kaydını tutuyoruz.
Bazen, bu iki tablodaki bilgilere de bir tek sorgu sonucu olarak ihtiyaç duyarız. Örneğin elimizde öyle bir sonuç olmalıdır ki, hangi kitabın kim tarafından ödünç alındığını bir listede görmemiz gereksin.

Bu iki tablo birbirine, kitapNo alanı ile bağlıdır. Çünkü, ödünç verilen bir kitap hakkında detaylı bilgi edinmek istediğimizde, odunc listesinden kitap numarasını alırız, daha sonra Kitap tablosundan aynı numarayı bulur ve karşılığındaki kitap hakkındaki detayları görebiliriz.

İPUCU:
Tabloların birbiri ile arasında bir ilişki tanımlanmadan ilişkisel sorgu yapılırsa, kartezyen çarpımı bulunur. Bu, &#8216;1.Tablodaki her bir kayıt ile 2. Tablodaki her bir kayıt ilişkilidir&#8217; demektir ve ilişkisel veritabanın doğasına terstir.

Örnek-44:

SELECT *

FROM Kitap, odunc;



Sorgusunun sonucunda, Kitap tablosunda 50, odunc tablosunda 100 kayıt varsa, (50*100=5000) 5000 satırlık bir bu iki tablo için kartezyen çarpım sonucu bulunur.
Klasik Join
İki tabloyu birlikte sorgulamanın en kolay yolu, asıl tablodaki birincil anahtar ile ikinci tablodaki yabancı anahtarı birbirine eşitlemektir.



SELECT tablo1.alan1|tablo2.alan1[tablo1.alan2,...]

FROM tablo1, tablo2

WHERE tablo1.birincilAnahtar=Tablo2.yabanciAnahtar [AND diğer şartlar]



Örnek-45:
Şu anda dışarıda olan Kitapın listesini alalım:

SELECT Kitap.*

FROM Kitap,odunc

WHERE Kitap.kitapNo=Odunc.kitapNo AND odunc.geldiMi=0;




Tabloya Takma Ad(Alice)


Birden fazla tablo üstünde işlem yaparken, sık sık tablo isimleri kullanılır. Bu da bir kelime kalabalığı olarak karşımıza çıkar. Bunun önüne geçmek için tabloların yerine takma ad verip o adları kullanabiliriz.

İPUCU:
Takma adlar tabloların ismini kısaltmanın yanı sıra başka işlerde de kullanılır. Genellikle tablolar için takma ad seçilirken kısa olması açısından 2 veya tek harf lakaplar tercih edilir.

Örnek-46:
Dışarıda olan Kitapların adlarını,hangi tarihte alındığını ve kimde olduklarını bulalım:

SELECT K.kitapAdi,O.vermeTarihi,u.Adi,U.Soyadi

FROM Kitap K, odunc O,Uye U

WHERE K.kitapNo = O.kitapNo AND O.UyeNo=U.uyeNo AND O.geldiMi=0;





Bir Tabloyu Kendisi ile İlişkilendirme


Bir tabloyu kendisi ile ilişkilendirerek sorgulamamız gerektiğinde aynı tabloya farklı iki takma adı atayıp, farklı iki tablo üstünde ilişkili sorgu yapıyormuş gibi ilişkili sorgu yapılabilir. İyi tasarlanmış bir veritabanında bu tür ilişki pek kullanılmaz.Genellikle verilerin doğruluğunu (veya tutarsızlığını) test etmede kullanılır.

ÖRNEK-47:
Kitap tablomuzda, bazı Kitapın adları hatalı okunduğu için aynı ISBN numarası ile farklı kitap adları girilmiş olup olmadığını test etmek ve sonucu görmek istersek:



SELECT K1.KitapAdi,K1.ISBNNo,K2.kitapAdi,K2.ISBNNO

FROM Kitap K1, Kitap K2

WHERE K1.ISBNNo=K2.ISBNNo AND K1.KitapAdi<>K2.KitapAdi;

>>0 kayıt seçildi.



Çünkü ISBN numaralarında bir hata yok.
Left [Outer] Join
İki tablo arasında ilişkili sorgu yapılırken, LEFT OUTER JOIN kullanıldığında, birinci tablodaki tüm kayıtlar getirilir. 2. Tabloda ise sadece ilişkiye göre uygun kayıtlar sağ tarafına eklenir.
Genel kullanımı,
...



FROM tablo1 LEFT JOIN tablo2

ON tablo1.alan1 karşılaştırma tablo2.alan2;



Şeklindedir.

Örnek-48:

Tüm üyelerin bir listesini, yanına da ödünç aldıkları kitap varsa, kitap numarasını sıralayalım



SELECT uye.Adi,odunc.KitapNo

FROM uye LEFT JOIN odunc ON odunc.uyeNo=uye.uyeNo





Right [Outer] Join


İki tablo arasında ilişkili sorgu yapılırken, RIGHT OUTER JOIN kullanıldığında, ikinci tablodaki tüm kayıtlar getirilir. 1. Tabloda ise sadece ilişkiye göre uygun kayıtlar sağ tarafına eklenir.

Genel kullanımı,

...

FROM tablo1 RIGHT JOIN tablo2

ON tablo1.alan1 karşılaştırma tablo2.alan2;


Şeklindedir.

Örnek-49:
Ödünç alınmış Kitaplardan dışarıda olanların listesini bulunuz:

SELECT Kitap.kitapAdi

FROM Kitap

RIGHT JOIN odunc ON odunc.KitapNo=Kitap.KitapNo

WHERE odunc.geldiMi=0;





[Inner] Join


INNER JOIN en çok kullanılan tablo birleştirme yöntemidir. İki tablo arasında birleştirme yaparken, tablolardan her ikisinde de yer alan değerler seçilir, tek tabloda yer alan değerler seçilmez.

İPUCU:
LEFT JOIN ve RIGHT JOIN, aslında birer OUTER JOIN ifadeleridir. Bir çok sistem OUTER ifadesinin yazılmasını isterken, MS temelli sistemlerde kod yazıyorsanız, böyle davranmak zorunda değilsiniz.

Aslında, Klasik Join ile INNER JOIN aynı şeydir. Sadece birleştirmede kullanılan teknik farklıdır.

...

FROM tablo1 INNER JOIN tablo2

ON tablo1.alan1 karşılaştırma tablo2.alan2;




Örnek-50:
LEFT JOIN örneğindeki sorguyu INNER JOIN ile çalıştıralım. Bu durumda, hiç kitap ödünç almayan üyelerin sonuçta yer almadığına dikkat edin.

SELECT uye.Adi,odunc.KitapNo

FROM uye INNER JOIN odunc ON odunc.uyeNo=uye.uyeNo




Sadece iki tabloyu JOIN edilebilir diye bir kısıtlama yoktur. İkiden fazla tabloyu da ihtiyacımıza göre JOIN edebiliriz.

Örnek-51:
Bu güne kadar kimin hangi kitabı ödünç aldığının dökümünü bulmak istersek:

SELECT Kitap.kitapAdi,uye.Adi,uye.Soyadi

FROM (odunc INNER JOIN Kitap ON Kitap.KitapNo=Odunc.kitapNo)

INNER JOIN uye ON uye.UyeNo = odunc.uyeNo;




Bazı sistemlerde kodlama yaparken, INNER ifadesi yer almamalıdır. Aksi halde sorgunuz çalışmayabilir. Bu farklılığın nedeni, JOIN ON ifadesi ANSI-SQL&#8217;in bir parçası değildir. Ancak VTYS üreticileri, WHERE şartında yer alan diğer koşullar ile, tablo ilişkilendirme koşullarının bir birinden kolayca ayırt edilmesi için standartlarda yer alan klasik join ile birlikte bu türden ifadeleri de desteklemektedirler.

6.Yeni Kayıt Eklemek: INSERT Komutu​

Tablolara, yeni bir kayıt eklemek için INSERT komutundan faydalanırız.Bir tabloya SQL ile kayıt eklemek için INSERT deyimi kullanılır.



INSERT INTO tablo_adi(alan1[,alan2,....])

VALUES(deger1[,deger2,....])



Alan adı sırası ile, değer sıralamasının aynı olması gerekir. değeri alabilen(girilmesi zorunlu olmayan alanlar) alanlar için değer girilmeyecekse boş bırakılabilir.

Örnek-52:Yeni bir kitap ekleyelim.



INSERT INTO Kitap(KitapAdi,SayfaSayisi, kitapOzeti)

VALUES('Photoshop Efektleri',330,'Photoshop efektlerini yakından tanıyın');

>> 1 adet Kayıt Eklendi



DİKKAT:
Bir tabloya metin ifadeler eklenirken, metinlerin tek tırnak arasına alınması bir kuraldır. Bazen değer olarak tek tırnak (&#8216;) girmek gerekebilir. Bu durumda, &#8216; yerine &#8216;&#8216; yazılır. Aksi halde SQL&#8217;in sentaksının bozulacağına dikkat edin. Bu türden durumlara kaçınma anlamında &#8216;escape&#8217; durum denir.

Örnek-53:



INSERT INTO Kitap(KitapAdi, ISBNNo, SayfaSayisi, kitapOzeti)

VALUES('Ahmet'in Günlüğü', '975-509-170-X', 330,'Bir polisin anıları');

>> Incorrect syntax near the keyword 'in'.



Bu kayıt eklenemeyecektir. Aksine in kelimesi SQL komutu olan In zannedilecek ve arkasından açılan tek tırnak kapanmamış olarak algılanacaktır.


Bunun yerine



INSERT INTO Kitap(KitapAdi, ISBNNo, SayfaSayisi, kitapOzeti)

VALUES('Ahmet''in Günlüğü', '975-509-170-X', 330,'Bir polisin anıları');

>> 1 adet Kayıt Eklendi



demek gerekir.
Bir Tablodan Seçilen Kayıtları Başka bir Tabloya Ekleme:
Bazı durumlarda, bir tabloda yer alan kayıtları başka bir tabloya aktarmak durumunda kalabiliriz.

Örnek-54:
Dışarıdaki Kitapımızı tutmak üzere bir tablo oluşturmamız gerekirse, bunları doğrudan bir seçme işleminin sonucunu bu yeni tabloya ekleme şeklinde de yapabiliriz:



INSERT INTO disardakiKitap(kitapNo,KitapAdi,Bedeli)

SELECT kitapNo,KitapAdi,Bedeli FROM Kitap

INNER JOIN odunc ON odunc.KitapNo=kitap.kitapNo

WHERE odunc.GeldiMi=0;

>> 3 adet Kayıt Eklendi

7.Güncelleme komutu: UPDATE​

Yanlış girdiğimiz verileri düzeltmek istediğimizde UPDATE komutu kullanılır.Bir kayıt üstünde değişiklik yapmak gerektiğinde, UPDATE deyimi kullanılır. Yapısı şu şekildedir:



UPDATE tablo_adi

SET alan1=yeniDeger1[, alan2=yeniDeger2, ....]

[WHERE sart]



DİKKAT:
Bir UPDATE cümlesinde WHERE şartı olmazsa, istenilen değişiklik tabloda yer alan tüm kayıtlar için yapılacağından dikkat edilmelidir. Böyle bir durumda data kaybı ile karşılaşabilirsiniz.

İPUCU:
Bir UPDATE cümleciğinde yeni değer, daha önce veritabanında yer alan bir başka değerden türetilebilir.

Örnek:



UPDATE kitap

SET kitapBedeli = kitapBedeli*1,18;

>>17 KAYIT GÜNCELLENDİ


8.Silme Komutu: DELETE​

-Tabloda yer alan kayıtların tamamını veya bir kısmını silmek için DELETE deyimi kullanılır.
Genel kullanımı şu şekildedir:



DELETE

FROM tablo_adi

[WHERE sart];



DİKKAT:
Bir DELETE cümlesinde WHERE şartı olmazsa, istenilen silme işlemi tabloda yer alan tüm kayıtlar için yapılacağından dikkat edilmelidir. Böyle bir durumda data kaybı ile karşılaşabilirsiniz.

Örnek-55:
Soyadı &#8216;OZAN&#8217; olan üyeleri silmek istersek:



DELTE

FROM uye

WHERE soyad LIKE '%OZAN%'

>>1 KAYIT SİLİNDİ


9.GENEL SQL FONKSİYONLARININ KULLANIMI​

Fonksiyonar, belli bir işlevi yerine getirmek üzere genelleştirilmiş kod parçacıklarıdır. Ancak SQL'deki fonksiyonlar, SQL'in çalıştırıldığı ortam tarafından sağlanabilir. Biz fonksiyon yazamayız.
ARİTMETİK İŞARETLER
Her yerde olan aritmetik işlemleri SQL&#8217;de de geçerlidir.
+ :Toplama
- :Çıkartma
* :Çarpma
/ :Bölme
% :Mod(Bazı Sistemlerde MOD da kullanılır)


İPUCU:
Bir DELETE cümleciğine şart konmazsa tabloda yer alan tüm kayıtlar silinir. Bir Sorguyu çalıştırmadan önce doğru kayıtları silmek istediğinizden emin olunuz. Böyle bir durumda data kaybı ile karşılaşabilirsiniz.

SQL&#8217;de oldukça fazla sayıda fonksiyon yer almamaktadır. Bundan dolayı bazı VTYS tarafından ek fonksiyonlar da sağlanabilmektedir. Kullanmakta olduğunuz VTYS&#8217;nin kılavuzuna bakarak daha fazla sayıda fonksiyonun kullanımı hakkında bilgi edinebilirsiniz. Burada sistem bazlı ama sık kullanılan bazı fonksiyonlar hakkında da bilgi verilecektir. SQL Server 2000&#8217;in sunduğu fonksiyonları bir sonraki bölümde ve ek kısmımızda bulabilirsiniz.
Tarih-Zaman Fonksiyonları:
GETDATE(): Microsoft ve Sybase temelli sistemlerde sitem tarihini bulur. DATE() olarak da geçebilmektedir.
SYSDATE(): Oracle&#8217;de aynı işlevi yerine getirir.
NOW(): MS temelli sistemlerde, anlık detaylı zamanı(gün-ay-yıl-saat-dk-sn) verir.

Örnek-56:
Üstünde çalıştığımız VTYS&#8217;de şu anki vakti almak için;



SELECT GETDATE()

>>6/22/2003 11:39:19 PM



Dememiz yeterli olacaktır.(MS SQLServer için)
Aritmetik Fonksiyonlar:
MOD(sayi,mod): Sayı&#8217;nın mod değerine bölümünden kalanını veririr. ORACLE&#8217;de geçerlidir. MS sistemlerde bir operatör gibi görev yapar.

Örnek-57:
Ödünç verme sürelelerinin 15 güne göre modunu alalım:



MS Access için:

SELECT vermeSuresi MOD 15 AS GUNMOD15

FROM odunc

WHERE kitapNo=1



MS SQL Server için:

SELECT vermeSuresi % 15 AS GUNMOD15

FROM odunc

WHERE kitapNo=1



Oracle için:



SELECT MOD(vermeSuresi ,15)

FROM odunc;



Şeklinde yazmamız gerekecektir.
ABS(sayi): Sayının mutlak değerini bulur.
COS(),SIN(),TAN(),COSH(),SINH(),TANH():Trigonometr ik fonksiyonların aynısıdır. Ancak, Oracle Sistemler için açı değeri olarak verilen değerin RADYAN cinsinden olması gerekir.
LN(sayi): Doğal logaritma almak için(e tabanlı logaritma) kullanılır.
LOG(sayi,taban): İstenilen bir sayının yine istenilen bir tabanda logaritmasını almak için kullanılır.
POWER(sayi,us): Bir sayının üssünü almak için kullanılır.
SIGN(sayi):Bir sayının yönünü belirtir. Negatif için &#8211;1, Pozitif için +1 sıfır için 0 döndürür.
SQRT(sayi): Bir sayının karekökünü alır.
Karakter İşleme Fonksiyonları:
CHR(): Bir ASCI kodunun karakter karşılığını döndürür.
CONCAT(metin1,metin2): İki veya daha fazla karakter ifadeyi uç uca eklemek için kullanılır.
MS temelli sistemlerde, + ile bu iş yapılabilirken ORACLE&#8217;de ancak || operatörü veya CONCAT fonksiyonu ile bu iş yapılabilir.

Örnek-58:
Kitap Adları ile yazarlarının adlarını bir tek alan olarak seçtirmek istersek:



SELECT kitapAdi + yazarAdi

FROM Kitap



Oracle&#8217;de

SELECT kitapAdi || yazarAdi

FROM Kitap;



veya



SELECT CONCAT(kitapAdi,yazarAdi)

FROM Kitap



Şeklinde kullanılabilir.

INITCAP(karakter): İlk harfi büyük yapar.(Oracle)
REPLACE(karakter,ifade,yerinegelecekIfade): İfadeleri bulup değiştirir. (SQLServer2000,SYBASE)
LOWER(metin), UPPER(metin) : Tamamı Küçük veya tamamı büyük harf yapmak için kullanılır.(Oracle)
LCASE(metin) ve UCASE(metin):Tamamı Küçük ve tamamı büyük harf yapmak için kullanılır. (MS)
LTRIM(metin), RTRIM(metin), TRIM(metin): Soldaki, sağdaki veya her iki taraftaki boşlukları atmak için kullanılır.
LENGHT(metin): Bir metnin uzunluğunu verir.(Oracle)
LEN(metin): Bir metnin uzunluğunu verir.(MS temelli Sistemler)
Dönüştürme Fonksiyonları
CONVERT(veritipi[(uzunluğu)], sütu adı, format): Bir verinin bir formattan başka bir formata dönüştürülmesi için kullanılır.

Örnek-59:
Üyelik Numarasının sonu 1 olan üyelerimizin listesini alalım:



SELECT uyeNo,Adi,soyadi

FROM uye

WHERE CONVERT(VARCHAR(4),uyeNo) LIKE '%1'



CAST(kolonAdi as CevirilecekVeriTipi(N)): Bir sütunun ya da verinin türünü başka bir türe değiştirmek için kullanılır.(SYBASE,MS SQL Server)

Örnek-60:



SELECT CAST(yazarNo as VARCHAR(4)) + ' '+adi +' '+soyadi

FROM yazar
 
Kobra_FighterTR

Kobra_FighterTR

Üye
Teşekkürler :D
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...


Üst Alt