Ana içeriğe geç

SQL Uygulamaları ve Veri Manipülasyonu

Bu bölüm; veritabanı nesnelerinin oluşturulması (DDL), tablolar arası ilişkilerin kurulması, veri tipleri ve dönüşümleri ile verilerin sorgulanması, filtrelenmesi ve birleştirilmesi (JOIN) işlemlerini kapsamlı SQL örnekleriyle ele almaktadır.

1. Temel Veri Tanımlama ve İşleme

Veri Tanımlama Dili (DDL), veritabanı şemasını oluşturmak ve yönetmek için kullanılır. Bu komutlar veritabanı yapısını belirler.

SQL - DDL (Veri Tanımlama Komutları)

Veritabanı ve Tablo Komutları (CREATE, DROP, ALTER TABLE)

Bir veritabanı projesine başlarken ilk adım veritabanını ve tabloları oluşturmaktır.

Veritabanı Oluşturma ve Silme:

Örnek: Yeni bir veritabanı oluşturur

CREATE DATABASE SirketDB;

Örnek: Veritabanını siler (Dikkat: Tüm veriler kaybolur!)

DROP DATABASE SirketDB;

Örnek: Çalışılacak veritabanını seçer

USE SirketDB;

Tablo Oluşturma ve Düzenleme:

Örnek: Yeni bir tablo oluşturur

CREATE TABLE Personel (
    PersonelID INT AUTO_INCREMENT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50),
    IseGirisTarihi DATE
);

Örnek : Tabloya yeni bir sütun ekler (ALTER)

ALTER TABLE Personel ADD Email VARCHAR(100);

Örnek: Tablodan bir sütunu siler

ALTER TABLE Personel DROP COLUMN IseGirisTarihi;

Örnek: Tabloyu tamamen siler

DROP TABLE Personel;

MySQL Constraints (Kısıtlayıcılar)

Veri bütünlüğünü sağlamak ve hatalı veri girişini engellemek için sütunlara kısıtlamalar getirilir.

1. NOT NULL: Sütunun boş bırakılamayacağını belirtir.

CREATE TABLE Uyeler (
    UyeID INT,
    Ad VARCHAR(50) NOT NULL -- Ad mutlaka girilmelidir
);

2. UNIQUE: Sütundaki tüm değerlerin benzersiz olmasını sağlar.

CREATE TABLE Uyeler (
    UyeID INT,
    Email VARCHAR(100) UNIQUE -- Aynı e-posta ile ikinci kayıt yapılamaz
);

3. PRIMARY KEY: Satırı benzersiz tanımlayan anahtardır (NOT NULL + UNIQUE).

CREATE TABLE Uyeler (
    UyeID INT PRIMARY KEY, -- Birincil Anahtar
    Ad VARCHAR(50)
);

4. FOREIGN KEY: Başka bir tablodaki birincil anahtarı referans alır.

CREATE TABLE Siparisler (
    SiparisID INT PRIMARY KEY,
    UyeID INT,
    FOREIGN KEY (UyeID) REFERENCES Uyeler(UyeID) -- İlişkisel bütünlük
);

5. CHECK: Verinin belirli bir koşulu sağlamasını zorunlu kılar.

CREATE TABLE Urunler (
    UrunID INT PRIMARY KEY,
    Fiyat DECIMAL(10,2),
    CHECK (Fiyat > 0) -- Fiyat 0 veya negatif olamaz
);

6. DEFAULT: Veri girilmezse varsayılan bir değer atar.

CREATE TABLE Siparisler (
    SiparisID INT PRIMARY KEY,
    SiparisTarihi DATETIME DEFAULT CURRENT_TIMESTAMP -- Otomatik tarih atar
);

2. Tip Dönüşümleri ve Veri Tipleri

Veritabanı tasarımında doğru veri tipini seçmek, performans ve depolama alanı açısından kritiktir.

Veri Tipleri

Sayısal Tipler:

  • INT: Tam sayılar için kullanılır (Örn: ID, Adet).
  • DECIMAL(p, s): Hassas ondalıklı sayılar için kullanılır (Örn: Para birimi). p: toplam basamak, s: virgülden sonraki basamak.

Metin (String) Tipleri:

  • CHAR(n): Sabit uzunluklu metin. CHAR(10) alanına "Ali" yazsanız bile 10 karakterlik yer kaplar.
  • VARCHAR(n): Değişken uzunluklu metin. "Ali" yazarsanız sadece 3 karakterlik (+uzunluk bilgisi) yer kaplar. En yaygın tiptir.
  • TEXT: Çok uzun metinler (makale, açıklama) için kullanılır.

Tarih ve Zaman Tipleri:

  • DATE: Sadece tarih (YYYY-MM-DD).
  • DATETIME: Tarih ve Saat (YYYY-MM-DD HH:MM:SS).

Tip Dönüşümleri

Bazen bir veri tipini diğerine dönüştürmek gerekir (Örn: Metin olarak gelen sayıyı toplamak). MySQL'de CAST ve CONVERT kullanılır.

Örnekler:

Örnek: Metni tam sayıya çevirme

SELECT CAST('123' AS UNSIGNED);

Örnek: Ondalıklı sayıyı tam sayıya çevirme (Yuvarlamaz, keser)

SELECT CAST(123.45 AS SIGNED);

Örnek: Tarihi belirli bir formata veya metne çevirme

SELECT CONVERT(NOW(), CHAR);

Dikkat

Tip dönüşümleri sırasında veri kaybı yaşanabilir. Örneğin, VARCHAR tipindeki "Merhaba" yazısını INT tipine çevirmeye çalışmak hata verir veya 0 değerini döndürür (SQL moduna göre değişir).


3. SQL DDL Relations (İlişkiler)

İlişkisel veritabanlarının gücü, tablolar arasındaki bağlantılardan gelir. Bu ilişkiler DDL komutları ile fiziksel olarak tanımlanır.

1-N (Bire Çok) İlişki

En yaygın ilişki türüdür. Bir tablodaki bir kayıt, diğer tablodaki birden fazla kayıtla eşleşebilir. Kural: "Çok" olan tarafa (N), "Bir" olan tarafın (1) birincil anahtarı Yabancı Anahtar (Foreign Key) olarak eklenir.

Senaryo: Bir Bölümde birden çok Çalışan olabilir.

1 Tarafı (Parent)

CREATE TABLE Bolum (
    BolumID INT PRIMARY KEY,
    BolumAdi VARCHAR(50)
);

N Tarafı (Child)

CREATE TABLE Calisan (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50),
    BolumID INT, -- FK olacak sütun
    -- İlişki Tanımı:
    CONSTRAINT fk_bolum FOREIGN KEY (BolumID) REFERENCES Bolum(BolumID)
);

1-1 (Bire Bir) İlişki

Bir tablodaki kaydın, diğer tabloda sadece tek bir karşılığı vardır.

Kural: Yabancı Anahtar (FK) herhangi bir tabloya eklenebilir, ancak FK sütunu üzerinde mutlaka UNIQUE kısıtı olmalıdır.

Senaryo: Bir Personelin sadece bir Pasaport detayı olabilir.

CREATE TABLE Pasaport (
    PasaportID INT PRIMARY KEY,
    PasaportNo VARCHAR(20),
    PersonelID INT UNIQUE, -- UNIQUE kısıtı 1-1 ilişkiyi zorunlu kılar
    FOREIGN KEY (PersonelID) REFERENCES Personel(PersonelID)
);

N-N (Çoka Çok) İlişki

İki tablodaki kayıtların karşılıklı olarak birden fazla kayıtla eşleşebilmesidir.

Kural: Bu ilişki fiziksel olarak doğrudan kurulamaz. Ara Tablo (Junction Table) oluşturulması zorunludur.

Senaryo: Bir Öğrenci çok ders alabilir, bir Dersi çok öğrenci alabilir.

Tablo 1

CREATE TABLE Ogrenci (
    OgrenciID INT PRIMARY KEY,
    Ad VARCHAR(50)
);

Tablo 2

CREATE TABLE Ders (
    DersID INT PRIMARY KEY,
    DersAdi VARCHAR(50)
);

Ara Tablo (Junction Table)

CREATE TABLE OgrenciDers (
    OgrenciID INT,
    DersID INT,
    KayitTarihi DATE,
    -- Birleşik Anahtar (Composite PK)
    PRIMARY KEY (OgrenciID, DersID),
    -- İlişkiler
    FOREIGN KEY (OgrenciID) REFERENCES Ogrenci(OgrenciID),
    FOREIGN KEY (DersID) REFERENCES Ders(DersID)
);

4. MySQL - DML (Veri İşleme Komutları)

DML (Data Manipulation Language), veritabanındaki verileri yönetmek (CRUD işlemleri) için kullanılır.

Veri Seçme ve Filtreleme

Veri çekmek için SELECT, filtrelemek için WHERE, sıralamak için ORDER BY ve kayıt sayısını sınırlamak için LIMIT kullanılır.

Örnek: 'Müşteriler' tablosundan, İstanbul'da yaşayanları isme göre A'dan Z'ye sırala ve sadece ilk 10 kaydı getir.

SELECT MusteriAdi, Sehir, Bakiye 
FROM Musteriler
WHERE Sehir = 'İstanbul'
ORDER BY MusteriAdi ASC
LIMIT 10;

Veri Ekleme, Güncelleme ve Silme

Veri manipülasyonunun en kritik komutlarıdır.

Ekleme (INSERT):

Örnek: Tüm sütunlara veri ekleme

INSERT INTO Urunler VALUES (1, 'Laptop', 15000);

Örnek: Belirli sütunlara veri ekleme (Önerilen yöntem)

INSERT INTO Urunler (UrunAdi, Fiyat) VALUES ('Mouse', 250);

Güncelleme (UPDATE):

Örnek: ID'si 5 olan ürünün fiyatını %10 artır

UPDATE Urunler 
SET Fiyat = Fiyat * 1.10 
WHERE UrunID = 5;

Kritik Uyarı: UPDATE ve DELETE

UPDATE ve DELETE komutlarını kullanırken WHERE koşulunu asla unutmayın! Eğer WHERE kullanmazsanız, tablodaki TÜM kayıtlar güncellenir veya silinir.

Silme (DELETE):

Örnek: Stoğu biten (0 olan) ürünleri sil

DELETE FROM Urunler WHERE Stok = 0;

Mantıksal Operatörler ve Desen Eşleştirme

Karmaşık filtreleme işlemleri için kullanılır.

LIKE (Desen Eşleştirme):

% (herhangi bir karakter dizisi) ve _ (tek karakter) joker karakterleridir.

Örnek: Adı 'A' ile başlayan ve içinde 'met' geçen kayıtlar

SELECT * FROM Personel WHERE Ad LIKE 'A%met%';

IN ve BETWEEN:

Örnek: Bölümü 1, 2 veya 3 olanlar

SELECT * FROM Personel WHERE BolumID IN (1, 2, 3);

Örnek: Maaşı 10.000 ile 20.000 arasında olanlar (Sınırlar dahil)

SELECT * FROM Personel WHERE Maas BETWEEN 10000 AND 20000;

5. İleri Seviye İşlemler

Veri analizi ve raporlama için kullanılan fonksiyonlardır.

Toplulaştırma Fonksiyonları

Bu fonksiyonlar bir sütundaki değerler kümesi üzerinde işlem yapar ve tek bir değer döndürür.

Örnek: En düşük ve en yüksek maaş

SELECT MIN(Maas), MAX(Maas) FROM Personel;

Örnek: Toplam çalışan sayısı

SELECT COUNT(*) FROM Personel;

Örnek: Muhasebe bölümündeki toplam maaş ödemesi

SELECT SUM(Maas) FROM Personel WHERE Bolum = 'Muhasebe';

Örnek: Şirket genelindeki maaş ortalaması

SELECT AVG(Maas) FROM Personel;

Gruplama ve Kümeleme

Verileri belirli bir sütuna göre gruplayıp, her grup için özet bilgi çıkarmak için GROUP BY kullanılır.

Senaryo: Her bölümdeki çalışan sayısını ve ortalama maaşı listele.

SELECT Bolum, COUNT(*) AS CalisanSayisi, AVG(Maas) AS OrtMaas
FROM Personel
GROUP BY Bolum;

HAVING vs WHERE Farkı

  • WHERE: Satırları gruplama yapılmadan önce filtreler.
  • HAVING: Gruplama yapıldıktan sonra oluşan grupları filtreler (Genellikle Aggregate fonksiyonlarla kullanılır).

-- Sadece ortalama maaşı 20.000'den büyük olan bölümleri getir SELECT Bolum, AVG(Maas) FROM Personel GROUP BY Bolum HAVING AVG(Maas) > 20000;

UNION Operatörü: İki farklı sorgunun sonucunu alt alta birleştirir (Tekrarları atar). UNION ALL tekrarları atmaz.

SELECT Sehir FROM Musteriler
UNION
SELECT Sehir FROM Tedarikciler;

İç İçe SELECT (Alt Sorgular)

Bir sorgunun sonucunu, başka bir sorgunun içinde kullanmaktır.

Senaryo: Maaşı, şirketin ortalama maaşından yüksek olan personeli bul.

SELECT Ad, Soyad, Maas 
FROM Personel 
WHERE Maas > (SELECT AVG(Maas) FROM Personel);

6. Tarihsel Fonksiyonlar

MySQL'de zaman damgasıyla çalışmak için kullanılan fonksiyonlardır.

Tarih ve Saat Alma

Örnek: Şu anki tarih ve saat (2023-10-27 14:30:00)

SELECT NOW();

Örnek: Sadece bugünün tarihi (2023-10-27)

SELECT CURDATE();

Örnek: İki tarih arasındaki gün farkı

SELECT DATEDIFF('2024-01-01', NOW());

Tarih Formatlama

Tarihleri okunabilir metin formatına çevirir (DATE_FORMAT).

Örnek: Çıktı: "27 October 2023" (Format kodları: %d Gün, %M Ay İsmi, %Y Yıl)

SELECT DATE_FORMAT(NOW(), '%d %M %Y');

7. Çok Tablolu Sorgulama (JOIN)

Normalizasyon nedeniyle parçalanan tabloları, sorgulama anında sanal olarak birleştirmek için kullanılır.

SQL Join Türleri Venn Şeması

JOIN Mantığı

  • WHERE ile Birleştirme (Eski Stil): SELECT * FROM A, B WHERE A.id = B.id
  • JOIN ile Birleştirme (ANSI Standart - Önerilen): SELECT * FROM A INNER JOIN B ON A.id = B.id JOIN sözdizimi daha okunaklıdır ve birleştirme koşulunu filtreleme (WHERE) koşulundan ayırır.

JOIN Türleri

INNER JOIN (Kesişim)

Her iki tabloda da eşleşen kayıtları getirir. Eşleşmeyenler listelenmez.

Örnek: Sadece siparişi olan müşterileri getir

SELECT Musteriler.Ad, Siparisler.SiparisTarihi
FROM Musteriler
INNER JOIN Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;

LEFT JOIN (Sol Tablo Öncelikli)

Sol tablodaki (FROM kısmındaki) TÜM kayıtları getirir. Sağ tabloda eşleşen varsa verisini getirir, yoksa NULL döner.

Örnek: Tüm müşterileri getir, siparişi varsa tarihini göster, yoksa NULL kalsın

SELECT Musteriler.Ad, Siparisler.SiparisTarihi
FROM Musteriler
LEFT JOIN Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;

RIGHT JOIN (Sağ Tablo Öncelikli)

Sağ tablodaki (JOIN kısmındaki) tüm kayıtları getirir. Sol tabloda karşılığı yoksa NULL döner.

Örnek: Tüm siparişleri getir, müşteri varsa adını göster, yoksa NULL kalsın

SELECT Musteriler.Ad, Siparisler.SiparisID
FROM Musteriler
RIGHT JOIN Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;

FULL OUTER JOIN (Tam Birleşim)

İki tablodaki tüm kayıtları (eşleşen + eşleşmeyen) getirir.

  • Önemli Not: MySQL FULL OUTER JOIN komutunu doğrudan desteklemez. Bu işlem LEFT JOIN ve RIGHT JOIN sonuçlarının UNION ile birleştirilmesiyle simüle edilir.

    Örnek: MySQL'de FULL JOIN Simülasyonu

    SELECT * FROM Musteriler
    LEFT JOIN Siparisler ON Musteriler.ID = Siparisler.MusteriID
    UNION
    SELECT * FROM Musteriler
    RIGHT JOIN Siparisler ON Musteriler.ID = Siparisler.MusteriID;