EXCEPT
در SQL Server برای استثناء گرفتن مجموعه ای از ردیف ها از مجموعه دیگر استفاده می شود. در واقع، این عمل تفاضل مجموعه ها را در تئوری مجموعه ها انجام می دهد.
فرض کنید دو جدول به نام Customers
و HighSpenders
در پایگاه داده خود دارید. جدول Customers
شامل ستونهای CustomerID
، CustomerName
و TotalSpent
است. جدول HighSpenders
شامل CustomerID
برای مشتریانی است که در یک دوره خاص بیش از مقدار مشخصی خرج کردهاند.
هدف شما نمایش لیستی از تمام مشتریان است، به جز مشتریانی که در جدول HighSpenders
قرار دارند (یعنی مشتریانی که جزو خرج کنندگان بالا نیستند).
در اینجا یک پرس و جوی SQL با استفاده از EXCEPT
برای دستیابی به این هدف ارائه میشود:
SQL
SELECT CustomerID, CustomerName, TotalSpent
FROM Customers
EXCEPT
SELECT CustomerID
FROM HighSpenders;
توضیح:
- این پرس و جو از دو بخش تشکیل شده است که با
EXCEPT
از هم جدا شدهاند. - بخش اول:
- تمام ستونهای مورد نیاز را از جدول
Customers
انتخاب میکند.
- تمام ستونهای مورد نیاز را از جدول
- بخش دوم:
- فقط ستون
CustomerID
را از جدولHighSpenders
انتخاب میکند.
- فقط ستون
نکات:
- این پرس و جو به طور واضح و خوانا با استفاده از نامهای کامل توابع و کلمات کلیدی نوشته شده است.
- ستونهای انتخاب شده در هر دو بخش باید با هم مطابقت داشته باشند (در این مثال، هر دو بخش فقط
CustomerID
را انتخاب میکنند). - پرس و جو به طور کامل با توضیحات و تفاسیر ارائه شده است.
نتیجه:
این پرس و جو خروجی زیر را برمیگرداند که شامل اطلاعات مشتریانی است که در جدول HighSpenders
وجود ندارند (یعنی مشتریانی با هزینه کمتر از حد تعیین شده):
CustomerID | CustomerName | TotalSpent |
---|---|---|
۳ | Alice Smith | ۲۰۰.۰۰ |
۵ | David Miller | ۱۵۰.۰۰ |
۷ | Emily Jones | ۱۰۰.۰۰ |
همانطور که مشاهده میکنید، EXCEPT
به شما امکان میدهد ردیفهای موجود در یک مجموعه را از ردیفهای موجود در مجموعه دیگر حذف کند و نتیجه را نمایش دهد. این برای یافتن تفاوت بین دو مجموعه داده مفید است.
مثالهای دیگر:
- میتوانید از
INTERSECT
به جایEXCEPT
استفاده کنید تا فقط ردیفهای موجود در هر دو مجموعه را نمایش دهد. - میتوانید از
WHERE
clause در هر دو بخشEXCEPT
برای فیلتر کردن بیشتر دادهها استفاده کنید. - میتوانید از
ORDER BY
clause برای مرتبسازی نتایج استفاده کنید. - میتوانید از
LIMIT
clause برای محدود کردن تعداد ردیفهای برگشتی استفاده کنید.
منابع:
- https://learn.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-ver16
- https://www.w3schools.com/sql/sql_ref_not.asp
- https://stackoverflow.com/questions/43942911/using-except-and-distinct-in-sql-server