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.
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'te en pratik yol Homebrew paket yöneticisini kullanmaktır. Homebrew yüklü değilse brew.sh adresinden kurabilirsin.
brew update
brew install postgresql@16
brew services start postgresql@16Kurulum bittiğinde PostgreSQL arka planda servis olarak çalışmaya başlar. Sürüm doğrulaması için:
postgres --versionUbuntu üzerinde resmi APT deposundan güncel sürümü kurmak en güvenli yoldur.
sudo apt update
sudo apt install -y postgresql postgresql-contribKurulum tamamlandığında PostgreSQL otomatik olarak başlatılır. Servisin durumunu kontrol etmek için:
sudo systemctl status postgresqlWindows'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:
5432'yi kullanKurulum sonrası SQL Shell (psql) uygulamasından bağlanabilir, veya pgAdmin ile görsel arayüz üzerinden yönetebilirsin.
PostgreSQL bir servistir; başlatılmadan veritabanına bağlanılamaz. İşletim sistemine göre servis komutları değişir.
brew services start postgresql@16
brew services stop postgresql@16
brew services restart postgresql@16sudo systemctl start postgresql
sudo systemctl stop postgresql
sudo systemctl restart postgresql
sudo systemctl enable postgresqlSon komut servisin sistem açılışında otomatik başlamasını sağlar.
Windows'ta servis yönetimi Services.msc üzerinden veya komut satırından yapılır:
net start postgresql-x64-16
net stop postgresql-x64-16psql, PostgreSQL ile etkileşim için kullanılan terminal aracıdır. SQL komutlarını burada doğrudan çalıştırabilir, veritabanını inceleyebilirsin.
Kurulum sonrasında varsayılan olarak postgres adlı bir süper kullanıcı oluşur. İlk bağlantı için:
sudo -u postgres psql
# veya
psql -U postgresBağlantı başarılı olduğunda terminal şu şekilde değişir: postgres=#. Artık SQL komutu yazabilirsin.
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ış yaparPostgreSQL'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.
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.
ALTER USER ahmet WITH PASSWORD 'yeni_sifre';Tüm sistem üzerinde tam yetki gerektiren bir kullanıcı için (dikkatli kullan):
ALTER USER ahmet WITH SUPERUSER;DROP USER ahmet;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.
CREATE DATABASE blog_app;Belirli bir kullanıcıyı sahibi yaparak oluşturmak istersen:
CREATE DATABASE blog_app OWNER ahmet;\c blog_appKomut başarılı olduğunda terminal blog_app=# şekline döner. Artık komutlar bu veritabanı üzerinde çalışır.
Uyarı: Bu işlem geri alınamaz, veriler kalıcı olarak kaybolur. Önce yedek almayı düşün.
DROP DATABASE blog_app;Tablolar verinin saklandığı yapılardır. Her sütunun bir veri tipi olur ve bu tip o sütuna girilebilecek değerleri belirler.
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 metinTEXT — uzunluk sınırı olmayan metinBOOLEAN — true / falseDATE — sadece tarih (2026-04-28)TIMESTAMP — tarih + saatJSONB — JSON verisi (indekslenebilir)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ütunUNIQUE — bu sütundaki değer tabloda sadece bir kere olabilirNOT NULL — boş bırakılamazDEFAULT — değer girilmezse varsayılan kullanılırDROP TABLE users;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 INTO users (email, name)
VALUES ('ahmet@example.com', 'Ahmet Yılmaz');Birden fazla kaydı tek seferde eklemek için:
INSERT INTO users (email, name) VALUES
('ali@example.com', 'Ali'),
('ayse@example.com', 'Ayşe'),
('mehmet@example.com', 'Mehmet');SELECT * FROM users;Sadece belirli sütunları getirmek için:
SELECT id, email FROM users;Uyarı: WHERE kullanmazsan tüm satırlar güncellenir. Bu çoğu zaman istenmeyen sonuç doğurur.
UPDATE users
SET name = 'Ahmet Demir'
WHERE id = 1;WHERE olmadan tüm satırları siler.
DELETE FROM users WHERE id = 1;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.
SELECT * FROM users WHERE is_active = TRUE;
SELECT * FROM users WHERE name LIKE 'A%';
SELECT * FROM users WHERE created_at > '2026-01-01';SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY name ASC;Genellikle web sayfalarında 10 kayıt gösterip sonraki sayfaya geçmek için kullanılır.
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).
İ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.
Her gönderinin (post) bir yazarı (user) vardır. Yani posts tablosundaki user_id sütunu, users tablosundaki id sütununa bağlanır.
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 silinirJOIN; 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.
Sadece her iki tabloda da eşleşmesi olan satırlar döner.
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON posts.user_id = users.id;users tablosundaki tüm kullanıcılar döner; gönderisi olmayan kullanıcının post sütunları NULL olur.
SELECT users.name, posts.title
FROM users
LEFT JOIN posts ON posts.user_id = users.id;SELECT users.name, posts.title
FROM users
RIGHT JOIN posts ON posts.user_id = users.id;Her iki tablodaki tüm kayıtlar döner; eşleşmeyenler için karşı taraf NULL olur.
SELECT users.name, posts.title
FROM users
FULL OUTER JOIN posts ON posts.user_id = users.id;İ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.
CREATE INDEX idx_users_email ON users(email);CREATE INDEX idx_posts_user_created
ON posts(user_id, created_at DESC);DROP INDEX idx_users_email;WHERE filtresinde kullanılan sütunlarJOINile birleştirilen sütunlar (foreign key'ler)ORDER BY ile sıralanan sütunlarÜ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.
pg_dump -U postgres blog_app > blog_app_backup.sqlYukarıdaki komut blog_app veritabanının tam bir kopyasını SQL dosyası olarak diske yazar.
Önce hedef veritabanını oluştur, ardından SQL dosyasını içeri aktar:
createdb -U postgres blog_app_yeni
psql -U postgres blog_app_yeni < blog_app_backup.sqlDaha küçük dosya boyutu ve seçici geri yükleme için ikili format tercih edilir.
pg_dump -U postgres -F c blog_app > blog_app.dump
pg_restore -U postgres -d blog_app_yeni blog_app.dumppgAdmin; 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.
brew install --cask pgadmin4pgadmin.org/download/pgadmin-4-apt sayfasındaki adımlarlocalhost5432postgresBuraya 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.