معاملات الربط بين نتائج الاستعلامات في SQL

من موسوعة حسوب
< SQL
اذهب إلى التنقل اذهب إلى البحث
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

تستخدم لدمج نتائج عدد من الاستعلامات وفق ثلاثة معاملات:

الضم 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
نعم نعم نعم نعم نعم

مصادر