در نظر بگیرید که دو جدول به نام Products
و OnlineOrders
در پایگاه داده خود دارید. جدول Products
شامل ستونهای ProductID
، ProductName
و UnitPrice
. جدول OnlineOrders
شامل ستونهای OrderID
، ProductID
و Quantity
است.
هدف شما نمایش لیستی از تمام محصولات به همراه قیمت واحد آنها است، حتی اگر محصول در هیچ سفارش online فروخته نشده باشد.
در اینجا یک پرس و جوی SQL با استفاده از UNION ALL
برای دستیابی به این هدف ارائه میشود:
SQL
SELECT
ProductID,
ProductName,
UnitPrice,
'NULL' AS OrderID,
'NULL' AS Quantity
FROM Products
WHERE ProductID NOT IN (SELECT ProductID FROM OnlineOrders)
UNION ALL
SELECT
p.ProductID,
p.ProductName,
p.UnitPrice,
o.OrderID,
o.Quantity
FROM Products p
INNER JOIN OnlineOrders o
ON p.ProductID = o.ProductID;
توضیح:
- این پرس و جو از دو بخش تشکیل شده است که با
UNION ALL
به هم متصل شدهاند. - بخش اول:
- اطلاعات مربوط به محصولاتی را انتخاب میکند که در هیچ سفارش online فروخته نشدهاند.
- از
WHERE
clause برای فیلتر کردن محصولاتی کهProductID
آنها در جدولOnlineOrders
وجود ندارد استفاده میکند. - مقادیر “NULL” را به ستونهای
OrderID
وQuantity
اختصاص میدهد.
- بخش دوم:
- اطلاعات مربوط به محصولاتی را انتخاب میکند که در حداقل یک سفارش online فروخته شدهاند.
- از
INNER JOIN
برای پیوستن به جداولProducts
وOnlineOrders
بر اساس ستونProductID
استفاده میکند. - تمام ستونهای مورد نیاز را از هر دو جدول انتخاب میکند.
نکات:
- این پرس و جو به طور واضح و خوانا با استفاده از نامهای کامل توابع و کلمات کلیدی نوشته شده است.
- از
UNION ALL
استفاده شده است تا اطمینان حاصل شود که هر محصول در خروجی ظاهر شود، حتی اگر در هیچ سفارش online فروخته نشده باشد. - پرس و جو به طور کامل با توضیحات و تفاسیر ارائه شده است.
نتیجه:
این پرس و جو خروجی زیر را برمیگرداند:
ProductID | ProductName | UnitPrice | OrderID | Quantity |
---|---|---|---|---|
۱ | Laptop | ۱۰۰۰.۰۰ | NULL | NULL |
۲ | Monitor | ۵۰۰.۰۰ | NULL | NULL |
۳ | Keyboard | ۵۰.۰۰ | ۱ | ۲ |
۴ | Mouse | ۲۰.۰۰ | ۱ | ۱ |
۵ | Desk | ۲۰۰.۰۰ | ۲ | ۱ |
همانطور که مشاهده میکنید، UNION ALL
به شما امکان میدهد دو یا چند پرس و جو را به هم متصل کنید و تمام ردیفها را از پرس و جوهای جداگانه، حتی ردیفهای تکراری، در خروجی نهایی نمایش دهد. این برای نمایش مجموعه کامل دادهها از چندین منبع مفید است.
مثالهای دیگر:
- میتوانید از
UNION
به جایUNION ALL
استفاده کنید تا ردیفهای تکراری حذف شوند. - میتوانید از
ORDER BY
clause برای مرتبسازی نتایج استفاده کنید. - میتوانید از
LIMIT
clause برای محدود کردن تعداد ردیفهای برگشتی استفاده کنید.
منابع:
- https://learn.microsoft.com/en-us/sql/ssms/visual-db-tools/create-union-queries-visual-database-tools?view=sql-server-ver16
- https://www.w3schools.com/sql/sql_ref_union.asp
- https://www.simplilearn.com/tutorials/sql-tutorial