Sitemap
Murat Culum

Murat Culum

PostgreSQL Alt Sorgular (Subqueries) / Part 8

4 min readJun 17, 2026

--

Press enter or click to view image in full size

Giriş

Bir SQL sorgusunun içerisinde başka bir sorgunun çalıştırılmasına alt sorgu (subquery) adı verilir.

Alt sorgular;

  • dinamik filtreleme,
  • karşılaştırma işlemleri,
  • grup bazlı analizler,
  • EXISTS kontrolleri,

gibi birçok senaryoda kullanılmaktadır.

PostgreSQL’de alt sorgular;

  • WHERE
  • SELECT
  • FROM
  • HAVING

ifadeleri içerisinde kullanılabilir.

Örnek Tablolar

employees

| employee_id | employee_name | department_id | salary |
| ----------- | ------------- | ------------- | ------ |
| 1 | Ahmet | 10 | 40000 |
| 2 | Ayşe | 20 | 50000 |
| 3 | Mehmet | 20 | 60000 |
| 4 | Fatma | 30 | 70000 |

departments

| department_id | department_name |
| ------------- | --------------- |
| 10 | IT |
| 20 | HR |
| 30 | Finance |

1.1 Alt Sorgular Nasıl Çalışır?

İçteki sorgu önce çalışır.

Daha sonra elde edilen sonuç dış sorguya aktarılır.

Örnek:

SELECT *
FROM employees
WHERE salary >
(
SELECT AVG(salary)
FROM employees
);

İç sorgu sonucu

SELECT AVG(salary)
FROM employees;

Sonuç:

|   avg |
| ----: |
| 55000 |

Dış sorgunun gerçek hali

SELECT *
FROM employees
WHERE salary > 55000;

Sonuç

| employee_name | salary |
| ------------- | ------ |
| Mehmet | 60000 |
| Fatma | 70000 |

1.2 Tek Satır Alt Sorgu Operatörleri

Tek satır döndüren alt sorgularda aşağıdaki operatörler kullanılabilir.

| Operatör |
| -------- |
| = |
| > |
| < |
| >= |
| <= |
| <> |

1.3 Tek Satır Alt Sorgu — WHERE

Ortalama maaştan yüksek maaş alan çalışanlar:

SELECT employee_name,
salary
FROM employees
WHERE salary >
(
SELECT AVG(salary)
FROM employees
);

Sonuç

| employee_name | salary |
| ------------- | ------ |
| Mehmet | 60000 |
| Fatma | 70000 |

1.4 Tek Satır Alt Sorgu — WHERE

En düşük maaşı alan çalışan:

SELECT *
FROM employees
WHERE salary =
(
SELECT MIN(salary)
FROM employees
);

Sonuç

| employee_name | salary |
| ------------- | ------ |
| Ahmet | 40000 |

1.5 SELECT İçerisinde Alt Sorgu

SELECT employee_name,
salary,
(
SELECT AVG(salary)
FROM employees
) AS avg_salary
FROM employees;

Sonuç

| employee_name | salary | avg_salary |
| ------------- | ------ | ---------- |
| Ahmet | 40000 | 55000 |
| Ayşe | 50000 | 55000 |
| Mehmet | 60000 | 55000 |
| Fatma | 70000 | 55000 |

1.6 HAVING İçerisinde Alt Sorgu

SELECT department_id,
AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) >
(
SELECT AVG(salary)
FROM employees
);

Sonuç

| department_id |   avg |
| ------------- | ----: |
| 30 | 70000 |

1.7 Çok Satırlı Alt Sorgular — IN

SELECT *
FROM employees
WHERE department_id IN
(
SELECT department_id
FROM departments
);

Sonuç

Tüm çalışanlar listelenir.

1.8 IN Operatörü

Belirli departmanlardaki çalışanlar:

SELECT employee_name
FROM employees
WHERE department_id IN
(
SELECT department_id
FROM departments
WHERE department_name IN ('IT','HR')
);

Sonuç

| employee_name |
| ------------- |
| Ahmet |
| Ayşe |
| Mehmet |

1.9 NOT IN

SELECT employee_name
FROM employees
WHERE department_id NOT IN
(
SELECT department_id
FROM departments
WHERE department_name='HR'
);

Sonuç

| employee_name |
| ------------- |
| Ahmet |
| Fatma |

1.10 IN Operatörü Kullanım Kuralları

IN operatörü;

  • birden fazla satır döndüren alt sorgularla
  • eşitlik kontrollerinde

yaygın olarak kullanılır.

1.11 EXISTS Operatörü

EXISTS, kayıt varlığını kontrol eder.

SELECT department_name
FROM departments d
WHERE EXISTS
(
SELECT 1
FROM employees e
WHERE e.department_id=d.department_id
);

Sonuç

| department_name |
| --------------- |
| IT |
| HR |
| Finance |

1.12 EXISTS Operatörü Mantığı

EXISTS;

Get Murat Culum’s stories in your inbox

Join Medium for free to get updates from this writer.

ilk eşleşmeyi bulduğu anda çalışmayı durdurur.

Bu nedenle büyük veri kümelerinde çoğu zaman:

  • IN

operatörüne göre daha verimli olabilir.

1.13 ANY Operatörü

Alt sorgudan dönen değerlerden en az birisi koşulu sağlıyorsa TRUE döner.

SELECT employee_name,
salary
FROM employees
WHERE salary >
ANY
(
SELECT salary
FROM employees
WHERE department_id=20
);

Alt sorgu sonucu

50000
60000

Sonuç

| employee_name | salary |
| ------------- | ------ |
| Ayşe | 50000 |
| Mehmet | 60000 |
| Fatma | 70000 |

1.14 ANY Operatörü Mantığı

salary > 50000
VEYA
salary > 60000

şeklinde değerlendirilir.

1.15 ALL Operatörü

Bütün değerler için koşul sağlanmalıdır.

SELECT employee_name,
salary
FROM employees
WHERE salary >
ALL
(
SELECT salary
FROM employees
WHERE department_id=20
);

Alt sorgu sonucu

50000
60000

Sonuç

| employee_name | salary |
| ------------- | ------ |
| Fatma | 70000 |

1.16 ALL Operatörü Mantığı

salary > 50000
VE
salary > 60000

olmalıdır.

DBA Notu

Günümüzde birçok alt sorgu;

  • JOIN
  • EXISTS
  • CTE
  • Window Functions

ile alternatif olarak yazılabilmektedir.

Performans analizi için:

EXPLAIN ANALYZE

çıktılarının incelenmesi tavsiye edilir.

--

--