📚 فصل ۱۸ — عملگرهای منطقی (AND, OR, NOT) در SQL Server
1️⃣ مقدمه — چرا عملگرهای منطقی مهماند؟
وقتی با شرطهای پیچیده در SQL کار میکنیم، معمولاً لازم داریم چندین شرط را با هم ترکیب کنیم.
عملگرهای منطقی دقیقا این کار را انجام میدهند:
- AND → همه شرطها باید درست باشند.
- OR → حداقل یکی از شرطها باید درست باشد.
- NOT → شرط را برعکس میکند.
📌 این عملگرها در سه دستور زیر بیشترین کاربرد را دارند:
- SELECT → فیلتر کردن دادهها
- UPDATE → آپدیت رکوردهای خاص
- DELETE → حذف رکوردها
2️⃣ ساختار کلی استفاده
SELECT ستونها
FROM جدول
WHERE شرط_۱ [AND | OR] شرط_۲ [AND | OR] ...;
3️⃣ عملگر AND — همه شرطها باید برقرار باشند
وقتی از AND استفاده میکنیم، رکورد فقط زمانی میآید که تمام شرطها درست باشند.
مثال — مشتریان تهران و فعال
SELECT *
FROM Customers
WHERE City = N'تهران' AND IsActive = 1;
📌 فقط مشتریان تهرانی که ستون IsActive آنها برابر ۱ است.
4️⃣ عملگر OR — کافی است یکی برقرار باشد
وقتی از OR استفاده میکنیم، رکورد اگر حتی یکی از شرطها درست باشد نمایش داده میشود.
مثال — مشتریان تهران یا مشهد
SELECT *
FROM Customers
WHERE City = N'تهران' OR City = N'مشهد';
📌 هرکس در تهران یا مشهد باشد میآید.
5️⃣ عملگر NOT — معکوس کردن شرط
اگر شرط درست باشد، با NOT نادرست میشود، و برعکس.
مثال — همه مشتریانی که شهرشان مشهد نیست
SELECT *
FROM Customers
WHERE NOT City = N'مشهد';
6️⃣ ترکیب عملگرها و اهمیت پرانتز
در SQL، AND اول اجرا میشود، بعد OR.
برای کنترل اولویت، از پرانتز استفاده کنید.
مثال — بدون پرانتز
SELECT *
FROM Customers
WHERE City = N'تهران' OR City = N'مشهد' AND IsActive = 1;
📌 اینجا اول AND اجرا میشود، یعنی:
- مشتریان مشهدی که فعال هستند
- یا مشتریان تهران (بدون توجه به فعال بودن)
مثال — با پرانتز
SELECT *
FROM Customers
WHERE (City = N'تهران' OR City = N'مشهد') AND IsActive = 1;
📌 اینجا نتیجه متفاوت است: فقط مشتریان تهرانی یا مشهدی که فعال باشند.
7️⃣ مثال عملی — فیلتر چندگانه
فرض کنید میخواهیم محصولاتی را ببینیم که:
- قیمت بیش از ۵۰ هزار دارند، یا
- موجودی آنها بیش از ۱۰۰ است، ولی
- دستهبندی آنها برابر ۳ نباشد.
SELECT *
FROM Products
WHERE (Price > 50000 OR Stock > 100) AND NOT CategoryID = 3;
8️⃣ AND، OR و NOT با توابع
میتوان از توابع داخلی هم داخل شرط استفاده کرد.
مثال — کاربرانی که سال تولدشان بعد از ۱۳۷۰ است و فعالاند:
SELECT *
FROM Users
WHERE YEAR(BirthDate) > 1991 AND IsActive = 1;
9️⃣ AND، OR با BETWEEN، IN و LIKE
مثال ۱ — ترکیب AND و BETWEEN
SELECT *
FROM Orders
WHERE Status = N'پرداخت شده' AND OrderDate BETWEEN '2025-01-01' AND '2025-06-30';
مثال ۲ — ترکیب OR و IN
SELECT *
FROM Customers
WHERE City IN (N'تهران', N'مشهد') OR Country = N'ایران';
مثال ۳ — ترکیب NOT و LIKE
SELECT *
FROM Customers
WHERE NOT FullName LIKE N'%آزمایشی%';
🔟 اشتباهات رایج
- فراموش کردن پرانتز در ترکیب AND و OR در شرطهای پیچیده.
- استفاده نادرست از NOT با چند شرط:
-- اشتباه
WHERE NOT City = N'مشهد' AND City = N'تهران';
-- درست (اینجا NOT روی کل پرانتز اعمال شده)
WHERE NOT (City = N'مشهد' AND City = N'تهران');
- شرطهای زیاد که باعث کندی کوئری میشوند.
- نداشتن ایندکس روی ستونهای پرتکرار در WHERE.
1️⃣1️⃣ سناریوهای واقعی پروژهای
سناریو ۱ — مشتریان VIP
نمایش افرادی که یا بیش از ۱۰ خرید داشتهاند یا خریدشان بالای ۵۰ میلیون بوده و وضعیتشان فعال است:
SELECT *
FROM Customers
WHERE (TotalOrders > 10 OR TotalAmount > 50000000) AND IsActive = 1;
سناریو ۲ — حذف سفارشهای تستی
DELETE FROM Orders
WHERE (CustomerID IN (999, 1000) OR OrderNotes LIKE N'%تست%')
AND OrderDate < '2025-01-01';
سناریو ۳ — بهروزرسانی موجودی محصولات
UPDATE Products
SET Stock = Stock + 50
WHERE CategoryID = 4 AND (Stock < 10 OR LastRestockDate < '2025-06-01');
1️⃣2️⃣ تمرینهای عملی
- همه کارمندانی که در بخش IT یا HR کار میکنند و سابقه بیش از ۵ سال دارند.
- همه محصولاتی که یا نامشان شامل “کتاب” است یا قیمتشان بین ۱۰۰ و ۲۰۰ هزار تومان است.
- همه سفارشهایی که پرداخت نشدهاند اما وضعیتشان “ارسال شده” نیست.
- حذف کاربران غیرفعالی که بیش از یک سال است وارد سیستم نشدهاند یا هیچ سفارش ثبت نکردهاند.
- آپدیت وضعیت سفارشهایی که یا متعلق به مشتریان جدید است یا تاریخشان کمتر از یک هفته است.
1️⃣3️⃣ جمعبندی
در این فصل یاد گرفتید:
- AND → همه شروط باید درست باشند
- OR → کافیست یکی درست باشد
- NOT → برعکس کردن شرط
- ترتیب اجرای شرطها و اهمیت پرانتز
- ترکیب این عملگرها با LIKE، IN، BETWEEN و توابع
- سناریوهای واقعی و اشتباهات رایج