مقایسه دادهها در SQL Server: راهنمای جامع عملگرهای نابرابری NOT EQUAL
در SQL Server، مقایسه مقادیر مختلف و یافتن رکوردهایی که با یک شرط خاص برابر نیستند، یک عملیات رایج است. برای این منظور، از چندین عملگر نابرابری (NOT EQUAL) و توابع مرتبط استفاده میشود. این عملگرها در بند `WHERE` برای فیلتر کردن نتایج، در بند `JOIN` برای تعریف روابط و در بسیاری سناریوهای دیگر کاربرد دارند.
اولین و رایجترین عملگرهای نابرابری در SQL Server، `!=` و “ هستند. این دو عملگر از نظر عملکردی کاملاً یکسان هستند و هر دو برای بررسی اینکه آیا دو مقدار با هم برابر نیستند، به کار میروند. انتخاب بین این دو معمولاً به سلیقه برنامهنویس یا استانداردهای کدنویسی پروژه بستگی دارد.
به عنوان مثال، برای انتخاب تمام رکوردهای مشتریانی که کشور آنها ‘ایران’ نیست، میتوانیم از هر دو عملگر به صورت زیر استفاده کنیم:
SELECT CustomerName, Country
FROM Customers
WHERE Country != 'ایران';
یا
SELECT CustomerName, Country
FROM Customers
WHERE Country <> 'ایران';
هر دو کوئری نتیجه یکسانی خواهند داد و تمام مشتریانی که کشورشان ‘ایران’ نیست را بازمیگردانند.
علاوه بر این عملگرهای مستقیم، SQL Server روشهای دیگری نیز برای بیان نابرابری یا عدم وجود دارد که میتوانند در سناریوهای پیچیدهتر مفید باشند.
**استفاده از `NOT IN`**
عملگر `NOT IN` برای بررسی اینکه آیا یک مقدار در مجموعهای از مقادیر مشخص شده وجود ندارد، به کار میرود. این عملگر به ویژه زمانی کاربرد دارد که میخواهید رکوردهایی را فیلتر کنید که مقادیر خاصی در یک لیست (که میتواند از یک زیرکوئری یا مجموعهای از مقادیر ثابت باشد) ندارند.
مثال: انتخاب مشتریانی که کشورشان نه ‘ایران’ است و نه ‘آمریکا’.
SELECT CustomerName, Country
FROM Customers
WHERE Country NOT IN ('ایران', 'آمریکا');
**نکته مهم در مورد `NOT IN` و `NULL`:** اگر لیست مقادیر در `NOT IN` شامل `NULL` باشد، کوئری ممکن است نتایج غیرمنتظرهای برگرداند. این به دلیل نحوه مدیریت `NULL` در SQL است، که `NULL` با هیچ چیز، حتی با خودش، برابر یا نابرابر تلقی نمیشود. بنابراین، هر مقایسهای با `NULL` همیشه `UNKNOWN` (ناشناخته) باز میگرداند.
**استفاده از `NOT EXISTS`**
عملگر `NOT EXISTS` برای بررسی اینکه آیا یک زیرکوئری هیچ رکوردی را برنمیگرداند، استفاده میشود. این عملگر به ویژه در سناریوهایی که نیاز به بررسی عدم وجود رکوردهای مرتبط در یک جدول دیگر دارید، قدرتمند است.
مثال: انتخاب مشتریانی که هیچ سفارشی ثبت نکردهاند.
SELECT CustomerName
FROM Customers c
WHERE NOT EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID);
این کوئری تمام مشتریانی را برمیگرداند که `CustomerID` آنها در جدول `Orders` وجود ندارد، به این معنی که هیچ سفارشی ندارند.
**کار با `NULL` و `IS NOT NULL`**
مقادیر `NULL` در SQL نشاندهنده عدم وجود داده یا ناشناخته بودن داده هستند و رفتار ویژهای در مقایسهها دارند. همانطور که گفته شد، `NULL` با هیچ چیز برابر یا نابرابر نیست. بنابراین، برای بررسی اینکه یک ستون `NULL` نیست، نمیتوانید از `!= NULL` یا ` NULL` استفاده کنید. در عوض، باید از عملگر `IS NOT NULL` استفاده کنید.
مثال: انتخاب مشتریانی که آدرس ایمیل آنها `NULL` نیست (یعنی آدرس ایمیل دارند).
SELECT CustomerName, Email
FROM Customers
WHERE Email IS NOT NULL;
**ترکیب عملگرها و ملاحظات عملکردی**
در کوئریهای پیچیدهتر، ممکن است نیاز به ترکیب عملگرهای نابرابری با عملگرهای منطقی (مانند `AND` و `OR`) داشته باشید. انتخاب صحیح عملگر و ساختار کوئری میتواند تأثیر زیادی بر عملکرد داشته باشد.
به عنوان مثال، کوئری زیر مشتریانی را انتخاب میکند که کشورشان ‘ایران’ نیست و درآمدشان بیشتر از 1000 است:
SELECT CustomerName, Country, Revenue
FROM Customers
WHERE Country <> 'ایران' AND Revenue > 1000;
هنگام کار با جداول بزرگ، ایندکسگذاری مناسب روی ستونهایی که در بند `WHERE` یا `JOIN` برای مقایسه نابرابری استفاده میشوند، میتواند به شدت عملکرد را بهبود بخشد. با این حال، باید توجه داشت که ایندکسها ممکن است در برخی سناریوهای نابرابری به اندازه ایندکسهای مربوط به برابری کارآمد نباشند، به خصوص اگر تعداد رکوردهای مطابق با شرط نابرابری بسیار زیاد باشد.
انتخاب بین `!=` و “ معمولاً به سلیقه شخصی برمیگردد، اما در برخی پایگاههای داده (نه SQL Server) ممکن است تفاوتهای جزئی در نحوه پردازش وجود داشته باشد. در SQL Server، این دو معادل هستند. برای سناریوهای عدم وجود در یک مجموعه، `NOT IN` و `NOT EXISTS` ابزارهای قدرتمندی هستند، با این تفاوت که `NOT EXISTS` معمولاً برای مجموعههای بزرگتر یا زیرکوئریهای پیچیدهتر کارایی بهتری دارد و در مواجهه با `NULL` ها در زیرکوئری، رفتار قابل پیشبینیتری دارد. مدیریت `NULL` با `IS NOT NULL` یا `IS NULL` ضروری است، زیرا `NULL` در مقایسههای معمولی نابرابری (مانند `!=` یا “) نتیجه نمیدهد.