Veritabani Programlama 1 - byte dergisi

56
Veritabanı Programlama Temmuz 2003 Veritabanı Programlama Yaşar Gözüdeli Eğitim dizisi

description

byte

Transcript of Veritabani Programlama 1 - byte dergisi

Page 1: Veritabani Programlama 1 - byte dergisi

Veritabanı Programlama

Temm

uz 2003V

eritabanı Program

lama

Yaşar Gözüdeli

Eğitim dizisi

Page 2: Veritabani Programlama 1 - byte dergisi

VeritabanıProgramlama

1Temmuz 2003

Yaşar GÖZÜDELİ

Bu ek kopyalanamaz, satılamaz. Her hakkı saklıdır.

BYTE’ın okurlarına ücretsiz armağanıdır.

© 2003 BYTE

BYTE bir Acar Yayıncılık Yayınıdır

Page 3: Veritabani Programlama 1 - byte dergisi

İÇİNDEKİLERÖnsöz........................................................................ 6Bu kitapta..................................................................................8Veritabanı Yönetim Sistemleri.................................................................. 8Veritabanı Nerelerde Kullanılır?............................................................... 9

1.İlişkisel Veritabanı Kavramı ..................................................12Günlük Hayatta ilişkisel Veritabanı......................................................... 12Temel Kavramlar1......................................................................................... 13Tablolar: ........................................................................................................... 13Değişken İsimlendirme Kuralları............................................................. 14İlişkisel Veritabanı Yönetim Sistemleri: ................................................. 14 2.SQL Veri Tanımlama Dili (Data Definition Language).........20Temel Veri Tipleri:.......................................................................................... 20Veritabanı: ....................................................................................................... 20Tablolar: ........................................................................................................... 21Tablo Oluşturma ........................................................................................... 21Kısıtlar(Constraint) oluşturma :................................................................ 22Tablo silme:..................................................................................................... 23Tabloda Değişiklik Yapma:......................................................................... 23İndeksler: ......................................................................................................... 23View’ler ............................................................................................................ 24Veritabanı Tasarımı:...................................................................................... 251.Nesneleri Tanımlayın:............................................................................... 262.Her nesne için bir tablo oluşturun: ..................................................... 263.Her bir tablo için bir anahtar alan seçin: ........................................... 264.Nesnelerin gerekli her bir özelliği içintabloya bir sütun ekleyin ........................................................................... 275.Tekrarlayan nesne özellikleri için ek tablolar oluşturun.............. 276.Anahtar alana bağlı olmayan alanları belirleyin ............................ 287.Tablolar arasındaki ilişkileri tanımlayın ............................................. 29Veritabanı Normalizasyonu ...................................................................... 29 3.SQL Veri İşleme Dili (Data Maniplation Language).............321.ResultSet Kavramı..................................................................................... 322.Select............................................................................................................. 32En Basit Select................................................................................................ 32

Page 4: Veritabani Programlama 1 - byte dergisi

Koşula bağlı Select ve Where Yapısı: ...................................................... 32Matematiksel Karşılaştırma İşaretleri: ................................................... 33Mantıksal İşaretler ........................................................................................ 33Sadece belli alanları seçmek..................................................................... 35Distinct ............................................................................................................. 36In......................................................................................................................... 36İç içe Select Yapısı: ........................................................................................ 36Any, Some, All ................................................................................................ 37Exists, not Exists ........................................................................................... 38Union (Birleştirme)....................................................................................... 38Kesişim Bulma:............................................................................................... 39Except(Fark Bulma) ...................................................................................... 39Between .... and .... ... ................................................................................... 40Karakter Karşılaştırmaları:Like.................................................................. 40Null Karşılaştırma......................................................................................... 423.Sonuçları Sıralama:Order By ................................................................. 434.Kayıtları Gruplama:Group By ................................................................ 44Gruplamalı Fonksiyonlar(Aggregate Functions): .............................. 44Alana Takma Ad ............................................................................................ 445.Tabloları Birleştirme:Joining ................................................................. 49Klasik Join........................................................................................................ 50Tabloya Takma Ad(Alias) ............................................................................ 50Self-join ............................................................................................................ 50Left [Outer] Join ............................................................................................ 51Right [Outer] Join ......................................................................................... 51[Inner] Join...................................................................................................... 526.Kayıt Ekleme:Insert................................................................................... 53Bir Tablodan Seçilen Kayıtları Başka bir Tabloya Ekleme:............... 537.Kayıt Güncelleme:Update...................................................................... 548.Kayıt Silme:Delete..................................................................................... 549.Genel SQL Fonksiyonları......................................................................... 55Aritmetik İşaretler......................................................................................... 55 Tarih-Zaman Fonksiyonları:....................................................................... 55Aritmetik Fonksiyonlar: .............................................................................. 55Karakter İşleme Fonksiyonları: ................................................................. 56Dönüştürme Fonksiyonları ....................................................................... 57

Page 5: Veritabani Programlama 1 - byte dergisi

Veritabanı Programlama 1 BYTE 7

ÖnsözBasit bir Web uygulamasından, devasa

kuruluşların ağır verilerine kadar, günü-

müzde bir çok alanda veritabanı uygu-

lamalarına ihtiyaç duyulmaktadır. Seri

özellikle, Web projeleri gibi küçük çaplı

işlerinde Veritabanı kullanmak zorunda

kalan, ama bu konuda başlangıç aşa-

ması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 bilen-

ler için bile seyrek kullanılan komutlara

bir yerlerden bakmak bazen bir zorunlu-

luk arz edebilmektedir. İşte kitapta böyle

bir ihtiyacı da karşılamak üzere SQL’i

enine boyuna ele aldım. Özellikle yapıla-

bilecek 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 kurgu-

lamak 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,

Sorumlu Yazı İşleri Müdürü:Murat Yıldı[email protected]

Yönetici Editör:İbrahim Ö[email protected]

Editörler:Burak Kahyaoğ[email protected]

Üsame İldar Ö[email protected]

Tasarım ve Uygulama:Yağız [email protected]

ACAR Yayıncılık adına imtiyaz sahibi:Murat Yıldız

Reklam Müdürü:Ahmet Aslantürk

Baskı:ETAM A.Ş.

Film Çıkış:Figür

Merkez Ofis:Fulya Cad. Fulya Bayırı Sk.

Bilsan Plaza 11/4 80300Mecidiyeköy - İSTANBUL

Tel: (212) 212 62 06Faks: (212) 212 62 11

www.byte.com.tr

Page 6: Veritabani Programlama 1 - byte dergisi

Veritabanı Programlama 1 BYTE 7

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 uygulama 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

kitap ortaya çıktı.

Özellikle SQL’e adanan ilk kitapçıkta

olmak üzere, kolay ama çok şey öğrenil-

mesi gerektiğinden, serinin tamamındaki

konu anlatımları sık sık ve kolaydan zora

doğru giden örneklerle desteklendi. İlk

kitapçıkta yer alan örneklerin bir çoğunu,

www.verivizyon.com/sqlkitabi adre-

sinde online simülasyon üstünde test

edebilirsiniz.

Veritabanının tarihi gibi , uygulama

geliştirme açısından çok da etkili olma-

yan konuları maalesef bu seride bulama-

yacaksınız. Bu türden kuru bilgiler için

bakılabilecek en iyi yer, bu konuda eğitim

veren yüksek öğretim kurumlarımızda

okutulan ders kitapları 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üleceği, neyin istemci programa

bırakılacağı konularının okurlar tarafın-

dan daha iyi anlaşılacağı kanaatindeyim.

Bu kitap sayesinde SQL’i tanıyan prog-

ramcıların bunu nerede nasıl kullanacak-

larını geniş örneklerle hem de güncel

teknolojiler ışığında öğrenebilecekleri bir

seri ortaya çıkmış olacak.

Emeği geçen herkese teşekkürü borç

bilirim.

-Yaşar GÖZÜDELİ

[email protected]

Page 7: Veritabani Programlama 1 - byte dergisi

8 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 9

İlk olarak, İlişkisel Veritabanı kavramını yakından tanıyacağız. Böylelikle hayatta karşılaşılan bilgiye dayalı projelerin

nasıl veritabanı mimarisine uyarlanacağını öğreneceğiz.

İkinci bölümde, SQL komutlarını iki gruba ayırarak inceleyeceğiz. Öncelikle, veritabanı tasarlamaya yönelik komutları öğreneceğiz. Bu gruba giren komutlar için Veri İşaretleme Dili deyimini kullanacağız. Veri İşaretleme Dili ile sadece verilerin sak-lanacağı ortama dair düzenlemeler yapılır.

Son olarak Veri İşleme Dili terimi altında, İlişkisel veritabanı destekli veri işleme komutlarını öğreneceğiz. Bu komutlarla veritabanına kayıt eklemek, veritabanından kayıt silmek, var olan kayıtlar üstünde güncelleme yapmak gibi işlemleri öğreneceğiz.

Bu konuya yeni başlamayı planlıyor-sanız, önce ilk bölümü, ardından hazır bir veritabanı üstünde 3. bölümü uygulama-nız, son olarak ikinci bölümde kod yazarak nasıl veritabanı tasarlayabileceğinizi öğre-nebilirsiniz. 2.bölümü anlamak zorunda değilsiniz.

Artık bir çok VTYS ortamında, verita-banı şemalarını düzenlemeniz için görsel arayüzler mevcuttur. Ancak bir proje üstünde çalışmak isterseniz, öncelikli olarak nesneleri tasarlayıp veritabanı şemasını ortaya çıkarmak gerekir. Ancak daha sonra veri işleme işlemlerine geçi-lebilir.

GİRİŞSQL(Es-kü-el okunur) insanların verita-banı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil sayesinde, bir veri-tabanı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 grup-lanıp diske kaydedilmesi işine veritabanı yönetimi denir. Veritabanlarından en popüler olanı, ilişkisel veritabanıdır. İlişki-sel 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) standart-ları 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 kul-lanılan dil tümü için de ortaktır ve SQL’dir.

Veritabanı Yönetim Sistemleri (VTYS) Veri Tabanı Yönetim Sistemleri, fiziksel hafızada bilgileri çeşitli özelliklerine göre

Bu Kitapta...

Page 8: Veritabani Programlama 1 - byte dergisi

8 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 9

gruplandırıp şekillendirdik-ten sonra saklayan prog-ramlardır. Kısaca VTYS diye adlandıracağız. VTYS, sakla-nan bu veriyi, SQL komut-ları ile insanların istekleri çerçevesinde işler, yeniden şekillendirirler. Yani, Verita-banı 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.

Veritabanı Yönetim sistemleri, her zaman bir kullanıcıya, yönetim ekran-larından bilgi vermek için kullanılmaz. Bazen kullanıcı konumunda doğrudan bir insan yerine bir program da olabilir.

Bir veritabanı programcısı, veritabanını çekip çevirmenin yanında, VTYS’ye bağla-nıp veri alış-verişi ve veri üstünde değişiklik yapan bu ‘istemci programları’ da yazabilen kişidir.

Veritabanı istemci programları 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 uygula-maları yapabiliyor olmak bu iş için başlan-gıçta yeterlidir.

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 otomas-yonu, muhasebe programları ve daha bir çok otomasyon programı temelde verita-banı projesidir. Günlük hayatta eritabanı programlama telefon şirketleri tarafından yoğun olarak kullanılır. Konuşmaların süre-leri 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 yüzbinlerce abonenin birbirini aradığı bir durumun içinden başka hangi yolla çıkılabilir ki?

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.

Page 9: Veritabani Programlama 1 - byte dergisi
Page 10: Veritabani Programlama 1 - byte dergisi

1. Bölüm

Page 11: Veritabani Programlama 1 - byte dergisi

12 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 13

İlişkisel VeritabanıKavramıİlişkisel veritabanı günümüzde en yaygın kullanılan ilişkisel veritabanı sistemle-rinden 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ılabi-lir 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 www.verivizyon.com/sqlkitabi adresin-den 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 sakla-mak üzere tasarlanır. Tablolar, satırlardan ve sütunlardan oluşur.

Bu bölümde, bu yapıları yakından tanıyacağız.

Günlük Hayattaİlişkisel VeritabanıBir çoğumuzun başına gelmiştir. Arka-daşlara, eşe dosta bir çok kitap, kaset, CD veririz ve... Gidiş o gidiş! Böyle bir sorunla nasıl başa çıkarız? Bu konuda bir proje

geliştirelim:Öncelikle elimizdeki bütün Kitapla-

rı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:

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 arka-sı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

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.

Page 12: Veritabani Programlama 1 - byte dergisi

12 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 13

şimdi bir de ödünç listesi 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 geti-rilip getirilmediğini kolayca takip edebili-riz. 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 tablolar-dır. Hayatta bir çok şeyi listelerle çözeriz. Her bir listeye karşılık, veritabanı mantı-ğında bir tablo gelir.

Temel KavramlarVeriler fiziksel hafızada Veri Dosyala-rı(DataFiles) halinde saklanır. Dosya, bilgisayarların bilgileri birbirinden ayıra-rak 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.

Tablolar: Bir tablo yani günlük hayattaki ‘liste’ kav-ramı, satırlardan ve sütunlardan oluşur. Mesela Kitap listemizi(yani Kitap tablo-muzu) 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.

Her bir alan, yapılandırılmış verinin bir birimini tutmak üzere tanımlanır. Her bir sütunun adı ile birlikte diğer bilgilerini-n(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ütun-ların yan yana gelmesiyle meydana gel-miş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

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.

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

Page 13: Veritabani Programlama 1 - byte dergisi

14 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 15

her birine bir kayıt denir. Yani, alan bilgi-leri ile birlikte her bir satır bir kayıttır. Bir kitap bilgisini ele alacak olursak,

Bu 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çerme-sidir.

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üründen soru-ları 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ı, zor-layı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.

Anahtar (Key): 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 Key, Unique Key, Foreign Key gibi türevleri vardır.

İlişkisel VeritabanıYönetim Sistemleri: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 Sistemle-ri’(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 edebil-mek için en az iki tablonun yer alması gere-kir 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

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

Page 14: Veritabani Programlama 1 - byte dergisi

14 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 15

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 tablo-sundaki 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 key) alandır, çünkü Kitap tablosundaki bir kaydı sembolize etmektedir.

Tüm bunların ardından VTYS’leri hak-kında özet olarak diyebiliriz ki;

Bir İlişkisel Veritabanı Yönetim Sistemi tablolar üstünde şu üç işlevi yerine getir-mek zorundadır.

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. Ayrılmış kelimeler değişken adı olamazlar (select,

like, not, or, delete, update vs.)

5. SQL büyük-küçük harf duyarlı değildir.

6. Değişken isimlerinde boşluk yer alamaz.

Değişken isimlendirmenotasyonları:

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.

NULL 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 karak-

teri) 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 NULL terimi kullanılır.

Değişken İsimlendirme Kuralları

Page 15: Veritabani Programlama 1 - byte dergisi

16 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 17

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çme-mizi sağlayan kitapNo’na ise yabancı anahtar(fore-ign key) denir.

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

Page 16: Veritabani Programlama 1 - byte dergisi

16 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 17

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.

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.

3. Birleştirme: Birden fazla tabloda yer alan bilgileri, yeri geldiğinde tek bir tabloy-muş gibi sunabilmelidir. Örneğin, ödünç alınıp da geri getirilmeyen kitabın adlarını ve kimler tarafından alındığını bir tek tab-loymuş gibi gösterebilmelidir.

VTYS bu 3 temel işlevi yerine getirmeli-dir. Bunlardan üçünü, ikisini veya birini aynı anda yerine getirmek durumunda kalabi-liriz. Ö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 depo-landığı, kullanıcı bilmek zorunda kalmaz. Yani, kullanıcı temel veri saklama işlem ve yöntemlerinden izole edilmiş olur. Kulla-nı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 alanlar-dan oluşacağı, hangi alana hangi aralıkta veri girileceği vb. gibi işlemler bu gruptadır.

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

SQL komutlarının bu şekilde gruplan-dırılmasının nedeni, SQL’den ziyade, veri yönetimi konusundaki mantıktan kaynak-lanmaktadı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

Kitaplar listesi üstünde bir iz düşürme işlemi Kitap-ların kitap No’nu, Adını ve sayfa sayısını alıyoruz. Diğer sütunları almıyoruz.

Page 17: Veritabani Programlama 1 - byte dergisi

hangi gruba girer? Peki ödünç verme süre-sinin 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.

Page 18: Veritabani Programlama 1 - byte dergisi

2. Bölüm

Page 19: Veritabani Programlama 1 - byte dergisi

20 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 21

SQL Veri Tanımlama Dili(Data Definition Language)SQL’i yeterince bilmiyorsanız, bu bölüm-den önce 3.Bölümü okumanız ve örnek-leri bir veritabanı üstünde yapmanız önerilir. Bundan sonra, bu bölümü kav-ramanız kolaylaşacaktır. Ancak bir proje geliştirirken öncelikle veriyi tanımlamak gerekir. Bu nedenle bu bölüme ö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ım-lama CREATE deyimi ile oluşturulur. DROP deyimi ile de tanımlamadan vaz-geçilip silinir. ALTER deyimi ise bir tanım-lama üstünde değişiklik için kullanılır.

Bu bölümde ve takip eden bölüm-lerde, örneklerden hemen sonra ‘>>’ konulduktan sonra bir mesaja yer veril-miştir. Bu mesaj SQL ifadesinin sonu-cunda ne olduğunu göstermektedir.

Temel Veri Tipleri:SQL’de yeni bir veri tipi tanımlayamayız. Sadece var olan veri tiplerini kullanabi-liriz. 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.

Veritabanı:Veritabanı, içerisinde tabloları barındıran veritabanı mimarisinin en büyük ögesidir. Bir veritabanı şu şekilde açılır:

CREATE DATABASE database_name

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 kulla-

nı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 ORACLE’da cümle-

lerin sonuna ; konulması gerekirken, Microsoft

tabanlı sistemlerde bu türden bir zorunluluk

bulunmamaktadı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.

Page 20: Veritabani Programlama 1 - byte dergisi

20 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 21

Örnek-1:CREATE DATABASE dbKutuphane;Ve şu şekilde silinir:DROP DATABASE database_name

Örnek-2:DROP DATABASE dbKutuphane

Tablolar:

Tablo OluşturmaCREATE TABLE tablo_adi(kolon_adi1 veri_tipi[NOT NULL][,kolon_adi2 veri_tipi[NOT NULL],.......])ile yeni bir tablo oluşturulur.

Örnek-3:CREATE TABLE Kitap(kitapNo INTEGER NOT NULL CONS-

TRAINT cnsKitapNo PRIMARY KEY,kitapAdi VARCHAR(63) NOT NULL,

ISBNNo VARCHAR(15),Turu VARCHAR(20),sayfaSayisi INTEGER,kitapOzeti VARCHAR(255))ile örneğimizdeki tabloyu oluştura-

biliriz.>> OLUŞTURMA İŞLEMİ BAŞARI İLE

YAPILDI

TEMEL VERİ TİPLERİINTEGER(boyut): Tam Sayı

INT(boyut): Tam Sayı

SMALLINT(boyut): Küçük Tam Sayı

TINNYINT(boyut): Nümerik tam 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

LOGICAL(BIT): BIT,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 (CHA-

R,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

(sayı)

Page 21: Veritabani Programlama 1 - byte dergisi

22 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 23

Kısıtlar (Constraint) Oluşturma:Kısıtlayıcılar, tabloların oluşturulması sıra-sında tabloların bir parçası olarak tanıla-nır. MS Access ve SQLServer’de kullanılır. Aşağıdaki işlevleri yerine getirebilirler:

1. INDEX gibi, birincil anahtar alan tanım-layabilirler (PRIMARY KEY): Bu durumda standart olarak Clustred Index gibi davra-nırlar.(bkz. INDEX’ler)

2. INDEX gibi tekil alan belirleyebilirler. (UNIQUE KEY)

3. Tablo oluşturma esnasında da yapıla-bilen, (NOT NULL) alan belirleyebilirler

4. Yabancı Anahtar belirleyebilir-ler.(FOREIGN KEY)

Primary Key: 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 key belirler. Bu, bazen bir tek alan olabileceği gibi, bazen birden fazla alan da birleşerek bir birincil anahtar oluşturabilir.

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

Foreign Key: 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şki-lendirmeye yarar.

Örneğin, olmayan bir kitabın ödünç tablosuna eklenememesi ve ödünç tab-losuna eklene bir kitabın numarası aracı-lığıyla detay bilgilerine erişilmesi. Burada Kitap.KitapNo birinicil anahtar alan; Odunc.kitapNo ise yabancı anahtardır.

Genel yapısı şu şekildedir:CONSTRAINT constraint_name PRI-

MARY KEY | UNIQUE | NOT NULL | REFE-RENCES 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 olmayabilir-ler. Özellikle yabancı anahtar zorlayıcısı ilişkisel veri girişi için oldukça etkili bir zorlayıcıdır. Ancak bir Foreign Key tanımı yapabilmek için, FOREIGN KEY yabancı anahtarının asıl tablosunda birincil anah-tar olması gerekir.

Örnek-4:CREATE TABLE Kitap (kitapNo int NOT NULL ,kitapAdi varchar63),ISBNNo varchar (15),sayfaSayisi int ,kitapOzeti varchar (255)

Page 22: Veritabani Programlama 1 - byte dergisi

22 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 23

)>>OLUŞTURULMA İŞLEMİ BAŞARI İLE

YAPILDIveyaCREATE TABLE odunc(oduncNo int NOT NULL ,kitapNo int NOT NULL ,uyeNo int NOT NULL ,vermeTarihi datetime NOT NULL,vermeSuresi int NOT NULL ,geldiMi bit )>>OLUŞTURULMA İŞLEMİ BAŞARI İLE

YAPILDI

Tablo silme:Bir tabloyu kullanmaktan vazgeçer-

sek: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 NULL][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 COLUM-

N kitapBedeli INTEGER NOT NULL;>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI

İLE YAPILDIdememiz gerekirdi.

Örnek-7:Bu sütunu silmek için,ALTER TABLE Kitap DROP COLUM-

N kitapBedeli;>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI

İLE YAPILDI

İndeksler:Kütüphanemizdeki Kitapın raflardaki dizi-lişlerini ele alalım. Bir kitap aradığımızda, Kitapımız bir kurala göre dizilmiyorsa, her bir kitaba teker teker bakmamız gere-kir. 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 ara-maya devam ederiz. Aynı şekilde yazarla-rı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 bula-biliriz.

Veritabanlarında indeks oluşturarak, verileri veritabanındaki kayıtlı oldukları sıradan başka bir sırada gösterebiliriz.

Page 23: Veritabani Programlama 1 - byte dergisi

24 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 25

Temelde İndekslerin ilişkisel veritaba-nı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öste-rirler.

3. Sorguların neticelenme sürelerini kısaltırlar.

CREATE [UNIQUE] INDEX index_adiON tablo_adi(kolon_adi1[,kolon_adi-

2,...][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’sunu vermek mümkün olamaya-caktır. Bunu bizim yerimize VTYS denet-leyecektir.

Bir indeksi silmek için:DROP INDEX tablo_adi.indeks_adideyimi 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

silelimDROP INDEX Kitap.indKitapNo>>NESNE SİLİNME İŞLEMİ BAŞARI İLE

YAPILDI SQL Server’de Index sırasına göre veri-

lerin 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şturu-labilir.(Bir çokluk kümesini fiziksel olarak aynı anda kaç farklı şekilde sıralayabiliri-z?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.

View’lerBazen, tabloları olduklarından farklı gösterecek filtrelere ihtiyaç duyarız. Bu türden işlevler için ANSI SQL VIEW kullanmayı önerir. VIEW’ler, saklanmış sorgulardan ibarettir. Aslında tablo gibi kullanılsa da böyle bir tablo halihazırda yoktur.

VIEW’ler şu görevler için kullanılır:*Kullanıcıların bazı kritik tabloların

sadece belli sütunlarını veya satırlarını görmesi istendiğinde,

*Kullanıcıların, çeşitli birim dönü-şümlerinden geçmiş değerler görmeleri gerektiğinde,

*Halihazırdaki tablolarda var olan verilerin başka bir tablo formatında

Page 24: Veritabani Programlama 1 - byte dergisi

24 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 25

sunulması gerektiğinde*Çok kompleks sorguları basitleştir-

mek için Örneğin Kitap tablomuzdaki sadece

Bilgi Teknolojileri türündeki kitabımızın yer alacağı bir VIEW şu şekilde oluşturu-labilir:

CREATE VIEW view_adi [(kolon1, kolon2...)] AS

SELECT tablo1.kolon_adi_1FROM tablo_adi;

Örnek-10CREATE VIEW vwBTKitapi(kitapNo,Ki-

tapAdi,ISBNNo, SayfaSayisi,Ozeti)ASSELECT kitapNo,KitapAdi,ISBNNo,

SayfaSayisi,OzetiFROM KitapWHERE turu = ‘Bilgi Teknolojileri’;

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

Veya şu şekilde de oluşturabiliriz:

Örnek-11CREATE VIEW vwBTKitaplari ASSELECT *FROM kitapWHERE kitapNo > 5>>NESNE OLUŞTURMA İŞLEMİ BAŞARI

İLE YAPILDIView’ler, tablolar üstünde yapılan bir

çok işlemi destekler.Örnek:Bir önceki View üstünde

seçme işlemi yapalım: Seçme işlemi de ne demek diyorsanız, Lütfen öncelikle 3.bölüme bir göz gezdiriniz...

Örnek-12SELECT *FROM vwBTKitapiBir view, başka bir View’in alanlarına

referans içerebilir. Ya da bir view bir tablo ile ilişkisel sorguya girebilir.

View’ler şu şekilde silinir:DROP VIEW view_adi;

Örnek-13:DROP VIEW vwBTKitapi;>>NESNE SİLİNME İŞLEMİ BAŞARI İLE

YAPILDI

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.

DİKKAT:1.MSAccess’de VIEW oluşturulamaz. SQLSer-

ver, SyBase, Oracle gibi orta ve büyük ölçekli

VTYS’lerde oluşturulabilir.

2.Bu kısımdaki SELECT komutunu anlamak için,

öncelikle 3.Ünite’ye göz atmanız önerilir.

DİKKAT:View’ler sonuç itibarı ile gerçek anlamdaki

tablolar değildir. Bundan dolayı View’ler

üstünde ekleme veya güncelleme yaparken

çeşitli kısıtlamalar vardır.

Page 25: Veritabani Programlama 1 - byte dergisi

26 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 27

Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını oku-manı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ı uygulanması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 ilgilen-meyeceğiz.

Örnek-14:Birkaç örnek proje için nesneleri vere-

cek olursak,

Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri

E-ticaret sistemi: Ürünler, müşteriler, siparişler,teslimat, fatura bilgileri,üretici-ler,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.

3.Her bir tablo için bir anahtar alan seçin:Veritabanındaki herhangi bir veriye erişmeden önce tabloya erişilir. Bir verita-banında en çok muhatap olunan nesne grubu genellikle tablolardır. Buraya kadar hangi tabloları oluşturacağımıza karar verdik. Her bir tablonun içinde hangi bilgileri saklayacağımızı kabaca biliyo-ruz. 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

İPUCUTablolara 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 bulun-

duracak tablonun adını Kitap koymak oldukça

mantıklıdır.

Page 26: Veritabani Programlama 1 - byte dergisi

26 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 27

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ıtlama-dığı 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ç tra-fiğ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 bulun-ması 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 olabi-lir.Bu bir kargaşaya neden olabilir. Çünkü eski kitabı kime, yeni kitabı kime verdiği-nizin takibini ISBN numarası ile mümkün değildir. Ancak bir E-Ticaret sitesi tasar-larken, stoktaki tüm kitaplar 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 özel-liği için bir alan(sütun) ekleyin.

Ö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 atma-nız hangi özelliklerin yer alması gerektiği konusunda karar vermenize yardımcı olacaktır.

5.Tekrarlayan nesne özellikleri için ek tablolar oluşturunAklınızda hep şu olmalı: veri tekrarı olacak mı? Veri tekrarı olacaksa bir yer-lerde 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ı

İPUCU1.En başa birincil anahtar olarak belirlediğiniz

alanı eklemek bir kural değildir, ancak tab-

lonuzun 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. ogrenci

tablosu için ogrenciID gibi.

Page 27: Veritabani Programlama 1 - byte dergisi

28 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 29

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 sis-teminde bir ürünün birden fazla reyonda yer alması gerekli olabilir. Veya bir kitap birden fazla kişi tarafından yazılmış ola-bilir..

Bir kitap için birden fazla türü kayde-debilmeyi 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 bil-giler tekrar edecektir. Ya da bir süre sonra, kitap hakkında girilen bilgilerin yanlış olduğunu fark ettiniz. Hangi kaydı gün-celleyeceksiniz? 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 kitap-tan 10 ayrı türde yer alan kitaba kadar bütün olasılıklar için bir çözüm geliştir-miş oluruz.

6.Anahtar Alana Bağlı OlmayanAlanları 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ği-mizde, 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 ken-disine bağlı bir özelliktir. Bu kişinin her aldığı kitap için adresini tekrar yazmaya gerek yoktur. Aynı şekilde otomasyon içerisinde başka yerlerde de bu kişinin adres bilgilerine muhtemelen ihtiyaç duyulabilir çünkü adres, üyenin bir özel-liğ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 ala-

Page 28: Veritabani Programlama 1 - byte dergisi

28 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 29

nına bir bağlantı (yabancı anahtar) içer-mesi daha doğru olur.

7.Tablolar arasındaki ilişkileritanımlayın.Her biri bir nesneye dair özellikleri barın-dıran tabloların tümünü göz önüne alın ve birbirleri ile olan ilişkilerini tanımlamaya çalışın. Örneğin kitabı ö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.uyeNoTur.turNo(1)---(∞)Kitap_tur.turNoKitap.kitapNo(1)---(∞)Kitap_tur.kitapNoYazar.yazarNo(1)--- (∞)kitap_

yazar.yazarNoİki tablo arasında ilişkiyi sağlayan alan-

ları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ği-nizde 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 fizik-sel 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:

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 benze-

rini MS Access ile de gerçekleştirebiliriz.

İPUCUFarklı 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 tablo-

sunda 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.

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

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ğne-

memiş 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

Veritabanı Normalizasyonu

Page 29: Veritabani Programlama 1 - byte dergisi

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.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ç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 normalizasyon

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.

Page 30: Veritabani Programlama 1 - byte dergisi

3. Bölüm

Page 31: Veritabani Programlama 1 - byte dergisi

32 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 33

SQL Veri İşleme Dili(Data Maniplation Language)Veri İşleme Dili, verinin şablonu üstünde değişiklik yapmaz. Sadece var olan tablo-lardaki 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 İşleme Dili sadece veritaba-nında kaydı tutulan bilgilerle ilgilenir. Bu bilgilerin nasıl tutulduğu ile ilgilenmez.

1.RESULTSET(RECORDSET, DATASET)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ştirilir-ken, ADO nesnelerinden RecordSet içeri-sine 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 aktarılabilir . RecordSet ve DataSet konusu, sonraki kitapçıkta teferruatlı olarak incelenecektir.

2.SELECTSELECT [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 JOINGROUP 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_adi-

2.alan_adi][alan_adi matematiksel operatör

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

En Basit SELECTEn 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ümle-ciğini takip eden kısımda, bu şartı belir-tebiliriz.

SELECT alan1[,alan2, alan3,..... | *] FROM tablo_adi WHERE şart1[AND şart2[OR şart3[NOT

şart4]]];

Page 32: Veritabani Programlama 1 - byte dergisi

32 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 33

Örnek-2:KitapNo 12’den büyük olan kitapları

seçelim:SELECT * FROM KitapWHERE kitapNo>12;

Örnek-3:Sayfa sayısı 200’den fazla olan ve kitap

numarası da 12’den büyük olan kitapların listesi:

SELECT * FROM KitapWHERE 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 ope-ratörlerinden faydalanılır.

Mantıksal fonksiyon tabloları şu şekil-dedir:

AND İŞARETİ:Şartlardan her ikisini de sağlayan kayıtları seçmek için kullanılır..

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

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

Bu fonksiyonların dışında XOR ve XNOR işlemleri de bazı VTY’leri tarafın-dan 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.

MatematikselKarşılaştırma İşaretleri:Koşullarda, verilerin durum Matematiksel

Karşılaştırma İşaretleri kullanılarak ifade edilir.

Bu işaretler Şunlardır:

=: 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

X(Şart)NOT X(Şartın tersi)

0

1(Seçilir)

1

0(Seçilmez)

Page 33: Veritabani Programlama 1 - byte dergisi

34 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 35

kitapNo kitapAdi ISBNNo sayfaSayisi kitapOzeti

1 Visual Basic.NET 0-672-32203-X 204Visual Basic.NET konusunda temel geçis bilgilerini içeren bir kitap.

2Telkin ve Hipnoz ile Ögrenme Teknikleri

975-6700-15-7 274 Öğrenme ve sınav konusunda hipnoz tekniği

3 Yatırım Planı Yapma 975-381-263-9 74Yatırım yapmak için nereden başlamalı, neler yapmalı...

4 İş Başında Duygusal Zeka 975-434-224-5 447 Duygusal zekanın iş ve yaşam konusundaki etkileri

5Hayat Yolunda Zorluklarla Mücadele

975-362-135-3 119 Hayat yolunda zorluklarla mücadele

6 İş Hayatında Motivasyon 975-8243-98-5 140 İş başında motivasyon

7İş hayatımdan Kesitler ve Gençlere Tavsiyeler

975-8243-92-6 214 Üzeyir Garih’in hayatından kesitler

8 PERL ile CGI 975-316-609-5 247 Perl CGI konusunda kaynak kitap

9 Front Page 2000 975-316-565-7 349 Front Page

10 Bir Çift Yürek 975-7800-25-2 225 Aborijin aileleri, Avustralya’nın yerlileri

11Marka Yaratmanın 22 Kuralı

975-8378-30-9 164Marka olmaya karar verenlerin okuması gereken bir kitap

12 Simyacı 975-510-682-0 166 Simyacı

13 Bellek Geliştirme 975-503-069-7 224 Bellek geliştirme konusunda bir kurs kitabı

14 Müşteri Bağlantıları 975-316-622-2 292 Bir Harvard işletme kitabı

15 İnsan Yönetme Sanatı 975-8243-00-4 144 Yöneticiler için iyi bir kitap

16 Önümüzdeki Yol 975-509-170-X 328 BT dünyasinin geleceğine dair Bill Gates’in görüşleri

Page 34: Veritabani Programlama 1 - byte dergisi

34 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 35

Örnek-4:Kitap No 12’den büyük olan veya,

sayfa sayısı 200’den büyük olan veya adı ‘Visual Basic.NET’ olan kitapların listesi:

SELECT * FROM KitapWHERE kitapNo > 12 AND sayfaSayisi > 200 OR KitapAdi=’Visual Basic.NET’;

Örnek-5:Kitap No 12’den büyük olan veya,

sayfa sayısı 200’den büyük olan veya adı ‘Visual Basic.NET’ olan ama ISBN NO ‘975-316-622-2’ olmayan kitapların listesi:

SELECT * FROM KitapWHERE (kitapNo > 12 AND sayfaSayisi

> 200 OR KitapAdi=’Visual Basic.NET’) AND ISBNNO <> ‘975-316-622-2’;

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’ten sonra bu alan-ların adını araya virgül koyarak yazarsak, sadece bu alandaki veriler gelir.

Örnek-6:select uyeNo,adi,soyadiFROM uye;

X(1.Şart)Y(2.Şart)

SONUÇ(X AND Y)

0

0

0(Seçilmez)

1

0

0(Seçilmez)

0

1

0(Seçilmez)

1

1

1(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)

Page 35: Veritabani Programlama 1 - byte dergisi

36 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 37

DISTINCT:Birden fazla tekrarlayan kayıt döndü-

ren SELECT işlemlerinde, her bir kaydın tekil olarak yer almasını istiyorsak DIS-TINCT deyimi kullanılır.

Örnek-7:Üye tablosundaki isim-

lerin tekil bir listesini almak isteyelim:

SELECT DISTINCT adiFROM uye;Üyelerimizden adaş olan-

ların adı sadece bir kez gelecektir.

INBir 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ç hare-

ketlerini görmek içinSELECT * 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’lerde desteklenmemek-tedir.

İPUCUBirden fazla şartın yer aldığı koşullarda paran-

tez kullanılarak şartların sırası değiştirilebilir,

mantıksal operatörlerin etkileyeceği şartlar

sınırlandırılabilir.şekilde tercih etmek okunur-

luğu artıracaktır.

Page 36: Veritabani Programlama 1 - byte dergisi

36 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 37

Örnek-9:Dışarıdaki kitaplarımızı bulmak ister-

sek: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ş demek-tir.)

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 KitapWHERE kitapNo IN(SELECT kitapNo FROM

odunc WHERE geldiMi=0);

Örnek-10:Aynı yöntem ile içerdeki kitaplarımızı

bulalım:İçerideki kitaplar, dışarıda olmayan

kitaplardır. Bundan dolayı da yuka-rıda içerde kullandığımız sorgu aynen duracak ama bu sefer kitap numaraları bunlara eşit olmayan kitapların listesini bulacağız.

SELECT * FROM KitapWHERE kitapNo NOT IN(SELECT kitapNo FROM odunc WHERE

geldiMi=0);

ANY, SOME, ALLBazı 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 :Dış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’den büyük olan kitapların listesini bulalım:

SELECT kitapNo,kitapAdi,sayfaSayisiFROM 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

Page 37: Veritabani Programlama 1 - byte dergisi

38 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 39

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’den büyük olan kitapların listesini bulalım:

SELECT kitapNo,kitapAdi,sayfaSayisiFROM Kitap WHERE sayfaSayisi > ALL( SELECT

sayfaSayisi FROM Kitap WHERE kitapNo IN(3,5,11))AND kitapNo>11

EXISTS, NOT EXISTSEXISTS kullanıldığında, dışarıdaki sor-guda, 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 sonu-cunda sıfır kayıt dönüyorsa, dışarıdaki sorgunun çalıştırılması için kullanılır.

DİKKAT:EXISTS yapılarda, içteki select ifade-

sinin

SELECT * İle başladığına dikkat edin. Bu hep bu

şekilde kullanılır.

Örnek-13:5 no’lu kitap ödünç verildi ise kitap

no’sunun ve kitap bilgilerini seçelim:SELECT kitapNo,kitapAdi FROM KitapWHERE EXISTS(SELECT * FROM odunc

WHERE kitapNo=5)AND kitapNo=5;

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

Genel kullanımı şu şekildedir:1.SELECT İFADESİ....UNION2.SELECT İFADESİ....

Page 38: Veritabani Programlama 1 - byte dergisi

38 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 39

Ö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’sini seçelim:SELECT adi,soyadi FROM yazar WHERE yazarNo < 3;

Üyelerin ilk 2’sini seçelim:SELECT adi,soyadiFROM uyeWHERE uyeNo < 3;SELECT adi,soyadi FROM yazar WHERE yazarNo < 3UNION SELECT adi,soyadi

FROM uyeWHERE uyeNo < 3;

KESİŞİM BULMA:İki tablonun veya iki SELECT sorgusu-

nun 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 bulun-

maktadır:

Şu isimler üyeler tablosunda bulun-maktadır:

SELECT adiFROM yazarWHERE EXISTS (SELECT * FROM uye WHERE yazar.adi = uye.adi)

EXCEPT (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.

Page 39: Veritabani Programlama 1 - byte dergisi

40 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 41

Örnek-16: Hangi kitaplar ödünç verilmemiştir?SELECT * FROM KitapWHERE kitapNo NOT IN(SELECT kitapNo FROM odunc WHERE

geldiMi=0);

Örnek-17:Şu ifade tüm kayıtları seçecektir.SELECT *FROM KitapWHERE 1=1;Çünkü 1=1 doğru bir ifadedir.

Örnek-18: Şu ifade, hiç bir kaydı seçemez.SELECT *FROM KitapWHERE 1=0;Çünkü 1=0 doğru değildir.Bu iki durum, veritabanı programları

yazarken özellikle arama-sorgulama

ekranlarında çok büyük dertlerden kur-tarabilir.

BETWEN.... AND....Bir Aralık içersinde sorgulama yapmak için BETWEEN altSinir AND ustSinir şek-lindeki 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 sayfaSa-

yisi < 500;YerineSELECT * FROM Kitap WHERE sayfaSayisi BETWEEN 300 AND

500; de diyebiliriz.

Karakter Karşılaştırmaları: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çinSELECT *

İPUCUBir 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

şartta 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’i

takip eden alanlar asla seçilmez 1=0 yanlış bir

şarttır.

Page 40: Veritabani Programlama 1 - byte dergisi

40 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 41

FROM Kitap WHERE kitapAdi= ‘Önümüzdeki Yol’;Kullanılabilir.

Ancak karakter ifadelerin nasıl yazıl-dığı 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çinSELECT * FROM Kitap WHERE kitapAdi LIKE ‘Önümüzdeki

Yol’;Aslında bu yapının bir önceki örnek-

ten bir farkı yok. Ancak takip eden örnek-lerde, LIKE2in avantajlarını öğreneceğiz.

Joker Karakterler:Seçimi biraz genişletelim ve adında ‘yol’ geçen Kitapları listelemek istesek?Bu durumda joker karakterleri kullanmamız gerekecektir. ‘%’ ve ‘_’ veya ‘?’ karakterle-rine joker karakterler denir.

Örnek-22: Adında yol geçen kitapların bir liste-

sini alalım:Tüm kitapların listesini görmek için:SELECT *

FROM Kitap WHERE kitapAdi LIKE ‘%Yol%’;

Örnek-23: Adının ilk harfi ‘Y’ olan üyelerin listesi.Tüm üyelerin listesini görmek için: SELECT * FROM uyeWHERE Adi LIKE ‘Y%’;

Örnek-24:Adının Son harfi ‘R’ olan listesini

kitapların listesini alalım:

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)

Page 41: Veritabani Programlama 1 - byte dergisi

42 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 43

Tüm kitaplar için:SELECT * FROM Kitap WHERE kitapAdi LIKE ‘%R’;

Örnek-25:İkinci harfi ‘A’ olan Kitapların listesi:SELECT * FROM Kitap WHERE kitapAdi LIKE ‘_A%’;Şeklinde arama yapabiliriz.

Örnek-26:

İkinci harfi A, B, D veya C’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 listesiSELECT *

FROM Kitap WHERE kitapAdi LIKE ‘_[^ESRIN]%’;

Null KarşılaştırmaBazen bir alana değer girilmiş olup olma-dığın karşılaştırmak zorunda kalabiliriz. Örneğin, kitaplığımızda yer alan kitaptan hangileri için yazar bilgileri girilmediğini bilmek isteriz.

NULL için karşılaştırma yaparken, IS NULL deyimi kullanılır. Boşluk olmayan alanlar için karşılaştırma yaparken ise IS NOT NULL deyimi kullanılır.

SELECT alanlarFROM tablo_adi WHERE alan_1 IS [NOT] NULL;

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

listesi:SELECT *FROM KitapWHERE ISBNNo IS NULL;

DİKKAT:Joker karakterler ‘=’ ile kullanılamaz. Sadece

LIKE ile kullanılabilir.

Page 42: Veritabani Programlama 1 - byte dergisi

42 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 43

3.ORDER BYSELECT 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 alanlarFROM tablo_adi WHERE şartlarORDER 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 ‘e’ geçen yazarları alfabetik

sıralatalım; Öncelikle soyadlara göre sıralan-sın, soyadı aynı yazarlar için de ada bakılsın:

SELECT *FROM yazarWHERE soyadi LIKE ‘%e%’

SELECT *FROM yazarWHERE soyadi LIKE ‘%e%’ORDER BY soyadi,adi

Örnek-30:Soyadını seçme-

den de soyadına göre sıralayabiliriz:

SELECT yazar-No,adi

FROM yazarWHERE adi LIKE

‘%e%’ORDER BY soyadi

DESC,adi

İPUCUSıralama yapılan sütunların mutlaka seçilen

sütunlar arasında yer almasına gerek yoktur.

Page 43: Veritabani Programlama 1 - byte dergisi

44 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 45

4.GROUP BYBazen verileri gruplandırarak işlem yapmak zorunda kalabiliriz. Genellikle veriler grup-landığında her bir grup için şu işlemlerden biri yapılmak isteniyor demektir; grup top-lamı, 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.

GRUPLAMALI işlemler için kitap tablosuBu türden işlemleri yapan fonksiyonlara

GRUPLAMALI FONKSİYONLAR (Aggregate 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 (bkz. karşıdaki tablo):

SELECT SUM(sayfaSayisi) FROM Kitap;>>3611

Alana Takma Ad (Alias):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 TOPLAMFROM 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 orta-lama sayfa sayısı (Aritmetik ortalama):

SELECT AVG(sayfaSayisi) AS ORTA-LAMA

FROM Kitap;MAX(sutun_adi): Referans sütuna

göre en büyük değeri bulmada kullanılır. BIT türden alanlarla birlikte kullanılmaz.

Page 44: Veritabani Programlama 1 - byte dergisi

44 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 45

kitapNo kitapAdi ISBNNo turu sayfa-Sayisi

kitapOzeti

1 Visual Basic.NET 0-672-32203-X Programlama 204

Visual Basic.NET konusunda temel geçiş bilgilerini içeren bir kitap.

2Telkin ve Hipnoz ile Öğrenme Teknikleri

975-6700-15-7 Kişisel Gelişim 274Ögrenme ve sınav konusunda hipnoz tekniği

3 Yatırım Planı Yapma 975-381-263-9 İş dünyası 74Yatırım yapmak için nereden başlamalı, neler yapmalı...

4 İş Başında Duygusal Zeka 975-434-224-5 Kişisel Gelişim 447Duygusal zekanın iş ve yaşam konusundaki etkileri

5Hayat Yolunda Zorluklarla Mücadele

975-362-135-3 Kişisel Gelişim 119Hayat Yolunda Zorluk-larla Mücadele

6 İş Hayatında Motivasyon 975-8243-98-5 İş dünyası 140 İş başında motivasyon

7İş Hayatımdan Kesitler ve Gençlere Tavsiyeler

975-8243-92-6 Kişisel Gelişim 214Üzeyir Garih’in hayatından kesitler

8 PERL ile CGI 975-316-609-5 Programlama 247Perl CGI konusunda kaynak kitap

9 Front Page 2000 975-316-565-7 Programlama 349 Front Page

10 Bir Çift yürek 975-7800-25-2 Hikaye 225Aborijin aileleri, Avustralya’nın yerlileri

11Marka Yaratmanın 22 Kurali

975-8378-30-9 İş dünyası 164Marka olmaya karar verenlerin okuması gereken bir kitap

12 Simyacı 975-510-682-0 Hikaye 166 Simyacı

13 Bellek Geliştirme 975-503-069-7 Kişisel Gelişim 224Bellek geliştirme konusunda bir kurs kitabı

14 Müşteri Bağlantıları 975-316-622-2 İş dünyası 292Bir Harvard işletme kitabı

15 İnsan Yönetme Sanatı 975-8243-00-4 İş dünyası 144Yöneticiler için iyi bir kitap

16 Önümüzdeki Yol 975-509-170-X BT 328BT dünyasının geleceğine dair Bill Gates’in görüşleri

Page 45: Veritabani Programlama 1 - byte dergisi

46 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 47

Örnek-34:Kitaplığımızdaki en kalın kitap:SELECT MAX(SayfaSayisi) AS EnKa-

linKitapFROM Kitap;

MIN(sutun_adi): Referans sütuna göre en küçük değeri bulmada kullanılır. BIT türden alanlarla birlikte kullanılmaz.

Örnek-35:Kitaplığımızdaki en ince kitap:SELECT MIN(SayfaSayisi) AS EnInce-

KitapFROM Kitap;Pek kullanılmasa da şu iki fonksiyon

da gruplamalı fonksiyondur.

VARIANCE(sutun_adi): Grup varyan-sı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.

Örnek-37:Yazarlar tablosunda, tüm yazarla-

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

SELECT COUNT(*) FROM yazar;>> 20SELECT COUNT(dogum) FROM yazar;>> 0

İPUCUCOUNT(*) 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

NULL olmayan kayıtların sayısını verir.

Page 46: Veritabani Programlama 1 - byte dergisi

46 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 47

COUNT DISTINCT sutun_1: sutun_1’de kaç farklı değer tekrarladığını sayar.

Örnek-38:Kütüphanedeki üye sayısı:SELECT COUNT(*)FROM UYE>>9Kütüphanedeki üyelere ait farklı isim

sayısı:SELECT COUNT(DISTINCT adi) FROM uye;>>6

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

Örnek-39:Elimizdeki Kitapları türüne göre grup-

landırdığımızda, her bir grupta kaç kitap yer alıyor?

SELECT turu,COUNT(*) FROM KitapGROUP BY turu;>>

Örnek-40:Elimizdeki kitapları 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 KitapGROUP BY turu;

Örnek-41:Elimizdeki kitapları türlerine göre

grupladığımızda her bir tür için orta-lama kitap sayfa adedini bulalım ama sayfa sayısı 400’den fazla olan Kitapları ve 75’den az olan Kitapları ortalamanın dışında tutalım (Hesaba katmayalım).

İPUCUGROUP BY’ı ORDER BY ile işlev olarak karıştır-

mamak gerekir. GROUP BY verilerin gruplara

göre sıralanmış olmasından ziyade, gruplara

göre hesaplama yapılması ihtiyacı olduğunda

kullanılmalıdır. Sonuçların sıralaması ile ilgili

her şey için ORDER BY kullanmak gerekir.

Page 47: Veritabani Programlama 1 - byte dergisi

48 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 49

SELECT turu as TURLER, AVG(SayfaSa-yisi) AS grupOrtalamaSayfa

FROM KitapWHERE sayfaSayisi BETWEEN 75 AND

400GROUP BY turu;

Örnek-42:Bir arkadaşınız sizin kütüphanede

otomasyona geçtiğinizi gördü ve şöyle bir soru yöneltti:

“Her bir türden toplam kaç kitabın var?”

Ve ekledi: “Bu arada, 2 kitaptan az olan türleri saymayacaksın...”

İşte cevabı:SELECT turu,COUNT(*) FROM KitapGROUP BY turuHAVING 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 eklediBu arada, kitap numarası 10’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 baka-lım:

SELECT turu,SUM(sayfaSayisi) sayfa-Sayisi

İPUCUKayıt filtrelemede kullanılacak şartlar arasında

gruplamalı Fonksiyonu kullanmayı gerektiren

bir şart varsa, HAVING deyimi ile belirtilir.

Page 48: Veritabani Programlama 1 - byte dergisi

48 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 49

FROM KitapWHERE kitapNo>10GROUP BY turuSELECT turu,SUM(sayfaSayisi) sayfa-

SayisiFROM KitapWHERE kitapNo>10GROUP BY turuHAVING AVG(sayfaSayisi)>175ORDER BY SUM(sayfaSayisi) DESC;HAVING ifadesinden sonra, hikaye

türü gelmemektedir. Çünkü grup orta-laması 166’dır ve bu da HAVING şartında verilen değerin altındadır.

5.JOININGBu kısımda kullanılan tabloların ilişkisel yapılarını anlamak için, bu sayfanın sol altındaki diagrama bakabilirsiniz. İ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 tara-fından alındığının, geri getirilip getirilme-diğ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ği-mizde, odunc listesinden kitap numara-sını alırız, daha sonra Kitap tablosundan aynı numarayı bulur ve karşılığındaki kitap hakkındaki detayları görebiliriz.

İPUCUTabloların birbiri ile arasında bir ilişki tanım-

lanmadan ilişkisel sorgu yapılırsa, kartezyen

çarpımı bulunur. Bu, ‘1.Tablodaki her bir kayıt

ile 2. Tablodaki her bir kayıt ilişkilidir’ demektir

ve ilişkisel veritabanın doğasına terstir.

Page 49: Veritabani Programlama 1 - byte dergisi

50 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 51

Örnek-44:SELECT * FROM Kitap, odunc;Sorgusunun sonucunda, Kitap tablo-

sunda 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ı birbi-rine eşitlemektir.

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

FROM tablo1, tablo2WHERE tablo1.birincilAnahtar=Tablo-

2.yabanciAnahtar [AND diğer şartlar]

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

alalım:

SELECT Kitap.* FROM Kitap,oduncWHERE Kitap.kitapNo=Odunc.kitapNo

AND odunc.geldiMi=0;

Tabloya Takma Ad (Alias)Birden fazla tablo üstünde işlem yapar-ken, 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 tablola-

rın yerine takma ad verip o adları kulla-nabiliriz.

Ö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 UWHERE K.kitapNo = O.kitapNo AND

O.UyeNo=U.uyeNo AND O.geldiMi=0;>>

Bir Tabloyu Kendisi İle İlişkilendirme(Self-join)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 kulla-nılmaz.Genellikle verilerin doğruluğunu

İPUCUTakma adlar tabloların ismini kısaltmanın yanı

sıra başka işlerde de kullanılır. Genellikle tablo-

lar için takma ad seçilirken kısa olması açısın-

dan 2 veya tek harf lakaplar tercih edilir.

Page 50: Veritabani Programlama 1 - byte dergisi

50 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 51

(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 olma-dığını test etmek ve sonucu görmek istersek:

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

FROM Kitap K1, Kitap K2WHERE 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 tab-lodaki 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 tablo2ON tablo1.alan1

karşılaştırma tab-lo2.alan2;

Şeklindedir.

Örnek-48:

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

SELECT uye.Adi,odunc.KitapNoFROM 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 tablo 1 RIGHT JOIN tablo 2 ON tablo1.alan1 karşılaştırma tab-lo2.alan2;

Şeklindedir.

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

olanların listesini bulunuz:SELECT Kitap.kitapAdiFROM KitapRIGHT JOIN odunc ON

odunc.KitapNo=Kitap.KitapNoWHERE odunc.geldiMi=0;

Page 51: Veritabani Programlama 1 - byte dergisi

52 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 53

[Inner] JoinINNER JOIN en çok kullanılan tablo bir-leş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.

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

FROM tablo1 INNER JOIN tablo2ON tablo1.alan1 karşılaştırma tab-lo2.alan2;

Örnek-50:LEFT JOIN

örneğindeki sor-guyu 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’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 stan-dartlarda yer alan klasik join ile birlikte bu türden ifadeleri de desteklemekte-dirler.

İPUCULEFT JOIN ve RIGHT JOIN, aslında birer OUTER

JOIN ifadeleridir. Bir çok sistem OUTER ifadesi-

nin yazılmasını isterken, MS temelli sistemlerde

kod yazıyorsanız, böyle davranmak zorunda

değilsiniz.

Page 52: Veritabani Programlama 1 - byte dergisi

52 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 53

6.INSERTBir tabloya SQL ile kayıt eklemek için INSERT deyimi kullanılır.

INSERT INTO tablo_adi(alan1[,a-lan2,....])

VALUES(deger1[,deger2,....])Alan adı sırası ile, değer sıralamasının

aynı olması gerekir. NULL değeri alabi-len (girilmesi zorunlu olmayan alanlar) alanlar için değer girilmeyecekse boş bırakılabilir.

Örnek-52Yeni bir kitap ekleyelim.INSERT INTO Kitap(KitapAdi,SayfaSa-

yisi, kitapOzeti)VALUES(‘Photoshop Efektle-

ri’,330,’Photoshop efektlerini yakından tanıyın’);

>> 1 adet Kayıt Eklendi

Ö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 zanne-dilecek 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 Eklendidemek 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 duru-munda 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 yapa-biliriz:

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

DİKKAT:Bir tabloya metin ifadeler eklenirken, metin-

lerin tek tırnak arasına alınması bir kuraldır.

Bazen değer olarak tek tırnak (‘) girmek gere-

kebilir. Bu durumda, ‘ yerine ‘‘ yazılır. Aksi halde

SQL’in sentaksının bozulacağına dikkat edin. Bu

türden durumlara kaçınma anlamında ‘escape’

durum denir.

Page 53: Veritabani Programlama 1 - byte dergisi

54 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 55

7.UPDATEBir kayıt üstünde değişiklik yapmak gerektiğinde, UPDATE deyimi kullanılır. Yapısı şu şekildedir:

UPDATE tablo_adiSET alan1=yeniDeger1[, alan2=yeni-

Deger2, ....][WHERE sart]

Örnek:UPDATE kitapSET kitapBedeli = kitapBedeli*1,18;>>17 KAYIT GÜNCELLENDİ

8.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];

Örnek-55:Soyadı ‘OZAN’ olan üyeleri silmek

istersek:DELTEFROM uyeWHERE soyad LIKE ‘%OZAN%’>>1 KAYIT SİLİNDİ

DİKKAT:Bir UPDATE cümlesinde WHERE şartı olmazsa,

istenilen değişiklik tabloda yer alan tüm kayıt-

lar için yapılacağından dikkat edilmelidir. Böyle

bir durumda data kaybı ile karşılaşabilirsiniz.

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şabi-

lirsiniz.

Page 54: Veritabani Programlama 1 - byte dergisi

54 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 55

9.GENEL SQL FONKSİYONLARININ KULLANIMI

Bir DELETE cümleciğine şart kon-mazsa tabloda yer alan tüm kayıtlar sili-nir. 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’de çok fazla sayıda fonksiyon yer almamaktadır. Bundan dolayı bazı VTYS tarafından ek fonksiyonlar da sağlana-bilmektedir. Kullanmakta olduğunuz VTYS’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’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’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’de şu anki

vakti almak için;SELECT GETDATE() >>6/22/2003 11:39:19 PMDememiz yeterli olacaktır.(MS SQLSer-

ver için)

Aritmetik Fonksiyonlar:MOD(sayi,mod): Sayı’nın mod değerine bölümünden kalanını veririr. ORACLE’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

GUNMOD15FROM odunc WHERE kitapNo=1MS SQL Server için: SELECT vermeSuresi % 15 AS

GUNMOD15FROM odunc WHERE kitapNo=1Oracle 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(): Trigonometrik 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

Page 55: Veritabani Programlama 1 - byte dergisi

56 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 57

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 –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 ekle-mek için kullanılır.

MS temelli sistemlerde, + ile bu iş yapılabilirken ORACLE’de ancak || opera-tö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 KitapOracle’deSELECT kitapAdi || yazarAdi FROM Kitap;veyaSELECT CONCAT(kitapAdi,yazarAdi)

FROM KitapŞeklinde kullanılabilir.

INITCAP(karakter): İlk harfi büyük yapar.(Oracle)

REPLACE(karakter,ifade,yerinege-lecekIfade): İ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), TRI-M(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 üyele-

rimizin listesini alalım:SELECT uyeNo,Adi,soyadi

Page 56: Veritabani Programlama 1 - byte dergisi

56 BYTE Veritabanı Programlama 1 Veritabanı Programlama 1 BYTE 57

FROM uyeWHERE CONVERT(VARCHAR(4),u-

yeNo) LIKE ‘%1’CAST(kolonAdi as CevirilecekVeriTi-

pi(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 +’ ‘+soyadiFROM yazar

ARİTMETİK İŞARETLERHer yerde olan aritmetik işlemleri SQL’de de

geçerlidir.

+

:Toplama

-

:Çıkartma

*

:Çarpma

/

:Bölme

%

:Mod(Bazı Sistemlerde MOD da kullanılır)