معاملات الربط بين نتائج الاستعلامات في SQL
تستخدم لدمج نتائج عدد من الاستعلامات وفق ثلاثة معاملات:
الضم UNION
: وهي عملية احتواء نتائج كافة الاستعلامات التي يربط بينها المعامل UNION
دون أي تكرار في السجلات.
التقاطع INTERSECT
: عملية تقاطع النتائج ما بين الاستعلامات، أي إظهار النتائج المشتركة فقط ما بين الاستعلامات التي يربط بينها المعامل INTERSECT
.
الاستثناء EXCEPT
: عملية استثناء نتائج الاستعلام الذي يلي المعامل EXCEPT
، وتختلف الكلمة المفتاحية لهذا المعامل في محرك Oracle إذ هي MINUS
بدلًا من EXCEPT
.
انظر إلى مخططات فن Venn Diagrams لرسومات توضيحية.
مثال
إن كان الجدول الآتي patients
موجودًا في قاعدة البيانات:
Doctor | Section | Age | Patient | PatientID |
---|---|---|---|---|
Nasser | Cardiology | 76 | Salem | 1029 |
Abd Allah | Neurology | 17 | Hasan | 896 |
Reem | Maternity | 23 | Nadine | 964 |
Fateh | Cardiology | 65 | Rami | 1070 |
Kareem | Neurology | 19 | Abd al-Rahim | 1150 |
Hadi | Critical Care | 65 | Roushd | 1097 |
Reem | Maternity | 27 | Sana | 1034 |
Abd Allah | Neurology | 49 | Helen | 963 |
Hadi | Critical Care | 58 | Ahmad | 1154 |
Kareem | Neurology | 40 | Maher | 1069 |
Amnah | Maternity | 30 | Zeina | 1028 |
إن كان الاستعلام الآتي:
SELECT *
FROM patients
WHERE Age<45
UNION
SELECT *
FROM patients
WHERE Doctor='Abd Allah';
فإن المعامل UNION
يربط نتائج الاستعلامين ليشمل السجلات الواردة في كليهما أي ستظهر السجلات التي عمر المريض فيها أقل من 45 سنة والسجلات التي اسم الطبيب فيها هو Abd Allah، لتظهر النتائج الآتية:
Doctor | Section | Age | Patient | PatientID |
---|---|---|---|---|
Abd Allah | Neurology | 17 | Hasan | 896 |
Reem | Maternity | 23 | Nadine | 964 |
Kareem | Neurology | 19 | Abd al-Rahim | 1150 |
Reem | Maternity | 27 | Sana | 1034 |
Abd Allah | Neurology | 49 | Helen | 963 |
Kareem | Neurology | 40 | Maher | 1069 |
Amnah | Maternity | 30 | Zeina | 1028 |
أما في الاستعلام الآتي:
SELECT *
FROM patients
WHERE Age<45
INTERSECT
SELECT *
FROM patients
WHERE Doctor='Abd Allah';
فإن المعامل INTERSECT
يُبقي السجلات المشتركة ما بين الاستعلامين فقط ولا يظهر سواها، تظهر النتائج الآتية:
Doctor | Section | Age | Patient | PatientID |
---|---|---|---|---|
Abd Allah | Neurology | 17 | Hasan | 896 |
أما في الاستعلام الآتي:
SELECT *
FROM patients
WHERE Age<45
EXCEPT -- MINUS in Oracle DB
SELECT *
FROM patients
WHERE Doctor='Abd Allah';
فتظهر سجلات الاستعلام الأول من بعد استثناء سجلات الاستعلام الثاني منها أي سيُحذف منها كل سجل فيه اسم الطبيب Abd Allah ، لتظهر النتائج:
Doctor | Section | Age | Patient | PatientID |
---|---|---|---|---|
Reem | Maternity | 23 | Nadine | 964 |
Kareem | Neurology | 19 | Abd al-Rahim | 1150 |
Reem | Maternity | 27 | Sana | 1034 |
Kareem | Neurology | 40 | Maher | 1069 |
Amnah | Maternity | 30 | Zeina | 1028 |
عرض السجلات المكررة UNION ALL
تستخدم الكلمة المفتاحية ALL
لضمان عرض السجلات بتكرارها دون حذفه.
مثال
ليكن لدينا الجدولان الآتيان في قاعدة البيانات:
الجدول الأول: المدرسون teachers
Course | Name | TeacherID |
---|---|---|
English (Adv) | Dr. Reem Hadi | 1024 |
Artificial Intelligence | Eng. Nasser Sharif | 1025 |
Photoshop Design | Mr. Maher Siraj | 1026 |
الجدول الثاني: الطلاب students
Course | Name | StudentID |
---|---|---|
Photoshop Design | Aya Akkad | 820 |
Networks | Hiba Abd Allah | 821 |
SQL Programming | Ammar Helali | 822 |
Artificial Intelligence | Loujain Zein | 823 |
إن تنفيذ الاستعلام الآتي:
SELECT Course FROM teachers
UNION ALL
SELECT Course FROM students
ORDER BY Course;
سيؤدي لظهور أسماء الدورات التدريبية دون حذف أي تكرار فيها كما يلي:
Course |
---|
Artificial Intelligence |
Artificial Intelligence |
English (Adv) |
Networks |
Photoshop Design |
Photoshop Design |
SQL Programming |
أما بحذف الكلمة المفتاحية ALL
من الاستعلام، أي بالشكل:
SELECT Course FROM teachers
UNION ALL
SELECT Course FROM students
ORDER BY Course;
سيؤدي لحذف النتائج المكررة لتصبح بالشكل:
Course |
---|
Artificial Intelligence |
English (Adv) |
Networks |
Photoshop Design |
SQL Programming |
التوافقية
SQLServer | SQLite | Oracle | PostgreSQL | MySQL |
---|---|---|---|---|
نعم | نعم | نعم | نعم | لا |