Sql Server Veritabanı ve Tablo Oluşturma

Herkese merhaba, Sql Server yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda Sql Server’da veritabanı ve tablo yapısını anlatacağım. Hadi başlayalım !
Sql Server’da sütunlarda veriler, tablolarda sütunlar ve veritabanında ise tablolar bulunmakta. Biz bir veri eklemek istediğimizde öncelikle hangi veritabanına, sonra hangi tabloya ve son olarakta hangi sütuna veri ekleyeceğimizi belirtmemiz gerekiyor. Eklediğimiz veriler ise şifrelenerek disk üzerine kaydediliyor. Tabi veritabanı, tablo ve sütunların da kendi başlarına özellikleri ve oluşturma-silme-güncelleme işlemleri bulunmakta.
Veritabanları, tablolardan oluşan bir yapıda ve veritabanı adı, içerisindeki tablo ve sütunların adı ve verilerin hangi dilde olduğunu belirtmek için karakter kodlaması özellikleri bulunmakta. Örneğin Arapça veriler tutmak istiyorsanız Arapça desteği olan karakter kodlaması kullanmanız gerekmekte. Örneğin veriler içerisinde ç, ğ, ş, ö gibi noktalı harfler bulunabilecekse ve Latin karakter kodlaması kullanırsanız bu harflerin ? şeklinde olduğunu göreceksiniz. Çünkü Latin kodlaması bu harfleri desteklemiyor. Latin kodlaması yerine Unicode yada Turkish kodlamalarını kullanmanız gerekiyor. Veritabanında belirlediğiniz karakter kodlaması hem tablolarda hemde sütunlardaki verilerde de geçerli olur fakat her biri için farklı da yapabiliriz. Örneğin veritabanını Latin kodlamasında yapsanız bile bir tabloyu Turkish, bir tabloyu Unicode formatta yapabilirsiniz. Karakter kodlamaları veritabanı ve tablo oluşturulurken belirlendiği için oluşturma aşamasında bunları farklı yapabilirsiniz.
Sql Server ile veritabanı oluşturmak için şöyle bir Sql komutu bulunmaktadır;
create database veritabanı_adı
Bu komuttaki veritabanı_adı kısmına veritabanına vermek istediğiniz adı yazabilirsiniz. Bir sunucu üzerinde aynı isimden bir tane veritabanı bulunabileceğinden daha önce aynı isimde bir veritabanı oluşturulmadığından emin olmanız gerekmekte.
Veritabanı oluşturduktan sonra tablo ve içerisindeki sütunları oluşturmanız gerekmekte. Tablo oluştururken aynı zamanda içerisindeki sütunlarda oluşturulur ve zaten Sql komutu da bu şekildedir. Veritabanına tablo eklemek için yazmamız gereken Sql komut formatı şöyledir;
create table tablo_adı(sütun1 veri_tipi1 [sütun1_özellikleri], sütun2 veri_tipi2 [sütun2_özellikleri], ..., sütunn veri_tipin [sütunn özellikleri]);
Buradaki tablo_adı kısmına tabloya vermek istediğiniz ismi yazmanız gerekiyor fakat bir veritabanına aynı isimden bir tane tablo bulunabileceğinden aynı isimde farklı bir tablonun olmadığından emin olmalısınız. sütun1, sütun2 kısımlarına tablo içerisinde bulunacak sütun isimlerini, veri_tipi1, veri_tipi2 kısımlarına ise o sütunun veri tipini yazmanız gerekiyor. Bu bilgileri zorunlu olarak yazmanız gerekiyor fakat [sütun_özellikleri] kısmı opsiyonel ve bu kısımda sütuna vermek istediğiniz özellikleri yazabilirsiniz. Örneğin bir sütunu primary key yapacaksanız yazabilirsiniz, yapmayacaksanız zaten birşey yazmanıza gerek yok.
Sql Server’da birden çok veritipi bulunmakta. Integer, float, decimal, datetime, date, time, char, varchar, text bunlardan sadece bir kaçı ve en çok kullanılanları. Integer tam sayılar, float ve decimal hem tam hemde ondalıklı sayılar, datetime tarih ve saat, time sadece saat, date sadece tarih, char karakter, varchar 65535 karaktere kadar metinsel ifadeler, text 65535 karakterden daha fazla olan metinsel ifadeler için kullanılmakta. Integer sadece tam sayılar için kullanılabilir ve int, smallint, tinyint, bigint gibi türleri bulunmakta. int -2147483648 ile 2147483647 arasındaki sayıları, smallint -32768 ile 32767 arasındaki sayıları, tinyint 0 ile 255 arasındaki sayıları, bigint -9223372036854775808 ile 9223372036854775807 arasındaki sayıları tutabilir. Tabi tutabilecekleri aralıklar farklı olduğundan kapladıkları alanlarda farklı olacaktır. Bigint 8, int 4, smallint 2 ve tinyint 1 byte yer kaplar. Örneğin 1-10 arasında değişecebilecek bir veriniz varsa tinyint kullanmak daha mantıklı olacaktır.
float noktalı yani ondalıklı sayıları tutmak için kullanılır fakat her tam sayı aynı zamanda bir noktalı sayı olduğundan tam sayıları da tutabilmektedir. 308 basamağa kadar olan verileri tutabilir ve basamak uzunluğuna göre bellekte kapladığı alanda değişmektedir.
decimal’de tıpkı float gibi hem ondalıklı hemde tam sayıları tutabilir fakat float’tan farklı olarak sayı tabanı ve virgülden sonraki basamak sayısı ayarlanabilir ve eklenen veriler buna göre tutulur. Örneğin virgül sonraki basamak sayısı 2 olarak ayarlanır ve sütuna 10 değeri eklenmek istenirse 10.00 olarak eklenecektir. decimal(taban_adı, virgülden_sonraki_basamak_sayısı) şeklinde oluşturulur ve kaydedeceğiniz veriler virgül sonraki basamak sayısına göre düzenlenerek kaydedilir. Örneğin decimal(10, 2) yapıp 5.333 değerini kaydetmek istediğinizde virgülden sonraki sayı kendi içerisinde 2 basamağa çevrilir, bu çevirme işlemi için en yakın 2 basamaklı sayıya yuvarlama yapılır ve 33 olarak kaydedilir. Doğrudan decimal olarak kaydetmeniz durumunda float gibi davranır ve veri olarak ne gönderirseniz onu kaydeder, virgülden sonrası için herhangi bir işlem yapılmaz.
char, C ve C++’da bildiğimiz char veritipinin aynısıdır ve karakterleri tutmak için kullanılır fakat karakter bütünlerini yani metinsel ifadeleri de tutabilir. Maksimum veri uzunluğu belirtilerek kelime ve hatta cümleler dahi tutulabilir. Fakat genel olarak çok kısa karakterlerdeki ifadeleri tutmak için kullanılmakta. char(uzunluk) şeklinde kullanılabilir ve uzunluk yerine maksimum uzunluk yazılması gerekmektedir. Sonrasında uzunluk değeri kadar uzunlukta olan veriler bu sütunlarda tutulabilir. Uzunluk değerinden daha uzun bir ifadeyi kaydettiğinizde maksimum uzunluk boyutu aşıldığı için hata verecektir.
Varchar, programlama dillerindeki String’in Sql Server’daki adı ve aynı şekilde metinsel ifadeleri tutmak için kullanılmakta. Metinsel deyince sadece harflerden oluşan bir bütün olarak düşünmeyin, sayıları da tutabilir fakat onları da metin olarak kaydedecek ve verecektir. Maksimum 65535 karakter yani 8000 byte tutabilir ve daha uzun veriler gönderildiğinde maksimum uzunluk aşıldı diyecek ve hata verecektir.
Text, varchar’ın tutabildiği ve hatta tutamayacağı kadar uzunlukta olan ifadeleri tutar ve maksimum karakter uzunluğunun bir sınırı yoktur. 1 trilyon karakter uzunluğunda olan bir veriyi bile tutabilir. Bunun sebebi bellek alanının sabit olmamasından kaynaklanıyor. Yani bir sütunu text veritipinde yaptıktan sonra içerisine veri eklemesi yaptığınızda bellekte kapladığı alan verinin uzunluğuna göre değişir. 1 karakterlik veri eklerseniz 1 byte, 1 trilyon karakterlik veri eklerseniz 1 trilyon byte (yaklaşık 930 GB) yer kaplayacaktır. Tabi kaplayacağı alanın sınırı yok dedik ama bu aslında teoride öyle. Sql Server’da yazdığımız veriler diskte yani bilgisayarınızın harddiskinde saklandığı için harddisk boyutu ve hatta harddiskteki boş alan kadar yer kaplayabilir. Dolayısıyla harddiskinizde 100 MB boş alan varsa 100 MB, 100 GB boş alan varsa 100 GB uzunluğunda veri saklayabilirsiniz.
Datetime, hem tarih hemde saati birlikte saklayabiliyorken; date sadece tarihi, time ise sadece saati saklayabilir. Sql Server’in ön tanımlı tarih formatı yyyy-mm-dd, saat formatı ise hh:mm:ss şeklindedir ve veri yazma ve okuma da bu formata göre yapılmaktadır.
Veritabanına bir tablo eklerken bahsettiğim veritiplerinden uygun olanları kullanarak sütunlar oluşturulmalıdır. Tabiki seçilecek veritipide tutulacak veriye uygun olmalıdır. Örneğin varchar sayısal verileri de tutabilir fakat bunu yapmak gerçekten mantıksız olacaktır. Çünkü sayılara ulaşmak ile metinlere ulaşmak çok farklı şeylerdir. Metinsel ifadeler içerisinden veri aramak ile sayısal ifadeleri aramak birbirinden farklı şeylerdir. Metinsel birşeyi aramak için metinsel karşılaştırma yapılıp full text search adını verdiğimiz soruna yol açabiliyorken, sayısal bir şeyi aramak doğrudan ilgili sayıyı bulmak anlamına geldiğinden metinsel birşeyi aramaktan daha hızlı olacaktır. Bu yüzden sayısal verileri mümkün olduğunca sayısal veritipleri ile tutmak gerekmekte. Ayrıca C# gibi bir programlama dili ile Sql Server üzerinden veri okunacağı zaman doğrudan ilgili veritipine göre sonuç getiren fonksiyonlar kullanıldığında hata alınabilmektedir. Örneğin C#’ta GetDouble() fonksiyonu bulunmakta ve bu fonksiyon Sql Server’da sayısal ifadeleri getirmekte. Siz sayısal veri tutacağınız sütunun veritipini varchar yaparsanız GetDouble() fonksiyonu hata verecektir.
Sql Server’da sadece benim bahsettiğim veritipleri yok, ben en çok kullanılanları anlattım fakat daha bir sürü veritipi bulunuyor. Bunların hepsine Microsoft dokümanından ulaşabilirsiniz.
Tablolara özellikler eklenebiliyor demiştim ya, bunlar örneğin default, null, primary key ve auto increment özellikleri. Bir sütun primary key yapıldığında o sütuna aynı veriden iki tane eklenemez, her veri unique yani farklı olması gerekmekte. Zaten primary key olan bir sütun büyük çoğunlukla integer veritipinde ve auto increment’ta olmakta. İçerisinde auto increment olan bir tabloya veri eklenirken auto increment olan sütuna elle veri eklenmez, o veriyi Sql Server’ın kendisi ekler. Bir sütunu identity yapmak için de başlangıç noktası ve adım uzunluğunu belirtmemiz gerekiyor. Başlangıç noktası ilk verinin değerini, adım noktası ise eklenen her veri için identity olan sütunun artış miktarını temsil eder. Örneğin başlangıç noktası 1, adım değeri 1 olan bir sütuna veri eklediğinizde o sütunun değeri her seferinde 1 artar. Bir sütunu identity yapmak için o sütunun primary key olması zorunludur fakat primary key yapmak için identity yapılması zorunlu değildir. Fakat büyük çoğunlukla primary key yapılan bir sütun aynı zamanda identity yapılmaktadır. Tablo oluştururken bir sütunu primary key ve identity yapmak için şöyle bir komut girilmesi gerekmektedir;
create table tablo_adı(sütun_adı veri_tipi identity(başlangıç_noktası, adım_uzunluğu) primary key);
Örneğin kitaplar adında bir tablo oluşturalım. Bu tabloda int tipinde primary key ve identity olan id, varchar tipte 100 karakter uzunluğunda kitapAdi, int tipinde sayfaSayisi sütunları olsun. Bu tabloyu oluşturmak için yazmamız geren Sql komutu şöyle olacaktır;
create table kitaplar(id int identity(1, 1) primary key, kitapAdi varchar(100), sayfaSayisi int);
Tablo içerisine veri eklerken herhangi bir sütuna veri eklemeyebiliriz, tabloyu ve sütunlarını oluşturduk diye veri ekleme zorunluluğumuz yok. Fakat bunu zorunlu hale getirebiliyoruz. Yani örneğin kitaplar tablosuna veri eklerken kitabın sayfa sayısını bilmiyorsak sayfaSayisi sütununu boş bırakabiliriz ama kitapAdi sütununu boş bırakmamalıyız, çünkü adını bilmediğimiz bir kitabı neden ekleyelim ki ? 🙂 İşte bunun gibi bir zorunluluk durumlarını belirtmek için ilgili sütuna not null özelliği veriyoruz ve bu özellik sayesinde tabloya veri eklerken ilgili sütun boş bırakılırsa veri eklenmeyip, üstüne birde hata verecek hale getiriyoruz. Az önce dediğim gibi kitapAdi sütununun boş bırakılmaması zorunluluğunu da ekleyerek tabloyu yeniden oluşturalım.
create table kitaplar(id int identity(1, 1) primary key, kitapAdi varchar(100) not null, sayfaSayisi int);
Boş bırakılabilsin ama boş bırakıldığı zamanda benim belirlediğim bir değer atansın istiyorsanız o zamanda ilgili sütuna default özelliği vermeniz gerekiyor. Bu özellik sayesinde tabloya veri eklerken default özelliği verilmiş sütuna veri eklenmezse sizin belirlediğiniz şey yazılıyor, veri eklenirse de eklenen şey yazılıyor. Örneğin yine kitaplar tablosunda sayfaSayisi bilinmiyorsa boş bırakabiliriz ama boş bırakmakta doğru olmaz. Çünkü sayfaSayisi değerini herhangi bir yerde kullanacaksak orası boş kalacak ve bu da kullanıcı deneyimini düşürecektir. Bunun yerine mesela 0 (sıfır) yazabiliriz. İşte bunun içinde sayfaSayisi sütununa default değer olarak 0 verelim.
create table kitaplar(id int identity(1, 1) primary key, kitapAdi varchar(100) not null, sayfaSayisi int default 0);
Evet Sql Server ile veritabanı, tablo ve sütun oluşturma işlemleri bu kadardı, bu yazımızın da sonuna geldik, tüm Sql Server yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.