Bu Derste Öğrenecekleriniz: 1. Tablo İşlemleri 1.1. Tablo Oluşturma 1.2. Tablo Oluşturmada Kısıtlamalar Constraints 1.3. Tablo Silme a. NULL, NOT NULL b. PRIMARY KEY c. UNIQUE d. FOREIGN KEY e. CHECK f. DEFAULT g. IDENTITY 1. Tablo İşlemleri 1.1. Tablo Oluşturma En basit haliyle CREATE TABLE tablo_adı Alan_adı1 VERI_TİPİ, Alan_adı2 VERİ_TİPİ, Alan_adıN VERİ_TİPİ CREATE TABLE ÖĞRENCİLER NUMARA INT, ADI VARCHAR50, SOYADI VARCHAR50, [BÖLÜM KODU] CHAR4, CİNSİYET CHAR5, TELEFON CHAR16 Burada Öğrenciler adında bir tablo oluşturulacak. NUMARA alanı tamsayı tipinde olacak, ADI ve SOYADI ile belirtilen alanlar maksimum 50 karakter alabilecek, ancak hafızada kullanılan karakter sayısı kadar yer tutacaktır. BÖLÜM KODU, CİNSİYET ve TELEFON ile belirtilen alanlar maksimum 4, 5 ve 16 karakter alabilen yazılar olabilecek. NOT: SQL de eğer veri tabanı adı, tablo adı, alan adı gibi herhangi bir nesnenin ismi birden fazla kelimeden oluşuyorsa kelimeler köşeli parantezler [ ] arasına yazılır. Yani BÖLÜM KODU yerine [BÖLÜM KODU] kullanılabilir. Alan adları köşeli parantezler [ ] arasına yazıldıktan sonra alan adlarında istenilen karakter kullanılabilir. [123*adı-soyadı] geçerli bir alan adı tanımlamasıdır. 1.2. Kısıtlamalar Constraints Bir tablo oluştururken bazı alanlar zorunlu bazı alanların ise isteğe bağlı olması istenir. Bazı alanlar tekrarlanmamalı, bazı alanlar ise istenilen kadar tekrar edilebilmeli. Bazı alanlar tabloya girilmeden önce bazı kurallara uyuyor mu diye kontrol edilmeli. Bazı alanlar ise aslında başka tablodan referans alan alanlar olabiliyor. Bazı alanların ise başlangıçta varsayılan değerlerinin olmasını isteriz. İşte bütün bunları sağlamak için tablo oluştururken bazı kurallar uygulanır. a. NULL, NOT NULL: tablo oluştururken boş bırakılabilecek alanlar NULL ile boş bırakılamayacak yani zorunlu olan alanlar ise NOT NULL ile işaretlenmelidir. NULL ifadesi opsiyoneldir. Her hangi bir şey yazılmazsa NULL geçerlidir. Yani o alan istenirse boş bırakılabilecek. 1 Bartın MYO Bilgisayar Programcılığı Öğr. Gör. Bayram AKGÜL 2013-2014 Güz Dönemi
CREATE TABLE BÖLÜMLER BÖLÜM_KODU CHAR4 NOT NULL, BÖLÜM_ADI VARCHAR50 NOT NULL, ADRES VARCHAR50 NULL Burada Bölümler adında bir tablo oluşturulacak. BÖLÜM_KODU ile belirtilen alan maksimum 4 karakter alabilen bir yazı olabilecek ve boş bırakılamayacak. BÖLÜM_ADI ile belirtilen alan ise maksimum 50 karakter alabilecek, ancak hafızada kullanılan karakter sayısı kadar yer tutacaktır. Bu alan da bölüm_kodu gibi boş bırakılamayacak. Çünkü her ikisi de NOT NULL ile işaretlenmişler. ADRES ile belirtilen alan ise maksimum 50 karakter alabilecek ve isterse boş bırakılabilecek. Çünkü NULL ile işaretlenmiş. Adres alanı da bölüm_adı gibi kullanılan karakter sayısı kadar hafızada yer tutacaktır. b. PRIMARY KEY: Yukarıdaki BÖLÜMLER tablosuna dikkat edilirse BÖLÜM_KODU ile belirtilen alan aslında her bölüm için özeldir ve tekrarlanmamalıdır. Veritabanı yönetim sistemleri I dersinden hatırlayacağınız üzere buna birincil anahtar diyorduk. Tabloyu oluştururken aslında bunu belirtebiliriz. Bir alanın birincil anahtar olduğunu belirtmek için o alan için tip belirtecinden sonra PRIMARY KEY anahtar sözcüğü kullanılır. Not: Birincil Anahtar: Tablodaki bir kaydı diğer kayıtlardan ayıran ve tekrara izin vermeyen alandır. CREATE TABLE BÖLÜMLER [BÖLÜM KODU] CHAR4 PRIMARY KEY NOT NULL, [BÖLÜM ADI] VARCHAR50 NOT NULL, [ADRES] VARCHAR50 NULL Yukarıda dikkat edilirse [BÖLÜM KODU] alanı tanımlanırken veri tipi belirtildikten sonra PRIMARY KEY kullanılmıştır. Bu durum, [BÖLÜM KODU] alanının birincil anahtar olduğunu ifade ediyor. Bir tabloda sadece bir tane birincil anahtar bulunabilir. Ama bu bir tane birincil anahtar birden fazla alandan oluşabilir. Böyle bir durumda PRIMARY KEY tanımlaması aşağıdaki gibi yapılır. CREATE TABLE SINAVLAR [DERS KODU] CHAR6 NOT NULL, [ÖĞRENCİ NO] INT NOT NULL, VİZE TINYINT NULL, FİNAL TINYINT NULL, CONSTRAINT PK_SINAVLAR PRIMARY KEY[DERS KODU], [ÖĞRENCİ NO] 2 Bartın MYO Bilgisayar Programcılığı Öğr. Gör. Bayram AKGÜL 2013-2014 Güz Dönemi
c. UNIQUE: Her ne kadar birincil anahtarlar ile tekrarı önleyebilsek de aslında birincil anahtar olmayan fakat yinede tekrar etmesini istemediğimiz alanlar olabilir. Böyle durumlar için UNIQUE anahtar sözcüğü kullanılır. Aşağıdaki örneği inceleyiniz. Çalışanlar adında bir tablo tanımlanmıştır. Bu tabloda birincil anahtar olabilecek NUMARA ve [TC NO] adında iki alan mevcut. Ancak biz sadece birini birincil anahtar olarak belirliyoruz, fakat diğerinin de tekrarlanmamasını istiyoruz. Çalışanlar tablosunda görüldüğü gibi [TC NO] alanı için veri tipi tanımlamasından sonra UNIQUE anahtar sözcüğü yazılmıştır. Bunun anlamı; [TC NO] birincil anahtar değil ancak yinede tekrarlanmasına izin verilmeyecektir. Sadece bir defa girilmesine izin verilecektir. CREATE TABLE ÇALIŞANLAR NUMARA INT PRIMARY KEY NOT NULL, [TC NO] DECIMAL11 UNIQUE NOT NULL, İSİM VARCHAR25 NOT NULL, SOYİSİM VARCHAR25 NOT NULL, TELEFON CHAR16 NULL d. FOREIGN KEY: Şimdi de aşağıdaki öğrenciler tablosunu düşünün. Bu tabloda dikkat edilirse BÖLÜM alanı aslında başka bir tablodan referans alıyor. Veritabanı Yönetim sistemleri I dersinden de hatırlayacağınız üzere buna referans anahtar veya dış anahtar diyorduk. Yani ÖĞRENCİLER tablosundaki BÖLÜM alanı aslında BÖLÜMLER tablosundaki birincil anahtar olan [BÖLÜM KODU] alanına referans ediyor. Öğrenciler tablosu için SQL kodunu yazacak olursak aşağıdaki gibi olacaktır. CREATE TABLE ÖĞRENCİLER NUMARA INT PRIMARY KEY NOT NULL, İSİM VARCHAR25 NOT NULL, SOYİSİM VARCHAR25 NOT NULL, BÖLÜM CHAR4 FOREIGN KEY REFERENCES BÖLÜMLER[BÖLÜM KODU] ON DELETE CASCADE ON UPDATE CASCADE NOT NULL, TELEFON CHAR16 NULL Yukarıdaki örnekte referans verilirken FOREIGN KEY kısmı isteğe bağlıdır. Yazılmazsa da olur. Önemli olan REFERENCES anahtar sözcüğünün yazılmış olmasıdır. Bir tabloda sadece bir tane birincil anahtar bulunabilir, fakat birden fazla yabancı anahtar bulunabilir. Bu durumda her referans için ayrı referans verilir. Yukarıdaki örnekte BÖLÜM alanının referansı belirtildikten sonra ON DELETE CASCADE ve ON UPDATE CASCADE ifadeleri kullanılmış. Bunun anlamı: Eğer referans edilen kayıt silinirse veya güncellenirse bu tabloda da aynı değişikliği yap demektir. Örneğin bölümler tablosundaki bölüm kodu BPR1 olan 3 Bartın MYO Bilgisayar Programcılığı Öğr. Gör. Bayram AKGÜL 2013-2014 Güz Dönemi
bölüm silinirse BPR1 bölümüne kayıtlı bütün öğrencilerde silinecektir. Eğer BPR1 olan bölüm kodu BBP1 olarak değiştirilirse öğrenciler tablosunda bölüm kodu BPR1 olan bütün öğrenciler için bölüm BBP1 olarak güncellenecektir. Eğer böyle bir durum istemiyorsak, yani bölümler tablosundan bir bölüm sildiğimizde öğrenciler tablosundaki o bölüme ait öğrencilerin silinmesini istemiyorsak ON DELETE CASCADE yerine ON DELETE NO ACTION yazmalıyız. Aynı durum güncelleme için de geçerlidir. Yani bölümler tablosundan bir bölüm kodu güncellenince, öğrenciler tablosundaki o bölüme kayıtlı öğrencilerin bölüm kodu güncellenmesin istiyorsak ON UPDATE CASCADE yerine ON UPDATE NO ACTION yazmamız gerekecektir. Eğer bölümler tablosundaki bir kayıt silinince öğrenciler tablosunda o bölüme kayıtlı öğrenciler silinmesin fakat bölüm kodu güncellenince öğrenciler tablosundaki o bölümün kodları güncellensin istiyorsak bu durumda ON DELETE NO ACTION ON UPDATE CASCADE şeklinde yamalıyız. Aynı mantık tersi için de geçerlidir. Referans anahtar tanımlanırken aşağıdaki kural göz önüne alınır. ALAN_ADI VERİ_TİPİ [FOREIGN KEY] REFERENCES REFERANS_TABLO_ADIREFERANS_ALAN_ADI ON DELETE { CASCADE NO ACTION} ON UPDATE { CASCADE NO ACTION} Foreign Key Yabancı anahtar tanımlanırken alan tanımından sonra yazılabildiği gibi daha sonrada aşağıdaki gibi de yazılabilirdi. CONSTRAINT FK_BÖLÜM FOREIGN KEY BÖLÜM REFERENCES BÖLÜMLER[BÖLÜM KODU] ON DELETE CASCADE ON UPDATE CASCADE Yani yukarıdaki tablo aşağıdaki gibi de tanımlanabilirdi. CREATE TABLE ÖĞRENCİLER NUMARA INT PRIMARY KEY NOT NULL, İSİM VARCHAR25 NOT NULL, SOYİSİM VARCHAR25 NOT NULL, BÖLÜM CHAR4 NOT NULL, TELEFON CHAR16 NULL, CONSTRAINT FK_BÖLÜM FOREIGN KEY BÖLÜM REFERENCES BÖLÜMLER[BÖLÜM KODU] ON DELETE CASCADE ON UPDATE CASCADE e. CHECK: Öğrenciler tablosunda TELEFON alanına dikkat edin. Telefon numarası için 16 karakter yer ayrılmış. Telefon yazılırken maksimum 16 karakterlik yer kullanıldıktan sonra istenildiği şekilde girilebilir. Aslında bu istenen bir durum değildir. Örneğin kimisi numaralar arasına nokta, kimisi tire veya bir başkası boşluk bırakabilir. Dahası, kimisi şehir kodlarını parantezler arasına alırken kimisi almaz, kimisi başına sıfır eklerken kimisi de eklemez. Bütün bunlar aslında istenmeyen durumlardır. Sıralamaların veya aramaların doğru şekilde yapılabilmesi için kayıtların aynı tipte olması gerekmektedir. Böyle durumları kontrol etmek için CHECK anahtar sözcüğü kullanılmaktadır. Aşağıda telefon için örnek bir kontrol yazılmıştır. TELEFON CHAR16 CHECK TELEFON LIKE '[0][0-9][0-9][0-9] [0-9][0-9][0-9] [0-9][0-9] [0-9][0-9]' 4 Bartın MYO Bilgisayar Programcılığı Öğr. Gör. Bayram AKGÜL 2013-2014 Güz Dönemi
Bir başka örnek olarak kan gruplarını verebiliriz. Bilindiği gibi bir insanın kan grubu A, B, 0 veya AB olabilir. Bir diğer örnek olarak ta cinsiyet olabilir. Cinsiyet sadece bay, bayan şeklinde yazılsın istiyorsak bunları veritabanına girmeden önce bunlar haricinde bir şeyin yazılmış olup olmadığını aşağıdaki gibi kontrol edebiliriz. KANGRUBU CHAR2 CHECKKANGRUBU IN 'A','B','0','AB' NOT NULL CİNSİYET CHAR5 CHECKCİNSİYET IN 'BAY', 'BAYAN' NOT NULL Bir alan kontrollü oluşturulmak istenince aşağıdaki kural göz önüne alınmalıdır. ALAN_ADI VERİ_TİPİ CHECK{KOŞUL İFADESİ} UYARI: Koşul ifadeleri daha sonra ayrıntılı bir şekilde işlenecektir. CHECK anahtar sözcüğü alan tanımlanırken yazılabildiği gibi aşağıdaki şekilde de tanımlanabilir. Görüldüğü gibi koşul ifadesi maaş alanı tanımladıktan sonra başka bir satırda yazılmış. CREATE TABLE KİŞİLER NUMARA INT PRIMARY KEY, ADI VARCHAR25 NOT NULL, SOYADI VARCHAR25 NOT NULL, MAAŞ SMALLMONEY NOT NULL, TELEFON CHAR16 NULL, CINSIYET BIT NULL, CONSTRAINT CHK_MAAŞ CHECKMAAŞ BETWEEN 1000 AND 2000 f. DEFAULT: bazen bazı alanların varsayılan değerlerinin olmasını isteriz. Yani eğer farklı bir şey belirtmiyorsak varsayılan değer otomatik olarak kayıt için girsin isteriz. CREATE TABLE KİŞİLER NUMARA INT PRIMARY KEY, ADI VARCHAR25 NOT NULL, SOYADI VARCHAR25 NOT NULL, BÖLÜM CHAR4 DEFAULT 'BPR1' NOT NULL Bu örnekte bölüm için bir veri belirtmiyorsak bölüm alanına varsayılanda BPR1 girilecektir. DEFAULT anahtar sözcüğü alan tanımlanırken yazılabildiği gibi aşağıdaki şekilde CONSTRAINT ile beraber de tanımlanabilir. CREATE TABLE KİŞİLER NUMARA INT PRIMARY KEY, ADI VARCHAR25 NOT NULL, SOYADI VARCHAR25 NOT NULL, BÖLÜM CHAR4 NOT NULL, CONSTRAINT DEF_BOLUM DEFAULT 'BPR1' FOR BÖLÜM 5 Bartın MYO Bilgisayar Programcılığı Öğr. Gör. Bayram AKGÜL 2013-2014 Güz Dönemi
g. IDENTITY: Sipariş numarası gibi bazı numaraların otomatik olarak üretilmesini isteyebiliriz. Access teki otomatik sayı alanını hatırlayınız. Böyle durumlar için IDENTITY anahtar sözcüğü kullanılır. IDENTITY kullanılırken yanına parantez içerisinde başlama ve artış miktarı belirtilebiliyor. Eğer bir şey belirtilmezse 1 den başlayıp birer birer arttıracaktır. CREATE TABLE SİPARİŞLER [SİPARİŞ NO] INT PRIMARY KEY IDENTITY100,1, [ÜRÜN ADI] VARCHAR25 NOT NULL, [SİPARİŞ TARİHİ] DATETIME NOT NULL Yukarıdaki örnekte sipariş numarası 100 den başlayacak ve her kayıt için birer birer arttırılacaktır. NOT: Herhangi bir tabloda sadece bir identity alan tanımlanabilir. 1.3. Tablo Silme Tablo silmek çok basittir. DROP TABLE tablo_adı komutu yazılarak çalıştırılır. İsmi yazılan Tablo tüm kayıtlarıyla yok edilir. Örnek: DROP TABLE ÖĞRENCİLER Burada öğrenciler tablosu tüm kayıtlarıyla yok edilecektir. 6 Bartın MYO Bilgisayar Programcılığı Öğr. Gör. Bayram AKGÜL 2013-2014 Güz Dönemi