SQL Server sorgu oluştururken çoğunlukla FROM ile listelenen tablolardaki tüm satırların yalnızca belirli bir alt kümesini almak isteyebilirsiniz. Veri hacmi büyüdükçe durum genelde böyle olur. Hangi satırların döndürüleceğini belirlemek içinse SELECT ifadesinde WHERE ifadesini kullanırız. Bu bölümde, predicate ile eşleşmeyen satırları filtrelemek için WHERE ifadelerinin nasıl oluşturulduğunu öğreneceksiniz.

WHERE ifadesiyle Predicate Kullanarak Verileri Filtrelemek

Sorgu tarafından döndürülen satırları sınırlamak için SELECT ifadesinde FROM deyimi ardından bir WHERE ifadesi eklenir. WHERE ifadeleri, predicate ile oluşturulmuş arama koşuluyla çalışmaktadır. Predicate, her satırın geçmesi gereken mantıksal bir filtre sağlar. Filtre işlemi sonucu yalnızca TRUE olarak değerlendirilen satırlar sorgunun bir sonraki aşamasına gönderilir.

WHERE ifadesini yazarken aşağıdaki hususları dikkate almakta fayda vardır:

  • Predicate, TRUE veya FALSE olarak değerlendirme yapabilen mantıksal bir koşul sağlamalıdır. (Eksik veya NULL değerlerle çalışırken değerlendirme sonucu NULL da olabilir.)
  • Yalnızca TRUE olarak değerlendirilen satırlar sonraki aşamaya geçirilir.
  • FALSE ve UNKNOWN değerleri işlemden çıkarılır.
  • Sorgunun SELECT ifadesinde oluşturulan sütun takma adları, WHERE ifadesinde predicate ile kullanılamaz.
  • Mantıksal işlem sırasında WHERE ifadesi FROM ifadesinden sonra işlenir. Bu nedenle WHERE ifadesi, SELECT gibi ifadelerden önce işlenecektir. Bunun sonucu olarak WHERE ifadesinde, SELECT ifadesinde oluşturulan sütun takma adları kullanılamaz, sütun isimlerini tekrar yazmanız gerekir.

Örneğin, aşağıdaki sorgu sorunsuz çalışacaktır:

SELECT orderid, custid, YEAR(orderdate) AS ordyear
FROM Sales.Orders
WHERE YEAR(orderdate) = 2006;

Fakat bu sorgu WHERE ifadesinde sütun takma adlarının kullanılması nedeniyle hata basacaktır:

SELECT orderid, custid, YEAR(orderdate) AS ordyear
FROM Sales.Orders
WHERE ordyear = 2006;

Hata iletisinde 3. satırda sütun takma adının kullanıldığı bildirilmektedir:

Msg 207, Level 16, State 1, Line 3
Invalid column name 'ordyear'.

Sorgu performansı açısından bakıldığında, WHERE ifadelerinin etkili kullanımı SQL Server üzerinde önemli bir etki sağlayabilir. Sorgu sonucunda tüm satırlar client’a döndürülmeden önce SQL Server ile sunucu tarafında filtreleme işlemi gerçekleştirilir. Bu şekilde client tarafında ağ trafiği ve bellek kullanımı azaltılabilir. SQL Server geliştirici ve yöneticileri, performansı daha da artırmak için predicate’lere ek olarak indeksler de oluşturabilir.

WHERE İfadesi Syntax

SQL Server Teknik Dökümantasyon’da, WHERE ifadesinin syntax’ı aşağıdaki gibi görünmektedir:

WHERE <search_condition>

WHERE ifadesinin en yaygın kullanım biçimi ise şöyledir:

WHERE <column> <operator> <expression>

Örneğin aşağıdaki kod parçasında WHERE ifadesi yalnızca İspanya’daki müşterileri döndürecektir:

SELECT contactname, country
FROM Sales.Customers
WHERE country = N'Spain';

Daha önceki T-SQL dilini anlattığımız bölümlerde tanıtılan mantıksal operatörlerden herhangi biri, WHERE ifadesinde predicate içerisinde kullanılabilir.

Bu örnekte belirtilen bir tarihten sonra verilen siparişler filtrelenmektedir:

SELECT orderid, orderdate
FROM Sales.Orders
WHERE orderdate > '20070101';

Not: Tarih ifadelerinin tırnak işaretleri ile ayrılmış dizeler şeklinde tanımlanması sonraki bölümlerde ele alınmıştır.

WHERE ifadesindeki kullanılabilen mantıksal operatörler, literal değerler ve constant ifadelere ek olarak predicate’inizde birkaç T-SQL seçenek operatörleri de kullanabilirsiniz:

Predicate ve OperatörlerAçıklama
INBelirtilen bir değerin alt sorgudaki veya listedeki herhangi bir değerle eşleşip eşleşmediğini belirler.
BETWEENTest edilecek kapsayıcı aralığı belirtir.
LIKEBelirli bir karakter dizesinin belirtilen bir paternle eşleşip eşleşmediğini belirler.
ANDİki Boolean ifadesini birleştirir ve yalnızca her ikisi de TRUE olduğunda TRUE değerini döndürür.
ORİki Boolean ifadesini birleştirir ve herhangi biri TRUE ise TRUE değerini döndürür.
NOTBir arama koşulunun sonucunu tersine çevirir.

Aşağıdaki örnekte WHERE ifadesindeki koşulları birleştirmek için OR operatörünün kullanımı gösterilmektedir:

SELECT custid, companyname, country
FROM Sales.Customers
WHERE country = N'UK' OR country = N'Spain';

Aşağıdaki örnekte ise IN operatörü kullanarak önceki sorguyla aynı sonuçları getiren başka bir sorgu gösterilmektedir:

SELECT custid, companyname, country
FROM Sales.Customers
WHERE country IN (N'UK',N'Spain');

Aşağıdaki örnekte bir tarih aralığında arama yapmak için mantıksal operatörlerin kullanımı gösterilmektedir:

SELECT orderid, custid, orderdate
FROM Sales.Orders
WHERE orderdate >= '20070101' AND orderdate <= '20080630';

Aşağıdaki örnekte ise BETWEEN operatörü kullanarak önceki sorguyla aynı sonuçları getiren başka bir sorgu gösterilmektedir:

SELECT orderid, custid, orderdate
FROM Sales.Orders
WHERE orderdate BETWEEN '20070101' AND '20080630';