Anasayfa / SQL / SQL’de EXISTS, IN, ANY ve ALL Kullanımı: Alt Sorgu Operatörleri

SQL’de EXISTS, IN, ANY ve ALL Kullanımı: Alt Sorgu Operatörleri

Veritabanı yönetimi ve veri analizi süreçlerinde, ham veriden anlamlı iş zekası çıktıları üretebilmek için basit filtreleme işlemleri çoğu zaman yetersiz kalır. Karmaşık veritabanı senaryolarında, sorgu sonuçlarınızı sabit değerlerle değil, başka bir sorgudan (alt sorgudan) dinamik olarak dönen sonuç kümeleriyle karşılaştırmanız gerekir. SQL, tam da bu tür dinamik veri kıyaslamalarını ve gelişmiş filtrelemeleri yapabilmeniz için güçlü mantıksal operatörler sunar.

SQL alt sorgularında (subqueries) sıkça kullanılan EXISTS, IN, ANY (SOME) ve ALL operatörlerinin ne işe yaradığını, nasıl kullanıldıklarını ve sorgu optimizasyonu açısından aralarındaki kritik farkları tüm detaylarıyla inceleyeceğiz.

1. SQL IN Operatörü Nedir ve Nasıl Kullanılır?

IN operatörü, bir ifadenin veya değerin, sizin belirlediğiniz bir değerler listesindeki herhangi bir değerle eşleşip eşleşmediğini kontrol etmek amacıyla kullanılan bir “küme üyeliği testidir” (set membership test).

Gerçek dünya uygulamalarında IN operatörü, genellikle karmaşık sorguları basitleştirmek ve birden fazla OR (veya) koşulunu tek bir satıra indirmek için kullanılır. Örneğin, SQL motoru için X IN (A, B, C) gibi bir ifade, mantıksal arka planda (X = A) OR (X = B) OR (X = C) ifadesi ile tamamen aynı mantıkta işlenir. Dolayısıyla IN operatörü çok daha okunabilir ve temiz bir kod yazmanıza olanak tanır.

IN operatörünün asıl gücü, sabit bir liste yerine alt sorgularla (subqueries) kullanıldığında ortaya çıkar. Test edilen satırdaki veri, alt sorgu tarafından dinamik olarak üretilen tek sütunluk bir veri kümesiyle kıyaslanır.

Örnek Kullanım:

SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE IN (SELECT OFFICE
                     FROM OFFICES
                     WHERE SALES > TARGET);

Yukarıdaki örnekte alt sorgu, satışları önceden belirlenen hedefleri aşan başarılı ofislerin numaralarından oluşan bir veri kümesi (liste) üretir. Dışarıdaki ana sorgu ise, SALESREPS (Satış Temsilcileri) tablosunu satır satır okur ve her bir satış temsilcisinin çalıştığı ofis numarasının, başarılı ofisler listesinde yer alıp almadığını kontrol eder.

Belirli bir kümeye ait olmayan kayıtları bulmak isterseniz NOT IN operatörünü kullanabilirsiniz. Ancak unutmayın ki, alt sorgudan dönen veri kümesinde bir NULL (boş) değer varsa, NOT IN kullanımı beklenmedik eksik sonuçlara veya NULL dönüşlere yol açabilir.

2. SQL EXISTS Operatörü Nedir ve Nasıl Çalışır?

EXISTS operatörü, adından da anlaşılacağı üzere bir “varlık testidir” (existence test). Görevi, parantez içine yazılan alt sorgunun herhangi bir veri satırı (sonuç) üretip üretmediğini denetlemektir. IN operatörünün aksine EXISTS, spesifik bir sütun değerini başka bir değerle kıyaslamaz; yalnızca alt sorgunun sonucunun boş küme olup olmadığıyla ilgilenir.

  • Eğer alt sorgu eşleşen en az bir satır bile döndürürse, EXISTS operatörü TRUE (Doğru) döner.
  • Eğer alt sorgu hiçbir kayıt bulamazsa, EXISTS operatörü FALSE (Yanlış) döner.
  • Önemli bir kural olarak, EXISTS operatörü kesinlikle NULL (bilinmeyen) sonucu döndürmez.

EXISTS operatörü, dönen verinin içeriğinden ziyade varlığına odaklandığı için, alt sorgunun SELECT bloğunda sütun isimleri yazmak yerine genellikle SELECT * (her şeyi seç) notasyonu kullanılır.

Örnek Kullanım:

SELECT DESCRIPTION
FROM PRODUCTS
WHERE EXISTS (SELECT *
              FROM ORDERS
              WHERE PRODUCT = PRODUCT_ID
              AND AMOUNT >= 25000.00);

Bu sorgunun çalışma prensibi şöyledir: Sistem PRODUCTS tablosundaki her bir ürün için alt sorguyu çalıştırır. Eğer söz konusu ürün için ORDERS tablosunda tutarı 25.000’e eşit veya daha büyük olan bir sipariş varsa, EXISTS operatörü eşleşmeyi yakalar, TRUE değerini üretir ve ilgili ürünü ana sorgu sonuç listesine dahil eder. EXISTS operatörüyle kurulan alt sorguların neredeyse her zaman dış sorgudaki bir sütuna atıfta bulunduğu (Correlated Subquery – İlişkili Alt Sorgu) dikkatinizi çekmiş olabilir.

3. SQL ANY (veya SOME) Operatörü

ANY operatörü, tekil bir test değerinin, bir alt sorgudan dönen veri sütunundaki değerler ile karşılaştırılmasını sağlar. Bu işlem sırasında =, <>, <, <=, >, >= gibi matematiksel karşılaştırma operatörlerinden biri mutlaka kullanılmalıdır. Eğer yapılan karşılaştırma, alt sorgudan gelen değerlerin herhangi biri (en azından bir tanesi) için TRUE (Doğru) sonuç verirse, ANY operatörü de tüm şartın TRUE olduğunu kabul eder. Standart SQL sözdiziminde SOME kelimesi de ANY ile birebir aynı işleve sahiptir ve birbirlerinin alternatifi olarak kullanılabilirler.

Bazen ANY operatörünün yarattığı sorguları anlamak kafa karıştırıcı olabilir. Örneğin X < ANY (Alt Sorgu) ifadesini düz bir şekilde “X, alt sorgudaki herhangi bir değerden küçüktür” diye çevirmek yerine; mantıksal olarak “Alt sorgudan dönen öyle bir Y değeri vardır ki, X < Y şartı sağlanır” şeklinde okumak, sorgunun niyetini çok daha net anlamanızı sağlayacaktır.

Örnek Kullanım:

SELECT NAME
FROM SALESREPS
WHERE (.1 * QUOTA) < ANY (SELECT AMOUNT
                          FROM ORDERS
                          WHERE REP = EMPL_NUM);

Kritik Kurallar: Eğer alt sorgu hiçbir satır döndürmezse (boş bir küme üretirse), ortada karşılaştırma yapılabilecek hiçbir Y değeri olmadığı için ANY operatörü doğrudan FALSE döner. Eğer şart hiçbir değer için sağlanmıyorsa ancak alt sorgu listesinde NULL (bilinmeyen) bir değer varsa, SQL’in üç değerli mantık (3-valued logic) kuralı gereği sonuç NULL kabul edilir. Hatalı mantık kurgularını ve beklenmedik NULL davranışlarını önlemek adına veri mühendisleri genellikle ANY operatörünü EXISTS testi yapısına çevirmeyi tercih ederler.

4. SQL ALL Operatörü

ANY operatörünün kardeşi sayılan ALL operatörü de bir test değerini, bir alt sorgunun ürettiği veri setiyle kıyaslamak için altı temel karşılaştırma operatöründen biriyle birlikte kullanılır. Ancak aralarındaki mantıksal fark çok büyüktür: Bir ALL testinin TRUE dönebilmesi için, yapılan karşılaştırmanın alt sorgudan gelen tüm değerler (istisnasız hepsi) için doğru olması şarttır.

Okuma kolaylığı açısından X < ALL (Alt Sorgu) ifadesini “Alt sorgudan dönen tüm Y değerleri için X < Y şartı sağlanır” şeklinde değerlendirebilirsiniz.

Örnek Kullanım:

SELECT CITY, TARGET
FROM OFFICES
WHERE (.50 * TARGET) < ALL (SELECT SALES
                            FROM SALESREPS
                            WHERE REP_OFFICE = OFFICE);

Bu kompleks sorgu, bir ofisteki tüm satış temsilcilerinin satışlarının, o ofise ait hedefin %50’sini istisnasız geçip geçmediğini denetler.

ALL operatörünün dikkat edilmesi gereken sıra dışı bir mantıksal kuralı vardır: Eğer alt sorgu hiçbir veri bulamaz ve boş bir sonuç kümesi döndürürse, ALL testi TRUE (Doğru) sonucunu üretir. Mantıken alt sorgudaki (var olmayan) “tüm” değerler için koşul ihlal edilmemiş sayılır. Alt sorgudaki değerlerden tek bir tanesi bile şartı sağlamazsa tüm test FALSE olur; şartı kesin olarak bozan bir veri yoksa fakat küme içinde NULL veri barındırıyorsa test sonucu yine NULL olacaktır.

5. Performans Optimizasyonu: IN mi, EXISTS mi?

SQL sorguları yazarken devasa boyutlardaki veritabanlarında (Big Data) en çok karşılaşılan performans darboğazları (bottleneck) alt sorgu seçimlerinden kaynaklanır.

Örneğin IN operatörü, doğası gereği yazdığınız alt sorgunun tamamını sonuna kadar çalıştırıp bitirir, tüm sonuç kümesini belleğe (RAM) yazar ve ancak ondan sonra dış sorguyu bu koca listeyle eşleştirmeye çalışır. EXISTS operatörü ise bir “varlık testi” yaptığı için çok daha akıllıdır: Alt sorguda eşleşen ilk kaydı bulduğu an işlemi derhal durdurur (short-circuit / erken çıkış yapar) ve sonucu hemen dış sorguya TRUE olarak iletir. Veritabanı motorunun, aradığı şeyi bulduktan sonra geri kalan milyonlarca satırı taramasına gerek kalmaz.

Bu nedenle endüstri standardı olarak, eşleşme yapılacak veritabanı tabloları çok büyükse ve alt sorgular uzun veri listeleri döndürüyorsa IN yerine EXISTS (veya tersi senaryolar için NOT EXISTS) operatörünü kullanmak sorgu çalışma hızınızı milisaniyeler seviyesine çekecektir.

Sonuç

Web uygulamalarında, raporlama panellerinde ve iş zekası projelerinde, doğru veriye doğru şekilde ulaşmak sisteminizin can damarıdır. Spesifik bir veri listesinde tarama yaparken IN, verinin varlığına veya yokluğuna göre dinamik filtreleme yaparken EXISTS, ve bir değerin başka bir veri kümesinin tamamına ya da bir kısmına karşı sınırlarını ölçerken ANY ve ALL operatörleri en etkili araçlarınızdır. Bu dört temel alt sorgu operatörünün arka plandaki çalışma mekanizmalarını bilmek ve EXISTS‘in sunduğu performans optimizasyonlarını alışkanlık haline getirmek, SEO odaklı içerikler sunan modern web sitenizin veritabanı performansını üst seviyeye taşıyacaktır.

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir