Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Bazen, verileriniz karakter dizileri ve sayılarla sınırlı değildir. Bir SQL tablosunda büyük miktarda veri saklamanız gerekir. Belgeler, dosyalar, XML belgeleri ve fotoğraflar bunlardan bazılarıdır. SQL, bu kadar büyük miktarda veri için özel veri türleri sağlar. Bu veri tipleri BLOB ve CLOB'tır. 

Not! Bu veri tiplerini kullanmadan önce kullandığınız veritabanının özelliklerini iyi araştırmanız gerekmektedir. Çünkü bazı durumlarda büyük verileri veritabanında saklamak avantajlı olabildiği gibi bazı durumlarda dezavantaj da yaratabilir.

BLOB(Binary Large Object)

Veriyi binary olarak diskte tutar.  

CLOB(Character Large Object)

Veriyi karakter olarak diskte tutar.


Sql'de kolonları oluştururken onlara bir çok özellik gireriz. Bu özellikler hangi veri tipinde olacağı (char, numeric vs), not null olacağı gibi özellikler olabilir. Eğer bir özellik kümesini bir çok kolonda kullanıyorsak bu özellikleri tek tek yazmak yerine kendi veri tipimizi oluşturabiliriz ve bu kolonlarda oluşturduğumuz veri tipini kullanabiliriz. Bu işlemleri create type ifadesi ile de yapabiliriz ancak domain ifadesi ile ayrıca bu veri tiplerine constraint tanımları yapılabilir.

Örnek:

CREATE DOMAIN yas AS integer NOT NULL CHECK(yas >= 18)

CREATE TABLE Kisi(
kisi_tc char(11) PRIMARY KEY,
kisi_ad varchar(30),
kisi_yas yas);


Sql'de kolonları oluştururken onlara bir çok özellik gireriz. Bu özellikler hangi veri tipinde olacağı (char, numeric vs), not null olacağı gibi özellikler olabilir. Eğer bir özellik kümesini bir çok kolonda kullanıyorsak bu özellikleri tek tek yazmak yerine kendi veri tipimizi oluşturabiliriz ve bu kolonlarda oluşturduğumuz veri tipini kullanabiliriz.

Örnek:
  • create type tutarTipi as numeric (12,2) not null
  • create table siparis(siparis_no integer not null, tutar tutarTipi)



DATE
Zamanı yıl, ay ve gün olarak depolar. (Örnek: '2005-7-31')

TIME
Zamanı saat, dakika ve saniye olarak depolar. (Örnek: '07:00:30' , '07:00:30.85')

TIMESTAMP
Zamanı yıl, ay, gün, saat, dakika ve saniye olarak depolar. (Örnek: '2005-7-31 07:00:30.85')


Sql'de check ifadesi ile bir alana girilebilecek değerleri kısıtlayabiliriz. Örneğin kişilerin yaşını tuttuğumuz alana çok büyük değer girilmesini önlemek için 1 ile 100 arasında değer girilmesine zorlayabiliriz.

Örnek:

MySQL:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    CHECK (Age>=18)
);

SQL Server / Oracle / MS Access:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int CHECK (Age>=18)
);


Primary Key
Birincil anahtar kısıtlayıcısıdır. Her tabloda bir adet bulunabilir. Girilen her değerin farklı olması anlamına gelmektedir. Yani eşsiz kayıtlar tutmakta kullanılır. Bu alanlar NULL değere sahip olamazlar. 
  • Primary Key null değer içeremez.
  • Bir tabloda sadece bir tane primary key olabilir.
  • Default olarak bir kolonu primary key olarak set ettiğinizde o kolon clustered index olarak oluşur ve tablo fiziksel olarak bu kolona göre dizilir.
  • Primary Key başka bir tablonun Foreing Key’i ile ilişkilendirilebilir.
  • Primary Key kolonunda otomatik artan identity set edilebilir.


Unique
Tablodaki bir sütünün benzersiz olmasını istediğimiz durumlarda kullanırız. Örnek vermek gerekirse, T.C Kimlik numaraları, Banka Hesap Numaraları gibi vs. Primary key den farkı ise Unique key bir tabloda birden fazla olmasıdır, primary key ise tabloda sadece 1 adet olabilir. Unique olarak tanımlanmış bir alan NULL olabilir. Değeri NULL’dan farklı olacak olursa kesinlikle daha önce girilen değerlerden farklı olmak zorundadır.
  • Her tabloda birden fazla Unique Constraint olabilir
  • Bir kolona unique constraint koyarsanız o kolon üzerinde default olarak non clustered index oluşur.
  • Otomatik artan identity set edilemez.
  • Null değer içerebilir.

Transaction, daha küçük parçalara ayrılamayan en küçük işlem yığınına denir. Belirli bir grup işlemin arka arkaya gerçekleşmesine rağmen, işlemlerin toplu olarak değerlendirilmesini sağlar. “Transaction”, prensip olarak ya bütün işlemleri gerçekleştirir ya da hiçbirini gerçekleştirmez. İşlemlerden biri dahi başarısız olursa, bu prensip nedeniyle hiçbir işlem olmamış kabul edilir; ancak tüm işlemler başarılı olduğunda” transaction”, içinde gerçekleşen tüm veri değişikliklerini onaylamış demektir. Bu işlemlerin ardı arkasına gelince bir tanesinin bile gerçekleşmemesi veri kaybına neden olacağı anlamına gelmektedir. Bu işlemler sırasında veriler üzerindeki değişikliklerin de tutarlı olması, birbirlerini tamamlayıcı nitelik taşıması gerekir. Bu özellikleri sağlayabilmesi içintransaction kavramı ortaya atılır. Veri tabanı uygulamaları geliştirirken böyle bir hataya sebep olacakları da düşünerek transaction bloğunun içine alınarak işlemler yapılır. Böylece ya hepsi işlenir ya da bütün işlemler geri alınır.

Transaction bloğundaki işlemlerin hepsi başarılı olduğunda “Transaction” Commit (Onaylama)komutu çalışır ve değişiklikler veritabanında gerçekleşmiş olur. Eğer herhangi bir hata oluşursa bu işleyiş bozulur ve hepsi geri alınır o zamanda “transaction” Rollback (Geridönüş) komutu çalışır. Böylece tüm işlemler geri alınır ve en başa dönülür. Bunu yaparak veri kaybetme olasılığımız da sıfıra iner. Aşağıdaki şekilde transaction olayını özetleyerek daha da görsel boyuta taşımak istedik.


Başlıca Transaction Çeşitleri
  • Begin Transaction
  • Save transaction
  • Rollback
  • Commit

Begin Transaction

Begin Transaction komutu yeni bir transaction başlatır. İşlemleri onaylamak için veya iptal etmek için Commit veya Rollback komutunu beklemeye koyuluyor. Kullanım şekli ise aşağıdaki gibidir.

BEGIN TRANSACTION
SQL KOMUTLARI
SQL KOMUTLARI...

Rollback Transaction

Rollback Transaction komutu Begin ile başlatılan işlemlerin hepsini iptal eder. Kullanım şekli ise aşağıdaki gibidir.

BEGIN TRANSACTION
SQL KOMUTLARI
SQL KOMUTLARI
SQL KOMUTLARI...(SQL exception) // !!!HATA!!!
ROLLBACK TRANSACTION

Commit Transaction

Commit Transaction komutu begin Transaction ile başlayan bütün işleri onaylar. Zaten bir transaction gerçekleşmişse ardından mutlaka Commit transaction gelmesi gerekir. Kullanım şekli ise aşağıdaki gibidir.

BEGIN TRANSACTION
SQL KOMUTLARI
SQL KOMUTLARI
SQL KOMUTLARI...
COMMIT TRANSACTION

Save Transaction

Bazen, bir noktaya kadar gelindikten sonra, işlemlerin buraya kadar olanını geçerli kabul etmek isteriz ama bundan sonraki işlemler için de transaction(geri alabilme seçeneği)ne ihtiyaç duyarız. Bu türden durumlarda geri dönüşüm noktalarından faydalanılır. Save Transaction komutu ise geri dönüşüm noktası belirler.

Genel Örnek:

BEGIN TRANSACTION
BEGIN TRY

UPDATE HESAP SET BAKIYE = BAKIYE - 1000
WHERE AD='SAMET' AND SOYAD='ULUTURK'

UPDATE HESAP SET BAKIYE = BAKIYE + 1000
WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR'

COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH

View'ler sanal tablolardır. View'ler tablolarımızın içerisinden belli veri kümelerini getirip bu veri kümelerini bir tabloymuş gibi kullanmamızı sağlarlar.

View'lerin Kullanılma Amaçları

  • Karmaşık sorguları basitleştirirler
  • Erişim izinlerini düzenlememizi sağlarlar
  • Sorgu sürelerini kısaltırlar

View Oluşturma

CREATE VIEW

Kullanımı:

CREATE VIEW view_adı
AS
SELECT sütun_adları
FROM temel_tablo

View Üzerinde Değişiklik Yapma

View üzerinde değişiklik yapmak için ALTER deyimi kullanılır.

Kullanımı:

ALTER VIEW view_adı
WITH seçenekler
AS
SELECT ifadesi

View'i Silmek

View’leri silmek için DROP deyimi kullanılır.

Kullanımı:

DROP VIEW view_adı

View'lerde With Schemabinding İfadesi

With schemabinding ifadesi view’in bağlı bulunduğu tablodaki kolonları kilitleyip o kolonların silinmesini engeller.

Kullanımı:

ALTER VIEW view_adı
WITH schemabinding
AS
SELECT ifadesi

With Encryption İfadesi

View'leri şifreleyip sorguların görünür olmasını engeller

Kullanımı:

ALTER VIEW view_adı
WITH encryption
AS
SELECT ifadesi

View'lerde CRUD işlemleri

View'ler içerisinde sadece view ile oluşturulan tablo üzerinde CRUD işlemleri yapılabilir. Normal tablolar üzerinde bu işlemler yapılamaz.

Sql View in İçerisinde Yapılamayacak İşlemler Nelerdir?

  • İsimsiz bir kolon kullanılamaz. (Örnek olarak aggregate fonksiyonlarını kolon ismi vermeden kullanmak)
  • View içerisinde parametre gönderilemez. 
  • View yapısı içerisinde dml kodları (insert into, update, delete) kullanılamaz.
  • View yapısı içerisinde, sadece select ile başlayan ifadeler kullanılabilir.
  • View içerisinde order by (sıralama) fonksiyonu kullanılamaz.



With kullanımı birden fazla yerde kullandığımız sorguların tekrar tekrar yazılmamasını sağlar. With ile bir alt sorgu oluşturulup bu sorguya bir isim verilebilir. Daha sonra yazılan sorguların içinde bu isim ile oluşturulan sorgu alt sorgu olarak kullanılabilir.

Örnek:

with enBuyukSiparis as select max(tutar) from Siparis
select musteriAd from Musteri m Where m.musteriID = enBuyukSiparis.musteriID

--> En büyük sipariş tutarına sahip müşterinin adını bulan sorgu