EXISTS ve NOT EXISTS
İlişkili satırları verimli şekilde kontrol edin.
EXISTS ve NOT EXISTS, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 2. 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 Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.
EXISTS Nedir?
EXISTS işleci, bir alt sorgunun en az bir satır döndürüp döndürmediğini sınar. Alt sorgu herhangi bir sonuç üretiyorsa TRUE, boşsa FALSE olarak değerlendirilir.
Değerleri karşılaştıran diğer alt sorgu işleçlerinin aksine EXISTS yalnızca varlığı önemser; alt sorgunun döndürdüğü gerçek verilere bakmaz.
Örnek Tabloları Oluşturma
EXISTS sorguları yazmadan önce iki tablo oluşturalım: customers ve orders. Ders boyunca EXISTS ve NOT EXISTS işleçlerinin uygulamada nasıl çalıştığını incelemek için bu tabloları kullanacağız.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
order_date DATE
);
INSERT INTO customers VALUES
(1, 'Alice', 'US'),
(2, 'Bob', 'UK'),
(3, 'Charlie', 'US'),
(4, 'Diana', 'DE');
INSERT INTO orders VALUES
(101, 1, 250.00, '2024-01-10'),
(102, 1, 180.00, '2024-02-15'),
(103, 2, 95.00, '2024-03-01'),
(104, 3, 430.00, '2024-03-22');Temel EXISTS Söz Dizimi
EXISTS için temel söz dizimi, onu bir WHERE yan tümcesinin içine yerleştirir. EXISTS'in içindeki alt sorgu genellikle dış sorgudan bir sütuna başvurur; buna ilişkili alt sorgu denir.
Aşağıdaki sorgu en az bir sipariş vermiş her müşteriyi bulur.
SELECT customer_id, name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);EXISTS İçinde SELECT 1
Alt sorgunun gerçek bir sütun seçmek yerine SELECT 1 kullandığını fark etmiş olabilirsiniz. Bu bilerek yapılır — EXISTS yalnızca satırların var olup olmadığını kontrol eder, içerdikleri değerleri değil.
SELECT 1 (hatta SELECT *) kullanmak sonucu değiştirmez; ancak SELECT 1, hem veritabanı motoruna hem de sorguyu okuyana gerçek değerlerin önemli olmadığını açıkça belirtir.
-- Both of these return the same result
SELECT name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
SELECT name FROM customers c
WHERE EXISTS (SELECT o.* FROM orders o WHERE o.customer_id = c.customer_id);Veritabanı EXISTS İşlemini Nasıl Değerlendirir
Dış sorgudaki her satır için veritabanı, ilişkili alt sorguyu çalıştırır. Eşleşen ilk satır bulunur bulunmaz motor taramayı durdurur ve EXISTS değerini TRUE olarak işaretler — bu kısa devre değerlendirmesi, büyük tablolarda bile EXISTS işlemini oldukça verimli kılar.
Buna karşılık JOIN, filtreleme yapmadan önce eşleşen satırların tamamını oluşturur. Yalnızca bir eşleşmenin var olup olmadığını bilmeniz gerektiğinde bu işlem daha yavaş olabilir.
-- EXISTS short-circuits after first match
-- Efficient even when orders table has millions of rows
SELECT name, country
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 200
);NOT EXISTS: Eksik Satırları Bulma
NOT EXISTS bunun tersidir: Alt sorgu hiç eşleşen satır bulmadığında TRUE döndürür. "Hiç sipariş vermemiş müşteriler hangileri?" gibi soruları yanıtlamanın standart SQL yolu budur.
Bunu normal bir JOIN veya NOT IN ile çözmeye çalışmak, NULL değerler işin içine girdiğinde hatalı sonuçlar üretebilir — NOT EXISTS bu sorunu tamamen önler.
-- Customers who have NOT placed any order
SELECT customer_id, name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);NULL Değerleriyle NOT EXISTS ve NOT IN Karşılaştırması
NOT EXISTS'in NOT IN'e göre en önemli avantajlarından biri NULL güvenliğidir. NOT IN tarafından kullanılan alt sorgu tek bir NULL bile döndürürse NOT IN ifadesinin tamamı NULL olur — bunun sonucunda dış sorgudan hiç satır döndürülmez.
NOT EXISTS, değer eşitliğini değil satırların varlığını değerlendirdiği için bu sorundan etkilenmez.
-- Dangerous: if any customer_id in orders is NULL,
-- NOT IN returns zero rows!
SELECT name FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);
-- Safe: NOT EXISTS handles NULLs correctly
SELECT name FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id
);Birden Çok Koşulla EXISTS
EXISTS içindeki alt sorgu, birden çok WHERE koşulu da dahil olmak üzere geçerli tüm SQL ifadelerini içerebilir. Bu sayede çok özel ölçütlere uyan ilişkili satırları kontrol edebilirsiniz — örneğin belirli bir ayda eşik değerden daha büyük bir sipariş veren müşterileri.
-- Customers who placed an order over 200 in March 2024
SELECT c.name, c.country
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 200
AND o.order_date >= '2024-03-01'
AND o.order_date < '2024-04-01'
);DELETE ve UPDATE İçinde EXISTS
EXISTS yalnızca SELECT ifadeleriyle sınırlı değildir. Başka bir tablodaki ilişkili verilerin varlığına göre satırları değiştirmek veya silmek için UPDATE ve DELETE içinde de kullanabilirsiniz.
Aşağıdaki örnek, belirli bir ülkedeki müşterilere ait siparişleri siler.
-- Delete orders placed by US customers
DELETE FROM orders o
WHERE EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
AND c.country = 'US'
);EXISTS ile JOIN Karşılaştırması
EXISTS ve JOIN çoğu zaman aynı soruyu ifade edebilir; ancak farklı şekilde çalışırlar. Birden çok eşleşme olduğunda JOIN satırları çoğaltır; EXISTS ise her dış satırı en fazla bir kez döndürür.
Yalnızca bir ilişkinin var olup olmadığını bilmeniz gerekiyor ve ilişkili tablodan veri almanız gerekmiyorsa EXISTS daha sade ve genellikle daha hızlıdır.
-- JOIN may return duplicate customer rows if a customer has multiple orders
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id;
-- EXISTS always returns each customer once
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id
);Veri Kalitesi Denetimleri için NOT EXISTS
NOT EXISTS, veri kalitesi denetimleri için güçlü bir araçtır. Yetim kayıtları, eksik başvuruları veya ilişkili verilere sahip olması gereken ancak sahip olmayan satırları bulmak için kullanabilirsiniz.
Aşağıdaki sorgu, customer_id değeri customers tablosundaki hiçbir satırla eşleşmeyen sipariş satırlarını tespit eder — bu, bozulmuş başvuru bütünlüğünün bir işaretidir.
-- Find orders with no matching customer (orphaned records)
SELECT o.order_id, o.customer_id, o.amount
FROM orders o
WHERE NOT EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
);Hızlı Kontrol
EXISTS ve NOT EXISTS konusundaki anlayışınızı sınayın.
Ders Özeti
Bu derste, EXISTS ve NOT EXISTS kullanarak değerleri doğrudan karşılaştırmadan ilişkili satırların varlığını veya yokluğunu nasıl kontrol edeceğinizi öğrendiniz.
Önemli noktalar:
- EXISTS, alt sorgu eşleşen bir satır bulur bulmaz TRUE döndürür (kısa devre değerlendirmesi).
- NOT EXISTS, alt sorgu eşleşen hiçbir satır bulmadığında TRUE döndürür.
- EXISTS içinde
SELECT 1kullanın — döndürülen değerler önemli değildir. - NOT EXISTS NULL güvenlidir; NOT IN güvenli değildir — NULL değerler ortaya çıkabilecekse NOT EXISTS'i tercih edin.
- EXISTS, SELECT, UPDATE ve DELETE ifadelerinde çalışır.
- Yalnızca varlığı kontrol etmeniz gerektiğinde EXISTS, JOIN'e göre genellikle daha sade ve hızlıdır.
Sıkça Sorulan Sorular
“EXISTS ve NOT EXISTS” dersi ücretsiz mi?
Evet — “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 Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.
“EXISTS ve NOT EXISTS” dersinde ne öğreneceğim?
İlişkili satırları verimli şekilde kontrol edin. SQL Academy 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 Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Academy, 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 2. dersidir.
“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 Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Academy 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
- İlişkili Alt Sorgular
- EXISTS ve NOT EXISTS
- IN, ANY ve ALL Karşılaştırması
- EXISTS ve JOIN Performansı