MySQL Nasıl Oluşturulur?
MySQL veritabanı oluşturma, tablo tasarımı, veri ekleme ve sorgulama işlemlerini adım adım öğrenin. Başlangıçtan ileri seviyeye MySQL rehberi.
MySQL Nedir?
MySQL, dünyada en yaygın kullanılan açık kaynak ilişkisel veritabanı yönetim sistemidir (RDBMS). Oracle Corporation tarafından geliştirilen MySQL, web uygulamalarının büyük çoğunluğunun arka planında çalışmaktadır. WordPress, Facebook, Twitter ve YouTube gibi devasa platformlar MySQL kullanır.
MySQL, verileri tablolar halinde organize eder ve SQL (Structured Query Language) dilini kullanarak bu verilere erişim sağlar. Güvenilir, hızlı ve ölçeklenebilir yapısıyla hem küçük projelerden kurumsal uygulamalara kadar geniş bir yelpazede tercih edilir.
MySQL Kurulumu
Windows
Windows için en kolay yöntem XAMPP veya MySQL Installer kullanmaktır:
- MySQL resmi sitesinden MySQL Installer indirin
- Kurulum sihirbazını takip edin (Developer Default seçeneği önerilir)
- Root şifrenizi belirleyin
- MySQL Workbench otomatik olarak kurulacaktır
Linux (Ubuntu/Debian)
# MySQL Server kurulumu
sudo apt update
sudo apt install mysql-server
# Güvenlik yapılandırması
sudo mysql_secure_installation
# MySQL servisini başlat
sudo systemctl start mysql
sudo systemctl enable mysql
# MySQL'e bağlan
sudo mysql -u root -p
macOS
# Homebrew ile kurulum
brew install mysql
# Servisi başlat
brew services start mysql
# Root şifresi belirle
mysql_secure_installation
Veritabanı Oluşturma
MySQL'e bağlandıktan sonra ilk adım bir veritabanı oluşturmaktır:
-- Yeni veritabanı oluştur
CREATE DATABASE magaza_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Mevcut veritabanlarını listele
SHOW DATABASES;
-- Veritabanını seç (aktif yap)
USE magaza_db;
-- Veritabanını sil (DİKKAT!)
DROP DATABASE IF EXISTS eski_veritabani;
💡 İpucu:
utf8mb4karakter seti Türkçe karakterleri ve emoji'leri destekler. Her zamanutf8mb4_unicode_cicollation kullanmanız önerilir.
Tablo Oluşturma
Tablolar, veritabanının temel yapı taşlarıdır. Her tablo belirli bir veri türünü saklar:
Temel Tablo Yapısı
CREATE TABLE kullanicilar (
id INT AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(50) NOT NULL,
soyad VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
sifre VARCHAR(255) NOT NULL,
telefon VARCHAR(20),
durum ENUM('aktif', 'pasif', 'askida') DEFAULT 'aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
İlişkili Tablolar (Foreign Key)
-- Kategori tablosu
CREATE TABLE kategoriler (
id INT AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(100) NOT NULL,
slug VARCHAR(100) NOT NULL UNIQUE
) ENGINE=InnoDB;
-- Ürün tablosu (kategoriye bağlı)
CREATE TABLE urunler (
id INT AUTO_INCREMENT PRIMARY KEY,
kategori_id INT,
ad VARCHAR(200) NOT NULL,
fiyat DECIMAL(10,2) NOT NULL DEFAULT 0,
stok INT NOT NULL DEFAULT 0,
aciklama TEXT,
aktif TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kategori_id) REFERENCES kategoriler(id)
ON DELETE SET NULL
ON UPDATE CASCADE
) ENGINE=InnoDB;
-- Sipariş tablosu
CREATE TABLE siparisler (
id INT AUTO_INCREMENT PRIMARY KEY,
kullanici_id INT NOT NULL,
toplam_tutar DECIMAL(10,2) NOT NULL,
durum ENUM('beklemede', 'hazirlaniyor', 'kargoda', 'teslim', 'iptal') DEFAULT 'beklemede',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kullanici_id) REFERENCES kullanicilar(id)
ON DELETE CASCADE
) ENGINE=InnoDB;
Veri Türleri
MySQL'de en çok kullanılan veri türleri:
| Tür | Açıklama | Örnek Kullanım |
|---|---|---|
| INT | Tam sayı (-2B ile +2B) | id, stok, miktar |
| BIGINT | Büyük tam sayı | Büyük ID'ler, istatistikler |
| VARCHAR(n) | Değişken uzunluklu metin | ad, email, telefon |
| TEXT | Uzun metin (64KB) | açıklama, içerik |
| DECIMAL(m,d) | Ondalıklı sayı (hassas) | fiyat, oran |
| DATE | Tarih (YYYY-MM-DD) | doğum tarihi |
| DATETIME | Tarih + Saat | sipariş zamanı |
| TIMESTAMP | Zaman damgası | created_at, updated_at |
| TINYINT(1) | Boolean (0/1) | aktif, onaylı |
| ENUM | Sabit seçenek listesi | durum, rol |
| JSON | JSON veri | ayarlar, metadata |
CRUD İşlemleri
CRUD, veritabanı işlemlerinin dört temel operasyonunu ifade eder:
CREATE — Veri Ekleme (INSERT)
-- Tek kayıt ekleme
INSERT INTO kullanicilar (ad, soyad, email, sifre)
VALUES ('Semih', 'Akbaş', 'semih@akbas.dev', '$2y$10$hash...');
-- Çoklu kayıt ekleme
INSERT INTO kategoriler (ad, slug) VALUES
('Elektronik', 'elektronik'),
('Giyim', 'giyim'),
('Kitap', 'kitap');
-- Başka tablodan veri ekleme
INSERT INTO arsiv_kullanicilar
SELECT * FROM kullanicilar WHERE durum = 'pasif';
READ — Veri Okuma (SELECT)
-- Tüm verileri çek
SELECT * FROM urunler;
-- Belirli sütunları çek
SELECT ad, fiyat, stok FROM urunler WHERE aktif = 1;
-- Filtreleme ve sıralama
SELECT u.ad, u.fiyat, k.ad AS kategori
FROM urunler u
LEFT JOIN kategoriler k ON u.kategori_id = k.id
WHERE u.fiyat > 100 AND u.stok > 0
ORDER BY u.fiyat DESC
LIMIT 10;
-- Gruplama ve toplam
SELECT k.ad, COUNT(*) as urun_sayisi, AVG(u.fiyat) as ortalama_fiyat
FROM urunler u
JOIN kategoriler k ON u.kategori_id = k.id
GROUP BY k.id
HAVING urun_sayisi > 5;
UPDATE — Veri Güncelleme
-- Tek kayıt güncelle
UPDATE urunler SET fiyat = 299.99, stok = 50 WHERE id = 1;
-- Koşullu toplu güncelleme
UPDATE urunler SET aktif = 0 WHERE stok = 0;
-- Başka tablodan güncelleme
UPDATE urunler u
JOIN kategoriler k ON u.kategori_id = k.id
SET u.fiyat = u.fiyat * 1.10
WHERE k.slug = 'elektronik';
DELETE — Veri Silme
-- Tek kayıt sil
DELETE FROM urunler WHERE id = 5;
-- Koşullu silme
DELETE FROM kullanicilar WHERE durum = 'pasif' AND created_at < '2024-01-01';
-- Tüm verileri sil (tablo yapısı korunur)
TRUNCATE TABLE gecici_veriler;
Index (Dizin) Oluşturma
Index'ler sorgu performansını büyük ölçüde artırır:
-- Tekil index (unique)
CREATE UNIQUE INDEX idx_email ON kullanicilar(email);
-- Normal index
CREATE INDEX idx_kategori ON urunler(kategori_id);
-- Bileşik index
CREATE INDEX idx_durum_tarih ON siparisler(durum, created_at);
-- Full-text index (metin arama)
ALTER TABLE urunler ADD FULLTEXT INDEX idx_arama (ad, aciklama);
-- Full-text ile arama
SELECT * FROM urunler
WHERE MATCH(ad, aciklama) AGAINST('laptop' IN NATURAL LANGUAGE MODE);
PHP ile MySQL Kullanımı (PDO)
Modern PHP uygulamalarında MySQL bağlantısı için PDO (PHP Data Objects) kullanılır:
// Veritabanı bağlantısı
$dsn = "mysql:host=localhost;dbname=magaza_db;charset=utf8mb4";
$pdo = new PDO($dsn, "root", "sifre", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// Güvenli veri ekleme (Prepared Statement)
$stmt = $pdo->prepare("INSERT INTO urunler (ad, fiyat, stok) VALUES (?, ?, ?)");
$stmt->execute(["Laptop", 15999.99, 25]);
// Güvenli veri çekme
$stmt = $pdo->prepare("SELECT * FROM urunler WHERE fiyat BETWEEN ? AND ?");
$stmt->execute([1000, 5000]);
$urunler = $stmt->fetchAll();
foreach ($urunler as $urun) {
echo $urun["ad"] . " - " . $urun["fiyat"] . " TL\n";
}
⚠️ Güvenlik: Asla kullanıcı girdisini doğrudan SQL sorgusuna eklemeyin! Her zaman
Prepared Statementskullanın. Bu, SQL Injection saldırılarına karşı en temel savunmadır.
Yedekleme ve Geri Yükleme
# Veritabanını yedekle
mysqldump -u root -p magaza_db > yedek_$(date +%Y%m%d).sql
# Belirli tabloyu yedekle
mysqldump -u root -p magaza_db urunler siparisler > tablolar_yedek.sql
# Yedeği geri yükle
mysql -u root -p magaza_db < yedek_20260214.sql
Performans İpuçları
- Index kullanın: Sık sorgulanan sütunlara index ekleyin
- SELECT * kullanmayın: Sadece ihtiyacınız olan sütunları çekin
- EXPLAIN kullanın: Sorgu performansını analiz edin
- Bağlantı havuzu: Sürekli yeni bağlantı açmak yerine mevcut bağlantıları yeniden kullanın
- Normalizasyon: Veri tekrarını önlemek için tabloları normalize edin
- Uygun veri türü: Her sütun için en uygun ve en küçük veri türünü seçin
Sonuç
MySQL, güçlü ve esnek bir veritabanı sistemidir. Temel SQL sorgularını öğrenmek, hem web geliştirme hem de veri yönetimi kariyerinde büyük avantaj sağlar. Bu rehberdeki adımları takip ederek kendi veritabanınızı oluşturabilir, tablolar tasarlayabilir ve verilerinizi yönetebilirsiniz.
Unutmayın: İyi bir veritabanı tasarımı, iyi bir uygulamanın temelidir.
Yorumlar (0)
Henüz yorum yok. İlk yorumu siz yapın!