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:
- Sütunlar (columns) — Veri alanları (örn.
ad,email,yas) - Satırlar (rows) — Her bir kayıt
┌─────────────────────────────────────────────┐
│ 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
| Tip | Açıklama |
|---|---|
INT | Tamsayı (-2^31 ile 2^31) |
BIGINT | Bü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) |
DATE | Sadece tarih |
DATETIME | Tarih + saat |
BIT | Boolean (0/1) |
UNIQUEIDENTIFIER | GUID |
IDENTITY ve PRIMARY KEY
Id INT IDENTITY(1,1) PRIMARY KEY
- IDENTITY(1,1) — 1’den başla, her satırda 1 artır (otomatik artan)
- PRIMARY KEY — Benzersiz tanımlayıcı, NULL olamaz
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ör | Anlam |
|---|---|
= | Eşit |
<> veya != | Eşit değil |
<, >, <=, >= | Büyük/küçük |
BETWEEN ... AND ... | Aralıkta |
IN (...) | Listede |
LIKE | Pattern matching |
IS NULL / IS NOT NULL | NULL 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
| Sembol | Anlam |
|---|---|
% | 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 BYile 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:
- İlişkisel veritabanı modeli ve tablo yapısı
CREATE DATABASE/CREATE TABLEile şema kurma- Yaygın veri tipleri (INT, NVARCHAR, DATE, DECIMAL)
SELECT/FROM/WHEREile sorgu temeli- Karşılaştırma ve LIKE operatörleri
NULLkavramı veISNULL/COALESCETOPile sınırlı sonuçlar
Yarın Gün 2’de ileri sorgulama — ORDER BY, GROUP BY, aggregate
fonksiyonlar ve daha karmaşık filtreleme.