راهنمای WHERE IN در SQL برای SELECT UPDATE DELETE

بهینه‌سازی فیلتر داده‌ها با 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 CustomerID FROM Customers WHERE Region = ‘East’)

سپس، کوئری اصلی از نتیجه این زیرکوئری برای فیلتر کردن استفاده می‌کند:


        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`های بخش فروش:

(SELECT DepartmentID FROM Departments WHERE DepartmentName = ‘Sales’)

و سپس کوئری `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`های کاربران غیرفعال:

(SELECT UserID FROM InactiveUsers)

کوئری `DELETE` نهایی به این شکل خواهد بود:


        DELETE FROM TempData
        WHERE CreatedDate < GETDATE() - 30 AND UserID IN (SELECT UserID FROM InactiveUsers);
    

این کوئری تمام رکوردهای جدول `TempData` را که تاریخ ایجاد آن‌ها بیشتر از ۳۰ روز گذشته است و مربوط به `UserID`های موجود در جدول `InactiveUsers` هستند، حذف می‌کند. استفاده از `WHERE IN` با زیرکوئری در عملیات `DELETE` به شما امکان می‌دهد تا عملیات حذف را بر اساس معیارهای پیچیده‌تر و دینامیک انجام دهید و از این رو، یک ابزار قدرتمند برای نگهداری و مدیریت داده‌ها در پایگاه داده‌های SQL Server به شمار می‌رود.

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟