EXISTS / IN / NOT EXISTS (alt sorgu)
Oracle
-- Siparişi olan müşteriler (EXISTS)
SELECT ad FROM musteri m
WHERE EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);
-- IN ile liste üyeliği
SELECT ad FROM musteri
WHERE il IN ('Ankara', 'Izmir');
-- Hiç siparişi olmayanlar (NOT EXISTS)
SELECT ad FROM musteri m
WHERE NOT EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);EXISTS ilişkili alt sorgunun en az bir satır döndürüp döndürmediğini kontrol eder (ilk eşleşmede durur, hızlıdır). IN bir değerin listede/alt sorgu sonucunda olup olmadığına bakar. Dikkat: alt sorgu NULL üretebiliyorsa NOT IN beklenmedik sonuç verir; NOT EXISTS daha güvenlidir. Oracle optimizer ikisini çoğu zaman aynı plana çevirir.
PostgreSQL
SELECT ad FROM musteri m
WHERE EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);
SELECT ad FROM musteri
WHERE il IN (SELECT il FROM hedef_iller);
SELECT ad FROM musteri m
WHERE NOT EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);PostgreSQL EXISTS/IN/NOT EXISTS'i tam destekler. NOT IN ile alt sorgu NULL içeriyorsa tüm sonuç boşalabileceği için NOT EXISTS ya da LEFT JOIN ... IS NULL önerilir. Planlayıcı IN ve EXISTS'i çoğu durumda semi-join olarak eşdeğer işler.
MySQL
SELECT ad FROM musteri m
WHERE EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);
SELECT ad FROM musteri
WHERE il IN ('Ankara', 'Izmir');
SELECT ad FROM musteri m
WHERE NOT EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);MySQL/MariaDB EXISTS/IN/NOT EXISTS'i destekler. MySQL 5.6 öncesinde ilişkili alt sorgular yavaş çalışabiliyordu; 5.6+ semi-join ve materyalizasyon optimizasyonlarıyla IN alt sorgularını hızlandırdı. NOT IN + NULL tuzağı burada da geçerlidir.
SQL Server
SELECT ad FROM musteri m
WHERE EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);
SELECT ad FROM musteri
WHERE il IN (SELECT il FROM hedef_iller);
SELECT ad FROM musteri m
WHERE NOT EXISTS (SELECT 1 FROM siparis s WHERE s.musteri_id = m.id);SQL Server EXISTS/IN/NOT EXISTS'i destekler ve iyileştirici bunları çoğunlukla semi/anti-join olarak işler. NOT IN alt sorgusunda NULL varsa sonuç beklenmedik biçimde boşalabilir; NOT EXISTS güvenli tercihtir. INTERSECT/EXCEPT de benzer üyelik mantığı için kullanılabilir.
MongoDB
// IN karşılığı: $in operatörü
db.musteri.find({ il: { $in: ["Ankara", "Izmir"] } })
// EXISTS karşılığı: $lookup + $match ile eşleşme kontrolü
db.musteri.aggregate([
{ $lookup: { from: "siparis", localField: "id",
foreignField: "musteri_id", as: "s" } },
{ $match: { "s.0": { $exists: true } } } // en az bir sipariş
])MongoDB'de değer listesi üyeliği $in / $nin operatörleriyle yapılır. Alt sorgu EXISTS'in karşılığı $lookup ile eşleşen belge dizisini getirip dizinin boş olup olmadığını süzmektir. Alan varlığı kontrolü ise ayrı bir { alan: { $exists: true } } operatörüdür (satır ilişkisi değil, alanın mevcudiyeti).
Redis
# Üyelik kontrolü Set/Hash ile:
SISMEMBER hedef_iller "Ankara" # kümede var mı? (IN benzeri)
EXISTS musteri:1 # anahtar mevcut mu?Redis'te alt sorgu yoktur. Değer üyeliği için Set üzerinde SISMEMBER (IN benzeri) kullanılır. EXISTS komutu ise bir alt sorgu değil, belirtilen anahtarın var olup olmadığını döndürür. İlişkisel varlık kontrolleri uygulama tarafında birden çok anahtar okunarak yapılır.
Elasticsearch
# IN karşılığı: terms sorgusu
GET musteri/_search
{ "query": { "terms": { "il": ["Ankara", "Izmir"] } } }
# Alanın varlığı: exists sorgusu
GET musteri/_search
{ "query": { "exists": { "field": "telefon" } } }Elasticsearch'te IN karşılığı 'terms' sorgusu (birden çok değerden biriyle eşleşme), NOT IN ise bool must_not içinde terms'tir. 'exists' sorgusu SQL EXISTS'e değil, bir alanın belgede değeri olup olmadığına bakar. Tablolar arası ilişkili EXISTS için genelde denormalizasyon gerekir.