Foto oleh panumas nikhomkhai via Pexels

Klausa WHERE digunakan untuk menyaring baris data berdasarkan kondisi tertentu, sehingga query hanya mengembalikan data yang relevan dengan kebutuhan. Hampir setiap aplikasi nyata membutuhkan filtering data, dan kesalahan logika pada WHERE — terutama terkait NULL dan kombinasi AND/OR — adalah salah satu sumber bug yang paling sering terjadi namun sulit disadari karena query tetap berjalan tanpa error sama sekali.

Artikel ini membahas cara kerja WHERE beserta operator perbandingan dan logika yang umum dipakai, termasuk jebakan NULL yang sering membingungkan pemula dan bagaimana cara menghindarinya secara konsisten.

Operator Perbandingan Dasar

Operator =, >, <, <>

SELECT * FROM Orders WHERE TotalAmount > 500000; SELECT * FROM Orders WHERE Status = 'Shipped'; SELECT * FROM Orders WHERE Status <> 'Cancelled'; -- Expected: hanya baris yang memenuhi kondisi yang muncul di hasil

Operator perbandingan dasar ini bekerja sama persis seperti pada kebanyakan bahasa pemrograman, namun perlu diingat bahwa perbandingan string di SQL Server bisa case-insensitive atau case-sensitive tergantung collation database yang dipakai, sehingga hasil perbandingan teks bisa berbeda antar instance.

Menggabungkan Kondisi dengan AND dan OR

Menggabungkan beberapa syarat filter

-- AND: kedua kondisi harus terpenuhi SELECT * FROM Orders WHERE Status = 'Shipped' AND TotalAmount > 500000; -- OR: salah satu kondisi cukup terpenuhi SELECT * FROM Orders WHERE Status = 'Cancelled' OR Status = 'Returned';

Ketika mencampur AND dan OR dalam satu query, selalu gunakan tanda kurung agar urutan evaluasi jelas dan tidak menghasilkan logika yang keliru, karena SQL Server mengevaluasi AND dengan prioritas lebih tinggi dibanding OR secara default, persis seperti perkalian yang didahulukan dari penjumlahan dalam matematika.

Tanda kurung menjaga logika tetap benar

SELECT * FROM Orders WHERE (Status = 'Cancelled' OR Status = 'Returned') AND OrderDate >= '2026-01-01'; -- Tanpa tanda kurung, logika bisa salah menjadi: -- Status = 'Cancelled' OR (Status = 'Returned' AND OrderDate >= '2026-01-01')

Memeriksa Nilai NULL

NULL harus dicek dengan IS NULL, bukan =

-- SALAH, tidak akan pernah mengembalikan hasil SELECT * FROM Orders WHERE ShippedDate = NULL; -- BENAR SELECT * FROM Orders WHERE ShippedDate IS NULL; -- Expected: query pertama SELALU mengembalikan 0 baris, -- bahkan jika memang ada baris dengan ShippedDate kosong

NULL berarti 'tidak diketahui', sehingga operator = tidak pernah bisa membandingkannya secara logis. SQL Server menyediakan IS NULL dan IS NOT NULL khusus untuk kasus ini, dan melupakan aturan ini adalah penyebab bug paling umum terkait filtering data pada developer yang baru belajar SQL.

Membalik Kondisi dengan NOT

Selain AND, OR, dan pemeriksaan NULL, WHERE juga sering dikombinasikan dengan NOT untuk membalik hasil sebuah kondisi, yang kadang lebih mudah dibaca dibanding menulis ulang kondisi kebalikannya secara manual.

NOT membalik hasil evaluasi kondisi

SELECT * FROM Orders WHERE NOT (Status = 'Cancelled'); -- Setara dengan SELECT * FROM Orders WHERE Status <> 'Cancelled'; -- Expected: kedua query menghasilkan baris yang identik, -- namun NOT bisa lebih mudah dibaca untuk kondisi kompleks

NOT menjadi sangat berguna ketika kondisi yang dibalik cukup kompleks, misalnya WHERE NOT (Status = 'Cancelled' AND TotalAmount < 100000), yang jika ditulis ulang manual tanpa NOT akan membutuhkan perubahan logika AND menjadi OR sesuai hukum De Morgan — sesuatu yang mudah salah jika dilakukan secara manual.

Menangani Nilai NULL pada Klausa WHERE

Perbandingan operator = dengan IS NULL untuk mendeteksi nilai kosong

-- Pendekatan yang SALAH: tidak akan pernah mengembalikan baris SELECT * FROM Customers WHERE Phone = NULL; -- Pendekatan yang BENAR SELECT * FROM Customers WHERE Phone IS NULL; -- Mengambil baris yang punya nomor telepon (tidak NULL) SELECT * FROM Customers WHERE Phone IS NOT NULL;

NULL pada SQL Server bukan berarti string kosong atau angka nol, melainkan representasi dari 'nilai tidak diketahui', sehingga setiap perbandingan menggunakan operator standar seperti sama dengan (=) atau tidak sama dengan (<>) terhadap NULL akan selalu menghasilkan UNKNOWN, bukan TRUE maupun FALSE, dan baris dengan hasil UNKNOWN tidak akan pernah muncul di hasil query WHERE.

Karena alasan itu, SQL Server menyediakan operator khusus IS NULL dan IS NOT NULL yang dirancang khusus untuk memeriksa keberadaan nilai NULL, dan inilah satu-satunya cara yang benar untuk memfilter baris berdasarkan NULL. Lupa menggunakan operator ini adalah salah satu penyebab bug paling umum bagi pemula, karena query dengan WHERE Kolom = NULL akan berjalan tanpa error namun selalu mengembalikan hasil kosong tanpa penjelasan.

Saat NULL terlibat dalam operator logika AND dan OR, hasilnya mengikuti aturan logika tiga-nilai (three-valued logic): UNKNOWN AND TRUE menghasilkan UNKNOWN, sedangkan UNKNOWN OR TRUE menghasilkan TRUE; memahami aturan ini membantu menjelaskan mengapa kondisi WHERE yang tampak benar secara logika kadang tetap mengecualikan baris tertentu yang mengandung NULL pada salah satu kolom yang diperiksa.

Operator Logika AND, OR, NOT dan Urutan Evaluasi dengan Tanda Kurung

Perbedaan hasil akibat urutan evaluasi AND dan OR

-- Query tanpa tanda kurung: berisiko salah interpretasi SELECT * FROM dbo.Pesanan WHERE StatusPesanan = 'Pending' OR StatusPesanan = 'Diproses' AND Prioritas = 'Tinggi'; -- Query dengan tanda kurung eksplisit sesuai maksud bisnis SELECT * FROM dbo.Pesanan WHERE (StatusPesanan = 'Pending' OR StatusPesanan = 'Diproses') AND Prioritas = 'Tinggi'; -- Hasil berbeda: query pertama bisa ikut mengembalikan status Pending -- berprioritas rendah, sedangkan query kedua hanya mengembalikan -- Pending/Diproses yang berprioritas Tinggi saja.

SQL Server, seperti kebanyakan bahasa pemrograman, memberi prioritas evaluasi lebih tinggi pada operator AND dibanding OR ketika keduanya dipakai dalam satu klausa WHERE tanpa tanda kurung. Artinya, kondisi yang dihubungkan AND akan dievaluasi terlebih dahulu sebagai satu kesatuan sebelum digabung dengan kondisi OR di sekitarnya, yang sering kali tidak sesuai dengan maksud logis penulisnya.

Pada contoh di atas, query tanpa tanda kurung sebenarnya dibaca mesin sebagai 'StatusPesanan Pending, ATAU (StatusPesanan Diproses DAN Prioritas Tinggi)', bukan 'status Pending atau Diproses, yang keduanya harus berprioritas Tinggi' seperti yang mungkin dimaksud penulis query. Kesalahan logika semacam ini tidak memunculkan error sintaks apa pun, sehingga sangat mudah lolos review dan baru ketahuan saat data yang dikembalikan aplikasi ternyata salah.

Operator NOT juga perlu diperlakukan hati-hati karena cakupannya hanya berlaku pada kondisi tepat setelahnya kecuali dibatasi tanda kurung, misalnya NOT StatusPesanan = 'Batal' AND Prioritas = 'Tinggi' hanya menegasikan kondisi status, bukan keduanya. Kebiasaan menulis tanda kurung eksplisit pada setiap kombinasi AND/OR, meski secara teknis kadang tidak wajib, adalah praktik defensif yang membuat maksud query jelas baik bagi mesin maupun bagi developer lain yang membaca query tersebut di kemudian hari, dan jauh lebih murah dibanding memperbaiki laporan bisnis yang sudah terlanjur salah dikirim ke pengguna.

Predikat SARGable agar WHERE Tetap Memanfaatkan Index

Predikat SARGable vs non-SARGable

-- TIDAK SARGable: fungsi pada kolom membuat index tidak terpakai SELECT * FROM dbo.Pesanan WHERE YEAR(TanggalPesan) = 2026; -- SARGable: kolom asli dibiarkan apa adanya, index bisa dipakai SELECT * FROM dbo.Pesanan WHERE TanggalPesan &gt;= '2026-01-01' AND TanggalPesan &lt; '2027-01-01';

Predikat disebut SARGable (Search ARGument-able) ketika SQL Server dapat langsung memakainya untuk melakukan Index Seek, yaitu ketika kolom pada klausa WHERE dibiarkan apa adanya tanpa dibungkus fungsi atau dikonversi tipe datanya. Membungkus kolom dengan fungsi seperti YEAR(TanggalPesan) memaksa SQL Server menghitung fungsi tersebut untuk setiap baris terlebih dahulu sebelum bisa dibandingkan, sehingga index pada kolom tersebut tidak bisa dipakai secara efisien dan berubah menjadi Index Scan penuh.

Mengubah predikat non-SARGable menjadi bentuk rentang nilai seperti pada contoh kedua membuat SQL Server dapat langsung melompat ke posisi yang relevan dalam struktur index tanpa perlu menghitung ulang fungsi apa pun per baris. Kebiasaan menulis predikat SARGable sejak awal, terutama pada kolom yang sudah memiliki index, adalah salah satu teknik tuning paling sederhana namun berdampak besar pada performa query sehari-hari.

Kesalahan Umum yang Sering Terjadi

Membandingkan NULL dengan operator =

Query seperti WHERE kolom = NULL tidak akan pernah mengembalikan hasil apa pun, bahkan jika ada baris dengan nilai NULL pada kolom tersebut, karena secara logis NULL tidak sama dengan apa pun termasuk NULL itu sendiri.

Mencampur AND dan OR tanpa tanda kurung

Urutan evaluasi default SQL Server bisa menghasilkan logika yang berbeda dari yang dimaksud penulis query, menyebabkan data yang difilter salah tanpa pesan error apa pun yang bisa dipakai untuk mendeteksi masalahnya.

Mengabaikan sensitivitas huruf besar/kecil pada perbandingan teks

Tergantung collation yang dipakai database, WHERE Nama = 'budi' bisa jadi tetap cocok dengan 'Budi' atau justru tidak cocok sama sekali, sehingga perilaku query bisa berbeda antar environment jika collation-nya tidak konsisten.

Kapan Pendekatan Ini Tidak Cocok Dipakai

Filtering dengan banyak kondisi OR pada kolom yang sama (seperti lima kondisi Status berbeda) secara fungsional benar namun kurang efisien dibanding menggunakan operator IN yang akan dibahas pada materi selanjutnya, terutama saat daftar nilai yang dibandingkan cukup panjang dan query ditulis berulang kali di banyak tempat.

Ringkasan

WHERE adalah alat utama untuk menyaring data sesuai kebutuhan bisnis. Memahami cara kerja AND, OR, dan penanganan NULL akan mencegah bug logika yang sering tidak terlihat langsung tapi menghasilkan data yang salah tanpa disadari penulis query.

Kebiasaan selalu memeriksa NULL dengan IS NULL/IS NOT NULL, bukan operator sama dengan, sebaiknya dijadikan refleks sejak awal belajar agar tidak menjadi kebiasaan buruk yang terbawa ke query-query produksi yang jauh lebih kompleks.

Seri Belajar SQL Server:

← Sebelumnya: Dasar Query SELECT pada SQL Server

→ Selanjutnya: Mengurutkan Data dengan ORDER BY