Yazılım Öğrenme Rehberi

Başlangıçtan İleri Seviyeye

Reklam
728x90 Leaderboard

Veritabanı Temelleri

Veritabanı Kavramları

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.

💡 Veritabanı Türleri:
  • İ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

🎯 Öneriler:
  • 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