SQL Subquery (Alt Sorgu) Kullanımı ve Örnekleri
SQL Subquery (Alt Sorgu) Kullanımı ve Örnekleri konusu, ilişkisel veri tabanlarında verileri filtrelemek, hesaplamak ve organize etmek için kullanılan en güçlü tekniklerden biridir ve veri analizi süreçlerinde karmaşık mantıksal işlemleri tek bir adımda gerçekleştirmeyi sağlayarak veri tabanı yönetiminde esneklik sunar. Veri tabanı yöneticileri ve yazılımcılar için alt sorgular, bir tablodaki verileri başka bir tablodaki sonuçlara dayanarak çekmek veya mevcut verileri dinamik kriterlere göre işlemek için kritik bir rol oynar. Günlük hayatta karşılaştığımız e-ticaret sipariş takibi, bankacılık işlemleri veya akademik başarı analizleri gibi pek çok sistem, arka planda bu iç içe geçmiş sorgu yapılarını kullanır. Bu rehberde, SQL dünyasının bu temel taşını her yaştan öğrencinin anlayabileceği bir dille, bol örnekli ve yapılandırılmış bir şekilde inceleyeceğiz.
- Alt sorgu (subquery) kavramını ve temel çalışma mantığını kavrayacaksınız.
- WHERE, FROM ve SELECT bloklarında alt sorgu yazmayı öğreneceksiniz.
- IN, ANY, ALL ve EXISTS gibi operatörlerin alt sorgularla kullanımını keşfedeceksiniz.
- İlişkili (correlated) ve ilişkisiz alt sorgular arasındaki farkları ayırt edebileceksiniz.
- Alt sorgular ile JOIN işlemleri arasındaki farkları ve performans etkilerini anlayacaksınız.
- Alt sorgular her zaman parantez ( ) içerisinde yazılır.
- Genellikle önce içteki sorgu (inner query) çalışır ve sonucu dıştaki sorguya (outer query) iletir.
- Bir alt sorgu, dış sorgunun kullandığı operatöre göre tek bir değer, bir liste veya bir tablo döndürebilir.
- Okunabilirliği artırsa da, çok büyük veri setlerinde performans için dikkatli kullanılmalıdır.
Alt Sorgu (Subquery) Nedir?
SQL’de alt sorgu, bir başka SQL ifadesinin (SELECT, INSERT, UPDATE veya DELETE) içine gömülmüş olan SELECT sorgusudur. Bir nevi “sorgu içinde sorgu” olarak tanımlanabilir. Alt sorgular, ana sorgunun ihtiyaç duyduğu veriyi dinamik olarak sağlar. Örneğin, bir şirketteki en yüksek maaşı alan kişiyi bulmak istiyorsanız, önce “en yüksek maaşın ne olduğunu” bulmanız gerekir; işte bu aşamada alt sorgu devreye girer.
Alt Sorguların Temel Kuralları
Bir alt sorgu yazarken uyulması gereken bazı teknik kurallar vardır. İlk olarak, alt sorgu mutlaka parantez içine alınmalıdır. İkinci olarak, alt sorgu genellikle tek bir sütun döndürmelidir (özellikle WHERE bloğunda karşılaştırma operatörleri ile kullanılıyorsa). Ayrıca, alt sorgularda ORDER BY komutu genellikle kullanılamaz; çünkü alt sorgu bir sonuç seti döndürür ve sıralama işleminin ana sorguda yapılması beklenir.
Alt Sorgu Türleri ve Kullanım Alanları
Alt sorgular, döndürdükleri veri yapısına ve ana sorguyla olan ilişkilerine göre üç ana kategoriye ayrılırlar. Bu kategorileri anlamak, hangi durumda hangi yapıyı kullanacağınızı belirlemek açısından hayati önem taşır. SQL dünyasında “subquery nedir” sorusunun cevabı, bu türlerin işlevselliğinde gizlidir.
1. Skaler Alt Sorgular (Scalar Subqueries)
Bu tür alt sorgular sadece tek bir değer (tek satır ve tek sütun) döndürür. Genellikle eşittir (=), büyüktür (>), küçüktür (<) gibi standart karşılaştırma operatörleri ile birlikte kullanılırlar. Örneğin, tüm çalışanların ortalama maaşını hesaplayıp, bu ortalamanın üzerinde maaş alanları listelemek skaler bir işlem gerektirir.
Aşağıdaki sorgu, önce iç kısımdaki SELECT ile ortalama maaşı bulur, ardından dış sorgu bu değeri kullanarak filtreleme yapar:
SELECT ad, soyad, maas FROM personel WHERE maas > (SELECT AVG(maas) FROM personel);
2. Çok Satırlı Alt Sorgular (Multi-Row Subqueries)
Eğer alt sorgu birden fazla satır döndürüyorsa, doğrudan eşittir operatörünü kullanamazsınız. Bunun yerine IN, ANY veya ALL gibi özel operatörleri kullanmanız gerekir. Bu sorgular genellikle bir listedeki elemanlarla eşleşme aramak için idealdir.
Bu en gelişmiş alt sorgu türüdür. İçteki sorgu, dıştaki sorgudan gelen bir değere bağımlıdır. Yani ana sorgudaki her bir satır için alt sorgu tekrar tekrar çalıştırılır. Bu durum, veri seti çok büyük olduğunda performansı olumsuz etkileyebilir ancak çok karmaşık mantıksal karşılaştırmalar yapmanıza olanak tanır.
Operatörlerin Alt Sorgularla Kullanımı
Alt sorguların gücü, onlarla birlikte kullanılan operatörlerden gelir. Sadece bir değer döndüren sorgular basit olsa da, liste döndüren sorgularla çalışırken aşağıdaki operatörleri bilmek gerekir.
| Operatör | Açıklama | Kullanım Durumu |
|---|---|---|
| IN | Alt sorgu listesindeki herhangi bir değerle eşleşir. | Bir küme içinde arama yaparken. |
| EXISTS | Alt sorgu en az bir satır döndürürse TRUE döner. | Varlık kontrolü yaparken. |
| ANY / SOME | Listedeki değerlerden en az biriyle karşılaştırma yapar. | Büyüktür/Küçüktür ile bir eleman yetiyorsa. |
| ALL | Listedeki tüm değerlerle karşılaştırma yapar. | Tüm gruptan daha büyük/küçük olanı bulurken. |
IN ve EXISTS Arasındaki Fark
Öğrencilerin en çok karıştırdığı konulardan biri IN ve EXISTS operatörleridir. IN operatörü, alt sorgudan dönen tüm değerleri bir liste haline getirir ve ana sorgudaki değeri bu listede arar. EXISTS ise alt sorgunun herhangi bir veri döndürüp döndürmediğine bakar; verinin içeriğiyle ilgilenmez. Genellikle büyük tablolarda EXISTS performansı daha yüksektir çünkü ilk eşleşmeyi bulduğunda aramayı durdurur.
Alt Sorguların SELECT ve FROM İçinde Kullanımı
Çoğu zaman alt sorguların sadece WHERE bloğunda kullanıldığı düşünülür, ancak bu büyük bir yanılgıdır. Alt sorgular, sorgunun her aşamasında esneklik sağlar.
SELECT Listesinde Alt Sorgu
Her bir satırın yanına, başka bir tablodan hesaplanmış bir değer getirmek için kullanılır. Örneğin, her müşterinin yanına o müşterinin toplam sipariş sayısını yazdırmak için SELECT içinde alt sorgu kullanılabilir.
Bu sorgu, her müşteri için o müşteriye ait siparişleri sayar:
SELECT musteri_adi, (SELECT COUNT(*) FROM siparisler WHERE siparisler.id = musteriler.id) AS toplam_siparis FROM musteriler;
FROM Cümlesinde Alt Sorgu (Derived Tables)
Bazen bir sorgunun sonucunu, başka bir sorgu için sanal bir tablo gibi kullanmak istersiniz. Buna “türetilmiş tablolar” denir. FROM bloğunda kullanılan her alt sorguya mutlaka bir takma ad (alias) verilmelidir.
Alt Sorgu mu, JOIN mi?
SQL öğrenenlerin en çok sorduğu sorulardan biri şudur: “Neden JOIN yerine alt sorgu kullanmalıyım?” Aslında çoğu alt sorgu, bir JOIN işlemine dönüştürülebilir. JOIN işlemleri genellikle veri tabanı motoru tarafından daha iyi optimize edilir ve daha hızlı çalışır. Ancak alt sorgular, özellikle karmaşık toplama (aggregate) fonksiyonları kullanıldığında veya kodun okunabilirliği daha önemli olduğunda tercih edilir.
Subquery: SELECT ad FROM ogrenciler WHERE id IN (SELECT ogrenci_id FROM notlar WHERE puan = 100);
JOIN: SELECT DISTINCT o.ad FROM ogrenciler o JOIN notlar n ON o.id = n.ogrenci_id WHERE n.puan = 100;
Veri Güncelleme ve Silme İşlemlerinde Alt Sorgular
Alt sorgular sadece veri çekmek (SELECT) için değil, verileri yönetmek için de kullanılır. UPDATE ve DELETE komutlarında alt sorgu kullanmak, toplu işlemleri güvenli bir şekilde yapmanızı sağlar.
UPDATE ile Kullanım
Bir tablodaki değerleri, başka bir tablodaki verilere göre güncellemek istediğinizde alt sorgu hayat kurtarıcıdır. Örneğin, stok miktarı belirli bir seviyenin altına düşen ürünlerin fiyatına zam yapmak için alt sorgu kullanılabilir.
DELETE ile Kullanım
Belirli bir kriteri sağlayan (veya sağlamayan) satırları silmek için alt sorgu kullanılır. Hiç sipariş vermemiş müşterileri silmek istiyorsanız, siparişler tablosunda bulunmayan müşteri ID’lerini bir alt sorgu ile tespit edip silebilirsiniz.
- Bir tablodaki en yüksek ikinci maaşı alan çalışanı alt sorgu kullanarak nasıl bulursunuz?
- EXISTS operatörü hangi durumlarda IN operatöründen daha performanslı çalışır?
- Alt sorgular neden her zaman parantez içine yazılmalıdır?
- FROM cümlesinde kullanılan bir alt sorguya takma ad (alias) verilmezse ne tür bir hata ile karşılaşılır?
Öğrendiklerinizi Pekiştirin
Alt sorgular, SQL dilinin mantıksal derinliğini oluşturan konulardan biridir. Başlangıçta karmaşık görünse de, “içeriden dışarıya” doğru düşünme pratiği kazandığınızda işler kolaylaşacaktır. Her zaman önce içteki parantezin ne sonuç döndürdüğünü anlamaya çalışın. Daha sonra dış sorgunun bu sonucu nasıl bir filtre olarak kullandığını analiz edin. Bol bol pratik yaparak, hangi durumlarda JOIN, hangi durumlarda alt sorgu kullanmanız gerektiğini sezgisel olarak öğrenmeye başlayacaksınız.
- Tanım: Alt sorgu, başka bir SQL sorgusunun içine gömülü olan SELECT ifadesidir.
- Yerleşim: WHERE, SELECT, FROM, HAVING, INSERT, UPDATE ve DELETE bloklarında kullanılabilir.
- Türler: Skaler (tek değer), çok satırlı (liste) ve ilişkili (correlated) olarak ayrılırlar.
- Operatörler: Karşılaştırma operatörlerinin yanı sıra IN, ANY, ALL ve EXISTS anahtar kelimeleriyle güçlendirilirler.
- Performans: Küçük ve orta ölçekli verilerde harikadır, ancak devasa verilerde JOIN alternatifleri değerlendirilmelidir.