Veritabanı Programlama (SQL)

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 Açıklama
CHAR(n) 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) 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 Değişebilir uzunlukta karakterleri saklar. En fazla 2GB metin içerir.
NCHAR(n) 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) Değişebilir uzunlukta verileri saklar. varchar tipinden farkı çoklu dil ve Unicode desteği olmasıdır. En fazla 4000 karakter
NTEXT En fazla 2,147,483,647 karakter uzunluğunda değer alabilen veri türüdür. Unicode desteği vardır.
BINARY(n) 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) Maksimum 2,147,483,647 bayt (2 GB) büyüklüğünde dosya kaydedilebilir.
IMAGE 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 Açıklama
BIT 0, 1 ve null değerini saklar.
TINYINT 0 ile 255 arasında değerleri saklar.
SMALLINT 32,768 ile 32,767 arasında değerleri saklar.
INT 2,147,483,648 ile 2,147,483,647 arasında değerleri saklar.
BIGINT 9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 arasında değerleri saklar.
DECIMAL(m,d) 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) 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) 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) 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 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 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 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
DATE
DATETIME
DATETIME2(fractional seconds precision)
SMALLDATETIME
TIME
DATETIMEOFFSET(fractional seconds precision)

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
=
<
>
<=
>=
<>

Mantıksal Operatörler

Operatör
AND
OR
NOT

Ö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
WHERE AlanAdi LIKE ‘fatih%’
WHERE AlanAdi LIKE ‘%fatih%’
WHERE AlanAdi LIKE ‘_fa’
WHERE AlanAdi LIKE ‘[A-H]%’
WHERE AlanAdi LIKE ‘[^A-H]%’
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.