Verileri koşullarla filtreleme

Tamamlandı

Yalnızca SELECT ve FROM yan tümcelerine sahip en basit SELECT deyimleri, tablodaki her satırı değerlendirir. WHERE yan tümcesini kullanarak, hangi satırların işleneceğini belirleyen ve sonuç kümesini azaltma olasılığı olan koşulları tanımlarsınız.

WHERE yan tümcesinin yapısı

WHERE yan tümcesi bir veya daha fazla arama koşulundan oluşur ve bunların her biri tablonun her satırı için DOĞRU, YANLIŞ veya 'bilinmiyor' olarak değerlendirilmelidir. Satırlar yalnızca WHERE yan tümcesi TRUE olarak değerlendirildiğinde döndürülür. Tek tek koşullar, veriler üzerinde filtre görevi görür ve 'koşullar' olarak adlandırılır. Her koşul, genellikle temel karşılaştırma işleçleri kullanılarak test edilen bir koşul içerir:

  • = (eşittir)
  • <> (eşit değildir)
  • > (büyüktür)
  • >= (büyüktür veya eşittir)
  • < (küçüktür)
  • <= (küçük veya eşittir)

Örneğin, aşağıdaki sorgu ProductCategoryID değeri 2 olan tüm ürünleri döndürür:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;

Benzer şekilde, aşağıdaki sorgu ListPrice değeri 10,00'dan küçük olan tüm ürünleri döndürür:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;

IS NULL / IS NOT NULL

AYRıCA IS NULL veya IS NOT NULL kullanarak 'bilinmeyen' veya NULL değerlerine izin vermek veya bunları dışlamak için kolayca filtreleyebilirsiniz.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;

Birden çok koşul

Birden çok koşul VE ve OR işleçleriyle ve parantezlerle birleştirilebilir. Ancak SQL Server aynı anda yalnızca iki koşulu işler. AND işlecine birden çok koşul bağlanırken tüm koşullar TRUE olmalıdır. İki koşulu bağlamak için OR işlecini kullanırken, sonuç kümesi için bir veya her ikisi de DOĞRU olabilir.

Örneğin, aşağıdaki sorgu kategori 2'de 10,00'dan küçük olan ürünü döndürür:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    AND ListPrice < 10.00;

PARANTEZler kullanılmadığı sürece AND işleçleri OR işleçlerinden önce işlenir. En iyi uygulama için, ikiden fazla koşul kullanırken parantez kullanın. Aşağıdaki sorgu, kategori 2 VEYA 3 VE maliyeti 10,00'dan küçük olan ürünleri döndürür:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
    AND (ListPrice < 10.00);

Karşılaştırma işleçleri

Transact-SQL, WHERE yan tümcesini basitleştirmeye yardımcı olabilecek karşılaştırma işleçleri içerir.

IN

IN işleci, OR ile bağlantılı aynı sütun için birden çok eşitlik koşuluna yönelik bir kısayoldur. Aşağıdaki örnekte olduğu gibi sorguda birden çok OR koşulu kullanmanın yanlış bir yanı yoktur:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    OR ProductCategoryID = 3
    OR ProductCategoryID = 4;

Ancak, IN kullanımı net ve kısadır ve sorgunun performansı etkilenmez.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);

BETWEEN

BETWEEN, AND işleciyle iki koşul kullanmak yerine değer için bir üst ve alt sınır için filtreleme yaparken kullanılabilecek başka bir kısayoldur. Aşağıdaki iki sorgu eşdeğerdir:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
    AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;

BETWEEN işleci kapsayıcı sınır değerlerini kullanır. Fiyatı 1.00 veya 10.00 olan ürünler sonuçlara dahil edilebilir. BETWEEN, tarih alanlarını sorgularken de yararlıdır. Örneğin, aşağıdaki sorgu 1 Ocak 2012 ile 31 Aralık 2012 arasında değiştirilen tüm ürün adlarını içerir:

SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';

ProductName

Modifieddate

Dağ Bisikleti Çorapları, M

2012-01-01 00:00:00.000

HL Dağ Çerçevesi - Gümüş, 42

2012-03-05 00:00:00.000

HL Dağ Çerçevesi - Gümüş, 38

2012-08-29 00:00:00.000

Mountain-100 Gümüş, 38

2012-12-31 00:00:00.000

Ancak bir zaman aralığı belirtmediğimiz için 2012-12-31 00:00:00.000 sonrasında hiçbir sonuç döndürülmüyor. Tarih ve saati doğru bir şekilde dahil etmek için koşula saati dahil etmemiz gerekir:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';

Büyüktür () ve Eşittir (>=) gibi temel karşılaştırma işleçleri de yalnızca tarihe göre filtrelendiğinde doğrudur:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01' 
    AND ModifiedDate < '2013-01-01';

LIKE

Son karşılaştırma işleci yalnızca karakter verileri için kullanılabilir ve joker karakterleri ve normal ifade desenlerini kullanmamızı sağlar. Joker karakterler kısmi dizeler belirtmemize olanak sağlar. Örneğin, "mountain" sözcüğünü içeren adlara sahip tüm ürünleri döndürmek için aşağıdaki sorguyu kullanabilirsiniz:

SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';

Joker % karakter 0 veya daha fazla karakterden oluşan herhangi bir dizeyi temsil eder, bu nedenle sonuçlar adında herhangi bir yerde "dağ" sözcüğü bulunan ürünleri içerir, örneğin:

Adı

ListPrice

Dağ Bisikleti Çorapları, M

9,50

Dağ Bisikleti Çorapları, L

9,50

HL Dağ Çerçevesi - Gümüş, 42

1364.0

HL Dağ Çerçevesi - Siyah, 42

1349.60

HL Dağ Çerçevesi - Gümüş, 38

1364.50

Mountain-100 Gümüş, 38

3399.99

Aşağıdaki gibi tek bir karakteri temsil etmek için _ (alt çizgi) joker karakterini kullanabilirsiniz:

SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';

Aşağıdaki sonuçlar yalnızca "Dağ Bisikleti Çorapları" ile başlayan ürünleri ve sonrasında tek bir karakteri içerir:

ProductName

ListPrice

Dağ Bisikleti Çorapları, M

9,50

Dağ Bisikleti Çorapları, L

9,50

Bulmak istediğiniz dizeler için karmaşık desenler de tanımlayabilirsiniz. Örneğin, aşağıdaki sorguda "Mountain-" ile başlayan ve ardından takip edilen bir ada sahip ürünler arandı:

  • 0 ile 9 arasında üç karakter
  • boşluk
  • herhangi bir dize
  • virgül
  • boşluk
  • 0 ile 9 arasında iki karakter
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Bu sorgunun sonuçları şuna benzer olabilir:

ProductName

ListPrice

Mountain-100 Gümüş, 38

3399.99

Mountain-100 Gümüş, 42

3399.99

Dağ-100 Siyah, 38

3399.99

Mountain-100 Siyah, 42

3399.99

Mountain-200 Gümüş, 38

2319.99

Mountain-200 Gümüş, 42

2319.99

Mountain-200 Siyah, 38

2319.99

Mountain-200 Siyah, 42

2319.99