Veritabani Programlama 1 - byte dergisi

August 23, 2018 | Author: websnap | Category: N/A
Share Embed Donate


Short Description

byte...

Description

T   e m m  u z  2   0   0   3 

Veritabanı Programlama

Yaşar Gözüdeli

V    e  r  i    t    a   b    a  n  ı   P   r   o   g  r   a  m l     a  m  a 

Eğitim dizisi

Veritabanı Programlama 1 Temmuz 2003  Yaşar GÖZÜDELİ Bu ek kopyalanamaz, satılamaz. Her hakkı saklıdır sak lıdır.. BYTE’ın BY TE’ın okurlarına ücretsiz armağanıdır. armağanıdır. © 2003 BYTE

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

İÇİNDEKİLER Önsöz........................................................................ 6 Bu kitapta kitapta........... ...................... ...................... ...................... ...................... ...................... ...................... ................ ..... 8 Veritabanı Yönetim Sistemleri.................................................................. Sistemleri.................................................................. 8 Veritabanı Nerelerde Kullanılır?................................................ Kullanılır?............................................................... ............... 9 1.İlişkisel Veritabanı Kavram Kavramıı .......... ..................... ....................... ....................... ................. ...... 12 Günlük Hayatta ilişkisel ilişkisel Veritabanı......................................................... 12 Temel Kavramlar1.............................................................. Kavramlar1......................................................................................... ........................... 13 Tablolar: .................................... ......................................................................... ....................................................................... .................................. 13 Değişken İsimlendirme Kuralları Kuralları.................................. ............................................................. ........................... 14 İlişkisel Veritabanı Yönetim Sistemleri: .................................. ................................................. ............... 14 20 2.SQL Veri Veri Tanımlama Tanımlama Dili (Data Denition Language) Language)......... .........20 Temel Veri Tipleri:......................................................... Tipleri:.......................................................................................... ................................. 20 Veritabanı:................................ Veritabanı: ..................................................................... ....................................................................... .................................. 20 Tablolar: .................................... ......................................................................... ....................................................................... .................................. 21 Tablo Oluşturma ................................. ..................................................................... .......................................................... ...................... 21 Kısıtlar(Constraint) oluşturma : ..................................... ................................................................ ........................... 22 Tablo silme: silme:.................................... ......................................................................... ................................................................. ............................ 23 Tabloda Değişiklik Yapma:.............................................. Yapma:......................................................................... ........................... 23 İndeksler: .................................. ....................................................................... ....................................................................... .................................. 23 View’ler ..................................... .......................................................................... ....................................................................... .................................. 24 Veritabanı Tasarımı:........................................................... asarımı:...................................................................................... ........................... 25 1.Nesneleri Tanımlayın:................................. Tanımlayın:...................................................................... .............................................. ......... 26 2.Her nesne için bir tablo oluşturun: oluşturun:...................................... ..................................................... ............... 26 3.Her bir tablo için bir anahtar alan seçin:.................................. seçin: ........................................... ......... 26 4.Nesnelerin gerekli her bir özelliği için tabloya bir sütun ekleyin ................................... ........................................................................ ........................................ ... 27 5.Tekrarlayan 5.T ekrarlayan nesne özellikleri için ek tablolar oluşturun.............. 27 6.Anahtar 6.Anaht ar alana bağlı olmayan olmayan alanl alanları arı belirleyin...... belirleyin ............ ........... .......... .......... ....... 28 7.Tablolar 7.T ablolar arasındaki ilişkileri tanımlayın .................................... ............................................. ......... 29 Veritabanı Normalizasyonu .................................... ...................................................................... .................................. 29 3.SQL Veri Veri İşleme Dili (Data Maniplation Language).............32 Language)............. 32 1.ResultSet Kavramı Kavramı................................. ...................................................................... .................................................... ............... 32 2.Select................................ 2.Select ..................................................................... ........................................................................... .......................................... 32 En Basit Select.................................................. Select....................................................................................... .............................................. ......... 32

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

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

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

Editörler: Burak Kahyaoğlu [email protected] 

Üsame İldar Özdemir [email protected] 

Tasarım ve Uygulama: Yağız Akay  [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 Ofs:

Fulya Cad. Fulya Bayırı Sk. Bilsan Plaza 11/4 80300 Mecidiyeköy - İSTANBUL Tel: (212) 212 62 06 Faks: (212) 212 62 11 www.byte.com.tr

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

veritabanı şeması üstüne inşa edilir. Bunun üstüne, HTML ve ASP-ASP.NETPHP 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. 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 Ser ver 2000, T-SQL T-SQL ile VTYS VT YS üstünde dinamik programcıkların 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 öğrenilmesi 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 adresinde online simülasyon üstünde test edebilirsiniz.

Veritabanının tarihi gibi , uygulama geliştirme açısından çok da etkili olmayan konuları maalesef bu seride bulamayacaksınız. Bu türden 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ı programcı arkadaşların, ark adaş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 sayesinde,, neyin veritabanı programlama kapsamında düşünüleceği, neyin istemci programa bırakılacağı konularının okurlar tarafından daha iyi anlaşılacağı kanaatindeyim. Bu kitap sayesinde SQL’i tanıyan programcıların bunu nerede nasıl kullanacakları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 -Y aşar GÖZÜDEL GÖZÜDELİİ  [email protected]

7

Bu Kitapta...

İ

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 saklanacağı 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ıyorsanız, önce ilk bölümü, ardından hazır bir veritabanı üstünde 3. bölümü uygulamanız, son olarak ikinci bölümde kod yazarak  nasıl veritabanı tasarlayabileceğinizi öğrenebilirsiniz. 2.bölümü anlamak zorunda değilsiniz. Artık bir çok VTYS ortamında, veritabanı ş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çilebilir.

8

GİRİŞ SQL(Es-kü-el okunur) insanların veritabanı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil sayesinde, bir veritabanından kayıtları alabilir, değiştirebilir ya da yeni kayıtlar ekleyebiliriz. SQL bir dildir; ancak bir programlama dili değildir. Program geliştirme geli ştirme aşamasında SQL SQL’’den faydalanılır, ancak tek başına bu iş için yeterli değildir. Verilerin belli özelliklerine göre gruplanıp diske kaydedilmesi işine veritabanı yönetimi denir. Veritabanlarından Veritabanlarından en popüler olanı, ilişkisel veritabanıdır. İlişkisel veritabanın kökeni, 1970’li yıllarda IBM laboratuarlarında yapılan çalışmalarda atılmıştır. Takip eden çalışmalarla, 1983’te SQL (Structural Query Language) standartları tanımlanmış ve ardından 1987 yılında önce ISO ardından da ANSI tarafından bir standart olarak kabul edilmiştir. Daha sonra, bu standartlar çerçevesinde bir çok  veritabanı yönetim sistemleri geliştirilmiştir. Bunlardan belli başlıları, Oracle, Sybase, MS SQL Server, Informix ve MySQL’dir. Bu VTYS’lerin işlerin daha kolay yürümesi için kendi adlarına standart dilden uzaklaşan taraarı vardır. Ancak genel işlemlerde kullanılan dil tümü için de ortaktır or taktır ve SQL SQL’’dir.

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

gruplandırıp şekillendirdikten sonra saklayan programlardır.. Kısaca VTYS ramlardır V TYS diye adlandıracağız. VTYS, saklanan bu veriyi, SQL komutları ile insanların istekleri çerçevesinde işler, yeniden şekillendirirler. Yani, Veritabanı Yönetim Sistemi’nin bir ucunda, bilgisayar disk(ler)inde saklanan düzenlenmiş veriler,, diğer ucunda ise bir veriler kullanıcı (genellikle insan) vardır. Veritabanı Yönetim Sistemleri konusunda daha geniş bilgi bir sonraki kitapçıkta verilecektir. Veritabanı Yönetim VTYS, disk üstündeki verileri daha kolay işleyip yönetmemizi sağlar. sağlar. sistemleri, her zaman bir SQL ile VTYS’ye veriler üstünde nasıl bir işlem yapması istendiği anlatıkullanıcıya, yönetim ekranlır. VTYS bunu bizim adımıza gerçekleştirir. gerçekleştirir. larından bilgi vermek için kullanılmaz. Bazen kullanıcı konumunda Veritabanı Nerelerde Kullanılır? doğrudan bir insan yerine bir program da Veritabanı programlama ile bir çok proje olabilir. geliştirilebilir. Bir İngilizce-Türkçe sözlük  Bir veritabanı programcısı, veritabanını bu yolla kolayca yazılabilir. Bir kütüphane çekip çevirmenin yanında, VTYS’ye bağlatakip otomasyonu, bir hastane otomasnıp veri alış-verişi ve veri üstünde değişiklik  yonu, muhasebe programları ve daha bir yapan bu ‘istemci programları’ da yazabilen çok otomasyon programı temelde veritakişidir. banı projesidir. projesidir. Günlük hayatta eritabanı Veritabanı istemci programları SQL programlama telefon şirketleri tarafından dışında başka dillere de hakim olmayı yoğun olarak kullanılır. Konuşmaların süregerektirir. VBScript’ten tutun da PHP, Perl, leri ay boyunca veritabanlarında saklanır ASP, ASP.Net gibi teknikler ile Web sayfası ve ay sonu geldiğinde istemci programlar geliştirmeye aşina olmak yahut C/C++/C#, tarafından her bir abonenin telefon faturası Java, Visual Basic gibi diller ile basit uygulateker teker hesaplanır hesaplanır.. Günde yüzbinlerce maları yapabiliyor olmak bu iş için başlanabonenin birbirini aradığı bir durumun gıçta yeterlidir. içinden başka hangi yolla çıkılabilir ki?

9

1. Bölüm

İlişkisel Veritabanı Kavramı İlişkisel veritabanı günümüzde en yaygın kullanılan ilişkisel veritabanı sistemlerinden biridir. En çok kullanılan ilişkisel Veritabanı Yönetim Sistemlerine Oracle, Ms SQL Server, Sybase, Informix, MySQL gibi veritabanı yönetim sistemlerini örnek olarak verebiliriz. Bu bölümde verilen uygulamaları test etmek için MS Access de de bir noktaya noktaya kadar kullanılabikullanılabilir ancak verilen örneklerin tamamı MS Access tarafından desteklenemez. Bu nedenle, örneklerin büyük bir çoğunluğu MS Access Access MS SQL Server 2000 üstünde test edilmiştir. ONLINE olarak kitabın içerdiği uygulamaları uygulamaları test etmek için www.verivizyon.com/sqlkitabi adresinden faydalana faydalanabilirsiniz. bilirsiniz. Bilgisayar ortamında veri saklamak  için kullanılan yapılardan en büyüğüne dosya dendiğini biliyorsunuz biliyorsunuzdur dur.. İlişkisel İ lişkisel veritabanları, veritabanı denilen büyük  dosyalardan oluşur. Veritabanı, içerisinde tabloları barındıran bir dosyadır dosyadır.. Her bir tablo, belli yapıya uygun verileri saklamak ü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 Ver Veritabanı itabanı Bir çoğumuzun başına gelmiştir. Arkadaşlara, eşe dosta bir çok kitap, kaset, CD veririz ve... Gidiş o gidiş! Böyle bir sorunla nasıl başa çıkarız? Bu konuda bir proje

12

geliştirelim: Öncelikle elimizdeki bütün Kitaplarımızın bir listesini yapalım. Ama bunu yaparken, her bir kitaba k itaba numara vermeyi ihmal etmeyelim. Çünkü elimizde aynı kitaptan iki adet olabilir. olabilir. Bunlardan biri eski, öteki de yeni kitap olabilir. Bu durumda bu iki kitaptan hangisini kime verdiğimizii nasıl ayırt edeceğiz? verdiğimiz Daha sonra kitaplarımızı şu şekilde bir listeye yazalım: Listenin her bir sütununda sırasıyla şu bilgiler yer alsın:

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. Kitap No: Her bir kitaba verdiğimiz numara Kitap Ad: Her bir kitabın adı ISBN Numarası: Her bir kitabın arkasında yer alan Uluslararası Standart Kitap Numarası Sayfa Sayısı: Kitabın kaç sayfa olduğu Özeti: Kitabın bir özet açıklaması Amacımız, kime hangi kitabı k itabı verdiğimizi bilmek. O halde Kitap listesine ek olarak 

şimdi bir de ödünç listesi yapalım:

Bu listede de, ödünç no, kitap no, ödünç alan, verme tarihi, verme süresi, geri geldi mi şeklinde bir liste daha yapalım. Kütüphanemizden verdiğimiz her bir Kütüphanemizden kitabı bu listeye işlersek, hangi kitabımık itabımızın kimde kaldığını, k aldığını, süresi sonunda getirilip getirilmediğini kolayca takip edebiliriz. Buradaki Geri geldi mi hanesine gelen her kitap için bir işaret koyabiliriz ya da imza attırabiliriz. Bu projeyi, bilgisayar ortamında yapmak, kağıt üstünde yapmaktan çok  daha kolay olacaktır. Bu projede yer alan listelerin karşılığı veritabanında tablolardır. Hayatta bir çok şeyi listelerle çözeriz. Her bir listeye karşılık, veritabanı mantığında bir tablo gelir.

Temel Kavramlar Veriler ziksel hafızada Veri Dosyaları(DataFiles) rı(DataFile s) halinde saklanır. Dosya, bilgisayarların bilgisayarları n bilgileri birbirinden ayırarak saklamak için kullandığı temel bilgi depolama yapısıdır. Bir dosyada, bir çok  veri yer alabilir. Bir kütüphane otomasyonunu ele alacak olursak, kitap ile ilgili bilgiler, ödünç verilenler, kütüphaneden kitap alma hakları olan üyeler, CD ve kasetler ile ilgili bilgiler aynı veri dosyasında ama farklı tablolar içerisinde yer alabilir.

Tablolar: Bir tablo yani günlük hayattaki ‘liste’ kavramı, satırlardan ve sütunlardan oluşur. Mesela Kitap listemizi(yani Kitap tablomuzu) ele alacak olursak, her bir satırda bir kitaba ait bilgiler yer almaktadır. Alan(Field), yapılandırılmış bilginin her bir kısmını saklamak üzere yapılan tanımlamadır. Her bir alan, yapılandırılmış verinin bir birimini tutmak üzere tanımlanır. Her bir sütunun adı ile birlikte diğer bilgilerinin(en fazla kaç birimlik bilgi bu hücrede saklanabilecek, ne tür bilgi saklanacak  vs.) ortaya koyduğu tanıma alan denir.

Alan, her bir sütun için tanımlayıcı bilgileri tutan yapıdır. Satır (Row): Bir tabloda yer alan her bir kayıt bir satıra karşılık gelir gelir.. Örneğin Kitap tablosunda her bir satırda farklı bir kitap hakkındaki bilgi yer almaktadır. Sütun (Column): Tablolar dikey sütunların yan yana gelmesiyle meydana gelmiştir.. İlk sütunda kitap miştir k itap numaraları, ikinci sütunda kitap isimleri, üçüncü sütunda, ISBN numaraları yer almaktadır. Kayıt (Record): Yapılandırılmış verilerden

13

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

Kayıt, alan tanımlamaları ile birlikte bir satırda yer alan bilgilere denir. 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çermesidir. Veri Tipi (Data Type): Bilgisayar, kayıtları yapısal olarak tutarken, onların yapıları hakkında kir sahibi olabilmek için bazı özelliklerinin önceden tanımlanması gerekir.. Örneğin, kitap numarası alanının gerekir 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ğ geleceğii ancak  tanımlandıktan sonra kayıt k ayıt girilebilir. girilebilir. Ayrıca, “bir alanın uzunluğu ne kadar k adar olacak, harf girilebiliyorsa en fazla kaç harf girilebilecek?”, “rakam ise en fazla kaç basamaklı olabilir?” türünden soruları yanıtlamak için de yine VTYS VT YS bir alan için veri tipi belirlememizi ister. Bir alan için hangi tip seçeneklerimizin olduğunu ilerleyen kısımlarda k ısımlarda öğreneceğiz. öğreneceğiz. Zorlayıcı (Constraint): Herhangi bir alan için girilebilecek verileri kısıtlayıcı

14

kurallara Zorlayıcılar denir. Kullanıcı, zorlayıcının istediği şekilde veri girmezse girmezse,, VTYS VT YS hata verir. verir. Böylelikle veritabanına kullanıcının key 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 Ve Veritabanı ritabanı 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 Sistemleri’(RDBMS)dir.. İlişkisel ri’(RDBMS)dir İlişk isel 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 olmasıdır.. Böyle olmasaydı durup dururken bu VTYS’ler V TYS’ler için ‘ilişkisel’ ‘ilişkisel’ demezdik. Bir veritabanında ilişkiden söz edebilmek için en az iki tablonun yer alması gerekir ve bu iki tablodaki verilerin bir biri ile bir şekilde ilişkilendiriliyor olması gerekir. Yine bir önceki örnek olaya dönecek olursak, Kitap listesi ile ödünçler listesi arasında

Değişken İsimlendirme Kuralları SQL’de SQL’ de tablo adları, alan(eld) , 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 or taya çıkabilmektedir. çıkabilmektedir.

1. Değişken isimleri, harf ile başlamak zorundadır. 2. Değişken isimleri, harf, har f, rakamlar ve ‘_’ dan oluşmak zorundadır. 3. Değişken isimlerinde Türkçe’ Türkçe’de ki noktalı harer (İ,ı,Ğ,ğ,Ü,ü,Ş,ş,Ç,ç,Ö,ö,) 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.

Değişken isimlendirme notasyonları: 1.Deve notasyonu: degiskenAdi şeklinde yazılır 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. olabilir. Space(ASCII-32 karakkarakteri) 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 kullanılır..

6. Değişken isimlerinde boşluk yer alamaz. bir ilişki vardır vardır.. Çünkü Kitap K itap listemizde olmayan bir kitap bizde yoktur ve ödünç veremeyiz. Haliyle de mantık olarak bu türden bir ödünç bilgisi ödünç listemizde yer alamamalıdır. Olaya tersten bakacak olursak, geri dönmeyen bir kitap hakkındaki detayları öğrenmek istediğimizde ödünç listesindeki kitap numarasını alırız. Daha sonra aynı numaraya karşılık gelen kitabı, Kitap tablosundaki satırı buluruz. Bu satırdaki bilgiler

bize kitap hakkındaki tüm detayları verir. Kitap tablosundaki kitapNo alanı aday anahtar(indeks)’tir. Odunc tablosundaki KitapNo alanı, ‘yabancı anahtar’ (foreign key) alandır, alandır, çünkü Kitap tablosundaki bir kaydı sembolize etmektedir. Tüm bunların ardından VTYS’leri hakkında özet olarak diyebiliriz ki; Bir İlişkisel Veritabanı Yönetim Yönetim Sistemi tablolar üstünde şu üç işlevi yerine getirmek zorundadır.

15

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. vardır. Bu ilişkiye ili şkiye bire sonsuz bir ilişki denir. Birinci tablodaki her bir tekil

kaydı sembolize eden kitapNo için aday anahtar, ikinci tabloda, ödünç verilen herhangi bir kitap hakkındaki detayları görmek için 1. tabloya geçmemizi sağlayan kitapNo’na ise yabancı anahtar(foreign key) denir.

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

16

1. Seçme: Herhangi bir tabloda (listede) yer alan tüm bilgileri gösterebilmelidi gösterebilmelidir.r. Ö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 getirebilmelidir.. Örneğin, canı isteyen bir kullanıcı kitabın sadece adını ve kaç sayfa olduğunu seçebilmelidir. seçebilmelidir. 3. Birleştirme: Birden fazla tabloda yer alan bilgileri, yeri geldiğinde tek bir tabloymuş gibi sunabilmelidir sunabilmelidir.. Örneğin, ödünç alınıp da geri getirilmeyen kitabın adlarını ve kimler tarafından alındığını bir tek tabloymuş gibi gösterebilmelidir. VTYS bu 3 temel işlevi yerine getirmelidir.. Bunlardan üçünü, ikisini dir ik isini veya birini aynı anda yerine getirmek durumunda kalabiliriz. Örneğin, sayfa sayısı 200’den 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 olabilir yönetilebilir olmasıdır. olmasıdır. Böylelikle, verilerin bilgisayarda ziksel olarak ne şekilde depolandığı, kullanıcı bilmek zorunda kalmaz. Yani, kullanıcı temel veri saklama işlem ve yöntemlerinden izole edilmiş olur. Kullanıcının verileri etkili olarak kullanması için bilmesi gereken tek şey SQL olmalıdır. Verilerle ilgili yapılan işlemler iki ayrı

Kitaplar listesi üstünde bir iz düşürme işlemi Kitapların kitap No’nu, Adını ve sayfa sayısını alıyoruz. Diğer sütunları almıyoruz. grupta incelenir. incelenir. Birincisi, veri tanımlama işlemleridir.. Bu grupta yapılan işlemler işlemleridir daha çok verinin saklandığı ortama dair işlemlerdir.. Doğrudan verinin kendisi ile işlemlerdir ilgilenmek yerine, tablonun hangi alanlardan oluşacağı, hangi alana hangi aralıkta veri girileceği vb. gibi işlemler bu gruptadır. Veri işleme işlemleri ise verinin saklandığı ortam ile hiçbir ilgisi olmayan işlemlerdir.. Bir tablonun içindeki tüm kayıtlar lerdir silinse bile sonuçta tablo var olacaktır. Çünkü bir tablonun silinmesi DDL’in görevidir. SQL komutlarının bu şekilde gruplandırılmasının nedeni, SQL’den ziyade, veri yönetimi konusundaki mantıktan kaynaklanmaktadır.. Böylelikle işlemler daha anlalanmaktadır şılır bir hal almaktadır almaktadır.. Verinin kılıfı ile ilgili işlemler ve verinin kendisi ile ilgili işlemler... işlemler... Sizce bir kitabın adının değiştirilmesi

17

hangi gruba girer? Peki ödünç verme süresinin 15 günden fazla olamaması? Ya kitap yatlarının da saklanacağı bir sütunu Kitap tablosuna ekleme işlemi? İpucu: ilk işlem DDL ile yapılmaz. Diğerlerinin ikisi aynı gruptan işlemlerdir.

2. Bölüm

SQL Veri Tanımlama Tanımlama Dili (Data Defnition Language) SQL’i yeterince bilmiyorsanız, bu bölümden önce 3.Bölümü okumanız ve örnekleri bir veritabanı üstünde yapmanız önerilir.. Bundan sonra, bu bölümü kavönerilir 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 kullanılır.. “Bir veritabanında hangi tablolar yer alacak, bu tablolarda tablolarda hangi alanlar alanlar yer alacak  alacak  ve alanların türleri ne olacak, indeks ya da anahtar olacak mı?” bunların hepsi DDL ile belirlenir belirlenir,, değiştirilir veya olan bir tanımlamadan vazgeçilip tanımlama silinebilir. Veritabanı Verita banı üstünde herhangi bir

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

20

tanımlamada bulunulacaksa, bu tanımlama CREATE deyimi ile oluşturulur. DROP deyimi ile de tanımlamadan vazgeçilip silinir. ALTER ALTER deyimi ise bir tanımlama üstünde değişiklik için kullanılır kullanılır.. Bu bölümde ve takip eden bölümlerde, örneklerden hemen sonra ‘>>’ ‘>>’ konulduktan sonra bir mesaja yer verilmiştir. Bu mesaj SQL ifadesinin sonucunda ne olduğunu göstermektedir.

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

Temel Veri Tipleri: SQL’de yeni bir veri tipi tanımlayamayız. Sadece var olan veri tiplerini kullanabiliriz. Burada hemen her yerde kullanılan ortak veri tiplerine bir göz atacağız. Diğer veri tipleri her bir VTYS’ye özel olarak  değişebileceğinden değişebilec eğ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ı, veritabanı mimarisinin en büyük ögesidir. ögesidir. Bir veritabanı şu şekilde açılır: CREATE DAT DATABASE database_n database_name ame

DİKKAT:

TEMEL VERİ TİPLERİ

ANSI-SQL içerisinde metin olan değerler (CHAR,VARCHAR,MEMO,DATE) tek tırnak içerisine alınarak yazılır. RAKAMSAL değerler ise olduğu gibi yazılır. Örnek: WHERE tarih=‘20.01.2003’ (metin) SET kitapNo=20 (sayı)

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 belir tir.. DATETIME: Tarih LOGICAL(BIT): BIT BIT,true/false ,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. tipidir

Örnek-1: CREATE DAT DATABASE dbKutuphan dbKutuphane; e; Ve şu şekilde silinir: DROP DATABASE DATABASE database_name d atabase_name Örnek-2: DROP DATABASE DATABASE dbKutuphane d bKutuphane

Tablolar: Tablo Oluşturma CREATE TABLE 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 TABLE Kitap( kitapNo INTEGER NOT NULL CONSTRAINT cnsKitapNo PRIMARY KEY, kitapAdi VARCHAR(63) NOT NULL,

ISBNNo VARCHAR(15), Turu VARCHAR( VARCHAR(20), 20), sayfaSayisi INTEGER, kitapOzeti VARCHAR(255) ) ile örneğimizdeki tabloyu oluşturabiliriz. >> OLUŞTURMA İŞLEMİ BAŞARI İLE YAPILDI

21

Kısıtlar (Constraint) Oluşturma: Kısıtlayıcılar,, tabloların oluşturulması sıraKısıtlayıcılar sında tabloların bir parçası olarak tanılanır. MS Access ve SQLServer’de kullanılır. Aşağıdaki işlevleri yerine getirebilirle getirebilirler: r: 1. INDEX gibi, birincil anahtar alan tanımlayabilirler (PRIMARY (PRIMARY KEY): KEY ): Bu durumda standart olarak Clustred Index gibi davranırlar.(bkz. INDEX’ler) 2. INDEX gibi tekil alan belirleyebilirler. (UNIQUE KEY) 3. Tablo oluşturma esnasında da yapılabilen, (NOT NULL) alan belirleyebilirler 4. Yabancı Anahtar belirleyebilirler.(FOREIGN ler .(FOREIGN KEY) KEY ) Primary Key: Bir tablodaki, her bir satırın yerine vekil olabilecek olabilecek bir anahtar veridir. Tekrarlamaması gerekir. Standart olarak bir tabloda verilerin, ziksel 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ımlanan 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.

22

Foreign Key: Bir tabloya girilebilece girilebilecek  k  değerleri başka bir tablonun bir belli alanında yer alabilecek veri grubu ile sınırlandırmaya ve en önemlisi de ilişkilendirmeye yarar. Örneğin, olmayan bir kitabın ödünç tablosuna eklenememesi ve ödünç tablosuna eklene bir kitabın numarası aracılığıyla detay bilgilerine erişilmesi. Burada Kitap.KitapNo birinicil anahtar alan; Odunc.kitapNo ise yabancı anahtardır. Genel yapısı şu şekildedir: CONSTRAINT constraint_name PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES foreig foreign_table n_table [(foreign_ [(foreign_eld1[,eld1[,foreign_eld2,..])] Tablolar oluşturulurken, bazı alanlara girilebilecekk değerler ile ilgili kısıtlar girilebilece koymak zorunda kalabiliriz. Böylesi durumlarda CONSTRAINT’ler kullanılır kullanılır.. CONSTRAINT’ler aslında INDEX’lere benzerler ama indekslerden farklı olarak  bir tek tablo üstünde etkili olmayabilir 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 anahtar olması gerekir. Örnek-4: CREATE TABLE TABLE Kitap ( kitapNo int NOT NULL , kitapAdi varchar63), ISBNNo varchar (15), sayfaSayisi int , kitapOzeti varchar (255)

) >>OLUŞTURULMA İŞLEMİ BAŞARI İLE YAPILDI veya CREATE TABLE 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çersek: DROP TABLE tablo_adi

>> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI İLE YAPILDI Örnek-6: Bu sütunun boş geçilememe geçilememesini sini istese idik: ALTER TABLE Kitap ALTER COLUMN kitapBedeli INTEGER NOT NULL; >> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI İLE YAPILDI dememiz gerekirdi. Örnek-7: Bu sütunu silmek için, ALTER AL TER TABLE TABLE Kitap DROP COLUMN kitapBedeli; >> TABLO DEĞİŞİKLİĞİ İŞLEMİ BAŞARI İLE YAPILDI

İndeksler: Tabloda Değişiklik Yapma: Bir tabloya sütun eklemek ek lemek veya tablodan sütun silmek için ALTER ALTER TABLE deyimi kullanılır. ALTER AL TER TABLE tablo_adi tablo_ adi {ADD{COLUMN {ADD{CO LUMN alan alan_tipi [(boyut)][NOT NULL][CONSTRAINT indeks] CONSTRAINT coklu_indeks} DROP{COLUMN alan | CONSTRAINT constraint_adi} } Örnek-5: Kitap tablosuna tablosuna kitap bedeli bedeli adında yeni bir tamsayı sütun ekleyelim. ALTER TABLE Kitap ADD kitapBedeli INTEGER;

Kütüphanemizdeki Kitapın raarda Kütüphanemizdeki raardaki ki dizilişlerini ele alalım. Bir kitap aradığımız aradığımızda, da, Kitapımız bir kurala göre dizilmiyorsa, her bir kitaba teker teker bakmamız gerekir. Kitapı raara alfabetik dizersek, her bir kitabı teker teker gözden geçirmek  zorunda kalmayız. Aradığımız kitap ile bakmakta olduğumuz kitabın isimlerini karşılaştırır, sağa ya da sola yönelip aramaya devam ederiz. Aynı şekilde yazarlarına ya da kütüphane numarasına numarasına göre göre sıralanmış birer liste liste olursa, bu kriterlere göre de aradığımız kitabı kolayca bulabiliriz. Veritabanlarında Verita banlarında indeks oluşturarak, verileri veritabanındaki veritabanındaki kayıtlı k ayıtlı oldukları sıradan başka bir sırada gösterebiliriz. gösterebiliriz.

23

Temelde İndekslerin ilişkisel veritabanında şu üç işlevi vardır: 1. Tekil İndeksler, veri ilişkilerini ve veri bütünlüğünü sağlayan birincil anahtar alanlar oluşturmada kullanılır kullanılır.. 2. İndeks olan alanın değerine göre bir kaydın kayıtlar arasındaki sırasını gösterirler. 3. Sorguların neticelenme sürelerini kısaltırlar. CREATE [UNIQUE] INDEX index_adi ON tablo_adi(kolon_a tablo_adi(kolon_adi1[,kolon_adidi1[,kolon_adi2,...][DESC]) Örnek-8: CREATE UNIQUE INDEX indKitapNo ON Kitap(kitapNo) >>OLUŞTURMA İŞLEMİ BAŞARI İLE YAPILDI Dedikten sonra, iki farklı kitaba aynı kitap no’sunu vermek mümkün olamayacaktır.. Bunu bizim yerimize VTYS denetcaktır leyecektir. Bir indeksi silmek için: DROP INDEX tablo_adi.indeks_ad tablo_adi.indeks_adii deyimi kullanılır. kullanılır. Bir tablo ya da indeks alan silindiğinde, indeks de otomatik  olarak silinmiş olur. Örnek-9: Şimdi, oluşturduğumuz indeksi geri silelim DROP INDEX Kitap.indKitap K itap.indKitapNo No >>NESNE SİLİNME İŞLEMİ BAŞARI İLE

24

YAPILDI SQL Server’de Index sırasına göre verilerin ziksel olarak yeniden sıralanmasını istersek, CREATE UNIQUE CLUSTERED INDEX indKitapNo ON kitaplar(kitapNo) diyebiliriz. Ancak bir tablo üstünde sadece bir adet Clustred Index oluşturulabilir.(Bir labilir .(Bir çokluk kümesini ziksel olarak  aynı anda kaç farklı şekilde sıralayabiliriz?Elbette bir kere...) Sizin kullanmakta olduğunuz VTYS de bu konuda ek işlevler sunuyor olabilir. Yardım menüsünden bu konuda bilgi alabilirsiniz. Tablolar birbiri ile ilişkilendirilirken, ilişk ilendirilirken, index alanlar üstünden ilişki kurulursa daha hızlı sorgular elde edilir.

View’ler Bazen, tabloları olduklarından farklı gösterecek ltrelere ihtiyaç duyarız. Bu türden işlevler 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 istendiğinde,, *Kullanıcıların, çeşitli birim dönüşümlerinden geçmiş değerler görmeleri gerektiğinde, *Halihazırdaki *Halihazırda ki tablolarda var olan verilerin başka bir tablo formatında

DİKKAT: 1.MSAccess’de de VIEW oluşturulamaz. SQLServer,, SyBase, Oracle gibi orta ver or ta ve büyük ölçekli VTYS’lerde oluşturulabilir oluşturulabilir.. 2.Bu kısımdaki SELECT komutunu anlamak için, öncelikle 3.Ünite’ye göz atmanız önerilir.

sunulması gerektiğinde *Çok kompleks sorguları basitleştirmek için Örneğin Kitap tablomuzdaki sadece Bilgi Teknolojileri Teknolojileri türündeki kitabımızın yer alacağı bir VIEW şu şekilde oluşturulabilir: CREATE VIEW view_adi [(kolon1, kolon2...)] AS SELECT tablo1.kolon_a tablo1.kolon_adi_1 di_1 FROM tablo_adi; Örnek-10 CREATE VIEW vwBTKitapi(kitapNo,KitapAdi,ISBNNo, SayfaSayisi,Ozeti) AS SELECT kitapNo,KitapA kitapNo,KitapAdi,ISBNNo di,ISBNNo,, SayfaSayisi,Ozeti FROM Kitap WHERE turu = ‘Bilgi Teknolojileri’; Teknolojileri’;

>>NESNE OLUŞTURMA İŞLEMİ BAŞARI İLE YAPILDI Veyaa şu şekilde de oluşturabiliriz: Vey Örnek-11 CREATE VIEW vwBTKitaplari AS SELECT * FROM kitap WHERE kitapNo > 5 >>NESNE OLUŞTURMA İŞLEMİ BAŞARI İLE YAPILDI View’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-12 SELECT * FROM vwBTKitapi Bir 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

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 vardır..

Veritabanı Tasarımı: İyi bir veritabanı tasarımı yapabilmek  için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur.

25

Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir gerekir.. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır. Ancak 5N, tasarım aşamasında size yol göstermek yerine hangi şartlara uygun tasarım yapmanız gerektiğini anlatır. Bazen, bu kurallardan vazgeçmek durumunda kalabilirsiniz ancak, veritabanında saklanacak verilerin hacmi arttıkça bu kuralların daha sıkı 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 ilgilenvarlıktır meyeceğiz. Örnek-14: Birkaç örnek proje için nesneleri verecek olursak, Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri E-ticaret sistemi: Ürünler, müşteriler, siparişler,teslimat, siparişler ,teslimat, fatura bilgileri,üretic bilgileri,üreticiiler,tedarikçiler,dağıtıcılar... Futbol Ligi: Takımlar, sahalar, sa halar, oyuncular, kstür, hakemler, antrenörler Okul Sistemi: Öğrenciler, öğretmenler, dersler, derslikler Sözlük: kelimeler, anlamlar, diller

26

İPUCU Tablolara isim verirken mümkünse tekil isimler kullanın. Böyle yaparsanız hem daha anlaşılır bir tasarım yapmış olursunuz hem de daha sonra kodlama aşamasında karışıklığın önüne geçmiş olursunuz. Örneğin içinde Kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça mantıklıdır.

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 olacaktır.. 3.Her bir tablo için bir anahtar alan seçin: Veritabanındaki Verita banındaki herhangi bir veriye erişmeden önce tabloya erişilir. Bir veritabanında en çok muhatap olunan nesne grubu genellikle tablolardır. Buraya kadar hangi tabloları oluşturacağ oluşturacağımıza ımıza karar verdik. Her bir tablonun içinde hangi bilgileri saklayacağımızı kabaca biliyoruz. Bu aşamada, tabloda yer alacak her bir kaydı bir diğerinden ayırabilecek ayırabilecek bir sütuna ihtiyaç duyarız. Örneğin bir bir kitabı seçmek istediğimizde, istediğimizde, bu kitabın hangi

kitap olacağını öyle bir anlatabilmeliyiz ki, başka hiçbir kitap ile karışmamalı. Bunu yapmanın tek yolu, bir alanı birincil anahtar alan olarak belirlemektir. Anahtar alan seçerken, sizi kısıtlamadığı sürece, doğal alanlar seçmeye dikkat etmenizde fayda vardır. Örneğin araçlar ile ilgili bir tablo yaparken, plakalarını anahtar alan olarak belirleyebilirsiniz. Çünkü her bir plakadan bir tek araç trağe çıkabilir. Bu bizi kısıtlamaz. Öğrenci tablosu için, öğrenci numarası doğal bir anahtar alandır çünkü aynı okulda, aynı numaradan bir öğrencinin daha bulunması söz konusu değildir. Kitap tablosu için ISBN numarasını anahtar alan olarak tanımlayabilirsiniz ama, elinizde aynı kitaptan iki adet olduğunda, ISBN numarası sizi kısıtlayacaktır. kısıtlayacaktır. elinizde iki adet ‘Önümüzdeki Yol’ kitabı varsa, her iki kitabın da ISBN numarası aynıdır.Kitapdan aynıdır .Kitapdan biri eski biri yeni olabilir.Bu bir kargaşaya neden olabilir. Çünkü eski kitabı kime, yeni kitabı kime k ime verdiğinizin takibini ISBN numarası ile mümkün değildir. Ancak bir E-Ticaret sitesi tasarlarken, stoktaki tüm kitaplar birbiri ile eşdeğer olacağından ya da öyle olduğu varsayıldığından varsayıldığında n 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

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

sıradan adını veren nesnenin her bir özelliğ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, yatı, baskı yılı... Üye için; UyeNo,, adı, soyadı, e-mail adresi, ev UyeNo telefonu, cep telefonu, iş telefonu.... Bu noktada, sizden istenen proje ile ilgili basılı formlar vs. varsa, bir göz atmanız hangi özelliklerin özelliklerin yer alması gerektiği konusunda karar vermenize yardımcı olacaktır. 5.Tekrarlayan nesne özellikleri için ek  5.Tekrarlayan tablolar oluşturun Aklınızda hep şu olmalı: veri tekrarı olacak mı? Veri tekrarı olacaksa bir yerlerde hata yapıyorsunuzdur. Elinizdeki tablonun en az bir tabloya daha ayrılması gerekiyor demektir. Şunu da unutmayın, her projeye uyacak evrensel bir veritabanı tasarım tekniği yoktur. Yani her şey sizin belli kurallar etrafında ne kadar teferrua teferruatlı tlı

27

düşünebildiğinize bağlıdır. Örneğimizde,, her bir kitap Örneğimizde k itap için tür belirledik ama, bir kitap hem kişisel gelişim kategorisine hem de hikaye kategorisine girebilir. Ya da e-ticaret sisteminde bir ürünün birden fazla reyonda yer alması gerekli olabilir. Veya bir kitap birden fazla kişi tarafından yazılmış olabilir.. Bir kitap için birden fazla türü kaydedebilmeyi ele alalım: Bu türden bir sorunu çözmek için ilk  akla gelen şey, Kitap için, 2.Tür,3.Tür diye iki alan daha eklemek. Ama çoğu kitap bir tek türdendir ve bu kitap için 2 alan hep boş kalacaktır. Öte yandan, 4 türe birden giren bir kitap olduğunda 4.tür bilgisini nereye yazacağız? Aynı alana mı? Ya da dört adet bölüm mü açacağız? Bunlar,, veritabanı tasarımının doğasına Bunlar terstir. 2.Çözüm yolu ise, bir kitabı iki kere kaydedip, birincisini, ‘Kişisel Gelişim’ türü olarak; ikincisini de ‘Hikaye’ olarak  girmek. Ancak bu durumda da diğer bilgiler tekrar edecektir. Ya da bir süre sonra, kitap hakkında girilen bilgilerin yanlış olduğunu fark ettiniz. Hangi kaydı güncelleyeceksiniz? Ya birini düzeltip birini unutursanız? Sonuçta veri tekrarı ve veri bütünlüğünün bozulması söz konusudur. Bu da yine ilişkisel ilişk isel 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.

28

Böylelikle, hiçbir türde yer almayan kitaptan 10 ayrı türde yer alan kitaba k itaba kadar bütün olasılıklar için bir çözüm geliştirmiş oluruz. 6.Anahtar Alana Bağlı Olmayan Alanları Belirleyin İlişkisel veritabanında, tablodan herhangi bir tek kayda erişmek için mutlaka bir farklı özellik sağlanmalıdır ve bu özellik  de anahtar alan tarafından sağlanır. Ancak bazen, anahtar alan ile aynı satırda yer aldığı halde, anahtar alan ile birebir ilişkisi ilişk isi olmayan bir alan yer alabilir. alabilir. Bu türden alanları elimine edip ayrı tablolara ayırmak gerekir. Örneğin, ödünç tablosunu ele alacak  olursak, ödünç verdiğimiz her kitabı ödünç alanın adresini de bilmek istediğimizde, bunu ödünç tablosuna t ablosuna yazamayız. Çünkü ödünç tablosunun birincil anahtar alanı oduncNo’dur ve bu alan, ödünç verme işlemi ile ilgilidir. Oysa ödünç alanın adresi, ödünç alan kişinin kendisine bağlı bir özelliktir ö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 özelliğidir. Ödünç verilen kitabın adresini bilmek  istediğimizde,, üyeler adında bir tablo istediğimizde daha açıp, burada herkesin adresini tutmak durumundayı durumundayızz demektir. Ödünç tablosunun ise, oduncAlan bilgisi olarak, Üyeler tablosunun birincil anahtar ala-

nına bir bağlantı (yabancı anahtar) içermesi daha doğru olur. 7.Tablolar arasındaki ilişkileri tanımlayın. Her biri bir nesneye dair özellikleri barındıran tabloların tümünü göz önüne alın ve birbirleri ile olan ilişkilerini tanımlamaya çalışın. Örneğin kitabı ödünç veririz. Bu durumda, ödünç tablosu ile Kitap tablosu ilişkili olacaktır olacaktır.. Kitap üyelere ödünç verilir. verilir. Bu durumda, ödünç ile üyeler arasında da bir ilişki vardır vardır.. Türler Türler ile Kitap K itap 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

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

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

 Veritabanı Normalizasyonu Uyeler.uyeNo(1)---(∞)odunc.uyeNo Aslında ilişkisel veri tabanı tasarımından ziyade, bir tablo içerisinde yer alacak kaydın nelerden oluşmaTur.turNo(1)---(∞)Kitap_tur.turNo Kitap.kitapNo(1)---(∞)Kitap_tur.kitapNo sına karar vermeye yarayan normalizasyon kuralları Yazar.yazarNo(1)--(∞)kitap_ başlı başına bir işlemdir. Sonuç itibari ile veritabanı yazar.yazarNo tasarım aşamasında gerekli bir işlem olduğundan bu İki tablo ilişkiyi alanbölüme almayıarasında uygun bulduk. Genelsağlayan kabul görmüş ların aynı addakuralı olması 5 normalizasyon vardır.zorunluluk Burada her bir değildir. kuralı Teorik olarak tabloları istediğiniz h erhangi herhangi tam olarak anlatmak mümkün değildir. Ancak bu ilişkisel veritabanının tanımı ile birlikte ortaya iki kurllar, alanları üstünden birleştirebilirsiniz. Ancak, türler ileyer üyeler konmuştur. Özettablosundaki olarak kri vermesitürNo açısından tablosundaki verilmiştir. uyeNo alanını birleştirdiğinizde hiçbir işinize yaramayacak anlamsız 1. Normalizasyon Kuralı: birBirilişki ortaya koymuş olursunuz. satırdaki bir alan yalnızca bir tek bilgi içerebilir. Bu ilişkileri analiz ederken, her bir Örneğin kitap tablosunda, birden fazla yazarı olan alanın hangi tablo birincil anahtar kitap için yazar1, yazar2,için yazar3 diye alanlar açsaydık, alan, hangi tabloolurduk. için yabancı anahtar bu kurala uymamış Böyle bir durumda, ayrıca yazarlar da oluşturarak çiğneolduğunu nottablosu etmeniz, daha kuralı sonra zikselmemiş olarak veritabanını tasarlarken işinizi oluruz. kolaylaştıracaktır. kolaylaştıracaktır . Hatta Genellikle yapılan hata: bu bilgileri bir şema Verileri üstünde İşte bir virgülde veyagösterebilirsiniz. bir başka karakter ile ayırıp çokaynı VTYS sağlanan alanatarafından girmek. Daha sonra programörnek içerisindebir şema:

29

split ile bu değerleri ayırmak. Ancak bu ilişkisel veritabanının doğasına terstir. 2. Normalizasyon Kuralı:

Bir tablo için, anahtar olmayan her alan, birincil anahtar olarak tanımlı tüm alanlara bağlı olmak zorundadır. Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi olacaktı ve oduncNo’na bağlı bir nitelik olmayacaktı. Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak sorunu çözdük. Ya da anahtar alanın birden fazla alandan oluştuğu tablolarda, anahtar alanlardan sadece birine bağlı veriler, tabloda yer almamalı, ayrı bir tabloya taşınmalıdır. Bunun tersi de geçerlidir. Yani iki ya da daha fazla tablonun birincil anahtarı aynı olamaz. Şayet böyle ise, bu iki tablo tek tabloya indirilmelidir. 3. Normalizasyon Kuralı:

Bir tablo için, anahtarı olmayan bir alan, anahtarı olmayan başka hiç bir alana bağlı olamaz. Örneğin, kitaplarımız için cilt tipi adında bir alan ekleyip burada da karton kapak için K, deri cilt için D, spiral cilt için S yazsaydık, bu kodlama, kitap tablosunun birincil anahtarı olan kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanımızda, karşılığı olmayan bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu olarak tutan alan aslında cilt tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır. Bu durumda, ciltSekli adında bir tablo açmamız gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli olmalıdır. Ancak bundan sonra, kitaplar tablosunda ciltTipi adında bir sütun açıp buraya da D,S,K D,S,K gibi kodları yazabiliriz. 4. Normalizasyon Kuralı:

Birincil anahtar alanlar ile anahtarı olmayan alanlar arasında, birden fazla bağımsız bire-çok ilişkisine izin verilmez. Örneğin, tablomuzda yer alan bir kitap hem hikaye kitabı hem de kişisel gelişim kitabı olabilir. (Bu

durumda kitabın adı, kişisel gelişim hikayeleri olurdu her halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz? 4.Normal formu sağlamak için, her bağımsız bire çok ilişki için ayrı bir tablo oluşturmak gerekir. Bu örnekte, türler diye bir tablo açmamız gerekiyor. Daha sonra kitapTurleri diye bir başka tablo daha açmamız gerekiyor. ‘Kişisel Gelişim 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 kitaplarımız için bir edinme şekli bilgisi girilecek sütun eklemek isteyelim: Bu bölüme girilebilecek bilgiler bellidir: Bağış veya satın alma. Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle, kullanıcıların kullanıcıla rın bu alan gelişi güzel bilgiler girmesini engellemiş oluruz. Bu da sorgulama esnasında verilerimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda, tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler başka bir tabloya taşınmış olur. Bu tablo için, veritabanı programlamada ‘look-up table’ terimi kullanılır. kullanı lır. Ancak, veritabanı normalizasyon kuralları, bir ilişkisel veritabanının tasarlanma aşamalarını değil de ilişkisel veritabanında yer alacak kayıtların ilişkisel veritabanı ile uyumlu olup olmadığını denetlemeye yöneliktir. Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi barındırmalıdır. * Veri tekrarı yapılmamalıdır. * Boş yer mümkün olduğunca az olmalıdır. * Veri bütünlüğü sağlanmalıdır. * Veriler, aralarında bir ilişki tanımlanmaya müsait olmalıdır.

3. Bölüm

SQL Veri İşleme Dili (Data Maniplation Language) Veri İşleme Dili, verinin şablonu üstünde değişiklik yapmaz. Sadece var olan tablolardaki bilgileri uygun şekilde raporlamak  (SELECT), yeni kayıtlar eklemek (INSERT), kayıtlar üstünde güncelleme yapmak(UPDATE) UPDA TE) ve kayıtları k ayıtları silmek (DELETE) için kullanılır. Veri İşleme Dili sadece veritabanında kaydı tutulan bilgilerle ilgilenir. ilgilenir. Bu bilgilerin nasıl tutulduğu ile ilgilenmez. 1.RESULTSET(RECORDSET, 1.RESULTSET(RE CORDSET, DA DAT TASET ASET)) VTYS’ VT YS’de 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 içerebilir.. Bir ResultSet’in içeriği, veritabanı programları geliştirilirken, ADO nesnelerinden nesnelerinden RecordSet RecordSet içeriiçerisine aktarılır ve veriler program 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.SELECT SELECT [DISTINCT] { * | alan_adi1, alan_ adi2, ....., [SUM(alan_adi)], [AVG(alan_ [AVG(alan_ adi)], [MAX(alan_adi)], [MIN(alan_adi)], [COUNT( * | alan_adi)]} FROM tablo_adi1, [tablo_adi2], ... LEFT [OUTER] JOIN | RIGHT [OUTER] JOIN |INNER JOIN GROUP BY {alan_adi} HAVING koşul

32

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_adi1.alan_a di = tablo_adi2.alan_adi] [alan_adi matematiksel operatör ANY|SOME|ALL ANY|SOME| ALL (SELECT işlemi)] [EXISTS|NOTT EXISTS (SELECT işlemi)]; [EXISTS|NO En Basit SELECT 

En basit olarak bir tablodaki tüm kayıtları seçmek için, SELECT alan1[,alan2, alan3,..... | *] FROM tablo_adi; Yapısı kullanılır. Örnek-1: Kitaplar tablosundaki tüm kayıtları seçelim: SELECT * FROM Kitap Koşula bağlı SELECT ve WHERE Yapısı: Bazı koşullara uyan bilgileri almamız gerekebilir. Bu durumda WHERE cümleciğini takip eden kısımda, bu şartı belirtebiliriz. SELECT alan1[,alan2, alan3,..... | *] FROM tablo_adi WHERE şart1[AND şart2[OR şart3[NOT şart4]]];

Örnek-2: KitapNo 12’den büyük olan kitapları seçelim: SELECT * FROM Kitap WHERE kitapNo>12;

Matematiksel Karşılaştırma İşaretleri: Koşullarda, verilerin durum Matematiksel Karşılaştırma İşaretleri kullanılarak ifade edilir edilir.. Bu işaretler Şunlardır:

=: Eşittir >: Büyüktür

Örnek-3: Sayfa sayısı 200’den fazla olan ve kitap numarası da 12’den büyük olan kitapların listesi: SELECT * FROM Kitap WHERE kitapNo > 12 AND sayfaSayisi > 200;

=: Büyüktür veya Eşittir(Büyük-Eşit) 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 Kitap WHERE (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 alanların adını araya virgül koyarak yazarsak, sadece bu alandaki veriler gelir. Örnek-6: select uyeNo,adi,soyadi FROM uye;

35

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

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

Örnek-8: 1,5 ve 6 nolu kitapların ödünç hareketlerini görmek için SELECT * FROM odunc WHERE kitapNo=1 OR kitapNo=5 OR kitapNo=6; Yerine SELECT * FROM odunc WHERE kitapNo IN(1,5,6); Kullanımı daha kolaydır.

Örnek-7:

Üye tablosundaki isimlerin tekil bir listesini almak  isteyelim: SELECT DISTINCT adi FROM uye; Üyelerimizden Üyelerimizde n adaş olanların adı sadece bir kez gelecektir. IN 

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

36

İç 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 V TYS’lerde desteklenmemekdesteklenmemektedir.

Örnek-9: Dışarıdaki kitaplarımızı bulmak istersek: Dışarıdaki kitapların numaralarını ödünç tablosundan çekecek bir sorgu yazalım(GeldiMi=0 olan kitaplar dışarıda olan kitaplar. Birileri tarafından ödünç alınmış ve henüz iade edilmemiş demektir.) SELECT kitapNo FROM odunc WHERE geldiMi=0 Ve bu sorguyu, sorguyu, kitaplar tablosundan, tablosundan, karşılık gelen kitap k itap numaralarını seçecek  şekilde IN() komutuna girdi ürettirelim: SELECT * FROM Kitap WHERE kitapNo IN( SELECT kitapNo FROM odunc WHERE geldiMi=0 ); Örnek-10: Aynı yöntem ile içerdeki kitaplarımızı bulalım: İçerideki kitaplar, dışarıda olmayan kitaplardır.. Bundan dolayı da yukakitaplardır 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 Kitap WHERE kitapNo NOT IN( SELECT kitapNo FROM odunc WHERE geldiMi=0 );

 ANY, SOME, ALL Bazı iç içe sorgularda, SOME, ANY veya ALL deyimi ile dışarıdaki SELECT ifadesinin seçeceği kayıtlar karşılaştırma kriterine göre kullanılabilir. ANY veya SOME :Dışarıdaki SELECT ifadesi sonucunda çıkacak kayıtlar 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 k itapların herhangi birinden kalın olan ve kitap no da 11’den büyük olan kitapların listesini bulalım: SELECT kitapNo,kitapAdi kitapNo,kitapAdi,sayfaSayisi ,sayfaSayisi FROM Kitap WHERE sayfaSayisi > ANY( SELECT sayfaSayisi FROM Kitap WHERE kitapNo IN(3,5,11) ) AND kitapNo>11

ALL: Dışarıdaki SELECT ifadesi sonucunda çıkacak kayıtlar, içerideki SELECT ifadesi

37

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) eşit) seçilir seçilir.. Örnek-12: 3,5 ve 11 nolu kitapların k itapların tamamından kalın olan ve kitap no da 11’den büyük  olan kitapların listesini bulalım: SELECT kitapNo,kitapAdi,sa kitapNo,kitapAdi,sayfaSayisi yfaSayisi FROM Kitap WHERE sayfaSayisi > ALL( SELECT sayfaSayisi FROM Kitap WHERE kitapNo IN(3,5,11) ) AND kitapNo>11

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

38

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

Örnek-13: 5 no’lu kitap ödünç verildi ise kitap k itap no’sunun ve kitap bilgilerini seçelim: SELECT kitapNo,kitapA k itapNo,kitapAdi di FROM Kitap WHERE EXISTS(SELECT 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 kullanılır.. Bunun için, iki SELECT ifadesinin eşit sayıda ve veri tipinde sütundan oluşan (eş değer) sonuçlar veriyor olması gerekir. Genel kullanımı şu şekildedir: 1.SELECT İFADESİ.... UNION 2.SELECT İFADESİ....

Örnek-14: Sisteme kayıtlı kişilerin bir kısmını (kitap yazarları ve üye isimlerini) bir tek  listede görmek isteyelim: Yazarlardan ilk 2’sini seçelim: SELECT adi,soyadi FROM yazar WHERE yazarNo < 3;

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

FROM uye WHERE uyeNo < 3;

KESİŞİM BULMA: İki tablonun veya iki SELECT sorgusunun sonucunun kesişimini bulmaya yarar. Yani her iki tabloda da bulunan kayıtları bulma işine KESİŞİM denir. Birkaç yolu vardır: Örnek-15: Hangi yazar isimleri aynı anda üye adı olarak da yer almaktadır? Şu isimler Yazarlar tablosunda bulunmaktadır:

Şu isimler üyeler tablosunda bulunmaktadır:

SELECT adi FROM yazar WHERE EXISTS (SELECT * FROM uye WHERE yazar.adi = uye.adi) EXCEPT (FARK BULMA) İki SELECT sorgusu sonucu veya iki tablo arasındaki farkı bulmaya denir. denir. Bu işlem için de bir çok yöntem kullanılabilir. NOT IN, NOT EXISTS bunlardan ikisidir.

39

Örnek-16: Hangi kitaplar ödünç verilmemiştir? SELECT * FROM Kitap WHERE kitapNo NOT IN( SELECT kitapNo FROM odunc WHERE geldiMi=0 ); Örnek-17: Şu ifade tüm kayıtları seçecektir. SELECT * FROM Kitap WHERE 1=1; Çünkü 1=1 doğru bir ifadedir. Örnek-18: Şu ifade, hiç bir kaydı seçemez. SELECT * FROM Kitap WHERE 1=0; Çünkü 1=0 doğru değildir. Bu iki durum, veritabanı programları programları yazarken özellikle arama-sor arama-sorgulama gulama

ekranlarında çok büyük dertlerden kurtarabilir. BETWEN.... AND.... Bir Aralık içersinde sorgulama yapmak  için BETWEEN altSinir AND ustSinir şeklindeki yapı kullanılır kullanılır..

Örnek-19: Sayfa Sayısı, 300 ile 500 arasındaki Kitapların listesini almak istediğimizde istediğimizde,, SELECT * FROM Kitap WHERE sayfaSayisi>300 AND sayfaSayisi < 500; Yerine SELECT * FROM Kitap WHERE sayfaSayisi BETWEEN 300 AND 500; de diyebiliriz.

İPUCU Bir WHERE cümleciğinden sonra gelen şart ne olursa olsun, doğru olduğu sürece SELECT kısmından sonra gelen kısım çalıştırılır. Bu ş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 geçerlidir.. Yanlış Yanlış bir şart varsa, SELECT’i takip eden alanlar asla seçilmez 1=0 yanlış bir şarttır.

40

Karakter Karşılaştırmal Karşılaştırmaları: arı:

Karakter ifadelerin (tarih ve metin tipli veriler) karşılaştırması da rakamlarla aynıdır. Örnek-20: Adı Önümüzdeki Yol olan kitabı seçmek için SELECT *

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

Ancak karakter ifadelerin nasıl yazıldığı ve içeriğinin tam olarak ne olduğunu birebir kestirmek zor olduğu için, bazen seçimi genişletmek üzere = yerine LIKE deyiminden de faydalanılır. LIKE  Örnek-21: Adı Önümüzdeki Yol olan kitabı LIKE komutu ile seçmek seçmek için SELECT * FROM Kitap WHERE kitapAdi k itapAdi LIKE ‘Önümüzdeki ‘Önümüzdeki Yol’; Aslında bu yapının bir önceki örnekten bir farkı yok. Ancak takip eden örneklerde, LIKE2in avantajlarını öğreneceğiz.

Joker Karakterler: Seçimi biraz genişletelim ve adında ‘yol’ geçen Kitapları listelemek istesek?Bu durumda joker karakterleri k arakterleri kullanmamız gerekecektir. ‘%’ ve ‘_’ veya ‘?’ karakterlekarakterle rine joker karakterler denir. Örnek-22: Adında yol geçen kitapların bir listesini alalım: Tüm kitapların listesini görmek için: SELECT *

 Joker Karakterler %: Birden fazla harf har f 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 hareri belirtir.(SQLServer belirtir.(SQLServer,Sybase) ,Sybase) [^ABC]: Herhangi bir harf yerine gelemeyecek hareri belirtir.(SQL Server, Sybase)

FROM Kitap WHERE kitapAdi LIKE ‘%Yol%’; Örnek-23: Adının ilk har ‘Y’ olan olan üyelerin listesi. Tüm Tü m üyelerin listesini görmek için: SELECT * FROM uye WHERE Adi LIKE ‘Y%’;

Örnek-24: Adının Son har ‘R’ olan listesini kitapların listesini alalım:

41

Tüm kitaplar için: SELECT * FROM Kitap WHERE kitapAdi LIKE ‘%R’; ‘%R’; Örnek-25: İkinci har ‘A’ olan Kitapların listesi: SELECT * FROM Kitap WHERE kitapAdi LIKE ‘_A%’; ‘_A%’; Şeklinde arama yapabiliriz.

Örnek-26:

İkinci har har  A, B, D veya C’den C’den biri olan Kitapların listesi SELECT * FROM Kitap WHERE kitapAdi k itapAdi LIKE ‘_[AE]%’ Örnek-27: İkinci har E, S, R, I ya da N den biri olmayan kitaplarının listesi SELECT *

42

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

FROM Kitap WHERE kitapAdi k itapAdi LIKE ‘_[^ESRIN]%’; Null Karşılaştırma

Bazen bir alana değer girilmiş olup olmadığı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 kullanılır.. Boşluk olmayan alanlar için karşılaştırma yaparken ise IS NOT NULL deyimi kullanılır. SELECT alanlar FROM tablo_adi WHERE alan_1 IS [NOT] NULL; Örnek-28: ISBN numarası olmayan kitapların listesi: SELECT * FROM Kitap WHERE ISBNNo IS NULL;

3.ORDER BY SELECT işlemi ile elde edilen sonucun bir alana göre sıralanmış olarak listelenmesin listelenmesinii isteyebiliriz. Bu durumda ORDER BY deyimi kullanılır. Genel Yapısı Yapısı şu şekildedir: SELECT alanlar FROM tablo_adi WHERE şartlar ORDER BY sutun1 [DESC|ASC][,sutun2 [DESC|ASC],.....]; ASC bir alana göre ARTAN sıralatmak  için kullanılır. Aslında Aslında artan-azalan ar tan-azalan şartı verilmediğinde de normalde artan ar tan sıralanır. 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ıralansın, soyadı aynı yazarlar için de ada bakılsın: SELECT * FROM yazar WHERE soyadi LIKE LIK E ‘%e%’

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

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

Örnek-30: Soyadını seçmeden de soyadına göre sıralayabiliriz: SELECT yazarNo,adi FROM yazar WHERE adi LIKE ‘%e%’ ORDER BY soyadi DESC,adi

43

4.GROUP BY Bazen verileri gruplandırarak işlem yapmak  zorunda kalabiliriz. Genellikle veriler gruplandığında her bir grup için şu işlemlerden biri yapılmak isteniyor demektir; grup toplamı, grup ortalaması, grubun en düşüğü, en fazlası.... Bu bölümde, kitap tablomuzun biraz değişik bir hali üstünde çalışacağız. Bu yapı, normalizasyon kurallarına uymaz, ancak GRUPLAMA konusunu anlamak açısından oldukça yararlı bir yapıdır. GRUPLAMALI işlemler için kitap tablosu Bu türden işlemleri yapan fonksiyonlara GRUPLAMALI FONKSİYONLAR (Aggregat (Aggregatee 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 geçerlidir..

Örnek-32: Bir önceki örneği alana takma ad ile yaparsak: SELECT SUM(sayfaSa SUM(sayfaSayisi) yisi) as TOPLAM FROM Kitap;

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

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

44

Kitaplığımızdaki her bir kitap için ortalama sayfa sayısı (Aritmetik ortalama): SELECT AVG(sayfaSayisi) AS ORTALAMA FROM Kitap; MAX(sutun_adi): MAX(sutun_ad i): Referans sütuna göre en büyük değeri bulmada kullanılır. BIT türden alanlarla birlikte kullanılmaz.

kitapNo

kitapAdi

1

Visual Basic.NET

2

Telkin ve Hipnoz ile Öğrenme Teknikleri

3

Yatırım Planı Yapma

ISBNNo

0-672-32203-X

975-6700-15-7

975-381-263-9

turu

Programlama

Kişisel Gelişim

İş dünyası

sayfaSayisi

kitapOzeti

2 04

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

2 74

Ögrenme ve sınav konusunda hipnoz tekniği

74

Yatırım yapmak için nereden başlamalı, neler yapmalı...

4

İş Başında Duygusal Zeka

975-434-224-5

Kişisel Gelişim

447

Duygusal zekanın iş ve yaşam konusundaki etkileri

5

Hayat Yolunda Zorluklarla Mücadele

975-362-135-3

Kişisel Gelişim

1 19

Hayat Yolunda Zorluklarla Mücadele

6

İş Hayatında Motivasyon

975-8243-98-5

İş dünyası

14 0

İş başında motivasyon

7

İş Hayatımdan Kesitler ve Gençlere Tavsiyeler

975-8243-92-6

Kişisel Gelişim

2 14

Üzeyir Garih’in hayatından kesitler

8

PERL ile CGI

975-316-609-5

Programlama

247

Perl CGI konusunda kaynak kitap

9

Front Page 2000

975-316-565-7

Programlama

34 9

Front Page

10

Bir Çift yürek

975-7800-25-2

Hikaye

2 25

Aborijin aileleri, Avustralya’nın yerlileri

11

Marka Yaratmanın 22 Kurali

975-8378-30-9

İş dünyası

1 64

Marka olmaya karar verenlerin okuması gereken bir kitap

12

Simyacı

975-510-682-0

Hikaye

16 6

Simyacı

13

Bellek Geliştirme

975-503-069-7

Kişisel Gelişim

22 4

Bellek geliştirme konusunda bir kurs kitabı

14

Müşteri Bağlantıları

975-316-622-2

İş dünyası

29 2

Bir Harvard işletme kitabı

15

İnsan Yönetme Sanatı

975-8243-00-4

İş dünyası

144

Yöneticiler için iyi bir Yöneticiler kitap

328

BT dünyasının geleceğine dair Bill Gates’in görüşleri

16

Önümüzdeki Yol

975-509-170-X

BT

45

Örnek-34: Kitaplığımızdaki en kalın kitap: SELECT MAX(SayfaSa MAX(SayfaSayisi) yisi) AS EnKalinKitap FROM Kitap;

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 Kitaplığımızda ki Kitapın K itapın sayısı: SELECT COUNT(*) FROM Kitap; >>16

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 MIN(SayfaSayisi)) AS EnInceEnInceKitap FROM Kitap; Pek kullanılmasa da şu iki fonksiyon da gruplamalı fonksiyondur.

VARIANCE(sutun_adi): Grup varyansını bulur.

46

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

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

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

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 >>9 Kütüphanedeki üyelere üyelere ait farklı isim sayısı: SELECT COUNT(DISTINCT adi) FROM uye; >>6

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

İPUCU GROUP BY’ı BY’ı ORDER BY ile işlev olarak karıştırmamak gerekir. 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 kullanılmalıdır her şey için ORDER BY kullanmak gerekir. gerekir.

Bu kısa örneklerden sonra, grupsal fonksiyonların gruplar üstünde nasıl kullanıldığına yakında bakalım. Örnek-39: Elimizdeki Kitapları türüne göre gruplandırdığımızda, landırdığımız da, her bir grupta kaç kitap yer alıyor? SELECT turu,CO turu,COUNT(*) UNT(*) FROM Kitap GROUP BY turu; >>

SELECT turu,SUM(sayfaSayisi) AS grupBasiToplamSayfa FROM Kitap GROUP BY turu; Örnek-41: Elimizdeki kitapları türlerine göre grupladığımızda grupladığım ızda her bir tür için ortalama 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).

47

“Her bir türden toplam kaç kitabın var?” Ve ekledi: “Bu arada, 2 kitaptan k itaptan az olan türleri saymayacaksın...” İşte cevabı: SELECT turu,CO turu,COUNT(*) UNT(*) FROM Kitap GROUP BY turu HAVING COUNT(*)>=2; SELECT turu as TURLER, AVG(SayfaSayisi) AS grupOrtalamaSa grupOrtalamaSayfa yfa FROM Kitap WHERE sayfaSayisi BETWEEN 75 AND 400 GROUP BY turu;

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

Örnek-42: Bir arkadaşınız sizin kütüphanede otomasyona geçtiğinizi gördü ve şöyle bir soru yöneltti:

48

Örnek-43: Aynı arkadaşınız abarttı ve şu soruyu yöneltti: Her bir türde toplam kaç sayfa kitabın var? Ve ekledi Bu arada, kitap numarası 10’dan küçük olan Kitapın muhtemelen eskidir, sayma. Bir de Ortalaması 175 sayfayı aşmayan türleri de görmek istemiyorum, çünkü muhtemelen bu türlerde yeterince kalın kitaplar yok. En az sayfa kitap bulunan tür en altta yer alacak şekilde liste verebilir misin? Öncelikle şu ifadenin sonucuna bakalım: SELECT turu,SUM(sa turu,SUM(sayfaSayisi) yfaSayisi) sayfaSayisi

FROM Kitap WHERE kitapNo>10 GROUP BY turu SELECT turu,SUM(sa turu,SUM(sayfaSayisi) yfaSayisi) sayfaSayisi FROM Kitap WHERE kitapNo>10 GROUP BY turu HAVING AVG(sayfaSayisi)>175 ORDER BY SUM(sayfaSayisi) DESC; HAVING HA VING ifadesinden sonra, hikaye türü gelmemektedir. Çünkü grup ortalaması 166’dır ve bu da HAVING şartında verilen değerin altındadır.

5.JOINING Bu 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 tarafından alındığının, geri getirilip getirilmediğinin kaydını tutuyoruz. Bazen, bu iki tablodaki bilgilere de bir tek sorgu sonucu olarak ihtiyaç duyarız. Örneğin elimizde öyle bir sonuç olmalıdır ki, hangi kitabın kim tarafından ödünç alındığını bir listede görmemiz gereksin. Bu iki tablo birbirine, kitapNo alanı ile bağlıdır. Çünkü, ödünç verilen bir kitap hakkında detaylı bilgi edinmek istediğimizde, odunc listesinden kitap numarasını alırız, daha sonra Kitap tablosundan aynı numarayı bulur ve karşılığındaki kitap hakkındaki detayları görebiliriz. görebiliriz.

İPUCU Tabloların birbiri ile arasında bir ilişki tanımlanmadan ilişkisel sorgu yapılırsa, kartezyen çarpımı bulunur. Bu, ‘1.Tablodaki ‘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.

49

Örnek-44: SELECT * FROM Kitap, odunc; Sorgusunun sonucunda, Kitap tablosunda 50, odunc tablosunda 100 kayıt varsa, (50*100=5000) 5000 satırlık bir bu iki tablo için kartezyen kar tezyen çarpım sonucu bulunur.

rın yerine takma ad verip o adları kullanabiliriz.

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

Klasik Join

İki tabloyu birlikte sorgulamanın en kolay yolu, asıl tablodaki birincil anahtar ile ikinci tablodaki yabancı anahtarı birbirine eşitlemektir. SELECT tablo1.alan1| tablo1.alan1|tablo2tablo2.alan1[tablo1.alan2,...] FROM tablo1, tablo2 WHERE tablo1.birincilAnahtar=Tablo2.yabanciAnahtarr [AND diğer şartlar] 2.yabanciAnahta Örnek-45: Şu anda dışarıda olan Kitapın listesini alalım:

SELECT Kitap.* FROM Kitap,odunc WHERE Kitap.kitapNo=O Kitap.kitapNo=Odunc.kitapNo dunc.kitapNo AND odunc.geldiMi=0;

Tabloya Takma Ad (Alias) Birden fazla tablo üstünde işlem yaparken, sık sık tablo isimleri kullanılır. kullanılır. Bu da bir kelime kalabalığı olarak karşımıza k arşımıza çıkar. Bunun önüne geçmek için tablola-

50

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

SELECT K.kitapAdi,O.vermeTarihi,u.Adi,U.Soyadi FROM Kitap K, odunc O,Uye U WHERE K.kitapNo = O.kitapNo AND O.UyeNo=U.uyeNo AND O.geldiMi=0; >> Bir Tabloyu Tabloyu Kendisi İle İlişkilendirme İl işkilendirme (Self-join) Bir tabloyu kendisi ile ilişkilendirerek  sorgulamamız gerektiğinde aynı tabloya farklı iki takma tak ma adı atayıp, atayıp, farklı iki tablo üstünde ilişkili sorgu yapıyormuş gibi ilişkili sorgu yapılabilir. yapılabilir. İyi tasarlanmış bir veritabanında bu tür ilişki pek kullanılmaz.Genellikle verilerin doğruluğunu

(veya tutarsızlığını) test etmede kullanılır. kullanılır. Örnek-47: Kitap tablomuzda, bazı Kitapın adları hatalı okunduğu için aynı ISBN numarası ile farklı kitap adları girilmiş olup olmadığını test etmek ve sonucu görmek  istersek: SELECT K1.KitapAdi,K1.ISBNNo,K2.kitapAdi,K2.ISBNNO FROM Kitap K1, Kitap K2 WHERE K1.ISBNNo=K2.ISBNNo AND K1.KitapAdiK2.KitapAdi; >>0 kayıt seçildi. Çünkü ISBN numaralarında bir hata yok. Left [Outer] Join İki tablo arasında ilişkili sorgu yapılırken, LEFT OUTER JOIN kullanıldığında, birinci tablodaki tüm kayıtlar getirilir.r. 2. Tabloda getirili Tabloda ise sadece ilişkiye göre uygun kayıtlar sağ tarafına eklenir. Genel kullanımı, ... FROM tablo1 LEFT JOIN tablo2 ON tablo1.alan1 karşılaştırma tablo2.alan2; Şeklindedir.

Tüm üyelerin bir listesini, yanına da Tüm ödünç aldıkları kitap varsa, kitap k itap numarasını sıralayalım SELECT uye.A uye.Adi,odunc.KitapNo di,odunc.KitapNo FROM uye LEFT JOIN odunc ON odunc.uyeNo=uye.uyeNo Right [Outer] Join İki tablo arasında ilişkili sorgu yapılırken, RIGHT OUTER JOIN kullanıldığında, ikinci tablodaki tüm kayıtlar getirilir. 1. Tabloda ise sadece ilişkiye göre uygun kayıtlar sağ tarafına eklenir. Genel kullanımı, FROM tablo 1 RIGHT JOIN tablo 2 ON tablo1.alan1 karşılaştırma tablo2.alan2; Şeklindedir.

Örnek-49: Ödünç alınmış Kitaplardan dışarıda olanların listesini bulunuz: SELECT Kitap.kitapAdi FROM Kitap RIGHT JOIN odunc ON odunc.KitapNo=Kitap.KitapNo WHERE odunc.geldiMi=0 odunc.geldiMi=0;;

Örnek-48:

51

[Inner] Join

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

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

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:

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

FROM tablo1 INNER JOIN tablo2 ON tablo1.alan1 karşılaştırma tablo2.alan2; Örnek-50:

LEFT JOIN örneğindeki sorguyu INNER JOIN ile çalıştıralım. Bu durumda, hiç kitap ödünç almayan üyelerin sonuçta yer almadığına dikkat edin. SELECT uye.Adi,odunc.KitapNo

52

SELECT Kitap.kitapAdi,uye.Adi,uye.Soyadi FROM (odunc INNER JOIN Kitap ON Kitap.KitapNo=Odunc.kitapNo) 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. çalışmayabilir. Bu farklılığın fark lılığın nedeni, JOIN ON ifadesi ANSI-SQL’in bir parçası değildir. değildir. Ancak VTYS V TYS üreticileri, WHERE şartında yer alan diğer koşullar ile, tablo ilişkilendirme koşullarının bir birinden kolayca ayırt edilmesi için standartlarda yer alan klasik join ile birlikte bu türden ifadeleri de desteklemektedirler.

6.INSERT Bir tabloya SQL ile kayıt eklemek ek lemek için INSERT deyimi kullanılır kullanılır.. INSERT INTO tablo_adi(alan1 tablo_adi(alan1[,a[,alan2,....]) VALUES(deger1[,deger2,....]) Alan adı sırası ile, değer sıralamasının aynı olması gerekir. NULL değeri alabilen (girilmesi zorunlu olmayan alanlar) alanlar için değer girilmeyecekse girilmeyecekse boş bırakılabilir. Örnek-52 Yeni bir kitap ekleyelim. INSERT INTO Kitap(KitapAdi,SayfaSaKitap(KitapAdi,SayfaSayisi, kitapOzeti) VALUES(‘Photoshop Efektleri’,330,’Photoshop efektlerini yakından tanıyın’); >> 1 adet Kayıt Eklendi

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

Örnek-53: INSERT INTO Kitap(KitapAdi, ISBNNo, SayfaSayisi,, kitapOzeti) SayfaSayisi VALUES(‘Ahmet’in Günlüğü’, ‘975-509‘ 975-509-

170-X’, 330,’Bir 330,’Bir polisin p olisin anıları anıları’); ’); >> Incorrect syntax near the keyword ‘in’. Bu kayıt eklenemeyecektir. Aksine in kelimesi SQL komutu olan In zannedilecek ve arkasından açılan tek tırnak  kapanmamış olarak algılanacaktır. Bunun yerine INSERT INTO Kitap(KitapAdi, ISBNNo, SayfaSayisi, SayfaSayi si, kitapOzeti) VALUES(‘Ahmet’’in Günlüğü’, ‘975-509170-X’, 330,’Bir 330,’Bir polisin p olisin anıları anıları’); ’); >> 1 adet Kayıt Eklendi demek gerekir. Bir Tablodan Tablodan Seçilen Se çilen Kayıtları Başka bir Tabloya Ekleme: Bazı durumlarda, bir tabloda yer alan kayıtları başka bir tabloya aktarmak durumunda kalabiliriz. Örnek-54: Dışarıdaki Kitapımızı tutmak üzere bir tablo oluşturmamız gerekirse, bunları doğrudan bir seçme işleminin sonucunu bu yeni tabloya ekleme şeklinde de yapabiliriz: INSERT INTO disardakiKitap(kitapNo disardakiKitap(kitapNo,-,KitapAdi,Bedeli) SELECT kitapNo,KitapA kitapNo,KitapAdi,Bedeli di,Bedeli FROM Kitap INNER JOIN odunc ON odunc.KitapNo=kitap.kitapNo WHERE odunc.GeldiMi=0; >> 3 adet Kayıt Eklendi

53

7.UPDATE Bir kayıt üstünde değişiklik yapmak  gerektiğinde, UPDATE deyimi kullanılır. Yapısı şu şekildedir: UPDATE tablo_adi SET alan1=yeni alan1=yeniDeger1[, Deger1[, alan2=yeniDeger2, ....] [WHERE sart] Örnek: UPDATE kitap SET kitapBedeli = kitapBedeli*1,18; k itapBedeli*1,18; >>17 KAYIT GÜNCELLENDİ

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

54

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

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: DELTE FROM uye WHERE soyad LIKE ‘%OZAN%’ >>1 KAYIT SİLİNDİ

9.GENEL SQL FONKSİYONLARININ KULLANIMI Bir DELETE cümleciğine şart konmazsa tabloda yer alan tüm kayıtlar silinir. Bir Sorguyu çalıştırmadan önce doğru kayıtları silmek istediğinizden emin olunuz. Böyle bir durumda data kaybı ile karşılaşabilirsiniz. SQL’de çok fazla sayıda fonksiyon yer almamaktadır.. Bundan dolayı bazı VTYS almamaktadır VT YS tarafından ek fonksiyonlar da sağlanabilmektedir. Kullanmakta olduğunuz VTYS’ VT YS’nin 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. verilecektir. SQL Server Ser ver 2000’in 2000’ in sunduğu fonksiyonları bir sonraki bölümde ve ek kısmımızda k ısmımızda bulabilirsiniz. Tarih-Zaman Fonksiyonları: GETDATE(): Microsoft ve Sybase temelli sistemlerde sitem tarihini bulur bulur.. DATE() olarak da geçebilmektedir. SYSDATE(): Oracle’de aynı işlevi yerine getirir. NOW(): MS temelli sistemlerde, anlık  detaylı zamanı(gün-a zamanı(gün-ay-yıl-saat-dk-sn) y-yıl-saat-dk-sn) verir. Örnek-56: Üstünde çalıştığı çalıştığımız mız VT VTYS’ YS’de de şu anki vakti almak için; SELECT GETDATE() >>6/22/2003 11:39:19 PM Dememiz yeterli olacaktır.(MS SQLServer için)

 Aritmetik Fonksiyonlar:

MOD(sayi,mod): Sayı’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 GUNMOD15 FROM odunc WHERE kitapNo=1 MS SQL Server için: SELECT vermeSuresi % 15 AS GUNMOD15 FROM odunc WHERE kitapNo=1 Oracle için: SELECT MOD(vermeS MOD(vermeSuresi uresi ,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.r. Ancak, Oracle Sistemler için açı aynısıdı 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

55

yine istenilen bir tabanda logaritmasını almak için kullanılır.

FROM Kitap Şeklinde kullanılabilir kullanılabilir..

POWER(sayi,us): Bir sayının üssünü almak için kullanılır.

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

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.

REPLACE(karakter,ifade,yerinegelecekIfade): İfadeleri bulup değiştirir. (SQLServer2000,SYBASE)

SQRT(sayi): Bir sayının karekökünü alır.

LOWER(metin), UPPER(metin) : LOWER(metin), Tamamı Küçük veya tamamı büyük harf  yapmak için kullanılır.(Oracle)

Karakter İşleme Fonksiyonları: CHR(): Bir ASCI kodunun karakter karşılığını döndürür döndürür..

LCASE(metin) ve UCASE(metin): Tamamı Küçük ve tamamı büyük harf  yapmak için kullanılır. (MS)

CONCAT(metin1,metin2): İki veya daha fazla karakter ifadeyi uç uca eklemek için kullanılır.

LTRIM(metin), RTRIM(metin), TRIM(metin): Soldaki, sağdaki sağdaki veya veya her iki taraftaki boşlukları atmak için kullanılır.

MS temelli sistemlerde, + ile bu iş yapılabilirken ORACLE’de ancak || operatörü veya CONCAT CONCAT fonksiyonu ile bu iş yapılabilir.

LENGHT(metin): Bir metnin uzunluğunu verir.(Oracle)

Örnek-58: Kitap Adları ile yazarlarının adlarını bir tek alan olarak seçtirmek istersek: SELECT kitapAdi + yazarAdi FROM Kitap Oracle’de SELECT kitapAdi || yazarAdi FROM Kitap; veya SELECT CONCAT(kitapAdi,yazarAdi)

56

LEN(metin): Bir metnin uzunluğunu verir.(MS temelli Sistemler)

Dönüştürme Fonksiyonları CONVERT(veritipi[(uzunluğu)], sütu adı, CONVERT(veritipi[(uzunluğu)], format): Bir verinin bir formattan başka bir formata dönüştürülmesi için kullanılır kullanılır.. Örnek-59: Üyelik Numarasının sonu 1 olan üyelerimizin listesini alalım: SELECT uyeNo,Adi,soyadi

FROM uye WHERE CONVERT(V CONVERT(VARCHAR(4),uARCHAR(4),uyeNo) LIKE ‘%1’ CAST(kolonAdi as CevirilecekVeriTipi(N)): Bir sütunun ya da verinin türünü başka bir türe değiştirmek için kullanılır.(SYBASE,MS SQL Server) Örnek-60: SELECT CAST(yazarNo as VARCHAR(4)) + ‘ ‘+adi +’ ‘+soyadi FROM yazar

ARİTMETİK İŞARETLER Her yerde olan aritmetik işlemleri SQL’de de geçerlidir. + :Toplama :Çıkartma * :Çarpma / :Bölme % :Mod(Bazı Sistemlerde MOD da kullanılır)

57

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF