0Pricing
SQL Interview Prep · Ders

İlişkili EXISTS ve NOT EXISTS

NULL değerlerini doğru şekilde ele alan sağlam anti-join alternatifini öğrenin.

İlişkili EXISTS ve NOT EXISTS, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 3. 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 Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

EXISTS Varlığı Sınar

EXISTS bir alt sorgu alır ve alt sorgu en az bir satır döndürür döndürmez TRUE, aksi hâlde FALSE sonucunu verir. Satırların kendisini hiçbir zaman döndürmez.

İçinde ilişkili bir alt sorgu bulunduğunda EXISTS, dış satır başına bir varlık sınamasına dönüşür: "Bu dış satırla eşleşen bir satır var mı?"

İlk eşleşmede durduğu için kaç satırın eşleştiğiyle ilgilenmez. Bu anlam ayrıntısı, mülakatlarda sık sorulan noktalardan biridir.

Temel Bir İlişkili EXISTS

En az bir sipariş vermiş müşterileri bulun. İç sorgu o.customer_id = c.customer_id üzerinden ilişkilendirilmiştir.

EXISTS her müşteri için şu soruyu sorar: Bu müşteri için herhangi bir sipariş var mı? Varsa müşteriyi tutar.

SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

EXISTS İçinde Neden SELECT 1 Kullanılır

EXISTS içinde SELECT 1, SELECT * veya SELECT NULL görebilirsiniz. Üçü de eşdeğerdir.

EXISTS yalnızca satır dönüp dönmediğini denetler; satırların içeriğini hiçbir zaman denetlemez. Bu nedenle seçilen sütunlar önemsizdir. Sorgu iyileştiricisi de bunları yok sayar.

SELECT 1, amacı belirten yaygın bir kullanımdır: "Yalnızca varlıkla ilgileniyorum." Birini seçip tutarlı olun; mülakat yapan kişinin burada sütun listesinin önemli olduğunu düşünmesine izin vermeyin.

NOT EXISTS Eksik Olanları Bulur

NOT EXISTS sınamayı tersine çevirir: ilişkili alt sorgu hiçbir satır döndürmediğinde dış satırı tutar.

Bu, yaygın bir karşı birleştirmedir: siparişi olmayan müşteriler, hiç satılmamış ürünler ve teslimi olmayan öğrenciler bu kalıpla bulunur.

SELECT c.customer_id, c.name
FROM customers c
WHERE NOT EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

NOT IN ve NULL Tuzağı

Mülakatlarda çok değerli bir nokta şudur. NULL içerebilen bir alt sorguya karşı NOT IN kullanmak beklenmedik sonuçlara yol açar: listede tek bir NULL olsa bile NOT IN hiçbir satır döndürmez.

Bunun nedeni, NULL ile karşılaştırmanın UNKNOWN sonucunu vermesi ve NOT IN'in tüm karşılaştırmaların FALSE olmasını gerektirmesidir. Tek bir UNKNOWN tüm koşulu geçersiz kılar.

NOT EXISTS bu sorunu yaşamaz; yalnızca satırların varlığını denetler ve NULL değerlerini güvenli biçimde ele alır.

-- Risky: returns nothing if any o.customer_id is NULL
SELECT c.customer_id FROM customers c
WHERE c.customer_id NOT IN (SELECT o.customer_id FROM orders o);

-- Safe: NULLs do not break it
SELECT c.customer_id FROM customers c
WHERE NOT EXISTS (
    SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id
);

NOT EXISTS Neden NULL Güvenlidir

Bunun nedeni eşleştirme mantığındadır. NOT EXISTS, herhangi bir iç satırın o.customer_id = c.customer_id koşulunu sağlayıp sağlamadığını denetler.

o.customer_id değeri NULL olan bir satır bu eşitliği hiçbir zaman sağlayamaz (NULL = herhangi bir değer sonucu TRUE değil, UNKNOWN'dur); bu nedenle eşleşme olarak sayılmaz. Varlık sınaması doğru kalır.

NOT IN kullanıldığında aynı NULL, UNKNOWN sonucunu üreten bir liste karşılaştırmasının parçası olur ve bu sonuç tüm çıktıyı yok eder. Kıdemli düzey mülakatlarda NOT EXISTS'in tercih edilmesinin nedeni budur.

Ek Koşullarla EXISTS

İlişkili alt sorgu daha fazla koşul taşıyabilir. 1000'in üzerinde en az bir sipariş vermiş müşterileri bulun.

Ek koşul EXISTS alt sorgusunun içinde yer alır ve kapsamı her müşteriyle sınırlıdır.

SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
      AND o.amount > 1000
);

Performans: Kısa Devre Davranışı

EXISTS, eşleşen ilk satır bulunur bulunmaz iç ilişkiyi taramayı durdurabilir. Tam bir sonuç kümesi oluşturmaz veya saymaz.

Bu, EXISTS'i genellikle verimli kılar; özellikle ilişkili sütun dizinlenmişse, çünkü satır başına yapılan her yoklama bir eşleşmeyi hızla bulup sonlandırabilir.

Bunu, her eşleşmenin sayılmasını zorunlu kılan ilişkili COUNT(*) > 0 ile karşılaştırın. Yalnızca evet/hayır yanıtına ihtiyacınız varsa EXISTS kullanmayı tercih edin.

Varlık İçin EXISTS ile COUNT Karşılaştırması

Adaylar bazen varlığı sınamak için ilişkili bir sayım yazar. Bu çalışır, ancak gereksiz çaba harcar.

COUNT sürümü eşleşen her siparişi sayar; EXISTS ise ilkinden sonra durur. Salt varlık sınaması için EXISTS, amacı açıkça belirtir ve sorgu iyileştiricisinin kısa devre yapmasına olanak tanır.

-- Works but counts everything
SELECT c.customer_id FROM customers c
WHERE (SELECT COUNT(*) FROM orders o
       WHERE o.customer_id = c.customer_id) > 0;

-- Better: stops at first match
SELECT c.customer_id FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o
              WHERE o.customer_id = c.customer_id);

Uygulamalı Örnek: Hiç Sipariş Edilmemiş Ürünler

Klasik bir karşı birleştirme mülakat sorusu: hiç sipariş edilmemiş ürünleri listeleyin. NOT EXISTS, İngilizcedeki gereksinime neredeyse aynı şekilde karşılık gelir.

Her ürün için herhangi bir sipariş satırının ürünü gösterip göstermediğini denetleyin; yalnızca hiç eşleşmesi olmayanları tutun.

SELECT p.product_id, p.name
FROM products p
WHERE NOT EXISTS (
    SELECT 1
    FROM order_items oi
    WHERE oi.product_id = p.product_id
);

Bölme Türü Sorgularda NOT EXISTS İçinde EXISTS

NOT EXISTS içine EXISTS yerleştirmek ilişkisel bölmeyi ifade eder: "bir kümedeki ALL ile eşleşen satırları bulun." Klasik bir soru, "bir kategorideki her ürünü sipariş etmiş müşteriler" sorusudur.

Mantık şöyledir: Sipariş etmediği hiçbir ürün olmayan müşteriyi tutun. Bu çift olumsuzluk, bölme sorgusunun ayırt edici özelliğidir ve görüşmeciler bunu EXISTS konusundaki derin hakimiyetinizi sınamak için kullanır.

SELECT c.customer_id
FROM customers c
WHERE NOT EXISTS (
    SELECT 1 FROM products p
    WHERE p.category = 'Coffee'
      AND NOT EXISTS (
          SELECT 1 FROM order_items oi
          JOIN orders o ON o.order_id = oi.order_id
          WHERE oi.product_id = p.product_id
            AND o.customer_id = c.customer_id
      )
);

Hızlı Kontrol

Siparişi olmayan müşterileri bulmanın en güvenli yolunu seçin.

Özet: İlişkili EXISTS ve NOT EXISTS

Temel çıkarımlar:

  • EXISTS, ilk eşleşmede kısa devre yapan satır başına bir varlık sınamasıdır; içindeki sütun seçimi önemsizdir (SELECT 1 kullanın).
  • NOT EXISTS, eşleşmesi olmayan satırları bulmak için NULL güvenli karşı birleştirmedir.
  • Listede bir NULL varsa NOT IN hiçbir şey döndürmez; NOT EXISTS kullanmayı tercih edin.
  • Varlık için EXISTS, erken durduğu için ilişkili COUNT(*) > 0 ifadesinden daha iyidir.

NOT IN içindeki NULL tuzağını sorulmadan belirtin; bu, SQL olgunluğunun güvenilir bir göstergesidir.

Sıkça Sorulan Sorular

“İlişkili EXISTS ve NOT EXISTS” dersi ücretsiz mi?

Evet — “İlişkili EXISTS ve NOT EXISTS” 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 Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“İlişkili EXISTS ve NOT EXISTS” dersinde ne öğreneceğim?

NULL değerlerini doğru şekilde ele alan sağlam anti-join alternatifini öğrenin. SQL Interview Prep 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 Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, 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 3. dersidir.

“İlişkili EXISTS ve NOT EXISTS” 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 Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep 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 Sorgunun Anatomisi
  2. GROUP BY Olmadan Grup Başına Toplulaştırma
  3. İlişkili EXISTS ve NOT EXISTS
  4. İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma
← SQL Interview Prep Sayfasına Dön