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ı
| Komut | Açıklama | Örnek |
|---|---|---|
CREATE | Yeni veritabanı, tablo, index vb. oluşturur | CREATE TABLE products (...) |
ALTER | Mevcut yapıyı değiştirir | ALTER TABLE products ADD COLUMN color VARCHAR(30) |
DROP | Yapıyı tamamen siler | DROP TABLE products |
TRUNCATE | Tablonun tüm verilerini siler (yapıyı korur) | TRUNCATE TABLE products |
RENAME | Tablo veya sütun adını değiştirir | RENAME 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 TABLEdediğ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'daDROPyazmadan ö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ı
| Komut | Açıklama | CRUD Karşılığı | Örnek |
|---|---|---|---|
INSERT | Yeni veri ekler | Create | INSERT INTO customers VALUES (...) |
SELECT | Veri sorgular / okur | Read | SELECT * FROM customers |
UPDATE | Mevcut veriyi günceller | Update | UPDATE customers SET city = 'Ankara' WHERE ... |
DELETE | Veri siler | Delete | DELETE FROM customers WHERE ... |
💡 İpucu: Bazı kaynaklar
SELECT'i DML'den ayırıp DQL (Data Query Language) olarak sınıflandırır. ÇünküSELECTveriyi 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:
UPDATEveDELETEkomutları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
ROLLBACKile 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ı
| Komut | Açıklama | Örnek |
|---|---|---|
GRANT | Kullanıcıya yetki verir | GRANT SELECT ON products TO 'rapor_user' |
REVOKE | Kullanıcıdan yetki alır | REVOKE 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
| Yetki | Ne Yapabilir |
|---|---|
SELECT | Veri okuma |
INSERT | Veri ekleme |
UPDATE | Veri güncelleme |
DELETE | Veri silme |
CREATE | Tablo/veritabanı oluşturma |
DROP | Tablo/veritabanı silme |
ALTER | Tablo yapısını değiştirme |
INDEX | Index oluşturma/silme |
ALL PRIVILEGES | Tü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
SELECTyetkisine sahip olmalı,DELETEyetkisi 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ı
| Komut | Açıklama |
|---|---|
BEGIN / START TRANSACTION | Yeni bir transaction başlatır |
COMMIT | Transaction'daki tüm değişiklikleri kalıcı yapar |
ROLLBACK | Transaction'daki tüm değişiklikleri geri alır |
SAVEPOINT | Transaction içinde bir "kayıt noktası" oluşturur |
RELEASE SAVEPOINT | Bir savepoint'i kaldırır |
ROLLBACK TO SAVEPOINT | Belirli 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önerSavepoint 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ı
| Özellik | DDL | DML | DCL | TCL |
|---|---|---|---|---|
| Ne yapar | Yapı tanımlar | Veri işler | Yetki yönetir | Transaction yönetir |
| Geri alınabilir mi | Hayır (auto-commit) | Evet (transaction ile) | Hayır (auto-commit) | — (kendisi kontrol mekanizması) |
| Sık kullanılır mı | Başlangıçta, değişikliklerde | Her gün, her dakika | Yönetimde | Kritik işlemlerde |
| Kim kullanır | Geliştirici, DBA | Herkes | DBA, güvenlik | Geliştirici |
| Örnek | CREATE, ALTER, DROP | SELECT, INSERT, UPDATE, DELETE | GRANT, REVOKE | COMMIT, 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 zorSQL anahtar kelimelerini isim olarak kullanma (
order,select,tableisim olarak sorunlu)Türkçe karakter kullanma (
müşteri_adıyerinemusteri_adiveyafirst_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
| Özellik | MySQL | PostgreSQL | ||
|---|---|---|---|---|
| String birleştirme | CONCAT('a', 'b') | `'a' \ | \ | 'b' veya CONCAT('a', 'b')` |
| Auto-increment | AUTO_INCREMENT | SERIAL veya GENERATED ALWAYS AS IDENTITY | ||
| Limit + Offset | LIMIT 10 OFFSET 5 | LIMIT 10 OFFSET 5 (aynı) | ||
| Boolean | TINYINT(1) (aslında sayı) | Gerçek BOOLEAN tipi | ||
| Tarih fonksiyonları | NOW(), DATE_FORMAT() | NOW(), TO_CHAR() | ||
| UPSERT | INSERT ... ON DUPLICATE KEY UPDATE | INSERT ... ON CONFLICT ... DO UPDATE | ||
| String tırnak | Tek 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,JOINgibi 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 postgresGrafik Arayüzlü (GUI) Araçlar
| Araç | Platform | Açıklama |
|---|---|---|
| MySQL Workbench | Tüm platformlar | MySQL'in resmi GUI aracı, ücretsiz |
| DBeaver | Tüm platformlar | Birden fazla RDBMS destekler, açık kaynak |
| phpMyAdmin | Web tabanlı | Tarayıcıdan MySQL yönetimi, özellikle web hosting'de yaygın |
| DataGrip | Tüm platformlar | JetBrains'in profesyonel veritabanı IDE'si (ücretli) |
| TablePlus | Mac, Windows, Linux | Şık ve hızlı, ücretsiz sürümü var |
| HeidiSQL | Windows | Ü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
DDL ve DML'i karıştırmak: "Tablo oluştur" (DDL) ile "tabloya veri ekle" (DML) farklı kategoridir.
CREATE TABLEDDL,INSERT INTODML. Yapıyı değiştiren her şey DDL, veriyi değiştiren her şey DML.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.
WHERE olmadan UPDATE/DELETE yazmak: Bu SQL dünyasının en ünlü hatasıdır.
DELETE FROM customerstüm müşterileri siler.UPDATE orders SET status = 'cancelled'tüm siparişleri iptal eder. WHERE koşulunu her zaman kontrol et.Ç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.
SQL anahtar kelimelerini tablo/sütun ismi olarak kullanmak:
order,table,select,groupgibi 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
AI Asistan
Sorularını yanıtlamaya hazır