PostgreSQL Alt Sorgular (Subqueries) / Part 8
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
60000Sonuç
| 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
60000Sonuç
| employee_name | salary |
| ------------- | ------ |
| Fatma | 70000 |1.16 ALL Operatörü Mantığı
salary > 50000
VE
salary > 60000olmalı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.







