SQL Server, alt sorgudan değerleri çekmenin yanı sıra, sorgudan sonuç döndürülüp döndürülmeyeceğini denetleyen bir mekanizma sağlar. EXISTS ile kayıtların var olup olmadığı denetlenir ve TRUE veya FALSE döndürür. Verileri çekmeden doğrulama işlemi için yararlı bir tekniktir.

EXISTS Predicate

Bir alt sorgu, dış sorgu tarafından EXISTS kullanılarak tarafından çağrıldığında, SQL Server alt sorgudan dönen sonuçları, önceki iki bölümde anlatılanda farklı olarak işler. EXISTS işlemi ile alt sorgudan dönen sonuçlarda bir skaler değer veya çok değerli liste almak yerine herhangi bir satır olup olmadığını kontrol eder.

Kavramsal olarak EXISTS predicate, sonuçları almak ve sonuçtaki satırları saymak ve sayıyı sıfırla karşılaştırmak işlemiyle eşdeğerdir. Siparişlerle ilişkili çalışanların ayrıntılarını döndüren aşağıdaki sorguları karşılaştıralım. İlk sorgunun alt sorgusunda COUNT kullanılmıştır:

SELECT empid, lastname
FROM HR.Employees AS e
WHERE (SELECT COUNT(*)
 FROM Sales.Orders AS O
 WHERE O.empid = e.empid)>0; 

Aynı sonuçları döndüren ikinci sorguda EXISTS kullanılmıştır:

SELECT empid, lastname
FROM HR.Employees AS e
WHERE EXISTS( SELECT *
 FROM Sales.Orders AS O
 WHERE O.empid = e.empid); 

İlk örnekteki alt sorgu, Sales.Orders tablosundaki her bir empid kaydını sayar ve sayım sonuçlarını sıfırla karşılaştırır, çalışanların siparişle ilişkisi bu yolla belirtilmiş olur.

İkinci sorguda EXISTS ile, Sales.Orders tablosunda empid kaydı bulunduğu anda TRUE değerini döndürür; hepsini teker teker hesaplamaz.

Not: Mantıksal işlem açısından iki sorgu da eşdeğerdir. Veri tabanı motoru sorguları çalıştırılmadan önce optimize ettiği için sorguların performansları farklı olabilir. Bu sorguları kullanırken kendi açınızdan test edebilirsiniz.

EXISTS’in bir başka yararlı kullanımı ise, aşağıdaki örnekte olduğu gibi asla sipariş vermeyen müşterileri NOT ile aradan kaldırmaktır:

SELECT custid, companyname
FROM Sales.Customers AS c
WHERE NOT EXISTS (
 SELECT *
 FROM Sales.Orders AS o
 WHERE c.custid=o.custid); 

Böylece SQL Server, yeniden sipariş veren müşterilerle ilgili siparişler hakkında veri döndürmek zorunda kalmaz. Sales.Orders tablosunda bir müşteri kimliği bulunursa NOT EXISTS ile bu değerler FALSE olarak değerlendirilir ve işlem hızlı bir şekilde tamamlanır.

Alt Sorgularla EXISTS Kullanmak

Alt sorgularla EXISTS kullanırken aşağıdakileri göz önünde bulundurmakta fayda var:

  • EXISTS ifadesi WHERE ifadesinden hemen sonra gelir. NOT ifadesi de eklenmezse hiçbir sütun isminin (veya başka bir ifadenin) bu ifadenin önüne geçmesi gerekmez.
  • EXISTS ifadesinden sonra gelen tanımlanan alt sorguda, SELECT listesinde yalnızca (*) bulunması gereklidir. Alt sorgu tarafından hiçbir satır dönmediği için herhangi bir sütun belirtmeye de gerek yoktur.

Kaynak:
Subqueries with EXISTS