← Kursa Dön
📄 Text · 25 min

İ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 exists

Hata! Çü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 utf8 ve utf8mb4 farklıdır! utf8 MySQL'in eski, 3-byte kısıtlı implementasyonudur — emoji ve bazı özel karakterleri desteklemez. Her zaman `utf8mb4` kullan. MySQL 8.0'da varsayılan zaten utf8mb4'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

CollationAçıklamaÖrnek
utf8mb4_unicode_ciGenel amaçlı, çoğu dil için iyiÖnerilen
utf8mb4_turkish_ciTürkçe'ye özel sıralama (I/İ, ı/i)Türkçe ağırlıklı projeler
utf8mb4_general_ciHızlı ama daha az doğru sıralamaPerformans kritik, dil önemsiz
utf8mb4_binBinary 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_ci yeterlidir. Eğer Türkçe büyük/küçük harf dönüşümü (I→ı, İ→i) kritik bir gereksinim ise utf8mb4_turkish_ci kullan.


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 changed

USE 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 verileri

  • sys — 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_ci

Bu çı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 DATABASE geri 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_schema sorguları, SHOW komutlarından daha esnektir çünkü standart SQL kullanırsın — WHERE, JOIN, ORDER BY gibi tüm SQL özelliklerini kullanabilirsin. Veritabanı yönetim araçları ve ORM'ler arka planda genellikle information_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.sql

SQL 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
\q

Sıkça Yapılan Hatalar

  1. `USE` yazmadan tablo oluşturmaya çalışmak: CREATE TABLE products (...) çalıştırdığında "No database selected" hatası alırsın. Önce USE veritabani_adi; yaz.

  2. Karakter seti belirtmemek: Varsayılan karakter seti MySQL versiyonuna göre değişir. Explicit olarak utf8mb4 belirt — Türkçe karakterler ve emojiler sorunsuz çalışsın.

  3. `utf8` yerine `utf8mb4` yazımı: MySQL'in utf8'i gerçek UTF-8 değildir (3-byte kısıtlı). utf8mb4 gerçek, 4-byte UTF-8 implementasyonudur. Her zaman utf8mb4 kullan.

  4. 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.

  5. 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.

  6. Sistem veritabanlarını değiştirmek: mysql, information_schema, performance_schema veritabanlarına müdahale etme — MySQL'in kendi iç yapısını bozarsın.


Özet

  • CREATE DATABASE ile yeni veritabanı oluşturulur, IF NOT EXISTS ile güvenli hale getirilir

  • USE komutu aktif veritabanını seçer — sonraki tüm komutlar bu veritabanında çalışır

  • SHOW DATABASES tüm veritabanlarını, SHOW TABLES tüm tabloları listeler

  • DESCRIBE (veya DESC) tablo yapısını, SHOW CREATE TABLE tam oluşturma kodunu gösterir

  • DROP DATABASE veritabanını tamamen siler — geri alınamaz

  • Karakter seti olarak her zaman utf8mb4 kullan

  • Collation olarak utf8mb4_unicode_ci veya Türkçe projeler için utf8mb4_turkish_ci tercih et

  • information_schema veritabanı, meta verileri sorgulamak için güçlü bir alternatiftir

  • SQL komutlarını .sql dosyalarına yazıp toplu çalıştırabilirsin