SQL-3 Veri Tanımlama Komutları
Transkript
SQL-3 Veri Tanımlama Komutları
SQL'de Veri Tanımlama Komutları SQL'de veri tanımlamak için kullanılan komutlara DDL (Data Definition Language- Veri Tanımlama Dili) denir. Bu komutlar ile oluşturulan ifadeler, SQL Server içinde veritabanı, tablo, indeks ve kullanıcı tanımlı veri tipleri gibi nesneler oluşturmak ve bunları yapılandırmak için kullanılır. Bir veritabanında hangi tablolar yer alacak, bu tablolarda hangi alanlar yer alacak ve alanların türleri ne olacak, indeks ya da anahtar olacak mı? Bunların hepsi DDL ile belirlenir, değiştirilir veya var olan bir tanımlama silinebilir. DDL komutları şunlardır: CREATE ALTER DROP Veritabanı üstünde herhangi bir nesne CREATE komutu ile oluşturulur. DROP komutuyla nesneler silinir. ALTER ise önceden oluşturulmuş bir nesne üzerinde değişiklik yapmak için kullanılır. ! SQL cümleciklerini BÜYÜK harfle yazmak, bir kural olmasa da kabul gören bir yazma şeklidir. Bu durumda, değişken adlarını mümkün oldukça küçük harflerden oluşacak şekilde tercih etmek okunurluğu artıracaktır. Birçok dilin aksine, SQL ifadelerinin kaç satırda bittiğinin bir önemi yoktur. İfadenin herhangi bir yerinde alt satıra geçmiş olmanız, SQL ifadesinin çalışamayacağı anlamına gelmez. ! Bazı veritabanı yönetim sistemlerinde her bir SQL cümleciğinin sonuna ‘;’ konulması istenir. Bu tür sistemlerde, ifadenin nerede bittiğini takip etmek kullanıcıya bırakılmıştır. Öte yandan bazı sistemlerde bir SQL ifadesinin bittiğini belirtmek için ifadenin sonuna ‘;’ koymaya gerek yoktur. Bunu sistemin kendisi de algılayabilmektedir. Çoğu sistemde ‘;’ konulmasının sorun çıkarmadığı bir gerçektir. SYBASE’de ve ORACLE’de ifadelerin sonuna ";" konulması gerekirken, MS tabanlı sistemlerde bu türden bir zorunluluk bulunmamaktadır. Bu bölümde SQL komutlarını kullanarak veritabanı üzerinde yapılabilecek işlemlerden bahsedilecektir. Veri tanımlama işlemlerinin menüler kullanılarak da yapılabildiği ikinci ünitede anlatılmıştı. Programları geliştirirken nesneler, SQL ifadesi kullanmadan menüler yardımıyla oluşturabilir ve kullanabilir. Ancak hazırlanan programlardaki veritabanı nesnelerini, programın gereksinimi doğrultusunda dinamik olarak programın içerisinde oluşturmak gerekebilir. Bunun için DDL komutları ile oluşturulan SQL ifadeleri kullanılmalıdır. DDL komutlarının uygulanmasında aşağıda bilgileri verilen örnekten yararlanılacaktır. Örnekte bir mağaza, müşterilerinin siparişlerini tutmak istemektedir. Bunun için oluşturulacak MAGAZA isimli veritabanında, siparişi veren müşterinin kişisel bilgilerinin tutulacağı MUSTERI tablosu, mağazada satılan ürünlerin bilgilerinin tutulacağı URUN tablosu ve siparişlerin tutulacağı SIPARIS tablosu oluşturulması gerekmektedir. Tablolarda aşağıdaki bilgi alanları yer almaktadır: musteri tablosu musteri_no : Adi : soyadi : dogum_tarihi : cinsiyeti : adresi : kart_no : tarih : Her müşteriyi temsil edecek bilgi (her numara bir tane olacak) Müşterinin adı Müşterinin soyadı Müşterinin doğum tarihi Müşterinin cinsiyeti bilgisi Müşterinin adresi Müşterinin kredi kartı numarası Müşterinin kayıt edildiği tarih ve saat urun tablosu urun_kodu urun_markasi urun_adi urun_fiyati urun_miktari aciklama Her ürünü temsil edecek bilgi (her kod bir tane olacak) Ürünün markası Ürünün adı Ürünün satış fiyatı Ürün miktarı Ürün açıklaması : : : : : : sıparis tablosu siparis_no : Her bir siparişi temsil edecek bilgi (her numara bir tane olacak) musteri_no : Siparişi yapan müşteriyi belirlemek için kullanılacak bilgi (aynı ada soyada sahip olan müşteriyi ayırt etmek amacıyla tek olan müşteri numarası kullanılır) siparis_tarihi : Siparişin verildiği tarih urun_kodu : Siparişi yapılan ürünü temsil eden kod (aynı isme sahip olan ürünleri ayırt etmek için ürün kodu kullanılır) fiyat : Ürünün sipariş verildiği tarihteki fiyatı miktar : Kaç adet sipariş verildiği sayı tutar : Siparişin tutarı (fiyat*miktar) Şekil 1'de veritabanındaki bu tablolar ve tabloların arasındaki ilişkiler şematik olarak gösterilmektedir. Şekil 1. Magaza veritabanındaki tabloların alan yapıları ve tablolar arasındaki ilişkiler Nesneler Oluşturmak - CREATE Komutu SQL Server içinde veritabanı, tablo, indeks ve kullanıcı tanımlı veri tipleri gibi nesneler oluşturmak için CREATE kullanılır. Oluşturulacak nesnenin özellikleri dikkate alınarak farklı parametreler kullanılmalıdır. Veritabanı Oluşturmak – CREATE DATABASE Bir SQL veritabanı temel olarak iki dosyadan oluşur. Bunlardan birincisi Data File olarak adlandırılan, tablo, indeks gibi verileri tutan dosyadır. Diğeri ise veritabanında meydana gelen değişiklikleri tutan bir çeşit işlem günlüğü diyebileceğimiz Transaction Log olarak adlandırılan dosyadır. CREATE DATABASE <veritabanı_adı> ON ( NAME = <veritabanı_dosya_adı>, FILENAME = '<veritabanı_dosya_adı_adresi>') LOG ON ( NAME = <veritabanı_günlük_dosya_adı>, FILENAME = veritabanı_işlem_günlüğü_dosya_adı_adresi' ) ; Yukarıda veritabanı oluşturmayı sağlayan ifadenin yapısı gözükmektedir. Veritabanı dosyalarını disk üzerinde birden fazla dosya belirterek veriyi farklı fiziksel dosyalara bölmek mümkündür. İlk dosyanın varsayılan uzantısı mdf iken, sonrakilerinki ndf'dir. MAXSIZE ile veri dosyalarının en fazla hangi boyuta ulaşacağı belirlenebilir. MAXSIZE değeri UNLIMITED olarak belirlendiğinde bir üst sınır tanımlanmaz. Fakat MS SQL Server'da veritabanı dosyası UNLIMITED olarak tanımlansa bile veritabanı dosyası boyutu en fazla 16 TB (Terabyte), işlem günlüğü dosyası boyutu ise en fazla 2 TB olabilmektedir. FILEGROWTH bilgisi MB ya da yüzde (%) olarak dosyanın büyüme oranını belirtir. Dosyanın büyüme bilgisi MAXSIZE ile düzenlenen değerleri aşamaz. * Örnek: CREATE DATABASE Magaza ON ( NAME = Sales_dat, FILENAME = 'C:\Magaza.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\Magaza_log.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) MAXSIZE değeri belirtilmezse UNLIMITED değerine sahipmiş gibi kabul edilir. * Örnek: CREATE DATABASE Magaza ON ( NAME = Magaza_dat, FILENAME = 'C:\Magaza.mdf' ) LOG ON ( NAME = Magaza_log, FILENAME = 'C:\Magaza_log.ldf' ) ; Sadece veritabanı adını belirterek SQL Server üzerinde veritabanı oluşturulabilir. Bu şekilde veritabanı tanımlandığında diğer parametreler varsayılan değerlere sahip olarak gerçekleştirilecektir. * Örnek: CREATE DATABASE Magaza Örnekteki gibi veritabanı oluşturulduğunda veritabanı dosyası magaza.mdf ve magaza_log.ldf isimli dosyalar SQL Server'ın bilgisayarda kurulu olduğu klasör içindeki DATA klasöründe yer alacaktır. "C:\Program Dosyaları (x86)\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA" gibi. Tablo Oluşturmak – CREATE TABLE SQL'de, CREATE TABLE ifadesi kullanılarak veritabanında veri depolamak için tablo oluşturulur. CREATE TABLE <tablo_adı> ( <alan_adı> <veri_türü> [DEFAULT ifade][alan_kısıtlaması], … … [ CONSTRAINT kısıtlayıcı adı ] { { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] | [ FOREIGN KEY ] REFERENCES referans_tablo_adı[ ( referans_alan ) ] [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }] [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }] } ); tablo_adı alan_adı : Tabloya verilecek isim (örnek musteri), : Tabloda yer alacak bilgi alanlarının adı (Örnek, müşteri_no, adı, soyadı gibi), alan_veri_türü : O alana girilecek bilginin türü (sayı, metin, tarih gibi), DEFAULT ifade : O alana değer girilmezse başlangıçta atanacak değer, alan_kısıtlaması : O alanla ilgili kısıtlama (boş olmaması gibi), tablo_kısıtlaması : Her kaydın belirli alanlara göre kısıtlanması (kayıtların tek olmasını sağlamak, başka bir tablo ile ilişkilendirmek), Örnek uygulama için sırasıyla musteri, urun ve siparis tabloları aşağıdaki SQL ifadeleri oluşturulmalıdır. Tabloları oluşturmak için aşağıda belirtilen SQL ifadelerini yeni sorgu ekranına kopyalayarak çalıştırılmalıdır. Musteri tablosunun oluşturulması: CREATE TABLE musteri ( musteri_no bigint IDENTITY(1,1) NOT NULL PRIMARY KEY, adi varchar (10) NOT NULL, soyadi varchar (10) NOT NULL, dogum_tarihi date NULL, cinsiyeti bit NULL DEFAULT 0, adres varchar (30) NULL, kart_no numeric(16, 0) NULL, tarih smalldatetime NULL ); musteri_no bigint IDENTITY(1,1) NOT NULL PRIMARY KEY, Alan adı Otomatik kimlik (başlangıç değeri, artırım miktarı) Veri türü Boş değere sahip olmayacağı belirler musteri_no alanının birincil anahtar alan olarak belirlenmesini sağlar. Şekil 2. Musteri_no alanını tanımlayan parçalar Yukarıdaki SQL ifadesi çalıştırıldığında şekil3'deki yapıya sahip musteri tablosu oluşturulur. Şekil 2'de musteri_no alanının tanımalayan parçalar açıkalnmaktadır. Bir alan tanımlanırken o alana ait tanımlama bilgileri değişebilir. Ancak alanda tutulacak veri tipi mutlaka belirtilmelidir. Musteri tablosu tanımlanırken cinsiyeti alanı bit veri tipinde tanımlanmıştır. Bunun nedeni bu alandaki kayıtlar yalnızca iki farklı değer alabilir. Örneğin kadınlar için 0, erkekler için ise 1 değeri verilebilir (Elbette bunun tersi de düşünülebilir). DEFAULT 0 özellliği ilk kayıt girişinde bu alandaki değerin 0 olacağını belirtmektedir. Eğer kayıt girişi esnasında bu alnda bir değişiklik yapılmazsa bu alandaki değer 0 olacaktır. SQL ifadesi ile oluşturulan bir tablonun alan yapsına oluşturulan tablo üzerinde sağ tuşa basıp Design komutunu seçerek ulaşabilirsiniz. Şekil 3. Musteri tablosunun alan yapısı Bir alanı, birincil anahtar olarak tanımlamak için PRIMARY KEY ifadesini kullanmak yeterlidir. Bu kullanımda, bu alana ait birincil anahtar indeksi rastgele türetilen bir isimle olacaktır. CONSTRAINT cümlesini ALTER TABLE ve CREATE TABLE ifadelerinde kısıtlayıcı oluşturmak ya da silmek için kullanılabilir. CONSTRAINT ile indeksi oluştururken istenilen bir isim verilebilmekte ve indeks özellikleri tanımlanabilmektedir. Örnekte musteri_no alanına ait musteri_no_pk isimli bir birincil anahtar alan tanımlanmıştır. CREATE TABLE musteri ( musteri_no bigint IDENTITY(1,1) NOT NULL, ... ... CONSTRAINT musteri_no_pk PRIMARY KEY (musteri_no) ); Urun Tablosunun oluşturulması: CREATE TABLE urun ( urun_kodu bigint IDENTITY(1,1) NOT NULL PRIMARY KEY, urun_adi varchar(20) NOT NULL, urun_markasi varchar(20) NOT NULL, urun_turu varchar(20) NULL DEFAULT 'Belirsiz', urun_fiyati money NOT NULL ); Yukarıdaki SQL ifadesi çalıştırıldığında aşağıdaki yapıya sahip urun tablosu oluşturulmuş olur. urun_turu alanı için belirtilen DEFAULT 'Belirsiz' özelliği, tabloya veri girilirken urun_turu alanı boş bırakılırsa NULL değeri yerine tırnak içinde belirtilen ifade yani Belirsiz değeri girilmiş olacaktır. Şekil 4. Urun tablosunun alan yapısı Siparis Tablosunun oluşturulması: CREATE TABLE siparis ( siparis_no bigint NOT NULL IDENTITY (1, 1), urun_kodu bigint NOT NULL, musteri_no bigint NOT NULL, siparis_tarihi smalldatetime NOT NULL, fiyat money NOT NULL, miktar smallint NOT NULL, tutar AS fiyat*miktar, CONSTRAINT siparis_pk PRIMARY KEY (siparis_no), CONSTRAINT siparis_musteri_fk FOREIGN KEY (musteri_no) REFERENCES musteri(musteri_no), CONSTRAINT siparis_urun_fk FOREIGN KEY (urun_kodu) REFERENCES urun(urun_kodu) ); Yukarıdaki SQL ifadesi çalıştırıldığında şekil 5'deki yapıya sahip siparis tablosu oluşturulmuş olur. SQL ifadesinde tutar AS fiyat*miktar bilgisi tutar alanının hesaplanmış alan olduğunu ifade etmektedir. Tutar alanındaki değerler fiyat ve miktarın çarpımı sonucu oluşur ve kullanıcı bu değerlere müdahale edemez. Şekil 5. Siparis tablosunun alan yapısı Siparis tablosu oluşturulurken öncekilerden farklı olarak yabancı anahtar (foreign key) kısıtlayıcısı kullanılmıştır. Yabancı anahtar kısıtlayıcısı, birincil anahtar-yabancı anahtar ilişkisinde; yabancı anahtar alanındaki değerlerin, yalnızca ilişikili olduğu tablodaki birincil anahtar alandaki değerlerden oluşmasını sağlar. Bu, veri bütünlüğünü sağlamak için uygulanan bir yöntemdir. Çünkü yapısı itibariyle yabancı anahtarın bulunduğu tablodaki veriler, birincil anahtarın bulunduğu tablodaki verilere aittir. Herhangi bir birincil anahtar ile eşleşmeyen yabancı anahtarlı kayıtlar, birincil anahtar-yabancı anahtar ilşikisinde bir anlam ifade etmeyecek ve tabloda gereksiz yer kaplayacaktır. Örneğin müşteri tablosunda yer almayan bir müşteri için sipariş tablosunda bir sipariş kaydı oluşturulmasınının bir anlamı yoktur. Bu tür durumlarda yabancı anahtar kısıtlayıcısı devreye girer ve şekil 6'daki bir hata mesajı verir. Şekil 6. Yabancı anahtar ksııtlamasından dolayı oluşan hata mesajı Yabancı anahtarla sadece girdiler kontrol edilmez. CASCADE, NO ACTION, SET NULL ve SET DEFAULT parametrelerin bağlı olarak aşağıdaki işlemleri gerçekleştirir: CASCADE : İlişkili tabloda bir değişiklik olduğunda ya da kayıt silindiğinde aynısı ilişkilendirilen tabloya da yansır. Silme yaparken, ana tablodaki kaydın, alt tablonun hangi kayıtlarında olduğu gibi sorunlarla uğraşmamak için ana-alt (master-detail) ilişkisindeki yapılarda Delete Cascade özelliği kullanılabilir. Kademeli silme özelliği ile bir ana tablodan veri silindiğinde otomatik olarak o kayda ait tüm bağlı alt tablolardaki veri de silinir ve bu şekilde veri bütünlüğü korunur. * Örnek: CONSTRAINT siparis_musteri_fk FOREIGN KEY (musteri_no) REFERENCES musteri(musteri_no) ON DELETE CASCADE; Örnekte siparis tablosunu musteri tablosu ile ilişkilendiren yabancı anahtara DELETE CASCADE seçeneği eklenemiştir. Böylece musteri tablosunda bir müşteriye ait kayıt silindiğinde o müşterinin bütün sipraişleri de silinecektir. Eğer DELETE CASCADE tanımlanmazsa bir müşterinin silinebilmesi için o müşteriye ait hiçbir siparişin olmaması gerekir. Siparişleri varsa da önce siparişleri silinmelidir. Aksi takdirde müşteri silinemez. Yabancı anahtar kısıtlayıcısı veri bütünlüğünü sağlamak için bunu engeller. ON UPDATE CASCADE seçeneği ilişkilendirilen birincil anahtardaki değerin değişmesi durumuna karşı yapılabilir. Örneğin musteri tablosunda bir müşteriye verilen numara (musteri.musteri_no alanı) yanlış girilmiş olabilir. Bu müşteriye ait numara değiştiğinde siparis tablosundaki o müşteriye ait numara da (siparis.musteri_no) değişmelidir. Aksi durumda veri bütünlüğü bozulabilir. Örneğimizde, ilişkilendirilen alanlar kimlik (identity) olarak tanımlandığı için bu alana veriler sistem tarafından otomatik artırılarak atanır. Bu da ON UPDATE CASCADE seçeneğinin kullanılmasını gereksiz kılar. Çünkü kimlik alanlarına normal şartlarda kullanıcı tarafından müdale edilemez. Eğer el ile değiştirilebilen bir birincil anahtar tanımlanmış olsaydı yabancı anahtar tanımlarken ON UPDATE CASCADE seçeneğinde mutlaka tanımlanmış olması gerekirdi. NO ACTION: Silme ya da güncelleme işlemi yabancı anahtar kısıtlayıcısına uymadağı durumlarda hata mesajı verilmesini ve işlemin iptal edilmesini sağlar. ON DELETE ya da ON UPDATE cümleleri yanında herhangi bir parametre belirtilmezse varsayılan olarak NO ACTION değeri geçerli olur. * Örnek: CONSTRAINT siparis_musteri_fk FOREIGN KEY (musteri_no) REFERENCES musteri(musteri_no) ON DELETE NO ACTION; ya da CONSTRAINT siparis_musteri_fk FOREIGN KEY (musteri_no) REFERENCES musteri(musteri_no) ON DELETE; SET NULL: Yabancı anahtar alanının NULL değer almasını sağlanır. Örnek olarak birincil tabloda bir kayıt silindiğinde ilişkili tabloda o kayda ait bağlı kayıtların yabancı anahtar değerinin NULL olmasını sağlar. SET DEFAULT: Yabancı anahtar alanı, varsayılan değer olarak tanımlanan değeri alması sağlanır. Örnek olarak birincil tabloda bir kayıt silindiğinde ilişkili tabloda o kayda ait bağlı kayıtların yabancı anahtar değerinin varsayılan değer olmasını sağlar. Yabancı alan için tanımlanmış bir varsayılan değer yoksa alanın değeri değiştirilmeden aynı kalır. ! CONSTRAINT ile oluşturulan tablonun yabancı anahtar kısıtlayıcısının özelliklerinde değişiklik yapmış olduk. Bu özelikler CREATE TABLE ile tablo tanımlanırken de belirlenebilirdi. Yukarıdaki kodlar çalıştırıldıktan sonra magaza veritabanı altında musteri, siparis ve urun adında oluşturulan tablolar, nesne gezgini (Object Explorer) alanında Tables altında gösterilecektir (Şekil 7). Yapılan değişiklikler nesne gezgininde görünmüyorsa listesinin yeninden oluşturulması için istenilen kök üzerinde farenin sağ tuşuna basıp Refresh komutu verilmelidir. Şekil 7. Magaza veritabanı ve bileşenleri Tablolarda İndeks Tanımlamak – CREATE INDEX Veritabanlarında indeks oluşturarak, verileri veritabanındaki kayıtlı oldukları sıradan başka bir sırada gösterebiliriz. Temelde indekslerin ilişkisel veritabanında şu üç işlevi vardır: 1. Tekil İndeksler, veri ilişkilerini ve veri bütünlüğünü sağlayan birincil anahtar alanlar oluşturmada kullanılır. 2. İndeks olan alanın değerine göre bir kaydın, kayıtlar arasındaki sırasını gösterir. 3. Sorguların gerçekleştirilme sürelerini kısaltır. CREATE INDEX belirtilen bir tablo üzerinden bir indeks oluşturur. İndekslerin birincil kullanım amacı veritabanı işlemlerinin performansını artırmaktır. (ancak uygunsuz kullanımı performansın düşmesiyle yol açar). CREATE [ UNIQUE ] INDEX <indeks_adı> ON <tablo_adı> (<alan_adı> [ASC|DESC][, <alan_adı> [ASC|DESC], ...]) [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }] * Örnek: CREATE INDEX adsoyad_indeks ON musteri (adi ASC, soyadi ASC) Bu örnekte musteri tablosuna için adı ve soyadı alanlarına göre artan sırada adsoyad_indeks isimli indeks oluşturulmaktadır. İndeks oluşturulduğunda tabloya ait Indexes grubunda özellikleriyle birlikte listelenecektir (Şekil 8). Şekil 8. Oluşturulmuş indeksler Farklı kayıtların indekse eklenmiş alanlarında yinelenen değer bulunmasını engellemek için UNIQUE özel amaçlı sözcüğünü kullanılır. * Örnek: CREATE UNIQUE INDEX adsoyad_indeks ON musteri (adi ASC, soyadi ASC) Bu örnekte musteri tablosuna için adı ve soyadı alanlarına göre artan sırada adsoyad_indeks isimli indeks oluşturulmaktadır. Ancak önceki örnekten farklı olarak UNIQUE ifadesi eklendiği için bu tabloya girilecek adi-soyadi alanı değerleri benzersiz olmalıdır. Aynı ada ya da soyada sahip müşteri tabloya eklenebilir fakat aynı ad ve soyada sahip müşteri eklemek istendiğinde hata verecektir. Böyle bir durumda sistem şekil 9'daki gibi bir hata mesajı vererek veri girişini engelller. Şekil 9. Aynı değere sahip verilerin girişinin indeks ile engellenmesi. İsteğe bağlı WITH ifadesiyle veri doğrulama kurallarına uyulmasını sağlayabilirsiniz. DISALLOW NULL seçeneğini kullanarak yeni kayıtların indekse alınmış alanda veya alanlarında giriş olmasını engellenebilir. IGNORE NULL seçeneğini kullanarak, indekse alınmış alanda veya alanlarda NULL değer içeren kayıtların indekste yer almasını önlenebilir. PRIMARY parametresini kullanarak, indekse alınmış alanı veya alanlar birincil anahtar olarak belirlenebilir. Bu parametre, anahtarın benzersiz olduğunu belirteceğinden, UNIQUE parametresinin kullanılmasına gerek kalmaz. ! Birincil anahtarı olan bir tabloda, yeni indeks oluşturmak için PRIMARY özel amaçlı sözcüğü kullanılamaz. Nesnelerde Değişiklik Yapmak - ALTER Komutu Daha önceden oluşturulmuş bir nesnenin özelliğinin değiştirilmesini sağlar. Veritabanının Adını Değiştirme Bir veritabanın adını değiştirmek için ALTER komutunun kullanımı şu şekildedir: ALTER DATABASE <veritabanı adı> MODIFY NAME=<veritabanın yeni adı>; * Örnek: ALTER DATABASE magaza MODIFY NAME=mgz; Yukarıdaki sorgu ifadesi ile magaza veritabanının adı mgz olarak değiştirmektedir. Tablo Adını Değiştirmek Veritabanı nesneleri üzerinde değişiklik yapmak için ALTER komutunu kullanırız. Fakat tablo adı değiştirme işlemi SQL Server 2008 biraz değişmiştir. Bunun için master tablosunda tanımlanmış olan "sp_rename" kayıtlı yordamının (stored procedure) kullanılması gerekmektedir. Bu da şu şekildedir: EXEC sp_rename <tablo adı>, <yeni tablo adı>; * Örnek: urun tablosunun adını urun1 olarak değiştirmek için aşağıdaki ifade yazılır. EXEC sp_rename 'urun', 'urun1' ! SQL komutlarının kullanımı çoğu veritabanı için aynı olsa da bazı komutlar versiyonlara ya da veritabanı platformuna (Oracle, MySql, MS SQL gibi) göre değişiklik gösterebilmektedir. Tablo adı değiştirme de bunlardan biridir. Örneğin MySql'de tablo adı aşağıdaki gibi değiştirilir. ALTER TABLE <tablo_eski_adı> RENAME TABLE < tablo_yeni_ adı>; Tabloda Alan Adı Değiştirmek Bir tabloya ait alanların da adı değiştirilebilir. EXEC sp_rename <'tablo adı.alan adı'>, <'yeni alan adı'> * Örnek: Urun tablosundaki iskonto alanının adını indirim olarak değiştirmek için aşağıdaki ifade yazılır. EXEC sp_rename 'urun.iskonto', 'indirim' Tabloya Yeni Bir Alan Eklemek ALTER TABLE <tablo adı> ADD <alan adı> <veri_turu>; * Örnek: Urun tablosuna her üründe yapılabilecek iskonto için bir alan oluşturmak için aşağıdaki ifade yazılır. ALTER TABLE urun ADD iskonto bigint; Tabloda Birincil Anahtar Alan Belirlemek * Örnek: Urun tablosunda urun_kodu alanına göre birincil anahtar oluşturmak için aşağıdaki ifade yazılır. ALTER TABLE urun ADD CONSTRAINT PK_urun PRIMARY KEY(urun_kodu); Tablodan Alan Silmek Tablodan istenilen bir alan silinebilir. ALTER TABLE <tablo_adı> DROP COLUMN <alan_adı>; * Örnek: Urun tablosundan indirim alanını silmek için aşağıdaki ifade yazılır. ALTER TABLE urun DROP COLUMN indirim; Tablonun Birincil Anahtar Alanını Silmek * Örnek: Urun tablosundaki PK_urun isimli birincil anahtarı kaldırmak için aşağıdaki ifade yazılır. ALTER TABLE urun DROP CONSTRAINT PK_urun; Nesneleri Silmek - DROP Komutu Veritabanı Silmek – DROP DATABASE İhtiyaç duyulmayan veritabanlarını silmekte fayda vardır. Bir veritabanı silindiğinde o veritabanına ait olan bütün bileşenler de silinecektir. Silinecek veritabanı aktif olmamalıdır. Yani bileşenleri kullanım halinde olmamalıdır. Kullanım şekli aşağıdaki gibidir. DROP DATABASE <veritabanı adı>; ! Veritabanı ile ilgili işlemlere devam edebilmeniz için silme işleminden önce veritabanınızın yedeğini almanızda fayda vardır. * Örnek: Magaza isimli veritabanı silen ifade aşağıdaki gibidir. DROP DATABASE magaza; Tablo Silmek – DROP TABLE Tablolara ihtiyaç kalmadığı zaman silmek için kullanılır. Silme işlemlerinin geri dönüşü yoktur. Bu nedenle silme işlemlerinde son derece dikkat edilmelidir. Tablolarla birlikte bu tablolara ait tüm indeksler, kısıtlamalar, tetikleyiciler de silinir. İfadenin yazılışı aşağıdaki gibidir. DROP TABLE <tablo adı>; * Örnek: Satis_Ekibi tablosunu silmek için aşağıdaki ifade yazılır. DROP TABLE Satis_Ekibi; Başka bir veritabanındaki tabloyu silmek için ifade şu şekilde yazılır. DROP TABLE <veritabanı adı>.dbo.<tablo adı>; * Örnek: Magaza veritabanındaki satis tablosunu silmek için aşağıdaki ifade yazılır. DROP TABLE Magaza.dbo.Satis; İndeks Silmek – DROP INDEX İndeks silme işleminin kullanım şekli aşağıdaki gibidir. İndeksler tablolara aittir. Dolayısıyla silme işleminde ait olduğu tablonun ismi de belirtilmelidir. DROP INDEX <tablo adı>.<indeks adı>; ya da DROP INDEX <indeks adı> ON <tablo adı>; * Örnek: Magaza veritabanında daha önceden oluşturulmuş musteri tablosundaki verileri isim ve soyadına göre sıralayan adsoyad_indeks isimli indeksi silen ifade aşağıdaki gibidir. DROP INDEX musteri.adsoyad_indeks; ya da DROP INDEX adsoyad_indeks ON musteri; ! Tek bir ifade ile birden fazla nesneyi (veritabanı, tablo, indeks) silmek mümkündür. Yapılması gereken silinecek nesnelerin isimlerini virgül (,) karakteri ile birbirinden ayırmaktır. Değerlendirme Soruları I. II. III. IV. CREATE DELETE DROP ALTER 1. Yukarıdakilerden hangisi veri tanımlama dili komutları arasındadır? a) Yalnız I b) I ve II c) I ve III d) I, II ve IV e) I, III ve IV 2. SQL Server ile oluşturulan veritabanı dosya uzantısı aşağıdakilerden hangisidir? a) Mdb b) Sql c) Mdf d) Sdf e) Dbo 3. İşlem Günlüğü (Transaction Log) için aşağıdakilerden hangisi doğrudur? a) Veritabanında silinen veya eklenen kayıtları saklar. b) Veritabanı üzerinde arama işleminin hızlandırılmasını sağlar. c) İlişkili tablolar arasında veri bütünlüğünü sağlar. d) Veritabanı üzerinde meydana gelen olayların kaydını tutar. e) Veritabanı üzerinde kayıtlar üzerinde yapılan değişikleri geçici olarak tutar. 4. Aşağıdaki SQL ifadelerden hangisi ogrenci_isleri adında bir veritabanı oluşturur? a) CREATE ogrenci_isleri; b) CREATE TABLE ogrenci_isleri; c) CREATE DATABASE ogrenci_isleri; d) ALTER DATABASE ogrenci_isleri; e) ALTER TABLE ogrenci_isleri; 5. Aşağıdaki SQL ifadelerden hangisi ogrenci_isleri adındaki veritabanının adını ogr_isl olarak değiştirir? a) CREATE ogrenci_isleri RENAME ogr_isl; b) CREATE DATABASE ogrenci_isleri RENAME ogr_isl; c) ALTER DATABASE ogrenci_isleri RENAME ogr_isl; d) ALTER DATABASE ogrenci_isleri MODIFY NAME=ogr_isl; e) ALTER DATABASE ogrenci_isleri ogr_isl; 6. Aşağıdaki SQL ifadelerinden hangisi personel tablosuna ait adi_soyadi isimli indeksi siler? a) ALTER INDEX personel.adi_soyadi; b) DROP INDEX personel.adi_soyadi; c) DROP INDEX adi_soyadi; d) CREATE INDEX adi_soyadi; e) CREATE INDEX personel.adi_soyadi; 7. 8. 9. İlişikli tablolar arasında, bir alan için belirtilen ON DELETE CASCADE özelliği için aşağıdakilerden hangisi doğrudur? a) Birincil tablodaki kayda karşılık ilişkili tabloda kayıt varsa silme işlemi iptal edilir. b) Birincil tablodaki kayda karşılık ilişkili tabloda kayıt varsa bu kayıtlara ait yabancı anahtar alan değeri NULL olarak değiştirilir. İlişkili tablodaki kayıtlar silinmez. c) Birincil tablodaki kayda karşılık ilişkili tabloda kayıt varsa bu kayıtlar da silinir. d) Birincil tablodaki kayda karşılık ilişkili tabloda kayıt varsa uyarı mesajı gösterilerek silme işleminin iptal edilmesi ya da gerçekleştirilmesi sağlanır. e) Birincil tablodaki kayda karşılık ilişkili tabloda kayıt olmadığı durumlarda silme işlemi gerçekleştirilir. Bir alan tanımlanırken "IDENTITY(10,1)" şeklinde belirtilen ifade ne anlama gelmektedir? a) Sayısal alanlarda tam kısmını 10, ondalık kısmını 1 basamak olacak şekilde ayarlar. b) Alan değerinin otomatik oluşturulurken başlangıç değerinin 10, artış değerinin 1 olmasını sağlar. c) Birincil anahtar alan tanımlamak için gerekli bir SQL ifadesidir. d) Boş değere sahip alanların olmaması için varsayılan olarak rastgele bir sayı oluşturur. e) Sayısal alanlarda, TC kimlik numarası gibi birbirinden farklı 10 basamaklı sayı oluşturarak benzersiz değerler oluşturur. İndeks oluşturulurken kullanılan UNIQUE ifadesi için aşağıdakilerden hangisi doğrudur? a) Birincil anahtar alan oluşturmak için benzersiz alan değeri oluşturur. b) Tablodaki verilerin büyükten küçüğe doru sıralanmasını sağlar. c) İndeksleme yapılacak alana benzersiz kayıt girilmesini zorunlu hale getirir. d) İndeks alan değeri için otomatik artan benzersiz kayıtlar oluşturur. e) İndeks alanına boş değer girilmesini engeller. 10. "Personel" isimli tabloya "eposta" isimli varchar veri tipinde alan eklemek için aşağıdaki ifadelerden hangisi çalıştırılmalıdır? ALTER TABLE Personel ADD eposta varchar(50); CREATE TABLE Personel INSERT eposta varchar(50); EDIT TABLE Personel INSERT eposta varchar(50); ALTER TABLE Personel ADD COLUMN eposta varchar(50); EDIT TABLE Personel DROP COLUMN eposta varchar(50); 11. Ogrenciler isimli tablodan cinsiyet isimli alanı silmek için aşağıdaki ifadelerden hangisi çalıştırılmalıdır? a) DELETE COLUMN cinsiyet FROM Ogrenciler; b) DROP COLUMN cinsiyet FROM Ogrenciler; c) DROP COLUMN cinsiyet TABLE OF Ogrenciler; d) ALTER TABLE Ogrenciler DROP COLUMN cinsiyet; e) DROP COLUMN Ogrenciler.cinsiyet; 12. Ogrenciler tablonsunun adının "Ogrenci_Listesi" olarak değiştirilmesi için aşağıdaki ifadelerden hangisi çalıştırılmalıdır? ALTER TABLE 'Ogrenciler' NAME 'Ogrenci_Listesi'; RENAME TABLE 'Ogrenciler' TO 'Ogrenci_Listesi'; SP_RENAME 'Ogrenciler', 'Ogrenci_Listesi'; ALTER TABLE NAME 'Ogrenciler' TO 'Ogrenci_Listesi'; DROP TABLE 'Ogrenciler'; CREATE TABLE 'Ogrenci_Listesi'; 13. Alan tanımlanırken kullanılan yabancı anahtar (Foreign Key) için aşağıdakilerden hangisi yanlıştır? Birincil tablonun bir alanına girilecek değerleri, ilişkilendirilen tablonun bir alanındaki değer kümesiyle kısıtlamak için kullanılabilir. Birincil tablodan veri silindiğinde otomatik olarak o kayda ait tüm bağlı alt tablolardaki verilerin de silinmesi sağlanabilir. Birincil tablodan bir kayıt silindiğinde ilişkili tabloda o kayda ait bağlı kayıtların yabancı anahtar değerinin NULL olmasını sağlanabilir. Yabancı anahtar tanımlanan alanın, başka bir tablonun birincil anahtarına (primary key) başvurmak zorundadır. Yabancı anahtar alan değerlerinin benzersiz olması zorunludur.