Merhaba arkadaşlar, “.Net Dünyasına Giriş” adlı makale serilerimin ikincisi olan “Veri Tabanı Programlama (Sql)” adlı makalemi hazırlamış bulunmaktayım. Bu makalemde veri tabanı nedir?, T-SQL Giriş, Temel Veri İşlemleri, ADO.Net gibi konularında ki bilgilerimi sizlerle paylaşmış olacağım.
Not: Ekte verdiğim Microsoft tarafından hazırlanan Örnek Database (Adventure Works 2012) bilgisayarınıza indirebilirsiniz. Ben tüm örneklerimi bu veri tabanı üzerinden anlattığımdan dolayı benim yaptığım örnek uygulamaları kendinizde ekte ki veri tabanı üzerinden deneyebilirsiniz.
1) Veri Tabanına Giriş
Veri Tabanı Nedir?
Veri tabanından önce, Veri nedir? sorusunu cevaplayalım. Veriyi kısaca tanımlarsak, Veri (Data) bir veya birden fazla oluşan bilgi kümesidir. Örnek olarak bir telefon rehberini düşünürsek rehberde bulunan her alan (İsim, Soyisim, Telefon Numarası, E-Mail) her biri birer veridir. Ve tüm bu bilgilerin tutulduğu kaydedildiği veya saklandığı alan ise Veri Tabanı (Database) adını alır. Özetlemek gerekirse Veri Tabanı (Database), farklı tiplerdeki verileri saklamamızı ve kullanmamızı sağlayan depolama ortamlarıdır.
Örnek Veri Tabanları
- Telefon Rehberi
- Kütüphane Sistemleri
- Bankaçılık ve Ödeme Borç Sistemleri
- Stok Takip ve Ürün Satış, Sipariş Sistemleri
- Ve benzeri…
Veri Tabanı Yönetim Sistemleri
Veri tabanı yönetim sistemleri (Database Management System-DBMS), veri tabanında depolanacak olan verilerin saklanırken uyacağı standartları ve depolanan verilere nasıl erişilebileceğini açıklayan sistemler bütünüdür. Böylece, uygulanan yönetim sistemleriyle (DBMS) verilerin bütünlüğünün ve güvenliğinin sağlanması amaçlanmaktadır.
İlişkisel Veri Tabanı Yönetim Sistemleri
İlişkisel Veri Tabanı Yönetim Sistemleri (Relational Database Management System – RDBMS) Veriler arasında ilişkilendirmeler yapabildiğimiz. Tablolar, satırlar, alanlar arasında ilişkiler geliştirebilidiğimiz sistemleri kapsar. En favori olan programlar: SQL SERVER, ORACLE vb.
İlişkisel bir veri tabanında üç temel eleman bulunmaktadır.
- Tablolar(Tables)
- Anahtarlar(Keys)
- İndeksler(Indexes)
İlişkisel bir veri tabanında bütün veriler tablolarda tutulmaktadır. Tablolar (tablet) içerisinde tanımlanacak olan anahtarlar(keys) girilecek verilerin tutulacağı birimler olacaktır. Yine anahtarlar aracılığıyla tablolar arasında ilişkilendirmeler yapılır.
Tables
Verilerin saklanmasını sağlayan, alanlar(sütün-column) ve satırlardan(row) oluşan birimlerdir.
1= Sütün(Column) bir kayda ait özellik.
2= Satır(Row) tabloda bulunan bir kayıt.
Anahtarlar
Kayıt içerisindeki farklılıkları ve nitelikleri gösteren belirleyicilere anahtarlar(keys) denir.
Birincil Anahtar(Primary Key): Bir tablo içerindeki satırları birbirinden ayırt eder. Birincil anahtar olan bir veri aynı tablo içinde tekrarlanamaz.
Tekil Anahtar(Unique Key): Tablonun bir alanına aynı değer sadece bir kez girilebilir. Birincil anahtarla aynı gibi gözüksede farkı null kayıtlarda çıkar. Birincil Anahtardan farklı olarak NULL (boşluk) değerini alabilir.
Referans Anahtar(Foreign Key): Adı üzerindende anlaşıldığı üzere, Tablodaki bir veriyi başka bir veri ile ilişkilendirmek için kullanılır.
Birleşik Anahtar(Composite Key): Birden fazla tablonun bileşiminden oluşucak yeni tablonun birincil anahtarı olacak olan anahtarlara denir.
İndeksler (Indexes)
Tablolardaki verilere daha hızlı ulaşmak için hazırlanan yapılara denir.
2) T-SQL Giriş
T-SQL yani Transact SQL, Microsoft SQL Server üzerinde kullanılan bir dildir.
T-SQL Veri Tipleri
Metinsel Veri Tipleri (String Datatypes)
Veri Tipi | Türü | Açıklama |
---|---|---|
CHAR(n) | Karakter | Uzunluğu değişmeyen sabit verileri saklar. Eğer n değeri 10 ise daha kısa uzunlukta değer girilince kalan boşluğu kendi tamamlar ve öyle saklar. |
VARCHAR(n) or VARCHAR(max) | Karakter | Değişebilir uzunlukta verileri saklar. En fazla 8000 karakter alır. n değeri maximum değerdir, daha kısa uzunlukta değer girilse bile olduğu gibi kayıt eder. |
TEXT | Karakter-Metin | Değişebilir uzunlukta karakterleri saklar. En fazla 2GB metin içerir. |
NCHAR(n) | Karakter | Sabit uzunlukta Unicode karakterleri saklar. Char tipinden farkı çoklu dil ve Unicode desteği olmasıdır. En fazla 4000 karakter. |
NVARCHAR(n) or NVARCHAR(max) | Karakter | Değişebilir uzunlukta verileri saklar. varchar tipinden farkı çoklu dil ve Unicode desteği olmasıdır. En fazla 4000 karakter |
NTEXT | Karakter-Metin | En fazla 2,147,483,647 karakter uzunluğunda değer alabilen veri türüdür. Unicode desteği vardır. |
BINARY(n) | Binary Data (İkili Sayma Sistemi) |
Dosyaları (Binary data) saklamak için kulanılır. Binary(n) şeklinde n değeri 1 ile 8000 arasında değer alır. N bayt kadar yer kaplar. |
VARBINARY(n) or VARBINARY(max) | Binary Data (İkili Sayma Sistemi) |
Maksimum 2,147,483,647 bayt (2 GB) büyüklüğünde dosya kaydedilebilir. |
IMAGE | Binary Data (İkili Sayma Sistemi) |
Grafik nesneleri için kullanılmaktadır. Binary olarak saklar. Maksimum 2 GB data saklar. |
*(n) kullanıcı tarafından verilen boyutu temsil eder.
Sayısal Veri Tipleri (Numeric Datatypes)
Data Type Syntax | Türü | Açıklama |
---|---|---|
BIT | İkili Sistem | 0, 1 ve null değerini saklar. |
TINYINT | Tam Sayı | 0 ile 255 arasında değerleri saklar. |
SMALLINT | Tam Sayı | 32,768 ile 32,767 arasında değerleri saklar. |
INT | Tam Sayı | 2,147,483,648 ile 2,147,483,647 arasında değerleri saklar. |
BIGINT | Tam Sayı | 9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 arasında değerleri saklar. |
DECIMAL(m,d) | Ondalık Sayı | Decimal(precision,scale),precision ile anlamlı basamak sayısı ve scale ile de virgülden sonraki kaç basamağın dikkate alınacağını belirten bir veri tipidir.Anlamlı basamak sayısı 1 ile 38 arasında tanımlanabilir.Scale faktörü ise 0 <= s <= p ile ilişkiye sahiptir. |
DEC(m,d) | Ondalık Sayı | Toplam basamak sayısı m ise ve d ondalık basamaktan sonraki rakamdır. Bu DECIMAL veri türü için eşanlamlıdır. |
NUMERIC(m,d) | Ondalık Sayı | Numeric(precision,scale),precision ile anlamlı basamak sayısı ve scale ile de virgülden sonraki kaç basamağın dikkate alınacağını belirten bir veri tipidir.Anlamlı basamak sayısı 1 ile 38 arasında tanımlanabilir.Scale faktörü ise 0 <= s <= p ile ilişkiye sahiptir.Decimal ile aynıdır. |
FLOAT(n) | Ondalık Sayı | Kullanılmak istenen boyuta göre ortalama değer alır. float(n) şeklinde kullanılır. mesela virgülden sonra 20 bitlik bir alan kullanılmasını istiyoruz. O zaman float(20) olarak yazılır ve verdiğimiz bu boyuta göre kaydetmek istediğimiz sayı yuvarlanır. Kesin değer değil de yaklaşık değer kaydedilmiş olur. n kısmı 1 ile 53 arasında olmalıdır. |
REAL | Ondalık Sayı | float(n) ile aynı özelliktedir. 4 bayt yer kaplar. – 3.40E+38 ile -1.18E-38, 0 ve 1.18E-38 ile 3.40E+38 arası ondalık sayıları tutar. |
SMALLMONEY | Para | 4 bayt yer kaplar. -214.748,3648 ile 214.748,3647 arası ondalık sayıları tutar. Virgülden sonra 4 basamak alır. Parasal verileri smallmoney veri tipinde saklayabiliriz. |
MONEY | Para | 8 bayt yer kaplar. kaplar. -922.337.203.685.477,5808 ile 922.337.203.685.477,5807 arası ondalık sayıları tutar. Virgülden sonra 4 basamak alır. Parasal verileri money veri tipinde saklayabiliriz. |
Tarihsel Veri Tipleri (Date/Time Datatypes)
Data Type Syntax | Türü | Açıklama |
---|---|---|
DATE | Tarih | 1 Ocak 0001 – 31 Aralık 9999. Sadece tarih içerir, saati saklamaz. |
DATETIME | Tarih | 1 Ocak 1753 – 31 Aralık 9999. 3.33 milisaniye doğruluk hassasiyeti vardır. |
DATETIME2(fractional seconds precision) | Tarih | datetime göre daha hassas şekilde YYYY-MM-DD hh:mm:ss[.nnnnnnn] tarih tutar (2011-01-21 12:35:29.1234567 gibi). saniye bölümünün ondalık kısmında 7 basamağa kadar değer tutabilir. Bu değer sadece datetime2 olarak kullanıldığında varsayılan olarak 7 basamaktır. |
SMALLDATETIME | Tarih | 1 Ocak 1900 – 6 Haziran 2079. 1 dakikalık doğruluk hassasiyeti vardır. |
TIME | Tarih | Sadece saati hh:mm:ss[.nnnnnnn] şeklinde tutar. 00:00:00.0000000 ile 23:59:59.9999999 arası değer alır. datetime2′de olduğu gibi** time(n)** şeklinde n değerini belirleyebiliyoruz. n değeri 0 ile 2 arasında ise 3 bayt; 3 veya 4 ise 4 bayt; 5 ile 7 arasında ise 5 bayt yer kaplar. sadece time olarak kullanılırsak varsayılan n değeri 7′dir. |
DATETIMEOFFSET(fractional seconds precision) | Tarih | Kullanımı ve tarih aralığı datetime2 ile aynıdır. Ülkelere göre değişen zaman farkını da tutmamıza olanak sağlar. YYYY-MM-DD hh:mm:ss[. nnnnnnn] [{+-}hh:mm] şeklinde tarihi tutar (22.01.2012 02:07:23.1234567 +03:00). Saat farkı -14:00 ile +14:00 arasında değer alır. Yaptığımız uygulamada farklı ülkelerin tarih ve saat bilgilerini tutuyorsak bu veri tipini kullanabiliriz. datetimeoffset(n) şeklinde kullanılır. n değeri 0 ile 2 arasında ise 8 bayt; 3 veya 4 ise 9 bayt; 5 ile 7 arasında ise 10 bayt yer kaplar. sadece datetimeoffset olarak kullanılırsak varsayılan n değeri 7′dir. T-SQL İfade Tipleri |
T-SQL içerisinde 3 tane ifade tipi bulunmaktadır.
- Veri Tanımlama Dili (Data Definition Language)
- Veri Kontrol Dili (Data Control Language)
- Veri İşleme Dili (Data Definition Language)
Veri Tanımlama Dili (Data Definition Language)
Veri tabanında nesneleri oluşturma için gerekli olan ifadeleri kapsar. CREATE, ALTER, DROP
--CREATE, veri tabanında nesne oluşturmak için kullanılır. --Database oluşturma CREATE DATABASE ISYERİ ON ( NAME=isyeri_dat, FILENAME = 'c:\msSQL\data\isyeri.mdf', SIZE=5, MAXSIZE=15, FILEGROWTH=1, ) --Table oluşturma CREATE Personel ( PersonelId INTEGER NOT NULL, PersonelAdSoyad VARCHAR(50), PersonelDogumTarihi DATETIME, PersonelBolumId INTEGER ) --ALTER, varolan bir nesne üzerinde güncelleme yapmak için kullanılır. --Tip Değişimi ALTER TABLE Personel ALTER COLUMN PersonelAdSoyad VARCHAR(25) NOT NULL --Anahtar Atama ALTER TABLE Personel ADD CONSTRAINT PK_Personel PRIMARY KEY (PersonelId) --DROP, veritabanından nesne silmek için kullanılır. --Tablo silme DROP Table Personel --Database silme DROP DATABASE ISYERİ
Veri Kontrol Dili (Data Control Language – DCL)
Veri tabanında kullanıcılara ve rollere hak vermek için kullanılır. GRANT (Veritabanı erişim izini), DENY (Belirli bir alana erişim izni), REVOKE (Daha önceden verilmiş izni kaldırma)
Veri İşleme Dili (Data Manipulation Language – DML)
Veriler üzerinde yapılması gereken işlemler için kullanılır. (Sorgu yapma, veri ekleme, veri güncelleme, veri silme) SELECT, INSERT, UPDATE, DELETE
3) Temel Veri İşlemleri
INSERT (Veri Ekleme)
INSERT INTO Person.PersonPhone (BusinessEntityID, PhoneNumber, PhoneNumberTypeID) VALUES ( 20777, '554-555-5553', 1) *Insert yaparken dikkat etmemiz gereken veri türlerine uygun değerler kullanmaktır.
UPDATE (Veri Güncelleme)
UPDATE Person.PersonPhone SET PhoneNumber='554-100-5353' WHERE BusinessEntityID=20777
*Where koşulu kullanmadığınız taktirde tüm kayıtları güncelleme yapacaktır.
DELETE (Veri Silme)
DELETE FROM Person.PersonPhone WHERE BusinessEntityID=20777 *Where koşulu kullanmadığınız taktirde tüm kayıtları silecektir.
SELECT (Veri Sorgulama)
Kullanımı: SELECT SütünIsmi1, SütünIsmi2, … FROM TabloAdi
--SELECT ifadesi, veri tablomuz üzerinde istediğimiz sorguları yaparak istediğimiz verileri çağırmamıza yarar. -- * (Yıldız) karakteri, veri tablomuzdaki tüm sutunların gösterimini sağlar. SELECT * FROM Person.Person SELECT FirstName, LastName, PersonType FROM Person.Person
WHERE (Koşul)
Kullanımı: [SELECT, UPDATE veya DELETE ifadelerinden biri] WHERE koşul veya koşullar
SELECT FirstName, LastName, PersonType FROM Person.Person WHERE PersonType='EM' UPDATE Person.Person SET FirstName = 'Fatih' WHERE BusinessEntityID=1 DELETE FROM Person.Person WHERE BusinessEntityID=53
Karşılaştırma Operatörleri
Operatör | Açıklama |
---|---|
= | Eşit ise |
< | Küçük ise |
> | Büyük ise |
<= | Küçük veya eşit ise |
>= | Büyük veya eşit ise |
<> | Eşit değil ise |
Mantıksal Operatörler
Operatör | Açıklama |
---|---|
AND | Her iki koşulunda sonucu doğru ise |
OR | Koşullardan sadece biri doğru ise |
NOT | Koşulun tam tersi durumunda |
Örnek kullanımı
--AND koşulu kullanımı SELECT * FROM Person.Person WHERE PersonType='EM' AND MiddleName='A' --OR koşulu kullanımı SELECT * FROM Person.Person WHERE PersonType='EM' OR MiddleName='A' --NOT koşulu kullanımı SELECT * FROM Person.Person WHERE FirstName NOT LIKE 'Rob'
Yukarıda verdiğim örnek databesi kendi SQL Server’nıza yüklerseniz bu sorgulamayı yaptığınız zaman AND ile çalıştığı zaman 19 OR ile çalıştığı zaman 1573 satır değer size geri döndürdüğünü fark edeceksiniz.
LIKE (Veri Arama)
Operatör | Açıklama |
---|---|
WHERE AlanAdi LIKE ‘fatih%’ | fatih ile başlayan kayıtları getirir. |
WHERE AlanAdi LIKE ‘%fatih%’ | içerisinde fatih geçen tüm kayıtları getirir. |
WHERE AlanAdi LIKE ‘_fa’ | 3 karakterden oluşan son iki harfinde fa bulunan tüm verileri getirir. |
WHERE AlanAdi LIKE ‘[A-H]%’ | A ile H arasındaki harflerle başlayan tüm verileri getirir. |
WHERE AlanAdi LIKE ‘[^A-H]%’ | A ile H arasındaki harflerin dışında kalan harfler ile başlayan kayıtlar. |
SELECT * FROM Production.Product WHERE Name LIKE '%Blue'
ORDER BY (Veri Sıralama)
-- ASC, A...Z ye sıralama SELECT Name, ProductNumber, Color FROM Production.Product ORDER BY Name ASC -- DESC, Z...A ya sıralama SELECT Name, ProductNumber, Color FROM Production.Product ORDER BY Name DESC
DISTINCT (Veri Tekrarını Önleme)
SELECT DISTINCT Color FROM Production.Product
ALIAS (Alan İsimlerini Değiştirme)
SELECT Name AS 'Urun Adi', ProductNumber AS 'Urun Kodu', Color AS 'Urun Rengi' FROM Production.Product
LITERAL Kullanımı
Sql sorgularında alan isimlerini değiştirebildiğimiz (alias) gibi içeriklerini değiştirebiliriz. Biz bu işleme literal kullanımı diyoruz.
SELECT Name + ProductNumber FROM Production.Product SELECT 'TR-' + ProductNumber FROM Production.Product SELECT (ListPrice - StandardCost) * 0.18 FROM Production.Product
Verileri Gruplama
TOP (Belirli Sayıda İlk Veriyi Çekme)
SELECT TOP 5 * FROM Production.Product
Gruplama Fonksiyonları
- MIN: parametre olarak aldığı alan adı içerisindeki en küçük değeri bulur.
- MAX: parametre olarak aldığı alan adı içerisindeki en büyük değeri bulur.
- SUM: parametre olarak aldığı alan adı içerisindeki verilerin toplam değerini bulur.
- AVG: parametre olarak aldığı alan adı içerisindeki verilerin toplamının aritmetik ortalamasını bulur.
- COUNT: parametre olarak aldığı alan adında kaç tane değer olduğunu bulur.
SELECT MIN(ListPrice) FROM Production.Product SELECT MAX(ListPrice) FROM Production.Product SELECT SUM(ListPrice) FROM Production.Product SELECT AVG(ListPrice) FROM Production.Product SELECT COUNT(ListPrice) FROM Production.Product
GROUP BY (Alan Adına Göre Gruplama)
SELECT Color, AVG(ListPrice), AVG(StandardCost) FROM Production.Product GROUP BY Color
*Production.Product tablosunun her renge ait ortalama fiyat ve maliyet değerlerinin getirilmesi.
HAVING (Gruplanan Verilere Şart Eklemek)
SELECT Class, COUNT(ProductID) FROM Production.Product WHERE Color='Red' or Color='Blue' GROUP BY Class HAVING COUNT(ProductID)>5 ORDER BY Class
*Production.Product tablosunda kırmızı veya mavi renkli ürünlerin Class bilgisine göre gruplanmasını ve en az 5 kaydı olan Class kayıtlarının listelenmesi.
Tabloları Birleştirmek
Birden Fazla Tabloyu Birleştirmek
SELECT Person.FirstName, Person.LastName, Address.AddressLine1, Address.City FROM Person.Person, Person.Address
*Birleştirilen iki tabloda, herhangi bir bağlantı ifadesi kullanılmazsa getirilecek sonuç her iki tablodan dönen verilerin Kartezyen çarpımları dır.
JOIN İfadeleri ile Tabloları Birleştirme
- INNER JOIN: Birleştirilen iki tablodaki verilerin sadece aynı olanların getirilmesini sağlar.
- OUTER JOIN: Birleştirilen iki tablonun birinde olması durumunda verilerin getirilmesini sağlar. LEFT, RIGHT ve FULL ile kullanılır.
- CROSS JOIN: Birleştirilen tablolardan seçilen veriler arasındaki tüm kombinasyonları getirir.
SELECT FirstName, PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID SELECT FirstName, PhoneNumber FROM Person.Person LEFT JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID SELECT FirstName, PhoneNumber FROM Person.Person CROSS JOIN Person.PersonPhone
SUBQUERY (İç İçe Sorgular)
SELECT Name, Color, ListPrice FROM Production.Product WHERE ListPrice = (SELECT MAX(ListPrice) FROM Production.Product)
asd
2 comments
Comments are closed.