T-SQL (Transact-SQL), Microsoft SQL Server’ın sorgu dilidir. Bu ilk günde ilişkisel modeli, temel sorgu yapısını ve veriyi nasıl süzeceğimizi öğreneceğiz.

1. İlişkisel Veritabanı Modeli

Bir veritabanı, birbiriyle ilişkili tablolardan oluşur. Her tablo:

┌─────────────────────────────────────────────┐
│ users                                       │
├──────┬────────────┬─────────────┬───────────┤
│ id   │ name       │ email       │ age       │  ← sütunlar
├──────┼────────────┼─────────────┼───────────┤
│ 1    │ Ali        │ ali@x.com   │ 28        │  ← satır
│ 2    │ Ayşe       │ ayse@x.com  │ 31        │
│ 3    │ Mehmet     │ mehmet@x.c  │ 25        │
└──────┴────────────┴─────────────┴───────────┘

İlişki: Bir tablo başka tabloyu foreign key ile referans verebilir (örn. orders.user_id → users.id). 3. günde detaylı işleyeceğiz.

2. Veritabanı ve Tablo Oluşturma

-- Veritabanı oluştur
CREATE DATABASE LeidenfrostDB;
GO

USE LeidenfrostDB;
GO

-- Tablo oluştur
CREATE TABLE Users (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(100) NOT NULL,
    Email NVARCHAR(150) UNIQUE,
    Age INT,
    CreatedAt DATETIME DEFAULT GETDATE()
);

Yaygın Veri Tipleri

TipAçıklama
INTTamsayı (-2^31 ile 2^31)
BIGINTBüyük tamsayı
DECIMAL(p, s)Ondalıklı sayı (örn. DECIMAL(10, 2) → 8 basamak + 2 decimal)
VARCHAR(n)ASCII metin, n karaktere kadar
NVARCHAR(n)Unicode metin (Türkçe karakter için)
DATESadece tarih
DATETIMETarih + saat
BITBoolean (0/1)
UNIQUEIDENTIFIERGUID

IDENTITY ve PRIMARY KEY

Id INT IDENTITY(1,1) PRIMARY KEY

3. SELECT — Temel Sorgu

SELECT Name, Email
FROM Users;

Tüm sütunlar:

SELECT * FROM Users;

Production’da SELECT * kullanma. Sütun sayısı değişince beklenmedik davranışlar olabilir. Her zaman ihtiyacın olan sütunları yaz.

Alias (Takma İsim)

SELECT
    Name AS UserName,
    Email AS UserEmail
FROM Users AS u;

4. WHERE — Filtreleme

SELECT Name, Age FROM Users
WHERE Age > 18;

Karşılaştırma Operatörleri

OperatörAnlam
=Eşit
<> veya !=Eşit değil
<, >, <=, >=Büyük/küçük
BETWEEN ... AND ...Aralıkta
IN (...)Listede
LIKEPattern matching
IS NULL / IS NOT NULLNULL kontrolü

Örnekler

-- Yaş 18 ile 30 arası
WHERE Age BETWEEN 18 AND 30

-- Belirli bir liste
WHERE Country IN ('Turkey', 'Germany', 'France')

-- Email "@gmail.com" ile bitsin
WHERE Email LIKE '%@gmail.com'

-- A harfiyle başlayanlar
WHERE Name LIKE 'A%'

-- NULL kontrol
WHERE PhoneNumber IS NULL

LIKE Pattern’leri

SembolAnlam
%Herhangi sayıda karakter
_Tek karakter
[abc]a, b veya c
[a-z]a-z arası tek karakter
[^abc]a, b veya c olmayan
-- "Mehmet" gibi 6 harfli isimler
WHERE Name LIKE '_____t'

-- A, B veya C ile başlayanlar
WHERE Name LIKE '[ABC]%'

AND, OR, NOT

SELECT * FROM Users
WHERE Age > 25
  AND Age < 40
  AND Country = 'Turkey';

SELECT * FROM Users
WHERE Country = 'Turkey'
   OR Country = 'Germany';

SELECT * FROM Users
WHERE NOT (Age < 18);

Birden fazla operator karışıkken parantez kullan:

WHERE (Country = 'Turkey' OR Country = 'Germany') AND Age > 25

5. NULL Kavramı

NULL = “değer yok / bilinmiyor” — boş string '' ile karıştırma.

-- Yanlış!
WHERE PhoneNumber = NULL    -- ÇALIŞMAZ

-- Doğru:
WHERE PhoneNumber IS NULL
WHERE PhoneNumber IS NOT NULL

NULL ile Matematik

SELECT 10 + NULL  -- NULL (NULL ile herhangi işlem → NULL)

Bu yüzden ISNULL() veya COALESCE() kullanılır:

SELECT ISNULL(PhoneNumber, 'Belirtilmemiş') FROM Users;
-- PhoneNumber NULL ise "Belirtilmemiş", değilse PhoneNumber

SELECT COALESCE(Mobile, Phone, Email, 'Yok') FROM Users;
-- İlk NULL olmayanı döner

6. Sınırlı Sonuçlar — TOP

SELECT TOP 10 * FROM Users
WHERE Age > 18;
-- İlk 10 sonuç

SELECT TOP 10 PERCENT * FROM Users;
-- İlk %10

Yarın ORDER BY ile birleştirip “en yüksek 10 maaşlı çalışan” gibi klasik sorguları yazacağız.

Pratik Sorular

Tablomuz:

CREATE TABLE Employees (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(100),
    Department NVARCHAR(50),
    Salary DECIMAL(10, 2),
    HireDate DATE
);

Soru 1: IT departmanındaki çalışanları listele.

SELECT Name, Salary FROM Employees
WHERE Department = 'IT';

Soru 2: Maaşı 5000-10000 arası olan çalışanları getir.

SELECT * FROM Employees
WHERE Salary BETWEEN 5000 AND 10000;

Soru 3: İsmi “M” ile başlayan ve maaşı 7000’den fazla olanlar.

SELECT Name, Salary FROM Employees
WHERE Name LIKE 'M%'
  AND Salary > 7000;

Soru 4: 2020’den önce işe başlamış olanları getir.

SELECT Name, HireDate FROM Employees
WHERE HireDate < '2020-01-01';

Soru 5: Departmanı bilinmeyen (NULL) çalışanları say.

SELECT * FROM Employees
WHERE Department IS NULL;

Günün Özeti

Bugün T-SQL’in temellerini öğrendik:

Yarın Gün 2’de ileri sorgulama — ORDER BY, GROUP BY, aggregate fonksiyonlar ve daha karmaşık filtreleme.