JOIN, belirli bir koşula göre bir SELECT sorgusunda birden fazla tabloyu birleştirmeyi sağlar ve genellikle ON anahtar kelimesiyle kullanımda olur. Alt sorgu (veya iç içe sorgu) bir sorgunun başka bir sorgunun içinde yer almasıdır. JOIN, iyi dizinlere sahip büyük tabloları birleştirmek için daha iyi çalışır, optimizatöre daha şeffaftır ve genellikle daha hızlı çalışır. Alt sorgular, toplama gerek duyulduğunda veya JOIN ile mümkün olmayan koşullar varsa (örneğin, korelasyonlu sorgular) kullanışlıdır.
JOIN Örneği:
SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;
Alt Sorgu Örneği:
SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moskova' );
“Alt sorguların her zaman JOIN'lerden daha yavaş olduğu düşünülebilir mi?”
Cevap: Hayır, her zaman değil! Doğru yazılmış alt sorgular genellikle optimizatör tarafından iç JOIN'lere dönüştürülür. Ayrıca bazen alt sorgular daha etkili olabilir — örneğin, dış sorgu küçük bir veri kümesiyle çalışırken, alt sorgu önceden agregat sonuçlar döndürebilir.
Örnek:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
Bu alt sorgu bir kez çalıştırılacaktır.
Hikaye
Büyük bir projede rapor için JOIN yerine iç içe alt sorgular kullanıldı. Veri hacmi arttığında sorgu saniyeler yerine birkaç dakika almaya başladı. Alt sorgular JOIN ile değiştirildiğinde performans 10 kat arttı.
Hikaye
Bir projede analist GROUP BY ile olan sorguyu alt sorguya çevirerek, sonuçta JOIN düzeyinde tekrar eden kayıtlar oluştuğunu fark etmedi. Bu, raporlardaki verilerin yanlış olmasına neden oldu — toplamlar, kartizian çarpımından dolayı abartılıydı.
Hikaye
Dış döngüde (her satır için) korelasyonlu bir alt sorgunun kullanılması, tablonun büyümesi sırasında performansın tamamen düşmesine yol açtı. JOIN ile toplama işlemiyle karar verdik — sorgu işleme süresi saatlerden dakikalara düştü.