Veritabanı Temelleri
Veritabanı Nedir?
Veritabanı, verilerin organize bir şekilde saklandığı, yönetildiği ve erişildiği sistemlerdir. Modern uygulamaların çoğu veritabanı kullanarak kullanıcı bilgilerini, ürün kataloglarını, işlem kayıtlarını ve daha fazlasını saklar.
- İlişkisel (SQL): MySQL, PostgreSQL, SQL Server, Oracle
- NoSQL: MongoDB, Redis, Cassandra, DynamoDB
- Graph: Neo4j, ArangoDB
- Time-Series: InfluxDB, TimescaleDB
Temel Kavramlar
1. Tablo (Table)
Verilerin satır ve sütunlarda tutulduğu yapı. Excel tablosuna benzer.
Customers Tablosu:
+----+----------+-----------+---------------------+
| ID | Ad | Soyad | Email |
+----+----------+-----------+---------------------+
| 1 | Ahmet | Yılmaz | ahmet@example.com |
| 2 | Ayşe | Demir | ayse@example.com |
+----+----------+-----------+---------------------+
2. Primary Key (Birincil Anahtar)
Her kaydı benzersiz tanımlayan alan. Genellikle ID sütunu kullanılır.
- Benzersiz olmalıdır (unique)
- NULL olamaz
- Her tabloda bir tane olmalıdır
3. Foreign Key (Yabancı Anahtar)
Tablolar arası ilişki kuran alan. Bir tablodaki Primary Key'i başka tabloda referans eder.
Orders Tablosu:
+----+------------+----------+
| ID | CustomerID | Toplam |
+----+------------+----------+
| 1 | 1 | 500.00 | -- CustomerID, Customers tablosundaki ID'yi referans eder
+----+------------+----------+
4. Index (İndeks)
Sorgu performansını artıran yapı. Kitabın dizini gibi çalışır.
- Arama hızını artırır
- Sık sorgulanan sütunlara eklenir
- Fazla index yazma performansını düşürür
SQL Temel Komutlar
SELECT - Veri Sorgulama
-- Tüm kayıtları getir
SELECT * FROM Customers;
-- Belirli sütunları getir
SELECT Ad, Soyad, Email FROM Customers;
-- Filtreleme
SELECT * FROM Customers WHERE Ad = 'Ahmet';
-- Sıralama
SELECT * FROM Customers ORDER BY Ad ASC;
-- Limit
SELECT TOP 10 * FROM Customers;
-- LIKE ile arama
SELECT * FROM Customers WHERE Email LIKE '%@gmail.com';
-- IN ile çoklu değer
SELECT * FROM Customers WHERE ID IN (1, 2, 3);
-- BETWEEN ile aralık
SELECT * FROM Orders WHERE Toplam BETWEEN 100 AND 500;
INSERT - Veri Ekleme
-- Tek kayıt ekleme
INSERT INTO Customers (Ad, Soyad, Email)
VALUES ('Mehmet', 'Kaya', 'mehmet@example.com');
-- Çoklu kayıt ekleme
INSERT INTO Customers (Ad, Soyad, Email)
VALUES
('Ali', 'Veli', 'ali@example.com'),
('Fatma', 'Öz', 'fatma@example.com');
UPDATE - Veri Güncelleme
-- Tek kayıt güncelleme
UPDATE Customers
SET Email = 'yeni@example.com'
WHERE ID = 1;
-- Çoklu sütun güncelleme
UPDATE Customers
SET Ad = 'Ahmet', Soyad = 'Yılmaz'
WHERE ID = 1;
-- ⚠️ DİKKAT: WHERE kullanmazsanız TÜM kayıtlar güncellenir!
DELETE - Veri Silme
-- Tek kayıt silme
DELETE FROM Customers WHERE ID = 1;
-- Çoklu kayıt silme
DELETE FROM Customers WHERE Ad = 'Ahmet';
-- ⚠️ DİKKAT: WHERE kullanmazsanız TÜM kayıtlar silinir!
-- Tüm kayıtları silmek için:
DELETE FROM Customers;
JOIN İşlemleri
INNER JOIN
Her iki tabloda da eşleşen kayıtları getirir.
SELECT c.Ad, c.Soyad, o.Toplam
FROM Customers c
INNER JOIN Orders o ON c.ID = o.CustomerID;
LEFT JOIN
Sol tablodaki tüm kayıtları ve sağ tablodaki eşleşenleri getirir.
SELECT c.Ad, c.Soyad, o.Toplam
FROM Customers c
LEFT JOIN Orders o ON c.ID = o.CustomerID;
RIGHT JOIN
Sağ tablodaki tüm kayıtları ve sol tablodaki eşleşenleri getirir.
SELECT c.Ad, c.Soyad, o.Toplam
FROM Customers c
RIGHT JOIN Orders o ON c.ID = o.CustomerID;
Aggregate Functions (Toplama Fonksiyonları)
-- COUNT - Kayıt sayısı
SELECT COUNT(*) FROM Customers;
-- SUM - Toplam
SELECT SUM(Toplam) FROM Orders;
-- AVG - Ortalama
SELECT AVG(Toplam) FROM Orders;
-- MIN - Minimum
SELECT MIN(Toplam) FROM Orders;
-- MAX - Maximum
SELECT MAX(Toplam) FROM Orders;
-- GROUP BY ile gruplama
SELECT CustomerID, COUNT(*) AS SiparisAdedi, SUM(Toplam) AS ToplamTutar
FROM Orders
GROUP BY CustomerID;
-- HAVING ile filtreleme (GROUP BY sonrası)
SELECT CustomerID, COUNT(*) AS SiparisAdedi
FROM Orders
GROUP BY CustomerID
HAVING COUNT(*) > 5;
Veritabanı Tasarımı
Normalizasyon
Veritabanını organize etme ve veri tekrarını azaltma süreci:
1. First Normal Form (1NF)
- Her sütun atomik (bölünemez) değer içermeli
- Tekrarlayan gruplar olmamalı
2. Second Normal Form (2NF)
- 1NF'de olmalı
- Tüm sütunlar primary key'e bağımlı olmalı
3. Third Normal Form (3NF)
- 2NF'de olmalı
- Geçişli bağımlılık olmamalı
İlişki Tipleri
One-to-One (1:1)
Bir kayıt başka tabloda sadece bir kayıtla ilişkili.
Users (1) --- (1) UserProfiles
One-to-Many (1:N)
Bir kayıt başka tabloda birden fazla kayıtla ilişkili.
Customers (1) --- (N) Orders
Many-to-Many (N:M)
Her iki tarafta da çoklu ilişki. Ara tablo gerektirir.
Students (N) --- (M) Courses
-- Ara tablo: StudentCourses
Stored Procedures (Saklı Prosedürler)
-- Stored Procedure oluşturma
CREATE PROCEDURE GetCustomerOrders
@CustomerID INT
AS
BEGIN
SELECT * FROM Orders WHERE CustomerID = @CustomerID;
END;
GO
-- Stored Procedure çalıştırma
EXEC GetCustomerOrders @CustomerID = 1;
Transactions (İşlemler)
-- Transaction başlat
BEGIN TRANSACTION;
-- İşlemleri yap
UPDATE Accounts SET Balance = Balance - 100 WHERE ID = 1;
UPDATE Accounts SET Balance = Balance + 100 WHERE ID = 2;
-- Hata yoksa kaydet
COMMIT;
-- Hata varsa geri al
-- ROLLBACK;
Best Practices
- Her zaman WHERE kullanın (UPDATE ve DELETE'de)
- Primary Key kullanın
- Foreign Key ile referential integrity sağlayın
- Index'leri doğru kullanın
- Normalizasyon yapın ama aşırıya kaçmayın
- Güvenlik için parameterized queries kullanın (SQL Injection'dan korunma)
- Düzenli backup alın
- Transaction kullanarak veri tutarlılığını sağlayın
