PostgreSQL Kurulum ve Temelleri

  1. PostgreSQL Kurulumu (macOS, Ubuntu, Windows)
  2. Servisi Başlatma ve Durdurma
  3. psql CLI ile Bağlanma
  4. Kullanıcı (Role) ve Şifre Yönetimi
  5. Veritabanı, Tablo ve Veri Tipleri
  6. CRUD ve İlişkisel Yapılar
  7. JOIN, INDEX, Backup & Restore
  8. pgAdmin ile Görsel Yönetim

PostgreSQL Nedir?

PostgreSQL; ilişkisel (relational) bir veritabanı yönetim sistemidir. Açık kaynaklıdır, ücretsizdir ve büyük veri yükleri altında bile yüksek performans ve veri tutarlılığı sağlar. Verileri tablolar halinde tutar, tablolar arasında ilişkiler kurar ve SQL dilini kullanır.

Kısaca: veriyi düzenli bir şekilde tutmak, sorgulamak ve aralarında ilişki kurmak için kullanılan bir araçtır. Modern uygulamaların büyük çoğunluğunda (web, mobil, API) arka planda bu tarz bir veritabanı çalışır.

Neden PostgreSQL?

  • Açık kaynak ve ücretsizdir
  • ACID uyumlu — veri kaybı ve tutarsızlık riski düşüktür
  • JSON, dizi, coğrafi veri gibi gelişmiş tipleri destekler
  • Geniş topluluk desteği ve zengin dokümantasyon

PostgreSQL Kurulumu

Aşağıda üç farklı işletim sistemi için kurulum adımları yer alıyor. Kendi sistemine uygun bölümü uygulayabilirsin. Kurulum sonunda PostgreSQL servis olarak arka planda çalışır hale gelecek.

macOS Kurulumu (Homebrew)

macOS'te en pratik yol Homebrew paket yöneticisini kullanmaktır. Homebrew yüklü değilse brew.sh adresinden kurabilirsin.

bash
brew update
brew install postgresql@16
brew services start postgresql@16

Kurulum bittiğinde PostgreSQL arka planda servis olarak çalışmaya başlar. Sürüm doğrulaması için:

bash
postgres --version

Ubuntu / Debian Kurulumu

Ubuntu üzerinde resmi APT deposundan güncel sürümü kurmak en güvenli yoldur.

bash
sudo apt update
sudo apt install -y postgresql postgresql-contrib

Kurulum tamamlandığında PostgreSQL otomatik olarak başlatılır. Servisin durumunu kontrol etmek için:

bash
sudo systemctl status postgresql

Windows Kurulumu

Windows'ta resmi yükleyiciyi kullanmak en kolay yöntemdir. postgresql.org/download/windowsadresinden EDB installer'ını indir ve sırasıyla şu adımları takip et:

  1. İndirdiğin .exe dosyasını yönetici olarak çalıştır
  2. Kurulum dizinini ve veri dizinini onayla
  3. postgres kullanıcısı için bir şifre belirle (bu şifre çok önemli, not et)
  4. Port olarak varsayılan 5432'yi kullan
  5. Kurulum bittikten sonra pgAdmin seçeneğini de işaretle

Kurulum sonrası SQL Shell (psql) uygulamasından bağlanabilir, veya pgAdmin ile görsel arayüz üzerinden yönetebilirsin.

Servisi Başlatma ve Durdurma

PostgreSQL bir servistir; başlatılmadan veritabanına bağlanılamaz. İşletim sistemine göre servis komutları değişir.

macOS (Homebrew)

bash
brew services start postgresql@16
brew services stop postgresql@16
brew services restart postgresql@16

Ubuntu / Debian

bash
sudo systemctl start postgresql
sudo systemctl stop postgresql
sudo systemctl restart postgresql
sudo systemctl enable postgresql

Son komut servisin sistem açılışında otomatik başlamasını sağlar.

Windows

Windows'ta servis yönetimi Services.msc üzerinden veya komut satırından yapılır:

bash
net start postgresql-x64-16
net stop postgresql-x64-16

psql CLI ile Bağlanma

psql, PostgreSQL ile etkileşim için kullanılan terminal aracıdır. SQL komutlarını burada doğrudan çalıştırabilir, veritabanını inceleyebilirsin.

İlk Bağlantı

Kurulum sonrasında varsayılan olarak postgres adlı bir süper kullanıcı oluşur. İlk bağlantı için:

bash
sudo -u postgres psql
# veya
psql -U postgres

Bağlantı başarılı olduğunda terminal şu şekilde değişir: postgres=#. Artık SQL komutu yazabilirsin.

Sık Kullanılan Meta Komutlar

psql içinde \ile başlayan komutlar "meta komutlar"dır. SQL değildirler, psql aracına yönelik kısayollardır.

  • \l — tüm veritabanlarını listeler
  • \c veritabani_adi — belirtilen veritabanına geçer
  • \dt — mevcut veritabanındaki tabloları listeler
  • \d tablo_adi — tablonun yapısını gösterir
  • \du — tüm kullanıcıları (rolleri) listeler
  • \q— psql'den çıkış yapar

Kullanıcı (Role) ve Şifre Yönetimi

PostgreSQL'de "user" ve "role" aynı şeydir; sistem her iki terimi de role olarak işler. Üretim ortamındapostgres süper kullanıcısı yerine, sınırlı yetkiye sahip ayrı bir kullanıcı oluşturmak iyi bir pratiktir.

Yeni Kullanıcı Oluşturma

sql
CREATE USER ahmet WITH PASSWORD 'guclu_sifre';

Bu komut ahmet adlı kullanıcıyı belirlenen şifre ile oluşturur. Kullanıcı varsayılan olarak hiçbir veritabanına yazma yetkisine sahip değildir.

Şifre Değiştirme

sql
ALTER USER ahmet WITH PASSWORD 'yeni_sifre';

Süper Kullanıcı Yetkisi Verme

Tüm sistem üzerinde tam yetki gerektiren bir kullanıcı için (dikkatli kullan):

sql
ALTER USER ahmet WITH SUPERUSER;

Kullanıcıyı Silme

sql
DROP USER ahmet;

Veritabanı Oluşturma ve Silme

PostgreSQL'de her uygulama için ayrı bir veritabanı oluşturmak standart yaklaşımdır. Bu, veriyi izole tutmayı ve yetki yönetimini kolaylaştırır.

Veritabanı Oluşturma

sql
CREATE DATABASE blog_app;

Belirli bir kullanıcıyı sahibi yaparak oluşturmak istersen:

sql
CREATE DATABASE blog_app OWNER ahmet;

Veritabanına Geçiş

bash
\c blog_app

Komut başarılı olduğunda terminal blog_app=# şekline döner. Artık komutlar bu veritabanı üzerinde çalışır.

Veritabanını Silme

Uyarı: Bu işlem geri alınamaz, veriler kalıcı olarak kaybolur. Önce yedek almayı düşün.

sql
DROP DATABASE blog_app;

Tablo Oluşturma ve Veri Tipleri

Tablolar verinin saklandığı yapılardır. Her sütunun bir veri tipi olur ve bu tip o sütuna girilebilecek değerleri belirler.

Sık Kullanılan Veri Tipleri

  • SERIAL — otomatik artan tam sayı (genellikle ID için)
  • INTEGER — tam sayı
  • NUMERIC(10, 2) — 10 basamaklı, 2 ondalıklı sayı (fiyatlar için)
  • VARCHAR(255) — değişken uzunluklu metin
  • TEXT — uzunluk sınırı olmayan metin
  • BOOLEAN — true / false
  • DATE — sadece tarih (2026-04-28)
  • TIMESTAMP — tarih + saat
  • JSONB — JSON verisi (indekslenebilir)

Örnek Tablo: users

sql
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  name VARCHAR(100) NOT NULL,
  is_active BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP DEFAULT NOW()
);
  • PRIMARY KEY — kaydı benzersiz olarak tanımlayan sütun
  • UNIQUE — bu sütundaki değer tabloda sadece bir kere olabilir
  • NOT NULL — boş bırakılamaz
  • DEFAULT — değer girilmezse varsayılan kullanılır

Tabloyu Silme

sql
DROP TABLE users;

Veri Ekleme, Okuma, Güncelleme, Silme (CRUD)

CRUD; Create, Read, Update, Delete sözcüklerinin baş harflerinden oluşur. Bir veritabanında yapılabilecek dört temel işlemi ifade eder.

INSERT — Veri Ekleme

sql
INSERT INTO users (email, name)
VALUES ('ahmet@example.com', 'Ahmet Yılmaz');

Birden fazla kaydı tek seferde eklemek için:

sql
INSERT INTO users (email, name) VALUES
  ('ali@example.com', 'Ali'),
  ('ayse@example.com', 'Ayşe'),
  ('mehmet@example.com', 'Mehmet');

SELECT — Veri Okuma

sql
SELECT * FROM users;

Sadece belirli sütunları getirmek için:

sql
SELECT id, email FROM users;

UPDATE — Veri Güncelleme

Uyarı: WHERE kullanmazsan tüm satırlar güncellenir. Bu çoğu zaman istenmeyen sonuç doğurur.

sql
UPDATE users
SET name = 'Ahmet Demir'
WHERE id = 1;

DELETE — Veri Silme

WHERE olmadan tüm satırları siler.

sql
DELETE FROM users WHERE id = 1;

Filtreleme ve Sıralama

Genellikle binlerce kayıt arasından sadece belirli olanları görmek istersin. WHERE, ORDER BY, LIMIT ve OFFSET bu iş için kullanılır.

WHERE — Koşullu Filtreleme

sql
SELECT * FROM users WHERE is_active = TRUE;
SELECT * FROM users WHERE name LIKE 'A%';
SELECT * FROM users WHERE created_at > '2026-01-01';

ORDER BY — Sıralama

sql
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY name ASC;

LIMIT ve OFFSET — Sayfalama

Genellikle web sayfalarında 10 kayıt gösterip sonraki sayfaya geçmek için kullanılır.

sql
SELECT * FROM users
ORDER BY id ASC
LIMIT 10 OFFSET 20;

Bu sorgu 21. kayıttan başlayıp 10 kayıt getirir (yani 3. sayfa).

PRIMARY KEY ve FOREIGN KEY

İlişkisel veritabanlarının gücü, tablolar arasında ilişki kurmaktan gelir. PRIMARY KEY bir kaydı benzersiz tanımlar, FOREIGN KEYise başka bir tablonun primary key'ine referans verir.

Örnek: users + posts

Her gönderinin (post) bir yazarı (user) vardır. Yani posts tablosundaki user_id sütunu, users tablosundaki id sütununa bağlanır.

sql
CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  title VARCHAR(255) NOT NULL,
  body TEXT,
  created_at TIMESTAMP DEFAULT NOW()
);
  • REFERENCES users(id) — bu sütun users tablosunun id sütununa bağlı
  • ON DELETE CASCADE — kullanıcı silinirse, ona ait tüm gönderiler de otomatik silinir

JOIN İşlemleri

JOIN; iki veya daha fazla tabloyu ortak bir sütun üzerinden birleştirerek tek bir sonuç tablosu döndürür. En yaygın türleri INNER JOIN, LEFT JOIN ve RIGHT JOIN'dur.

INNER JOIN — İki tabloda da olan kayıtlar

Sadece her iki tabloda da eşleşmesi olan satırlar döner.

sql
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON posts.user_id = users.id;

LEFT JOIN — Soldaki tablodaki tüm kayıtlar

users tablosundaki tüm kullanıcılar döner; gönderisi olmayan kullanıcının post sütunları NULL olur.

sql
SELECT users.name, posts.title
FROM users
LEFT JOIN posts ON posts.user_id = users.id;

RIGHT JOIN — Sağdaki tablodaki tüm kayıtlar

sql
SELECT users.name, posts.title
FROM users
RIGHT JOIN posts ON posts.user_id = users.id;

FULL OUTER JOIN — Tüm kayıtlar

Her iki tablodaki tüm kayıtlar döner; eşleşmeyenler için karşı taraf NULL olur.

sql
SELECT users.name, posts.title
FROM users
FULL OUTER JOIN posts ON posts.user_id = users.id;

İndeksler (INDEX)

İndeks; bir sütundaki değerlerin hızlı bulunmasını sağlayan ek bir veri yapısıdır. Sık aranan sütunlara indeks koyulduğunda SELECT sorguları çok daha hızlı çalışır. Ancak her indeks INSERT ve UPDATE'i biraz yavaşlatır ve disk alanı tüketir; bu yüzden gereken yere koymak önemlidir.

İndeks Oluşturma

sql
CREATE INDEX idx_users_email ON users(email);

Birleşik (Composite) İndeks

sql
CREATE INDEX idx_posts_user_created
ON posts(user_id, created_at DESC);

İndeksi Silme

sql
DROP INDEX idx_users_email;

Ne Zaman İndeks Koymalı?

  • Sık WHERE filtresinde kullanılan sütunlar
  • JOINile birleştirilen sütunlar (foreign key'ler)
  • ORDER BY ile sıralanan sütunlar

Yedekleme ve Geri Yükleme

Üretim ortamındaki bir veritabanı için düzenli yedek almak hayati önem taşır. PostgreSQL bu iş için pg_dump ve pg_restore araçlarını sağlar.

Yedek Alma (pg_dump)

bash
pg_dump -U postgres blog_app > blog_app_backup.sql

Yukarıdaki komut blog_app veritabanının tam bir kopyasını SQL dosyası olarak diske yazar.

Geri Yükleme (psql)

Önce hedef veritabanını oluştur, ardından SQL dosyasını içeri aktar:

bash
createdb -U postgres blog_app_yeni
psql -U postgres blog_app_yeni < blog_app_backup.sql

İkili (Custom) Format ile Yedek

Daha küçük dosya boyutu ve seçici geri yükleme için ikili format tercih edilir.

bash
pg_dump -U postgres -F c blog_app > blog_app.dump
pg_restore -U postgres -d blog_app_yeni blog_app.dump

pgAdmin ile Görsel Yönetim

pgAdmin; PostgreSQL'in resmi grafik arayüz aracıdır. Terminale alışkın değilsen veya tabloları görsel olarak incelemek istersen ideal bir araçtır.

Kurulum

  • macOS: brew install --cask pgadmin4
  • Ubuntu: pgadmin.org/download/pgadmin-4-apt sayfasındaki adımlar
  • Windows: PostgreSQL kurulumu sırasında otomatik gelir

İlk Bağlantı

  1. pgAdmin'i aç ve master şifresini belirle
  2. Sol menüdeki Servers üzerine sağ tıkla → Register → Server
  3. Name: Local
  4. Connection sekmesi:
    • Host: localhost
    • Port: 5432
    • Username: postgres
    • Password: kurulumda belirlediğin şifre
  5. Save'e tıkla. Artık veritabanlarını sol panelden görebilir, tablolara tıklayarak veriyi düzenleyebilirsin.

Buraya kadar geldiysen artık PostgreSQL'i kurabiliyor, bağlanıp veritabanı oluşturabiliyor, tablolar yapabiliyor ve bunlar arasında ilişki kurabiliyorsun. Sonraki adım: kendi projenle gerçek bir uygulama üzerinde pratik yapmak.

Bu Sayfada
Tüm Hakları Saklıdır © 2026 - sezergec.dev - Gizlilik Politikası