← Kursa Dön
📄 Text · 30 min

SQL Nedir? DDL, DML, DCL, TCL

Giriş — Veritabanıyla Nasıl Konuşuruz?

Önceki derste veritabanının ne olduğunu, tablolar ve ilişkiler kavramını öğrendik. Şimdi asıl soruya geliyoruz: veritabanıyla nasıl iletişim kurarız?

Düşün ki muhteşem bir kütüphane inşa ettin — raflar düzenli, kitaplar kategorize edilmiş, her şey yerli yerinde. Ama bu kütüphaneden bir kitap istemen gerektiğinde kütüphaneciye söylemen gerekiyor. Hangi dilde konuşacaksın? İşte veritabanlarının ortak dili SQL'dir.

SQL, veritabanı dünyasının İngilizcesi gibidir — nereye gidersen git, hangi RDBMS'i kullanırsan kullan, SQL konuşulur.


SQL Nedir?

SQL (Structured Query Language — Yapılandırılmış Sorgu Dili), ilişkisel veritabanlarıyla iletişim kurmak için kullanılan standart dildir.

SQL ile şunları yapabilirsin:

  • Veritabanı ve tablo oluşturabilirsin (yapı kurma)

  • Tablolara veri ekleyebilirsin (kayıt girme)

  • Verileri sorgulayabilirsin (arama ve raporlama)

  • Verileri güncelleyebilirsin (değiştirme)

  • Verileri silebilirsin (kaldırma)

  • Erişim yetkilerini yönetebilirsin (güvenlik)

Kısa Tarihçe

  • 1970 — Edgar F. Codd ilişkisel modeli yayınladı

  • 1974 — IBM'de SEQUEL (Structured English Query Language) geliştirildi

  • 1979 — Oracle, ilk ticari SQL veritabanını piyasaya sürdü

  • 1986 — ANSI (Amerikan Ulusal Standartlar Enstitüsü) SQL'i standart olarak kabul etti

  • 1987 — ISO da SQL standardını onayladı

  • Günümüz — SQL hâlâ en yaygın kullanılan veritabanı dili (ve Stack Overflow anketlerinde sürekli en çok kullanılan dillerden biri)

💡 İpucu: SQL'in okunuşu konusunda iki kamp var: "es-kü-el" (harf harf) ve "siquel" diyenler. İkisi de kabul görür ama resmi standart "es-kü-el" der. Günlük konuşmada ikisini de duyacaksın.


SQL Bir Programlama Dili mi?

Bu sorunun cevabı biraz nüanslı. SQL, Python veya Java gibi genel amaçlı (general-purpose) bir programlama dili değildir. Döngü yazmak, sınıf tanımlamak, kullanıcı arayüzü oluşturmak gibi işler SQL'in işi değil.

SQL bir deklaratif (declarative) dildir. Yani "ne istediğini" söylersin, "nasıl yapılacağını" veritabanı motoru kendi belirler.

🎯 Analoji: Restoranda garson "Ben tavuk sote istiyorum" diyorsun (deklaratif) — tavuğu nasıl doğrayacağını, hangi tencerede pişireceğini, yağı ne zaman ekleyeceğini söylemiyorsun. Garson (veritabanı motoru) bunu kendi biliyor. Ama Python'da yemek yapmak isteseydin, her adımı sen tarif edecektin (imperatif).

Karşılaştırma:

# Python (imperatif) — Nasıl yapılacağını adım adım tarif ediyorsun
result = []
for customer in customers:
    if customer.city == "İstanbul":
        result.append(customer.name)
result.sort()
-- SQL (deklaratif) — Ne istediğini söylüyorsun
SELECT first_name 
FROM customers 
WHERE city = 'İstanbul' 
ORDER BY first_name;

SQL sorgusunda "tablonun ilk satırından başla, her satırı kontrol et, city sütununa bak, İstanbul ise bir listeye ekle, sonra sırala" demiyorsun. Sadece "İstanbul'daki müşterilerin isimlerini sıralı getir" diyorsun. Veritabanı motoru en verimli yolu kendi buluyor.


SQL'in Yapısı — Dört Ana Kategori

SQL komutlarının hepsi aynı işi yapmaz. Bir kısmı yapı kurar, bir kısmı veri ekler, bir kısmı güvenlik ayarlar. Bu yüzden SQL komutları dört ana kategoriye ayrılır:

                    ┌─────────────────────────┐
                    │          SQL             │
                    └────────────┬────────────┘
          ┌──────────┬──────────┼──────────┬──────────┐
          ▼          ▼          ▼          ▼          
       ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐
       │ DDL  │  │ DML  │  │ DCL  │  │ TCL  │
       └──────┘  └──────┘  └──────┘  └──────┘
       Yapı      Veri      Yetki     İşlem
       Tanımla   İşle      Kontrol   Kontrol

Şimdi her birini detaylıca inceleyelim.


1. DDL — Data Definition Language (Veri Tanımlama Dili)

DDL komutları, veritabanının yapısını (iskeletini) tanımlar. Tablo oluşturmak, değiştirmek, silmek — bunlar DDL işlemleridir.

🎯 Analoji: DDL, bir evin mimari planını çizmek gibidir. Kaç oda olacak, odaların boyutları ne, kapılar nerede — bunları belirliyorsun. İçine mobilya koymuyorsun (o DML'in işi), sadece yapıyı kuruyorsun.

DDL Komutları

KomutAçıklamaÖrnek
CREATEYeni veritabanı, tablo, index vb. oluştururCREATE TABLE products (...)
ALTERMevcut yapıyı değiştirirALTER TABLE products ADD COLUMN color VARCHAR(30)
DROPYapıyı tamamen silerDROP TABLE products
TRUNCATETablonun tüm verilerini siler (yapıyı korur)TRUNCATE TABLE products
RENAMETablo veya sütun adını değiştirirRENAME TABLE products TO items

Örnekler

Veritabanı oluşturma:

CREATE DATABASE e_commerce;

Tablo oluşturma:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    city VARCHAR(50),
    registration_date DATE DEFAULT (CURRENT_DATE)
);

Tabloya sütun ekleme:

ALTER TABLE customers ADD COLUMN phone VARCHAR(20);

Tabloyu silme:

DROP TABLE customers;

⚠️ Dikkat: DDL komutları genellikle geri alınamaz (auto-commit). DROP TABLE dediğinde tablo ve içindeki tüm veriler gider — geri dönüşü yoktur (yedekten döndürmek hariç). Bu yüzden DDL komutlarını çalıştırmadan önce iki kez düşün. Production'da DROP yazmadan önce üç kez düşün.

DDL'in Özellikleri

  • Auto-commit: MySQL'de DDL komutları otomatik olarak commit edilir. Transaction içinde olsan bile DDL çalıştığında transaction otomatik commit olur.

  • Yapısal değişiklik: Veriyle değil, yapıyla ilgilenir.

  • Metadata değiştirir: Veritabanının "sözlüğünü" (data dictionary / information_schema) günceller.


2. DML — Data Manipulation Language (Veri İşleme Dili)

DML komutları, tablolardaki verileri işler. Veri eklemek, okumak, güncellemek, silmek — yani CRUD operasyonları DML'in kapsamındadır.

🎯 Analoji: DDL evin yapısını kuruyorsa, DML o evin içine mobilya koyma, çıkarma, değiştirme işlemidir. Evi bozmuyorsun, sadece içindekilerle çalışıyorsun.

DML Komutları

KomutAçıklamaCRUD KarşılığıÖrnek
INSERTYeni veri eklerCreateINSERT INTO customers VALUES (...)
SELECTVeri sorgular / okurReadSELECT * FROM customers
UPDATEMevcut veriyi güncellerUpdateUPDATE customers SET city = 'Ankara' WHERE ...
DELETEVeri silerDeleteDELETE FROM customers WHERE ...

💡 İpucu: Bazı kaynaklar SELECT'i DML'den ayırıp DQL (Data Query Language) olarak sınıflandırır. Çünkü SELECT veriyi değiştirmez, sadece okur. İkisi de doğrudur — resmi SQL standardı bu ayrımı yapmaz ama bilmen iyi olur.

Örnekler

Veri ekleme:

INSERT INTO customers (first_name, last_name, email, city) 
VALUES ('Ahmet', 'Yılmaz', 'ahmet@email.com', 'İstanbul');

Veri sorgulama:

-- Tüm müşterileri getir
SELECT * FROM customers;

-- İstanbul'daki müşterileri getir
SELECT first_name, last_name, email 
FROM customers 
WHERE city = 'İstanbul';

Veri güncelleme:

UPDATE customers 
SET city = 'Bursa' 
WHERE customer_id = 1;

Veri silme:

DELETE FROM customers 
WHERE customer_id = 1;

⚠️ Dikkat: UPDATE ve DELETE komutlarında WHERE koşulu unutulursa tablodaki tüm satırlar etkilenir! Bu, en yaygın ve en tehlikeli SQL hatalarından biridir. UPDATE customers SET city = 'Ankara' dediğinde tüm müşterilerin şehri Ankara olur. Her zaman WHERE yaz.

DML'in Özellikleri

  • Transaction desteği: DML komutları transaction içinde çalıştırılabilir ve ROLLBACK ile geri alınabilir (DDL'den farklı olarak).

  • Veriyle çalışır: Yapıyı değiştirmez, sadece veriyi.

  • En sık kullanılan: Günlük veritabanı işlemlerinin büyük çoğunluğu DML'dir.


3. DCL — Data Control Language (Veri Kontrol Dili)

DCL komutları, veritabanına erişim yetkilerini yönetir. Kim hangi tabloya erişebilir, kim veri ekleyebilir, kim sadece okuyabilir — bunları DCL belirler.

🎯 Analoji: Bir ofis binasının güvenlik sistemi gibi düşün. Kimin hangi kata çıkabileceği, kimin hangi odaya girebileceği, kimin sadece lobi'de kalacağı — DCL bu "giriş kartlarını" yönetir.

DCL Komutları

KomutAçıklamaÖrnek
GRANTKullanıcıya yetki verirGRANT SELECT ON products TO 'rapor_user'
REVOKEKullanıcıdan yetki alırREVOKE INSERT ON products FROM 'rapor_user'

Örnekler

Kullanıcı oluşturma ve yetki verme:

-- Yeni bir kullanıcı oluştur
CREATE USER 'rapor_user'@'localhost' IDENTIFIED BY 'guclu_sifre_123';

-- Bu kullanıcıya sadece SELECT yetkisi ver (sadece okuma)
GRANT SELECT ON e_commerce.* TO 'rapor_user'@'localhost';

-- Değişiklikleri uygula
FLUSH PRIVILEGES;

Yetki kaldırma:

-- INSERT yetkisini geri al
REVOKE INSERT ON e_commerce.* FROM 'rapor_user'@'localhost';

Tüm yetkileri verme:

-- Bir kullanıcıya tüm yetkileri ver (dikkatli kullan!)
GRANT ALL PRIVILEGES ON e_commerce.* TO 'admin_user'@'localhost';

Yetki Türleri

YetkiNe Yapabilir
SELECTVeri okuma
INSERTVeri ekleme
UPDATEVeri güncelleme
DELETEVeri silme
CREATETablo/veritabanı oluşturma
DROPTablo/veritabanı silme
ALTERTablo yapısını değiştirme
INDEXIndex oluşturma/silme
ALL PRIVILEGESTüm yetkiler

💡 İpucu: Gerçek dünyada en az yetki prensibi (principle of least privilege) uygulanır. Her kullanıcıya sadece işini yapması için gereken minimum yetkiyi ver. Rapor çeken biri sadece SELECT yetkisine sahip olmalı, DELETE yetkisi vermek gereksiz risk yaratır.

DCL'in Özellikleri

  • Güvenlik odaklı: Verinin kendisiyle değil, veriye erişim haklarıyla ilgilenir.

  • Auto-commit: DDL gibi, DCL komutları da otomatik commit olur.

  • Veritabanı yöneticisi (DBA) işi: Günlük geliştirmeden çok, yönetim tarafında kullanılır.


4. TCL — Transaction Control Language (İşlem Kontrol Dili)

TCL komutları, transaction'ları (işlem gruplarını) yönetir. Birden fazla DML komutunu tek bir "paket" olarak yönetmeni sağlar.

🎯 Analoji: Online alışveriş yaptığını düşün. Ödeme sayfasında "Onayla" butonuna basıyorsun. Kart bilgin doğrulanır, bakiyenden düşülür, sipariş oluşturulur, stok güncellenir. Bunların hepsi tek bir işlem (transaction) olarak çalışır. Biri başarısız olursa hepsi geri alınır. "Paran gitti ama sipariş oluşmadı" durumu yaşanmaz. İşte TCL bu "ya hep ya hiç" mekanizmasını yönetir.

TCL Komutları

KomutAçıklama
BEGIN / START TRANSACTIONYeni bir transaction başlatır
COMMITTransaction'daki tüm değişiklikleri kalıcı yapar
ROLLBACKTransaction'daki tüm değişiklikleri geri alır
SAVEPOINTTransaction içinde bir "kayıt noktası" oluşturur
RELEASE SAVEPOINTBir savepoint'i kaldırır
ROLLBACK TO SAVEPOINTBelirli bir savepoint'e kadar geri alır

Örnekler

Başarılı transaction:

-- Transaction başlat
START TRANSACTION;

-- Müşterinin bakiyesinden düş
UPDATE accounts SET balance = balance - 500 WHERE customer_id = 1;

-- Alıcının bakiyesine ekle
UPDATE accounts SET balance = balance + 500 WHERE customer_id = 2;

-- Her şey başarılı — kalıcı yap
COMMIT;

Başarısız transaction — geri alma:

START TRANSACTION;

-- Stoktan düş
UPDATE products SET stock_quantity = stock_quantity - 1 WHERE product_id = 5;

-- Sipariş oluşturmaya çalış ama bir hata oluştu!
-- INSERT INTO orders (...) VALUES (...);  -- HATA!

-- Bir şeyler ters gitti, tüm değişiklikleri geri al
ROLLBACK;
-- Stok da eski haline döner

Savepoint kullanımı:

START TRANSACTION;

INSERT INTO orders (customer_id, total_amount) VALUES (1, 500);
SAVEPOINT siparis_olusturuldu;

INSERT INTO order_items (order_id, product_id, quantity, unit_price) 
VALUES (LAST_INSERT_ID(), 5, 2, 250);

-- Bir sorun çıkarsa sadece order_items'ı geri al,
-- orders'ı koru
ROLLBACK TO SAVEPOINT siparis_olusturuldu;

-- Siparişi farklı ürünlerle tekrar dene
INSERT INTO order_items (order_id, product_id, quantity, unit_price) 
VALUES (LAST_INSERT_ID(), 8, 1, 500);

COMMIT;

TCL'in Özellikleri

  • Veri güvenliği: "Yarım kalmış" işlemleri önler.

  • DML ile çalışır: Transaction'lar DML komutlarını gruplar. DDL komutları transaction'ı otomatik commit eder.

  • Performans etkisi: Transaction açık kaldığı süre boyunca ilgili satırlar kilitlenebilir. Uzun transaction'lardan kaçın.


Dört Kategorinin Karşılaştırması

ÖzellikDDLDMLDCLTCL
Ne yaparYapı tanımlarVeri işlerYetki yönetirTransaction yönetir
Geri alınabilir miHayır (auto-commit)Evet (transaction ile)Hayır (auto-commit)— (kendisi kontrol mekanizması)
Sık kullanılır mıBaşlangıçta, değişikliklerdeHer gün, her dakikaYönetimdeKritik işlemlerde
Kim kullanırGeliştirici, DBAHerkesDBA, güvenlikGeliştirici
ÖrnekCREATE, ALTER, DROPSELECT, INSERT, UPDATE, DELETEGRANT, REVOKECOMMIT, ROLLBACK

SQL Syntax'ının Temel Kuralları

SQL yazmaya başlamadan önce bilinmesi gereken temel kurallar:

1. Büyük/Küçük Harf Duyarlılığı

SQL anahtar kelimeleri büyük/küçük harf duyarsızdır (case-insensitive):

-- Bunların üçü de aynı şeyi yapar:
SELECT * FROM customers;
select * from customers;
SeLeCt * FrOm CuStOmErS;  -- Çalışır ama yapma 😄

Gelenek (convention): SQL anahtar kelimelerini BÜYÜK HARF, tablo ve sütun isimlerini küçük harf yazmak en yaygın standarttır:

SELECT first_name, last_name FROM customers WHERE city = 'İstanbul';

💡 İpucu: Tablo ve sütun isimlerinin büyük/küçük harf duyarlılığı işletim sistemine bağlıdır. Linux'ta MySQL tablo isimlerinde büyük/küçük harf fark eder, Windows'ta etmez. En güvenli yol: her yerde küçük harf ve alt çizgi (snake_case) kullanmaktır.

2. Noktalı Virgül (;)

Her SQL komutu noktalı virgül ile biter:

SELECT * FROM customers;
INSERT INTO customers (first_name) VALUES ('Ahmet');

Tek komut yazıyorsan bazı araçlar noktalı virgülsüz de çalıştırır, ama birden fazla komut çalıştıracaksan noktalı virgül zorunludur. En iyi pratik: her zaman koy.

3. String Değerler ve Tek Tırnak

SQL'de metin (string) değerler tek tırnak içine yazılır:

-- Doğru — tek tırnak
SELECT * FROM customers WHERE city = 'İstanbul';

-- Yanlış — çift tırnak (MySQL'de çalışabilir ama standart değil)
SELECT * FROM customers WHERE city = "İstanbul";

⚠️ Dikkat: MySQL çift tırnağı da kabul eder (ANSI_QUOTES modu kapalıysa), ama PostgreSQL ve diğer birçok RDBMS sadece tek tırnak kabul eder. Taşınabilir kod yazmak için her zaman tek tırnak kullan.

4. Yorum Satırları (Comments)

-- Bu tek satırlık yorum (iki tire + boşluk)

# Bu da tek satırlık yorum (MySQL'e özel, tercih etme)

/* 
   Bu çok satırlık yorum.
   Birden fazla satıra yayılabilir.
   Uzun açıklamalar için kullanışlı.
*/

SELECT first_name,  -- Müşterinin adı
       last_name,   -- Müşterinin soyadı
       email        -- E-posta adresi
FROM customers;

5. Boşluk ve Satır Sonu

SQL boşluk ve satır sonlarına duyarsızdır. Aşağıdaki iki sorgu aynıdır:

-- Tek satırda
SELECT first_name, last_name, email FROM customers WHERE city = 'İstanbul' ORDER BY last_name;

-- Çok satırda (okunabilir)
SELECT first_name, 
       last_name, 
       email 
FROM customers 
WHERE city = 'İstanbul' 
ORDER BY last_name;

İkinci format çok daha okunabilir. Sorguların uzaması halinde çok satırlı format hayat kurtarır.

6. İsimlendirme Kuralları

Tablo ve sütun isimleri için best practice:

-- ✅ İyi — snake_case, anlamlı isimler
CREATE TABLE order_items (
    item_id INT,
    order_id INT,
    unit_price DECIMAL(10,2)
);

-- ❌ Kötü — belirsiz, tutarsız, sorunlu karakterler
CREATE TABLE OI (
    id INT,
    oid INT,
    p DECIMAL(10,2)
);

İsimlendirme kuralları:

  • Küçük harf ve alt çizgi kullan (snake_case)

  • Tablo isimleri çoğul (customers, orders)

  • Sütun isimleri tekil (first_name, email)

  • Anlamlı isimler ver — 6 ay sonra oid'nin ne olduğunu hatırlamak zor

  • SQL anahtar kelimelerini isim olarak kullanma (order, select, table isim olarak sorunlu)

  • Türkçe karakter kullanma (müşteri_adı yerine musteri_adi veya first_name)


SQL Komutlarının Çalışma Sırası

Bir SQL sorgusu yazdığında, veritabanı motoru onu belirli bir sırayla işler. Bu sırayı bilmek ileride karmaşık sorgular yazarken çok işine yarayacak:

1. FROM      — Hangi tablodan?
2. WHERE     — Hangi koşullara uyan satırlar?
3. GROUP BY  — Nasıl grupla?
4. HAVING    — Gruplara hangi koşullar uygulanacak?
5. SELECT    — Hangi sütunları göster?
6. ORDER BY  — Nasıl sırala?
7. LIMIT     — Kaç satır göster?

Bu sıra yazım sırası ile farklıdır. Yazarken SELECT ... FROM ... WHERE ... diye yazarsın ama veritabanı önce FROM'u, sonra WHERE'i, en son SELECT'i işler. Bu ayrımı şimdi aklının bir köşesinde tut — GROUP BY ve HAVING konularında çok önemli olacak.


Gerçek Dünya Örneği — Her Kategoriden Bir SQL Komutu

Hadi e-ticaret veritabanımızda her kategoriden bir komut çalıştıralım:

-- 1. DDL — Veritabanı ve tablo oluştur
CREATE DATABASE e_commerce;
USE e_commerce;

CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(200) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock_quantity INT DEFAULT 0
);

-- 2. DML — Veri ekle ve sorgula
INSERT INTO products (product_name, price, stock_quantity) 
VALUES ('Kablosuz Mouse', 299.99, 150);

INSERT INTO products (product_name, price, stock_quantity) 
VALUES ('Mekanik Klavye', 899.99, 75);

SELECT * FROM products;
-- Çıktı:
-- +------------+----------------+--------+----------------+
-- | product_id | product_name   | price  | stock_quantity |
-- +------------+----------------+--------+----------------+
-- | 1          | Kablosuz Mouse | 299.99 | 150            |
-- | 2          | Mekanik Klavye | 899.99 | 75             |
-- +------------+----------------+--------+----------------+

-- 3. DML — Güncelle
UPDATE products SET price = 279.99 WHERE product_id = 1;

-- 4. DCL — Kullanıcı yetkilendirme
GRANT SELECT ON e_commerce.products TO 'rapor_user'@'localhost';

-- 5. TCL — Transaction
START TRANSACTION;
UPDATE products SET stock_quantity = stock_quantity - 1 WHERE product_id = 1;
-- Sipariş kaydı eklenecek...
COMMIT;

SQL Standartları ve Lehçeler (Dialects)

SQL bir standart olmakla birlikte, her RDBMS kendi eklentilerini ve farklılıklarını barındırır. Bu "lehçelere" SQL dialect denir.

Önemli Farklar — MySQL vs PostgreSQL

ÖzellikMySQLPostgreSQL
String birleştirmeCONCAT('a', 'b')`'a' \\'b' veya CONCAT('a', 'b')`
Auto-incrementAUTO_INCREMENTSERIAL veya GENERATED ALWAYS AS IDENTITY
Limit + OffsetLIMIT 10 OFFSET 5LIMIT 10 OFFSET 5 (aynı)
BooleanTINYINT(1) (aslında sayı)Gerçek BOOLEAN tipi
Tarih fonksiyonlarıNOW(), DATE_FORMAT()NOW(), TO_CHAR()
UPSERTINSERT ... ON DUPLICATE KEY UPDATEINSERT ... ON CONFLICT ... DO UPDATE
String tırnakTek ve çift tırnak (varsayılan)Sadece tek tırnak (çift tırnak = tanımlayıcı)

Bu kursta MySQL syntax'ını kullanacağız. PostgreSQL farklılıklarını ilgili derslerde "📝 PostgreSQL Notu" olarak belirteceğiz.

💡 İpucu: SQL'in %80-90'ı tüm RDBMS'lerde aynıdır. Temel SELECT, INSERT, UPDATE, DELETE, JOIN gibi komutlar evrenseldir. Farklılıklar genellikle ileri seviye fonksiyonlarda ve özel syntax'larda ortaya çıkar. Bir RDBMS'i iyi öğrenirsen diğerine geçiş çok rahat olur.


Hangi Araçları Kullanacağız?

SQL yazmak için bir istemci araca ihtiyacın var. İşte seçeneklerin:

Komut Satırı (CLI)

# MySQL CLI
mysql -u root -p

# PostgreSQL CLI
psql -U postgres

Grafik Arayüzlü (GUI) Araçlar

AraçPlatformAçıklama
MySQL WorkbenchTüm platformlarMySQL'in resmi GUI aracı, ücretsiz
DBeaverTüm platformlarBirden fazla RDBMS destekler, açık kaynak
phpMyAdminWeb tabanlıTarayıcıdan MySQL yönetimi, özellikle web hosting'de yaygın
DataGripTüm platformlarJetBrains'in profesyonel veritabanı IDE'si (ücretli)
TablePlusMac, Windows, LinuxŞık ve hızlı, ücretsiz sürümü var
HeidiSQLWindowsÜcretsiz, hafif, MySQL/MariaDB/PostgreSQL

Hangi aracı kullanacağın pek önemli değil — hepsi aynı SQL komutlarını çalıştırır. Başlangıç için MySQL Workbench veya DBeaver iyi seçimlerdir.


Sıkça Yapılan Hatalar

  1. DDL ve DML'i karıştırmak: "Tablo oluştur" (DDL) ile "tabloya veri ekle" (DML) farklı kategoridir. CREATE TABLE DDL, INSERT INTO DML. Yapıyı değiştiren her şey DDL, veriyi değiştiren her şey DML.

  2. Transaction kullanmamak: Birbirine bağlı birden fazla DML işlemi yapıyorsan (örneğin, bakiye düş + sipariş oluştur), bunları mutlaka transaction içine al. Aksi halde yarım kalmış işlemler veri tutarsızlığı yaratır.

  3. WHERE olmadan UPDATE/DELETE yazmak: Bu SQL dünyasının en ünlü hatasıdır. DELETE FROM customers tüm müşterileri siler. UPDATE orders SET status = 'cancelled' tüm siparişleri iptal eder. WHERE koşulunu her zaman kontrol et.

  4. Çift tırnak alışkanlığı: Python veya JavaScript'ten geliyorsan çift tırnak refleksin olabilir. SQL'de string değerler için tek tırnak kullan. Bu alışkanlığı baştan edin.

  5. SQL anahtar kelimelerini tablo/sütun ismi olarak kullanmak: order, table, select, group gibi isimler sorun çıkarır. Eğer mecbursan backtick kullan: ` order . Ama en iyisi baştan uygun isim seç: orders, user_table` vb.


Özet

  • SQL (Structured Query Language), ilişkisel veritabanlarıyla iletişim kurmak için kullanılan standart deklaratif dildir

  • SQL komutları dört ana kategoriye ayrılır:

- DDL (Data Definition Language) — Yapı tanımlar: CREATE, ALTER, DROP - DML (Data Manipulation Language) — Veri işler: SELECT, INSERT, UPDATE, DELETE - DCL (Data Control Language) — Yetki yönetir: GRANT, REVOKE - TCL (Transaction Control Language) — İşlem yönetir: COMMIT, ROLLBACK

  • SQL büyük/küçük harf duyarsızdır ama gelenek olarak anahtar kelimeler büyük harf yazılır

  • String değerler tek tırnak içine yazılır

  • Her RDBMS kendi SQL lehçesine (dialect) sahiptir ama temeller aynıdır

  • WHERE koşulunu unutmak, SQL dünyasının en tehlikeli hatasıdır