پایگاه داده های رابطه ای بر پایه ریاضی همچون نظریه مجموعه ها هستند. در اسکریپت های SQL می توانیم مفاهیم اجتماع (Union) و اشتراک (Intersect) و تفریق (Mines) را پیداه سازی کنیم. این مفاهیم برای ترکیب کردن سطرهای برگشتی چندین پرس و جو به کار گرفته می شوند. در پایگاه داده اوراکل برای پیاده سازی این مفاهیم عبارت های UNION و UNION ALL و INTERSECT و MINES به کار گرفته می شوند.

شکل زیر مغهوم عبارت های UNION و UNION ALL و INTERSECT و MINES را نشان می دهد. این مفاهیم را به عنوان عملگرها مجموعه (Set Operation) می خوانیم. همه آنها سطرهای برگشتی چندین عبارت SELECT را با هم ادغام کرده و سپس تنها یک نتیجه (سطرهایی) را برگشت می دهند.

  • عبارت UNION: پس از حذف سطرهای تکراری، سطرهای هر دو پرس و جوی SELECT را با یکدیگر ادغام می کند.
  • عبارت UNION ALL: همه سطرهای هر دو عبارت SELECT به همراه سطرهای تکراری را با هم ادغام می کند.
  • عبارت INTERSECT: تنها سطرهای همسان در هر دو عبارت SELECT را با یکدیگر ادغام می کند.
  • عبارت MINES: سطرهایی از عبارت SELECT نخست مه در دومین عبارت SELECT نیستند را در خروجی برگشت می دهد.

ساختار جدول ها و سطرهای این نوشته

در این نوشته برای آموزش مفاهیم، دو جدول به نام employees و job_hoistory را به کار می بریم. پیش از با جدول employees آشنا شده اید و پرس و جو های زیادی را روی آن آموزش داده ایم. در اوراکل اگر بخواهیم ساختار یک جدول شامل نام و گونه ستون را ببینیم باید دستورهای DESCRIBE یا DESC را همانند DESC hr.employees به کار ببریم. شکل زیر ساختار جدول employees را نشان می دهد.

این جدول شامل داده هایی درباره کارمندان مانند نام، نام خانوادگی، نشانی رایانامه، شماره تلفن، تاریخ استخدام، شناسه کار و مدیر و دپارتمان که کلیدهای خارجی به جدول های دیگر هستند. شکل زیر نمونه ای داده ها و سطرهای این جدول را نشان می دهد.

شکل های زیر ساختار و برخی از رکوردهای جدول job_history را نشان می دهند. در هر دو جدول ستون department_id هست و اگر به شکل رکوردهای هر دو جدول نگاه کنید سطرهایی در هر دو جدول هستند که مقدار ستون department_id برابر با شماره ۸۰ است. در ادامه بر روی همین سطرها از جدول ها مفاهیم Set Opeartions را نشان می دهیم.

اجتماع

کد زیر الگوی به کار گیری عبارت UNION را نشان می دهد. در همه عبارت های SELECT باید تعداد و گونه هر کدام از expression ها یکسان باشد. همچنین عبارت های SELECT در هر سوی عبارت UNION می توانند نتیجه JOIN یا پرس و جو های تو در تو باشند. در الگوی زیر تنها دو عبارت SELECT و یک عبارت UNION هست ولی می توان بیش از این نیز داشت.

اگر فرض کنیم می خواهیم سه عبارت SELECT را با عملگرهای مجموعه با هم ادغام کنیم، نتیجه عملگر مجموعه نخست بر روی دو عبارت SELECT نخست، با عملگر مجموعه دوم بر روی عبارت SELECT سوم اعمال می شود. به عبارت دیگر نتیجه هر دو عبارت SELECT و عملگر مجموعه یک سری سطرهای تازه است که می توانیم آن را با عملگر مجموعه دیگری بر روی عبارت SELECT دیگری ادغام کنیم.

کد و شکل ریز کدی را با عبارت UNION نشان می دهد. اگر کد را اجرا و خروجی آن را بررسی کنید، خواهید دید که هیچ سطری با شناسه کارمندی یا ستون employee_id برابر با ۱۷۶ و department_id برابر با ۸۰ نخواهد بود.

اجتماع با عملگر UNION ALL

هر دو عملگرهای UNION و UNION ALL همسان هستند و برای اجتماع دو عبارت SELECT به کار می روند ولی در UNION ALL سطرهای تکراری نیز در خروجی نشان داده می شوند از این رو در کد و شکل زیر سطرهای تکراری با ستون department_id با مقدار ۸۰ نیز نشان داده می شوند.

اشتراک با عملگر INTERSECT

در اشتراک سطرهایی نمایش داده می شود که در هر دو جدول هستند. کد و شکل زیر نمونه ای از به کار گیری عملگر INTERSECT را نشان می دهد. کد زیر فهرست همه کارمندانی را به همراه شناسه کاری و دپارتمانشان بر می گرداند که کار کنونی آنها با کار پیشین آنها یکی است. گمان کنید که کارمند پیش از این بر کاری بوده که هم اکنون نیز دوباره به همان کار برگشته است.

اشتراک با عملگر INTERSECT

در اشتراک سطرهایی نمایش داده می شود که در هر دو جدول هستند. کد و شکل زیر نمونه ای از به کار گیری عملگر INTERSECT را نشان می دهد. کد زیر فهرست همه کارمندانی را به همراه شناسه کاری و دپارتمانشان بر می گرداند که کار کنونی آنها با کار پیشین آنها یکی است. گمان کنید که کارمند پیش از این بر کاری بوده که هم اکنون نیز دوباره به همان کار برگشته است.

 تفریق با عملگر MINUS

در تفریق سطرهایی نمایش داده می شود که در جدول نخست هستند ولی در دومی نیستند. کد و شکل زیر نمونه ای از به کارگیری عملگر MINUS را نشان می دهد. کد زیر فهرست همه کارمندانی را به همراه شناسه کاری آنها نشان می دهد که هرگز پیش از این کارشان را عوض نکرده بودند.