22 Şubat 2013 Cuma

MS SQL'e Giriş

Merhaba Webkolog takipçileri!

Bugün sizlere veri tabanı dünyasının temel taşlarından biri olan MS SQL’e keyifli bir giriş yapıyoruz. Eğer daha önce veri tabanlarıyla hiç tanışmadıysanız ya da bilgilerini tazelemek istiyorsanız doğru yerdesiniz. Hadi başlayalım!

MS SQL Nedir?

MS SQL (Microsoft SQL Server), Microsoft tarafından geliştirilen bir ilişkisel veri tabanı yönetim sistemidir (RDBMS). Veri depolama, yönetme ve işleme konularında bize çok güçlü yetenekler sunar. Web uygulamalarından kurumsal sistemlere kadar geniş bir yelpazede kullanılır.

Bağlantı Türleri

MS SQL Server’a bağlanırken genellikle üç farklı kimlik doğrulama yöntemi kullanılır:

  • SQL Server Authentication: SQL Server üzerinde tanımlı kullanıcı adları ve şifreleri ile bağlanılır.
  • Windows Authentication: Windows işletim sistemi kullanıcı hesapları ile bağlanılır. Bu genellikle daha güvenli bir yöntemdir.
  • Mixed Mode: Hem Windows hem de SQL Server kimlik doğrulamasını bir arada kullanır.

Sunucu adını belirtirken ".", "localhost", "127.0.0.1" veya "local" gibi kısaltmaları ya da ".\SQLEXPRESS" gibi özel örnek adlandırmaları kullanabiliriz.

Temel Kavramlar

Veri tabanlarında sıkça duyacağımız bazı temel kavramlar var:

  • Row (Satır): Bir tablodaki tek bir veri kaydını temsil eder.
  • Column (Sütun): Tablodaki belirli bir veri türünü (örneğin isim, yaş) temsil eder.
  • Field (Alan): Bir satır ve sütunun kesiştiği noktadaki tekil veri değeridir.

Unutmayın, veri tabanında veriler 8KB boyutundaki veri sayfalarında (data pages) saklanır.

Indexler ve Performans

Indexler, veri tabanında verilere daha hızlı erişmemizi sağlayan yapılar gibidir. Tıpkı bir kitabın içindekiler bölümü gibi düşünebilirsiniz.

  • Clustered Index: Verilerin fiziksel olarak sıralanmasını sağlar. Bir tabloda sadece bir tane olabilir. Eğer bir tabloda Primary Key tanımlıysa, o alan otomatik olarak clustered index olarak ayarlanır.
  • Nonclustered Index: Verilerin sanal bir sıralamasını tutar ve verinin fiziksel konumuna işaret eder. Bir tabloda birden fazla nonclustered index bulunabilir (SQL 2005'te 249, SQL 2008'de 999 adede kadar).

Basit SQL Komutları

Hemen basit bir tablo oluşturalım ve içine veri ekleyelim:

CREATE TABLE Musteriler (
    id INT NOT NULL PRIMARY KEY IDENTITY(1,1), -- MySQL'deki AUTO_INCREMENT gibi
    Ad NVARCHAR(50),
    Soyad NVARCHAR(50),
    Yas INT NOT NULL DEFAULT 0
);

INSERT INTO Musteriler (Ad, Soyad, Yas) VALUES ('Ali', 'Can', 30);
INSERT INTO Musteriler (Ad, Soyad, Yas) VALUES ('Ayşe', 'Demir', 25);

SELECT * FROM db_adi.dbo.Musteriler; -- Belirli bir veritabanındaki tabloya erişim

SQL'de indexler genellikle 1'den başlar, bu T-SQL için de geçerlidir.

Normalizasyon Kuralları ve Performans İpuçları

Veri tabanı tasarımında normalizasyon, veriyi tekrarlamadan, tutarlı ve etkili bir şekilde saklamayı hedefler:

  • Her kaydın ID değeri farklı olmalı.
  • Tekrar eden satırlar ayrı bir tabloda olmalı ve bağlantı kurulmalı.
  • Çoka çok ilişkilerde ara tablo kullanılmalı.

Performansı artırmak için bazı ipuçları:

  • NOT ve LIKE operatörlerini zorunlu olmadıkça kullanmaktan kaçının.
  • Gereksiz yere tüm veriyi getirmek yerine sadece ihtiyacınız olan sütunları seçin.
  • Sıralamaya ihtiyacınız yoksa ORDER BY kullanmayın.
  • VARCHAR tipi alanları (ad, soyad, e-posta gibi) 40 karakterden fazla yapmamaya özen gösterin; gereksiz yere veri artışına neden olabilir.

SQL Sorgu İşleme Aşamaları

Bir SQL sorgusu çalıştığında, arka planda şu adımlar gerçekleşir:

  • Parse: Sorgunun sözdizimi (syntax) doğrulanır.
  • Resolve: Sorgudaki nesneler (tablolar, sütunlar vb.) çözümlenir.
  • Optimize: Sorgunun en verimli şekilde nasıl çalıştırılacağı planlanır.
  • Compile: Plan başka bir çalıştırılabilir koda dönüştürülür.
  • Execute: Kod çalıştırılır ve sonuçlar döndürülür.

Veri Tabanı Yönetimi Komutları

Veri tabanı oluşturma, değiştirme ve silme işlemleri için şu komutları kullanırız:

CREATE DATABASE veritabani_adi;
ALTER DATABASE veritabani_adi MODIFY NAME = yeni_veritabani_adi; -- Veritabanı adını değiştirme
DROP DATABASE veritabani_adi;
USE veritabani_adi; -- Çalışacağımız veritabanını seçme
GO -- Batch ayırıcı

SQL Komut Kategorileri

SQL komutları temel olarak dört ana kategoriye ayrılır:

  • DML (Data Manipulation Language): Veri üzerinde işlem yapar (SELECT, INSERT, UPDATE, DELETE).
  • DDL (Data Definition Language): Veri tabanı yapısını tanımlar ve değiştirir (CREATE, ALTER, DROP, RENAME, TRUNCATE).
  • DCL (Data Control Language): Veri tabanı üzerindeki erişim yetkilerini kontrol eder (GRANT, REVOKE, DENY).
  • TCL (Transaction Control Language): İşlemleri (transaction) yönetir (BEGIN TRAN, COMMIT TRAN, ROLLBACK TRAN).

Özel Değişkenler ve Fonksiyonlar

MS SQL'de kullanabileceğimiz bazı önemli sistem değişkenleri ve fonksiyonlar:

  • @@version: SQL Server sürüm bilgilerini verir.
  • @@IDENTITY: Aktif kullanıcının yaptığı son otomatik artan (IDENTITY) alanın ID'sini verir.
  • SCOPE_IDENTITY(): Çalışan batch'deki son otomatik artan alanın ID değerini verir. Genellikle daha güvenlidir.
  • IDENT_CURRENT('TabloAdi'): Belirtilen tablonun son ID değerini verir.
  • CAST(): Bir veri tipini başka bir veri tipine dönüştürür.
SELECT CAST(123 AS NVARCHAR(10));

Matematiksel Fonksiyonlar

Matematiksel işlemler için sıkça kullandığımız fonksiyonlar:

SELECT AVG(SutunAdi) FROM TabloAdi; -- Ortalama
SELECT ABS(-10); -- Mutlak değer
SELECT RAND(); -- Rastgele sayı
SELECT MAX(SutunAdi), MIN(SutunAdi) FROM TabloAdi; -- Maksimum ve Minimum değer
SELECT LOG(10); -- Doğal logaritma
SELECT LOG10(100); -- 10 tabanına göre logaritma
SELECT CEILING(4.3); -- Yukarı yuvarlar (5)
SELECT FLOOR(4.7); -- Aşağı yuvarlar (4)
SELECT ROUND(4.56, 1); -- Belirtilen ondalık basamağa yuvarlar (4.6)
SELECT SIN(PI()/2); -- Sinüs
SELECT COS(0); -- Kosinüs
SELECT TAN(PI()/4); -- Tanjant
SELECT COT(PI()/4); -- Kotanjant
SELECT PI(); -- Pi sayısı
SELECT SQRT(25); -- Karekök
SELECT POWER(2, 3); -- Üs alma (2^3 = 8)

Tarih ve Zaman Fonksiyonları

Tarih ve zaman işlemleri için kullanışlı fonksiyonlar:

SELECT GETDATE(); -- Mevcut tarih ve saat
SELECT DATEADD(DAY, 5, GETDATE()); -- Tarihe gün ekleme (5 gün sonrası)
SELECT DATEDIFF(YEAR, '2000-01-26', '2012-01-31'); -- İki tarih arasındaki fark (yıl olarak)
SELECT DATENAME(MONTH, GETDATE()); -- Ay adını verir
SELECT ISDATE('2023-01-01'); -- Geçerli bir tarih mi? (1: Evet, 0: Hayır)
SELECT MONTH(GETDATE()); -- Ay numarasını verir
SELECT DAY(GETDATE()); -- Gün numarasını verir
SELECT YEAR(GETDATE()); -- Yıl numarasını verir

Metin (String) Fonksiyonları

Metinlerle çalışırken işimize yarayacak fonksiyonlar:

DECLARE @Yazi NVARCHAR(50) = 'Webkolog Blog';

SELECT LEN(@Yazi); -- Karakter uzunluğu
SELECT LEFT(@Yazi, 3); -- Soldan 3 karakter
SELECT RIGHT(@Yazi, 4); -- Sağdan 4 karakter
SELECT SUBSTRING(@Yazi, 5, 4); -- 5. karakterden başlayarak 4 karakter
SELECT REPLACE(@Yazi, 'Blog', 'Makaleleri'); -- Değiştirme
SELECT STUFF(@Yazi, 1, 3, 'Yeni'); -- Belirli bir pozisyonda karakterleri değiştirme/ekleme
SELECT CHARINDEX('Blog', @Yazi); -- Alt dizinin başlangıç pozisyonunu bulma
SELECT LOWER(@Yazi); -- Küçük harfe çevirme
SELECT UPPER(@Yazi); -- Büyük harfe çevirme
SELECT LTRIM('   Merhaba'); -- Sol boşlukları silme
SELECT RTRIM('Merhaba   '); -- Sağ boşlukları silme

Hata Yönetimi Fonksiyonları

Hata durumunda bilgi almak için kullanabileceğimiz fonksiyonlar (TRY...CATCH blokları içinde kullanılır):

  • ERROR_LINE(): Hataya neden olan satır numarasını verir.
  • ERROR_MESSAGE(): Hata mesajını verir.
  • ERROR_NUMBER(): Hata numarasını verir.
  • ERROR_PROCEDURE(): Hataya neden olan prosedürün adını verir.
  • ERROR_SEVERITY(): Hatanın şiddetini verir.
  • ERROR_STATE(): Hatanın durum kodunu verir.

Geçici Tablolar ve Tablo Değişkenleri

Geçici olarak veri depolamak için farklı yapılar kullanırız:

  • #Tablo (Local Temporary Table): Oturum bazlıdır. Oluşturulduğu oturum kapandığında otomatik silinir.
  • ##Tablo (Global Temporary Table): Uygulama bazlıdır. Tüm oturumlar erişebilir ve tüm oturumlar kapandığında silinir.
  • DECLARE @tablo TABLE: Tablo değişkenidir. Bellekte tutulur ve bir batch bittiğinde kapsam dışına çıkar. Performans açısından genellikle daha hızlıdır.
CREATE TABLE #GeciciMusteriler (
    ID INT PRIMARY KEY IDENTITY(1,1),
    Ad NVARCHAR(50)
);

CREATE TABLE ##GenelGeciciMusteriler (
    ID INT PRIMARY KEY IDENTITY(1,1),
    Ad NVARCHAR(50)
);

DECLARE @urunler TABLE (
    UrunID INT PRIMARY KEY IDENTITY(1,1),
    UrunAdi NVARCHAR(100)
);

INSERT INTO @urunler (UrunAdi) VALUES ('Laptop');
SELECT * FROM @urunler;

Değişkenler ve Kontrol Akışı

MS SQL'de değişken tanımlama ve akış kontrolü için kullanılan yapılar:

DECLARE @Sayi INT = 10;
DECLARE @Yazi NVARCHAR(50);

SET @Sayi = @Sayi + 1; -- Değişken değerini artırma
SELECT @Yazi = 'Merhaba Webkolog'; -- Değişkene değer atama

-- Birden fazla değişkeni SELECT ile atama
DECLARE @Degisken1 NVARCHAR(50), @Degisken2 NVARCHAR(50);
SELECT @Degisken1 = 'Ali', @Degisken2 = 'Veli';

-- Sorgu sonucunu değişkene atama
SELECT @Yazi = Ad FROM Musteriler WHERE ID = 1;

-- CASE ifadesi
DECLARE @Durum NVARCHAR(10) = 'A';
SELECT CASE @Durum
    WHEN 'A' THEN 'Durum A'
    WHEN 'B' THEN 'Durum B'
    ELSE 'Diğer Durum'
END AS DurumAciklamasi;

-- IF-ELSE IF-ELSE yapısı
IF (EXISTS(SELECT 1 FROM Musteriler WHERE Ad = 'Ali'))
BEGIN
    PRINT 'Ali adında müşteri var.';
END
ELSE IF (@Durum = 'B')
BEGIN
    PRINT 'Durum B geçerli.';
END
ELSE
BEGIN
    PRINT 'Hiçbiri geçerli değil.';
END;

-- WHILE döngüsü
DECLARE @Counter INT = 1;
WHILE (@Counter <= 5)
BEGIN
    PRINT 'Sayı: ' + CONVERT(NVARCHAR, @Counter);
    SET @Counter = @Counter + 1;
END;

Index Bakımı

Indexlerin performansı için periyodik bakım önemlidir:

CREATE CLUSTERED INDEX IX_Musteri_Ad ON Musteriler(Ad); -- Ad sütununa göre clustered index
CREATE NONCLUSTERED INDEX IX_Musteri_Email ON Musteriler(Email); -- Email sütununa göre nonclustered index

DBCC SHOWCONTIG (Musteriler); -- Tablo ve index parçalanma bilgisini gösterir

ALTER INDEX IX_Musteri_Ad ON Musteriler REBUILD; -- Index'i yeniden oluşturur (Parçalanmayı tamamen giderir)
ALTER INDEX IX_Musteri_Email ON Musteriler REORGANIZE; -- Index'i yeniden düzenler (Daha az kaynak tüketir, küçük parçalanmaları giderir)

IF UPDATE(SutunAdi) -- Tetikleyicilerde (Trigger) bir sütun güncellendi mi kontrolü
BEGIN
    PRINT 'Sütun güncellendi!';
END;

Bu makalede MS SQL'e temel bir giriş yaparak, veri tabanı dünyasının kapılarını araladık. Umarım bu bilgiler, veri tabanı maceranızda size güzel bir başlangıç noktası sunmuştur.

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder