بهینهسازی فیلتر دادهها با WHERE IN در SQL: راهنمای SELECT، UPDATE، DELETE
عبارت `WHERE IN` در SQL ابزاری قدرتمند برای فیلتر کردن دادههاست که به شما امکان میدهد ردیفهایی را انتخاب، بهروزرسانی یا حذف کنید که یک ستون خاص در مجموعه مشخصی از مقادیر قرار دارد. این مجموعه مقادیر میتواند به صورت مستقیم مشخص شود یا از طریق یک زیرکوئری (subquery) پویا ایجاد گردد. استفاده از `WHERE IN` خوانایی کوئریها را افزایش داده و مدیریت عملیات روی چندین آیتم را ساده میکند.
برای مثال، فرض کنید میخواهیم کارمندانی را انتخاب کنیم که شناسههای خاصی دارند. به جای نوشتن چندین شرط `OR`، میتوانیم از `WHERE IN` استفاده کنیم:
SELECT *
FROM Employees
WHERE EmployeeID IN (1, 2, 3);
این کوئری تمام جزئیات کارمندانی با شناسههای ۱، ۲ و ۳ را بازمیگرداند. این روش برای کار با لیستهای ثابت و کوچک از مقادیر بسیار کارآمد است.
در مثالی پیچیدهتر، ممکن است بخواهیم سفارشهای مشتریانی را انتخاب کنیم که در یک منطقه خاص قرار دارند. در اینجا، زیرکوئری به کمک میآید تا لیست `CustomerID`ها را به صورت پویا تولید کند.
ابتدا زیرکوئری برای شناسایی مشتریان منطقه مورد نظر اجرا میشود:
سپس، کوئری اصلی از نتیجه این زیرکوئری برای فیلتر کردن استفاده میکند:
SELECT *
FROM Orders
WHERE CustomerID IN (SELECT CustomerID FROM Customers WHERE Region = 'East');
این کوئری تمام سفارشهایی را بازیابی میکند که توسط مشتریان مستقر در منطقه “East” ثبت شدهاند. این روش انعطافپذیری بالایی را فراهم میکند، زیرا لیست مقادیر `CustomerID` به صورت خودکار توسط زیرکوئری تولید میشود و نیازی به بهروزرسانی دستی آن نیست.
`WHERE IN` تنها برای انتخاب دادهها نیست و میتوان از آن در عملیات `UPDATE` نیز استفاده کرد تا چندین ردیف را به صورت همزمان بهروزرسانی کنید.
به عنوان مثال، برای افزایش ۱۰ درصدی قیمت محصولات با شناسههای ۱۰۱، ۱۰۵ و ۱۱۰، کوئری زیر استفاده میشود:
UPDATE Products
SET Price = Price * 1.10
WHERE ProductID IN (101, 105, 110);
مشابه مثال `SELECT` با زیرکوئری، میتوان از `WHERE IN` به همراه یک زیرکوئری در عبارت `UPDATE` نیز استفاده کرد. فرض کنید میخواهیم حقوق کارمندان بخش فروش را ۵ درصد افزایش دهیم. برای این کار، ابتدا شناسههای بخش فروش را با یک زیرکوئری پیدا میکنیم.
زیرکوئری برای یافتن `DepartmentID`های بخش فروش:
و سپس کوئری `UPDATE` نهایی به این شکل خواهد بود:
UPDATE Employees
SET Salary = Salary * 1.05
WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'Sales');
این کوئری تمام کارمندانی را که در بخش “Sales” کار میکنند، پیدا کرده و حقوق آنها را ۵ درصد افزایش میدهد.
در نهایت، `WHERE IN` در عملیات `DELETE` نیز کاربرد فراوانی دارد، به ویژه زمانی که نیاز به حذف چندین ردیف خاص باشد.
برای حذف ردیفهای گزارش با شناسههای ۴، ۵ و ۶:
DELETE FROM Logs
WHERE LogID IN (4, 5, 6);
و با استفاده از زیرکوئری، میتوانیم به صورت پویا ردیفهایی را برای حذف شناسایی کنیم. برای مثال، حذف دادههای موقت مربوط به کاربران غیرفعال که بیش از ۳۰ روز از ایجاد آنها گذشته است.
زیرکوئری برای شناسایی `UserID`های کاربران غیرفعال:
کوئری `DELETE` نهایی به این شکل خواهد بود:
DELETE FROM TempData
WHERE CreatedDate < GETDATE() - 30 AND UserID IN (SELECT UserID FROM InactiveUsers);
این کوئری تمام رکوردهای جدول `TempData` را که تاریخ ایجاد آنها بیشتر از ۳۰ روز گذشته است و مربوط به `UserID`های موجود در جدول `InactiveUsers` هستند، حذف میکند. استفاده از `WHERE IN` با زیرکوئری در عملیات `DELETE` به شما امکان میدهد تا عملیات حذف را بر اساس معیارهای پیچیدهتر و دینامیک انجام دهید و از این رو، یک ابزار قدرتمند برای نگهداری و مدیریت دادهها در پایگاه دادههای SQL Server به شمار میرود.