Memfilter data dengan predikat
Pernyataan SELECT paling sederhana dengan hanya klausul SELECT dan FROM akan mengevaluasi setiap baris dalam tabel. Dengan menggunakan klausul WHERE, Anda menentukan kondisi yang menentukan baris mana yang akan diproses dan berpotensi mengurangi tataan hasil.
Struktur klausul WHERE
Klausul WHERE terdiri dari satu atau lebih kondisi pencarian, yang masing-masing harus bernilai TRUE, FALSE, atau 'tidak diketahui' untuk setiap baris tabel. Baris hanya akan dikembalikan ketika klausul WHERE bernilai TRUE. Setiap kondisi bertindak sebagai filter pada data, dan disebut sebagai 'predikat'. Setiap predikat mencakup kondisi yang sedang diuji, biasanya menggunakan operator perbandingan dasar:
- = (sama)
- <> (tidak sama)
- > (lebih besar)
- >= (lebih besar atau sama)
- < (lebih kecil)
- <= (lebih kecil atau sama)
Misalnya, kueri berikut mengembalikan semua produk dengan nilai ProductCategoryID 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
Demikian pula, kueri berikut mengembalikan semua produk dengan ListPrice kurang dari 10.00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL / IS NOT NULL
Anda juga dapat dengan mudah memfilter untuk mengizinkan atau mengecualikan nilai 'tidak diketahui' atau NULL menggunakan IS NULL atau IS NOT NULL.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
Beberapa kondisi
Beberapa predikat dapat digabungkan dengan operator AND dan OR dan dengan tanda kurung. Namun, SQL Server hanya akan memproses dua kondisi dalam waktu yang bersamaan. Semua kondisi harus TRUE saat menghubungkan beberapa kondisi dengan operator AND. Saat menggunakan operator OR untuk menghubungkan dua kondisi, satu atau keduanya mungkin berupa TRUE untuk tataan hasil.
Misalnya, kueri berikut menghasilkan produk di kategori 2 yang harganya kurang dari 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
Operator AND diproses sebelum operator OR, kecuali jika tanda kurung digunakan. Untuk praktik terbaik, gunakan tanda kurung saat menggunakan lebih dari dua predikat. Kueri berikut mengembalikan produk dalam kategori 2 ATAU 3 AND dengan biaya kurang dari 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Operator perbandingan
T-SQL menyertakan operator perbandingan yang dapat membantu menyederhanakan klausul WHERE.
DI
Operator IN adalah pintasan bagi beberapa kondisi kesetaraan untuk kolom yang sama yang terhubung dengan OR. Tidak ada salahnya menggunakan beberapa kondisi OR dalam kueri, seperti dalam contoh berikut:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Tetapi, menggunakan IN jelas dan ringkas, dan performa kueri tidak akan terpengaruh.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
ANTARA
BETWEEN adalah pintasan lain yang dapat digunakan saat memfilter batas atas dan bawah untuk nilai daripada menggunakan dua kondisi dengan operator AND. Dua pernyataan berikut setara:
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;
Operator BETWEEN menggunakan nilai batas inklusif. Produk dengan harga 1,00 atau 10,00 akan disertakan dalam hasilnya. BETWEEN juga berguna saat mengkueri bidang tanggal. Misalnya, kueri berikut akan menyertakan semua nama produk yang diubah antara 1 Januari 2012 dan 31 Desember 2012:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
Tanggal Modifikasi
Kaus Kaki Sepeda Gunung, M
01-01-2012 00.00.00.000
HL Mountain Frame - Perak, 42
05-03-2012 00.00.00.000
HL Mountain Frame - Perak, 38
29-08-2012 00.00.00.000
Mountain-100 Perak, 38
31-12-2012 00.00.00.000
Namun karena kami tidak menentukan rentang waktu, tidak ada hasil yang dikembalikan setelah 2012-12-31 00:00:00.000. Untuk menyertakan tanggal dan waktu secara akurat, kita perlu menyertakan waktu dalam predikat:
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';
Operator perbandingan dasar seperti Lebih Besar Dari (>) dan Sama Dengan (=) juga akurat jika hanya memfilter menurut tanggal:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
Suka
Operator perbandingan akhir hanya dapat digunakan untuk data karakter dan memungkinkan kita untuk menggunakan karakter kartubebas dan pola ekspresi reguler. Kartubebas memungkinkan kita untuk menentukan string parsial. Misalnya, Anda dapat menggunakan kueri berikut untuk menghasilkan semua produk dengan nama yang berisi kata "mountain":
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
Kartubebas % mewakili string 0 karakter atau lebih, sehingga hasilnya mencakup produk dengan kata "mountain" di mana saja dalam namanya, seperti berikut ini:
Nama
ListPrice
Kaus Kaki Sepeda Gunung, M
9.50
Kaus Kaki Sepeda Gunung, L
9.50
HL Mountain Frame - Perak, 42
1364,0
HL Mountain Frame - Hitam, 42
1349,60
HL Mountain Frame - Perak, 38
1364,50
Mountain-100 Perak, 38
3399,99
Anda dapat menggunakan wildcard _ (garis bawah) untuk mewakili satu karakter, seperti ini:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Hasil berikut hanya mencakup produk yang dimulai dengan "Kaus Kaki Sepeda Gunung, " dan satu karakter setelahnya:
ProductName
ListPrice
Kaus Kaki Sepeda Gunung, M
9.50
Kaus Kaki Sepeda Gunung, L
9.50
Anda juga dapat menentukan pola kompleks untuk string yang ingin Anda temukan. Misalnya, kueri berikut mencari produk dengan nama yang dimulai dengan "Gunung-", lalu diikuti oleh:
- tiga karakter antara 0 dan 9
- spasi
- string apa saja
- koma
- spasi
- dua karakter antara 0 dan 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Hasil dari kueri ini mungkin terlihat seperti ini:
ProductName
ListPrice
Mountain-100 Perak, 38
3399,99
Mountain-100 Perak, 42
3399,99
Mountain-100 Hitam, 38
3399,99
Mountain-100 Hitam, 42
3399,99
Mountain-200 Perak, 38
2319,99
Mountain-200 Perak, 42
2319,99
Mountain-200 Hitam, 38
2319,99
Mountain-200 Hitam, 42
2319,99