0Pricing
SQL Academy · Ders

İlişkili Alt Sorgular

Dış satıra bağlı olan bir alt sorgu.

İlişkili Alt Sorgular, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

İlişkili Alt Sorgu Nedir?

İlişkili alt sorgu, dış (kapsayan) sorgudan bir sütuna başvuran alt sorgudur. Bir kez çalışıp sabit bir sonuç döndüren normal alt sorgunun aksine, ilişkili alt sorgu dış sorgu tarafından işlenen her satır için bir kez değerlendirilir.

Bu özellik onları satır satır karşılaştırmalar için güçlü kılar, ancak basit alt sorgulara göre daha maliyetlidir.

Basit ve İlişkili Alt Sorgu Karşılaştırması

Temel fark şudur: normal bir alt sorgu dış sorguya başvurmaz ve tek başına çalışabilir. İlişkili alt sorgu dış satıra bağlıdır; dış tablo takma adının alt sorgunun içinde göründüğünü fark edebilirsiniz.

Aşağıdaki örnekte, iç SELECT dış sorgudaki e1.department_id değerine başvurarak ilişkiyi oluşturur.

-- Regular subquery (runs once)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Correlated subquery (runs once per outer row)
SELECT name, salary, department_id
FROM employees e1
WHERE salary > (
  SELECT AVG(salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

Örnek Tabloları Oluşturma

Bu ders boyunca kullanacağımız iki tabloyu oluşturalım: employees ve departments. Bu tablolar, ilişkili alt sorguları farklı senaryolarda göstermek için gerçekçi veriler sağlar.

CREATE TABLE departments (
  id   INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE employees (
  id            INT PRIMARY KEY,
  name          VARCHAR(50),
  department_id INT REFERENCES departments(id),
  salary        NUMERIC(10,2),
  hire_date     DATE
);

INSERT INTO departments VALUES (1,'Engineering'),(2,'Sales'),(3,'HR');

INSERT INTO employees VALUES
  (1,'Alice',  1, 90000, '2020-03-01'),
  (2,'Bob',    1, 75000, '2021-06-15'),
  (3,'Carol',  2, 60000, '2019-01-10'),
  (4,'David',  2, 68000, '2022-09-01'),
  (5,'Eve',    3, 55000, '2020-07-20'),
  (6,'Frank',  1, 95000, '2018-11-05'),
  (7,'Grace',  3, 52000, '2023-02-28'),
  (8,'Henry',  2, 71000, '2021-04-12');

Departman Ortalamasından Daha Fazla Kazanan Çalışanlar

İlişkili alt sorguların klasik kullanım alanlarından biri, kendi departmanının ortalama maaşından daha yüksek maaş alan her çalışanı bulmaktır. İç sorgu, dış sorguda işlenen her çalışan satırı için departman ortalamasını yeniden hesaplar.

SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary > (
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id, e1.salary DESC;

SELECT İçinde İlişkili Alt Sorguları Kullanma

İlişkili alt sorgular yalnızca SELECT listesi ile sınırlı değildir; her satır için bir değer hesaplamak üzere SELECT listesi içinde de yer alabilir. Burada her çalışanın maaşını departmanının ortalama maaşıyla birlikte tek sorguda alıyoruz.

SELECT
  e.name,
  e.salary,
  (
    SELECT ROUND(AVG(e2.salary), 2)
    FROM employees e2
    WHERE e2.department_id = e.department_id
  ) AS dept_avg_salary
FROM employees e
ORDER BY e.department_id, e.name;

Her Departmandaki En Yüksek Maaşlı Çalışanı Bulma

Her departmandaki en yüksek maaşı alan çalışanı bulmak için ilişkili bir alt sorgu kullanabiliriz. İç sorgu geçerli satırın departmanı için en yüksek maaşı bulur, dış sorgu da yalnızca bununla eşleşen satırı tutar.

SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary = (
  SELECT MAX(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id;

İlişkili Alt Sorguyla EXISTS

EXISTS işleci, ilişkili alt sorgularla sıkça birlikte kullanılır. İç sorgu en az bir satır üretiyorsa TRUE döndürür. Burada 2021'den önce işe alınmış en az bir çalışanı bulunan tüm departmanları listeliyoruz.

SELECT d.name AS department
FROM departments d
WHERE EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.id
    AND e.hire_date < '2021-01-01'
);

İlişkili Alt Sorguyla NOT EXISTS

NOT EXISTS bunun tersidir; ilişkili alt sorgu eşleşen hiçbir satır bulamadığında TRUE döndürür. Bu, çalışanı olmayan departmanlar gibi alt kayıtları bulunmayan üst kayıtları bulmak için kullanışlıdır.

SELECT d.name AS department_without_employees
FROM departments d
WHERE NOT EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.id
);

UPDATE İçinde İlişkili Alt Sorgu

İlişkili alt sorgular UPDATE deyimlerinin içinde de çalışır. Aşağıdaki örnek bir dept_avg sütunu ekler ve ardından bu sütunu her çalışanın departmanındaki ortalama maaşla doldurmak için ilişkili bir alt sorgu kullanır.

ALTER TABLE employees ADD COLUMN dept_avg NUMERIC(10,2);

UPDATE employees e1
SET dept_avg = (
  SELECT ROUND(AVG(e2.salary), 2)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

SELECT name, salary, dept_avg FROM employees ORDER BY department_id, name;

DELETE İçinde İlişkili Alt Sorgu

İlişkili bir alt sorguyu DELETE deyiminde, ilişkili bir tablodaki verilere göre satırları kaldırmak için de kullanabilirsiniz. Aşağıdaki sorgu, maaşı departmanının ortalama maaşının %60'ından düşük olan çalışanları siler; bu bir veri temizleme kalıbıdır.

DELETE FROM employees e1
WHERE e1.salary < (
  SELECT AVG(e2.salary) * 0.60
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

SELECT name, salary, department_id FROM employees ORDER BY department_id;

Performans İpucu: İlişkili Alt Sorgu ve JOIN

İlişkili alt sorgular dışarıdaki her satır için bir kez çalışır; bu, büyük tablolarda yavaş olabilir. Birçok ilişkili alt sorgu, daha iyi performans için türetilmiş bir tablo veya CTE ile JOIN kullanacak şekilde yeniden yazılabilir. Her iki kalıbı da anlayın ve okunabilirliğe ve yürütme planına göre seçim yapın.

-- Correlated version (potentially slower)
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

-- Equivalent JOIN + derived table (often faster)
SELECT e.name, e.salary
FROM employees e
JOIN (
  SELECT department_id, AVG(salary) AS avg_sal
  FROM employees
  GROUP BY department_id
) dept_avg ON dept_avg.department_id = e.department_id
WHERE e.salary > dept_avg.avg_sal;

Kısa Kontrol

İlişkili alt sorgular anlayışınızı sınayın.

Özet: İlişkili Alt Sorgular

Bu derste ilişkili alt sorgunun dış sorgusundaki bir sütuna başvurduğunu ve her dış satır için yeniden değerlendirildiğini öğrendiniz. Önemli noktalar:

  • SELECT, WHERE, UPDATE ve DELETE içinde yer alabilirler.
  • EXISTS / NOT EXISTS, ilişkili alt sorgularla birlikte ilgili satırların varlığını sınamak için doğal olarak kullanılır.
  • Anlatım gücü yüksek olsa da yavaş olabilirler; performans önemliyse JOIN kullanacak şekilde yeniden yazmayı değerlendirin.
  • Alt sorgunun içindeki dış tablo takma adı ilişkiyi oluşturan unsurdur.

Sıkça Sorulan Sorular

“İlişkili Alt Sorgular” dersi ücretsiz mi?

Evet — “İlişkili Alt Sorgular” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“İlişkili Alt Sorgular” dersinde ne öğreneceğim?

Dış satıra bağlı olan bir alt sorgu. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“İlişkili Alt Sorgular” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İlişkili Alt Sorgular
  2. EXISTS ve NOT EXISTS
  3. IN, ANY ve ALL Karşılaştırması
  4. EXISTS ve JOIN Performansı
← SQL Academy Sayfasına Dön