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.

Benzer belgeler