İlk SQL Komutları: CREATE DATABASE, USE, SHOW
Giriş — İlk Adımı Atma Zamanı
Buraya kadar veritabanının ne olduğunu, SQL'in ne işe yaradığını ve veri tiplerini öğrendik. Artık ellerimizi kirletme zamanı — gerçek SQL komutları yazacağız.
Bu ders, SQL yolculuğundaki ilk pratik adım. Bir veritabanı oluşturacak, içine gireceğ ve neler olduğuna bakacağız. Tıpkı yeni bir ev inşa edip kapıyı açıp içeri girip odaları gözden geçirmek gibi.
🎯 Analoji: Bilgisayarında yeni bir klasör oluşturduğunu düşün. Klasörü oluşturursun (
CREATE DATABASE), klasörün içine girersin (USE), klasörde ne var diye bakarsın (SHOW). SQL komutları da tam olarak bunu yapar — ama veritabanı dünyasında.
MySQL'e Bağlanmak
SQL komutlarını çalıştırmak için önce MySQL sunucusuna bağlanman gerekiyor. En temel yol komut satırı (CLI) üzerinden:
# MySQL'e bağlan (root kullanıcısı ile)
mysql -u root -p
# Şifre sorulacak — MySQL kurulumunda belirlediğin şifreyi gir
# Başarılı bağlantı sonrası şöyle bir ekran göreceksin:
# Welcome to the MySQL monitor. Commands end with ; or \g.
# mysql>Bu mysql> promptu, SQL komutları yazmaya hazır olduğun anlamına gelir. Artık her yazdığın komut MySQL sunucusuna gönderilecek.
💡 İpucu: GUI araç kullanıyorsan (MySQL Workbench, DBeaver, phpMyAdmin), bağlantı ayarlarını yapıp bir SQL editör penceresi açman yeterli. Komutlar aynı — sadece çalıştırma butonu farklı.
CREATE DATABASE — Veritabanı Oluşturma
Her şey bir veritabanı oluşturmakla başlar. Bir MySQL sunucusunda birden fazla veritabanı olabilir — her proje için ayrı bir veritabanı oluşturmak best practice'tir.
Temel Sözdizimi (Syntax)
CREATE DATABASE veritabani_adi;İlk Veritabanımızı Oluşturalım
-- E-ticaret veritabanımızı oluştur
CREATE DATABASE e_commerce;Eğer her şey yolundaysa şöyle bir mesaj görürsün:
Query OK, 1 row affected (0.01 sec)Aynı İsimde Veritabanı Varsa?
-- Bu komutu iki kez çalıştır
CREATE DATABASE e_commerce;
-- İlk sefer: Query OK
-- İkinci sefer: ERROR 1007 (HY000): Can't create database 'e_commerce'; database existsHata! Çünkü e_commerce zaten var. Bu hatayı önlemek için IF NOT EXISTS kullanırsın:
-- Güvenli yol — zaten varsa hata vermez
CREATE DATABASE IF NOT EXISTS e_commerce;
-- Zaten varsa: Query OK, 1 row affected, 1 warning
-- Yoksa oluşturur: Query OK, 1 row affected💡 İpucu:
IF NOT EXISTSözellikle script dosyalarında ve otomasyon senaryolarında çok kullanışlıdır. Script'i birden fazla kez çalıştırabilirsin — hata vermez.
Karakter Seti ve Sıralama (Character Set & Collation)
Veritabanında Türkçe karakterler (ş, ç, ğ, ü, ö, ı, İ) düzgün çalışsın istiyorsan, karakter seti ve sıralama ayarını doğru yapmalısın:
-- UTF-8 desteği ile veritabanı oluşturma (önerilen)
CREATE DATABASE e_commerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;Bu ne anlama geliyor?
CHARACTER SET utf8mb4— Dünyandaki tüm karakterleri destekler (Türkçe, Arapça, Çince, emoji 🎉)COLLATE utf8mb4_unicode_ci— Karşılaştırma ve sıralama kuralı
- ci = case-insensitive (büyük/küçük harf duyarsız): 'ahmet' = 'AHMET' - unicode = Unicode standart sıralama kuralları
⚠️ Dikkat: MySQL'de
utf8veutf8mb4farklıdır!utf8MySQL'in eski, 3-byte kısıtlı implementasyonudur — emoji ve bazı özel karakterleri desteklemez. Her zaman `utf8mb4` kullan. MySQL 8.0'da varsayılan zatenutf8mb4'tür ama explicit belirtmek iyi pratiktir.
-- ❌ Eski ve kısıtlı — kullanma
CREATE DATABASE eski_db CHARACTER SET utf8;
-- ✅ Modern ve kapsamlı — bunu kullan
CREATE DATABASE yeni_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Collation Seçenekleri
| Collation | Açıklama | Örnek |
|---|---|---|
utf8mb4_unicode_ci | Genel amaçlı, çoğu dil için iyi | Önerilen |
utf8mb4_turkish_ci | Türkçe'ye özel sıralama (I/İ, ı/i) | Türkçe ağırlıklı projeler |
utf8mb4_general_ci | Hızlı ama daha az doğru sıralama | Performans kritik, dil önemsiz |
utf8mb4_bin | Binary karşılaştırma (büyük/küçük harf duyarlı) | Şifre, hash değerleri |
Türkçe I/İ sorunu:
-- utf8mb4_unicode_ci ile:
-- 'Istanbul' = 'istanbul' = 'ISTANBUL' (hepsi eşit, EVET)
-- Ama 'I' ve 'İ' ayrımı net olmayabilir
-- utf8mb4_turkish_ci ile:
-- 'Istanbul' ≠ 'İstanbul' (Türkçe kuralları: I≠İ, ı≠i)
-- Türkçe sıralama: a, b, c, ç, d, e, f, g, ğ, h, ı, i, j, ...💡 İpucu: Çoğu proje için
utf8mb4_unicode_ciyeterlidir. Eğer Türkçe büyük/küçük harf dönüşümü (I→ı, İ→i) kritik bir gereksinim iseutf8mb4_turkish_cikullan.
USE — Veritabanını Seçme (Aktif Yapma)
Veritabanını oluşturdun ama henüz "içinde" değilsin. SQL komutlarının hangi veritabanına gideceğini belirtmen gerekiyor:
-- e_commerce veritabanını aktif yap
USE e_commerce;
-- Çıktı: Database changedUSE komutundan sonra yazdığın tüm SQL komutları bu veritabanı üzerinde çalışır.
USE e_commerce;
-- Artık bu komutlar e_commerce veritabanında çalışır
CREATE TABLE products (...);
SELECT * FROM customers;
INSERT INTO orders (...) VALUES (...);Hangi veritabanındayım?
-- Aktif veritabanını göster
SELECT DATABASE();
-- Çıktı:
-- +------------+
-- | DATABASE() |
-- +------------+
-- | e_commerce |
-- +------------+Veritabanı belirtmeden tablo erişimi
USE kullanmadan da belirli bir veritabanının tablosuna erişebilirsin — tam yol (fully qualified name) kullanarak:
-- USE kullanmadan
SELECT * FROM e_commerce.customers;
SELECT * FROM baska_db.users;
-- Bu özellikle birden fazla veritabanı arasında JOIN yaparken kullanışlıdır
SELECT c.first_name, l.log_message
FROM e_commerce.customers c
JOIN logging_db.activity_logs l ON c.customer_id = l.user_id;SHOW — Bilgi Sorgulama Komutları
SHOW komutu, veritabanı sunucusu hakkında meta bilgi (bilgi hakkında bilgi) sorgular. Hangi veritabanları var, hangi tablolar var, tablo yapısı nasıl — bunları SHOW ile öğrenirsin.
SHOW DATABASES — Tüm Veritabanlarını Listele
SHOW DATABASES;Çıktı:
+--------------------+
| Database |
+--------------------+
| e_commerce |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+e_commerce— Bizim oluşturduğumuz veritabanıinformation_schema— MySQL'in meta veri deposu (tablo yapıları, sütun bilgileri vb.)mysql— MySQL'in kendi sistem tabloları (kullanıcılar, yetkiler)performance_schema— Performans izleme verilerisys— DBA'ler için hazır performans sorguları
⚠️ Dikkat: Sistem veritabanlarını (
information_schema,mysql,performance_schema,sys) silme veya değiştirme! Bunlar MySQL'in kendi iç mekanizmasıdır. Dokunursan sunucu düzgün çalışmayabilir.
SHOW DATABASES filtreleme
-- Belirli bir kalıba uyan veritabanlarını göster
SHOW DATABASES LIKE 'e_%';
-- e_ ile başlayan veritabanları
SHOW DATABASES LIKE '%commerce%';
-- İçinde "commerce" geçen veritabanlarıSHOW TABLES — Tablolari Listele
USE e_commerce;
SHOW TABLES;Eğer henüz tablo oluşturmadıysan:
Empty set (0.00 sec)Tablolar oluşturduktan sonra:
+----------------------+
| Tables_in_e_commerce |
+----------------------+
| categories |
| customers |
| departments |
| employees |
| order_items |
| orders |
| products |
+----------------------+SHOW COLUMNS / DESCRIBE — Tablo Yapısını Göster
Bir tablonun sütunlarını, veri tiplerini ve kısıtlamalarını görmek için:
-- İki komut da aynı işi yapar
SHOW COLUMNS FROM customers;
-- veya kısa yol:
DESCRIBE customers;
-- veya daha da kısa:
DESC customers;Çıktı:
+-------------------+--------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+-------------------+-------------------+
| customer_id | int unsigned | NO | PRI | NULL | auto_increment |
| first_name | varchar(50) | NO | | NULL | |
| last_name | varchar(50) | NO | | NULL | |
| email | varchar(100) | NO | UNI | NULL | |
| phone | varchar(20) | YES | | NULL | |
| city | varchar(50) | YES | | NULL | |
| registration_date | date | YES | | curdate() | DEFAULT_GENERATED |
| is_active | tinyint(1) | YES | | 1 | |
+-------------------+--------------+------+-----+-------------------+-------------------+Her sütun hakkında şu bilgileri görebilirsin:
Field: Sütun adı
Type: Veri tipi
Null: NULL değer alabilir mi (YES/NO)
Key: PRI (primary key), UNI (unique), MUL (index)
Default: Varsayılan değer
Extra: Ek bilgi (auto_increment vb.)
SHOW CREATE TABLE — Tablonun Tam CREATE Komutunu Göster
Bu komut, tabloyu oluşturan SQL komutunun tamamını gösterir — çok kullanışlıdır:
SHOW CREATE TABLE customers;Çıktı:
CREATE TABLE `customers` (
`customer_id` int unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) NOT NULL,
`last_name` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,
`phone` varchar(20) DEFAULT NULL,
`city` varchar(50) DEFAULT NULL,
`registration_date` date DEFAULT (curdate()),
`is_active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`customer_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ciBu çıktı özellikle şu durumlarda işe yarar:
Tabloyu başka bir sunucuya taşımak istediğinde
Tablonun yapısını dokümante etmek istediğinde
Debug yaparken tablonun gerçek yapısını görmek istediğinde
SHOW CREATE DATABASE
SHOW CREATE DATABASE e_commerce;+------------+------------------------------------------------------------------+
| Database | Create Database |
+------------+------------------------------------------------------------------+
| e_commerce | CREATE DATABASE `e_commerce` /*!40100 DEFAULT CHARACTER SET |
| | utf8mb4 COLLATE utf8mb4_unicode_ci */ ... |
+------------+------------------------------------------------------------------+Diğer Faydalı SHOW Komutları
-- Sunucu değişkenlerini göster (binlerce ayar)
SHOW VARIABLES;
-- Belirli bir değişkeni göster
SHOW VARIABLES LIKE 'max_connections';
-- Sonuç: max_connections = 151 (varsayılan)
-- Karakter seti ayarlarını göster
SHOW VARIABLES LIKE 'character_set%';
-- Aktif bağlantıları göster
SHOW PROCESSLIST;
-- Sunucu durumunu göster
SHOW STATUS;
-- Belirli durum bilgisini göster
SHOW STATUS LIKE 'Threads_connected';
-- Tablonun indekslerini göster
SHOW INDEX FROM products;
-- Desteklenen storage engine'leri göster
SHOW ENGINES;
-- Desteklenen karakter setlerini göster
SHOW CHARACTER SET;
-- Tablo istatistiklerini göster (satır sayısı, boyut vb.)
SHOW TABLE STATUS;
SHOW TABLE STATUS LIKE 'customers';DROP DATABASE — Veritabanını Silme
Bir veritabanını ve içindeki tüm tabloları, tüm verileri tamamen silmek için:
DROP DATABASE veritabani_adi;-- Veritabanını sil
DROP DATABASE e_commerce;
-- Query OK, 7 rows affected (0.05 sec) — 7 tablo silindi
-- Güvenli yol — yoksa hata vermez
DROP DATABASE IF EXISTS e_commerce;⚠️ Dikkat:
DROP DATABASEgeri alınamaz. Transaction içine alsan bile geri dönüşü yoktur (DDL komutu, auto-commit). Production'da bu komutu çalıştırmadan önce: 1. Doğru veritabanında olduğundan emin ol 2. Yedek al 3. Bir kez daha düşün 4. Bir kez daha düşün
Veritabanı Silme ve Tekrar Oluşturma (Reset)
Geliştirme ortamında sıfırdan başlamak istediğinde:
-- Temizle ve tekrar oluştur
DROP DATABASE IF EXISTS e_commerce;
CREATE DATABASE e_commerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE e_commerce;
-- Tabloları tekrar oluştur...Bu "drop and recreate" pattern'ı özellikle şu durumlarda kullanılır:
Migration script'lerini test ederken
Seed data ile temiz bir ortam oluştururken
Unit test'ler için temiz veritabanı hazırlarken
ALTER DATABASE — Veritabanını Değiştirme
Mevcut veritabanının ayarlarını değiştirebilirsin:
-- Karakter setini değiştir
ALTER DATABASE e_commerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_turkish_ci;
-- Salt okunur yap (MySQL 8.0+)
ALTER DATABASE e_commerce READ ONLY = 1;
-- Tekrar yazılabilir yap
ALTER DATABASE e_commerce READ ONLY = 0;information_schema — MySQL'in Sözlüğü
MySQL, tüm veritabanları, tablolar, sütunlar, indeksler hakkındaki bilgileri information_schema adlı özel bir veritabanında tutar. Bu veritabanını SHOW komutlarının alternatifi olarak sorgulayabilirsin:
-- Tüm veritabanlarını listele (SHOW DATABASES alternatifi)
SELECT SCHEMA_NAME
FROM information_schema.SCHEMATA;
-- Bir veritabanındaki tüm tabloları listele
SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH, CREATE_TIME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'e_commerce';
-- Bir tablonun sütunlarını listele (DESC alternatifi)
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'e_commerce' AND TABLE_NAME = 'customers';
-- Tüm foreign key'leri listele
SELECT
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'e_commerce'
AND REFERENCED_TABLE_NAME IS NOT NULL;💡 İpucu:
information_schemasorguları,SHOWkomutlarından daha esnektir çünkü standart SQL kullanırsın —WHERE,JOIN,ORDER BYgibi tüm SQL özelliklerini kullanabilirsin. Veritabanı yönetim araçları ve ORM'ler arka planda genellikleinformation_schema'yı sorgular.
Gerçek Dünya Örneği — E-Ticaret Veritabanı Kurulumu
Şimdi öğrendiğimiz komutlarla e-ticaret veritabanımızı sıfırdan kuralım:
-- Adım 1: Eski varsa temizle (sadece geliştirme ortamında!)
DROP DATABASE IF EXISTS e_commerce;
-- Adım 2: Veritabanı oluştur
CREATE DATABASE e_commerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Adım 3: Veritabanını seç
USE e_commerce;
-- Adım 4: Kontrol — hangi veritabanındayız?
SELECT DATABASE();
-- Sonuç: e_commerce ✓
-- Adım 5: Tablo var mı?
SHOW TABLES;
-- Sonuç: Empty set (henüz tablo yok)
-- Adım 6: Veritabanı ayarlarını kontrol et
SHOW CREATE DATABASE e_commerce;
-- CHARACTER SET utf8mb4, COLLATE utf8mb4_unicode_ci ✓
-- Adım 7: Sunucu versiyon kontrolü
SELECT VERSION();
-- Örnek sonuç: 8.0.36
-- Adım 8: Bağlantı karakter seti kontrolü
SHOW VARIABLES LIKE 'character_set_connection';
-- utf8mb4 olmalıBu adımları bir .sql dosyasına kaydedip tekrar tekrar çalıştırabilirsin:
# SQL dosyasını MySQL'e yükle
mysql -u root -p < setup_database.sqlSQL Dosyası (Script) Oluşturma
Birden fazla SQL komutunu bir dosyaya yazıp toplu çalıştırabilirsin:
Dosya: `setup_database.sql`
-- E-Ticaret Veritabanı Kurulum Script'i
-- Tarih: 2024-01-15
-- Versiyon: 1.0
-- Temiz başlangıç
DROP DATABASE IF EXISTS e_commerce;
-- Veritabanı oluştur
CREATE DATABASE e_commerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Veritabanını seç
USE e_commerce;
-- Tablolar bir sonraki derste oluşturulacak...
-- Kontrol
SELECT 'Veritabanı başarıyla oluşturuldu!' AS mesaj;Çalıştırma:
# Dosyadan çalıştır
mysql -u root -p < setup_database.sql
# veya MySQL içindeyken
mysql> SOURCE /path/to/setup_database.sql;💡 İpucu: SQL script dosyaları version control'da (Git) tutulmalıdır. Veritabanı yapısındaki her değişiklik bir migration dosyası olarak kaydedilmelidir. Laravel, Django, Rails gibi framework'ler bu iş için migration sistemi sunar.
Komut Satırı İpuçları
MySQL CLI'da işini kolaylaştıracak birkaç ipucu:
-- Çıktıyı dikey formatta göster (geniş tablolar için)
SHOW COLUMNS FROM customers\G
-- \G, noktalı virgül yerine kullanılır ve çıktıyı dikey gösterir:
-- *************************** 1. row ***************************
-- Field: customer_id
-- Type: int unsigned
-- Null: NO
-- Key: PRI
-- Default: NULL
-- Extra: auto_increment
-- Sorgu süresini göster
SHOW VARIABLES LIKE 'profiling';
SET profiling = 1;
SELECT * FROM customers;
SHOW PROFILES;
-- Geçmiş komutlara erişim (yukarı/aşağı ok tuşları)
-- veya
\! history -- Linux/Mac'te önceki komutları göster
-- MySQL'den çık
EXIT;
-- veya
QUIT;
-- veya
\qSıkça Yapılan Hatalar
`USE` yazmadan tablo oluşturmaya çalışmak:
CREATE TABLE products (...)çalıştırdığında "No database selected" hatası alırsın. ÖnceUSE veritabani_adi;yaz.Karakter seti belirtmemek: Varsayılan karakter seti MySQL versiyonuna göre değişir. Explicit olarak
utf8mb4belirt — Türkçe karakterler ve emojiler sorunsuz çalışsın.`utf8` yerine `utf8mb4` yazımı: MySQL'in
utf8'i gerçek UTF-8 değildir (3-byte kısıtlı).utf8mb4gerçek, 4-byte UTF-8 implementasyonudur. Her zamanutf8mb4kullan.Production'da `DROP DATABASE` çalıştırmak: Geri dönüşü yoktur. Yedeksiz
DROPçalıştırmak, yangın çıktığında "itfaiye zaten gelirdi" demek gibidir — gelmez.Veritabanı isminde özel karakter ve boşluk kullanmak:
CREATE DATABASE "my database"sorun çıkarır. Küçük harf, alt çizgi, boşluk yok:my_database.Sistem veritabanlarını değiştirmek:
mysql,information_schema,performance_schemaveritabanlarına müdahale etme — MySQL'in kendi iç yapısını bozarsın.
Özet
CREATE DATABASEile yeni veritabanı oluşturulur,IF NOT EXISTSile güvenli hale getirilirUSEkomutu aktif veritabanını seçer — sonraki tüm komutlar bu veritabanında çalışırSHOW DATABASEStüm veritabanlarını,SHOW TABLEStüm tabloları listelerDESCRIBE(veyaDESC) tablo yapısını,SHOW CREATE TABLEtam oluşturma kodunu gösterirDROP DATABASEveritabanını tamamen siler — geri alınamazKarakter seti olarak her zaman
utf8mb4kullanCollation olarak
utf8mb4_unicode_civeya Türkçe projeler içinutf8mb4_turkish_citercih etinformation_schemaveritabanı, meta verileri sorgulamak için güçlü bir alternatiftirSQL komutlarını
.sqldosyalarına yazıp toplu çalıştırabilirsin
AI Asistan
Sorularını yanıtlamaya hazır