10
والتحكمماسبات هندسة الثالثة السنة البيانات ر قواعد ا مقرادسةية السعملسة الل ال1 رات الزئيةتفساس اSub Queries توفر لغةSQL مات جزئية أو فرعيةى استعتدع( ماتة استعموع أو ممنية إدراج استع إمكاsub query سي.م رئي استع ) ما رمزنا بـ إذاsqi م فرعي,ستع نستطيع انا فإنماتستعتداخل افة لختلت اما عن ا لتعبلتالية:ت ا بالصياغا1) select columns from table_name where column_name=(sqi); ... الفرعي ضمن قوسمستعرة ا عباا نضعن وحيث أنعيدب أن يلسابقة يغة الصيا ا sqi واحد وسج واحدا عمودا( وحيدة قيمة) ا رسالة خطأ , وستظهرف ذلك ة. مثال( 1 ) راتب: يتقاضى أك الذي)وظفأو ا( وظفت ا هو بياناطلوبن ا كا : إذاselect * from emp where sal=(select max(sal) from emp); أي م الفرعي أوستعم تنفيذ ا يتselect max(sal) from emp ,كدة الراتب ا ويتم إعا م الفرعيستعدة عن اعا القيمة ا يستخدم والذيسيم الرئيستع ا التنفيذ إ ينتقلقارنة ا طلوبة.ئج النتادة ا وإعا( مثال2 :) تباضون رالذين يتقا اوظفت ا هو بياناطلوبن ا كا إذا أقل لميع الوسطيعدل من ا الرواتب:select * from emp where sal<(select avg(sal) from emp); ( مثال3 وظفعمل فيه ا يت القسم الذي هو بياناطلوبن ا كا: إذا) scott : select dname from dept where deptno=(select deptno from emp where lower(ename)='scott'); 2) select columns from table_name where column_name in (sqi); عيد أن يكن لسابقةغة الصيا ا sqi ن قيمة... أكثر م مثال( 1 ) : ا هي فيهوظف الث مهنة أحد اقسامت ا هو بياناطلوبن ا كا إذاclerk : select * from dept where deptno in (select deptno from emp where lower(job)='clerk'); وج م الفرعي أوستعم تنفيذ ا يت قتة. بعدئحة مق )ثال هذا ا ن قيمةأكثر م( عادةن القيم ا زيقارنة عملية ا ذلك تريعاملستخدام ا باin ئحة...ذه ال مع ه

SQL Subqueries

Embed Size (px)

DESCRIPTION

How to write subqueries in the Structured Query Language SQL. Several forms of these queries are explained with examples.Joins and self-joins.

Citation preview

Page 1: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

1

Sub Queries االستفسارات اجلزئية

subإمكانية إدراج استعالم أو جمموعة استعالمات )تدعى استعالمات جزئية أو فرعية SQLتوفر لغة

query.يف استعالم رئيسي )

لتعبري عن احلاالت املختلفة لتداخل االستعالمات فإننا نستطيع االستعالم فرعي, sqiإذا ما رمزنا بـ بالصياغات التالية:

1) select columns from table_name

where column_name=(sqi);

وحيث أننا نضع عبارة االستعالم الفرعي ضمن قوسني..., وستظهر رسالة خطأ اً(قيمة وحيدة )عموداً واحداً وسجاًل واحد sqiيف الصياغة السابقة جيب أن يعيد

.خبالف ذلك : إذا كان املطلوب هو بيانات املوظف )أو املوظفني( الذي يتقاضى أكرب راتب:(1)مثال

select * from emp

where sal=(select max(sal) from emp);

مث ويتم إعادة الراتب األكرب, select max(sal) from empيتم تنفيذ االستعالم الفرعي أواًل أي يف املقارنة ينتقل التنفيذ إىل االستعالم الرئيسي والذي يستخدم القيمة املعادة عن االستعالم الفرعي

وإعادة النتائج املطلوبة.من املعدل الوسطي جلميع أقلإذا كان املطلوب هو بيانات املوظفني الذين يتقاضون راتبًا (: 2مثال)

الرواتب:select * from emp

where sal<(select avg(sal) from emp);

:scott(: إذا كان املطلوب هو بيانات القسم الذي يعمل فيه املوظف 3مثال)select dname from dept

where deptno=(select deptno from emp where lower(ename)='scott');

2) select columns from table_name

where column_name in (sqi);

أكثر من قيمة... sqiيف الصياغة السابقة ميكن أن يعيد :clerkإذا كان املطلوب هو بيانات األقسام اليت مهنة أحد املوظفني فيها هي : (1)مثال

select * from dept

where deptno in (select deptno from emp where lower(job)='clerk');

زين القيم املعادة )أكثر من قيمة يف هذا املثال( يف الئحة مققتة. بعد يتم تنفيذ االستعالم الفرعي أواًل وخت مع هذه الالئحة... inباستخدام املعامل ذلك جتري عملية املقارنة

Page 2: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

2

مالحظة: ميكن أن جند عدة مستويات لتداخل االستعالمات, مبعىن أن جند استعالمًا فرعيًا ضمن ., وهكذا..استعالم فرعي آخر

:3كان املطلوب إعادة بيانات األقسام اليت عدد املوظفني فيها أكرب من إذا (:2مثال)select * from dept

where deptno in (select deptno from

(select deptno, count(ename) from emp group by deptno having

count(ename)>3));

:, وهنا يف هذا املثالداخل األكربيف مستوى الت ةالواقع اتيتم يف البداية تنفيذ االستعالمselect deptno, count(ename) from emp group by deptno having

count(ename)>3

, وهكذا للوصول إىل االستعالم الرئيسي...1تعالمات الواقعة يف مستوى التداخل األقل بـ مث االس

عدد من موظفيها رواتب ترتاوح بني إذا كان املطلوب إعادة بيانات األقسام اليت يتقاضى(: 3مثال) والراتب األكرب يف مجيع األقسام. 3000

select * from dept

where deptno in (select deptno from emp where sal between

3000 and (select max(sal) from emp));

ها أكرب من متوسط الراتب (: إذا كان املطلوب هو إعادة بيانات األقسام اليت متوسط الرواتب في4مثال) الكلي:

select * from dept where deptno in

(select deptno from (select deptno, avg(sal) from emp group by deptno

having avg(sal)>(select avg(sal) from emp)));

من الواضح أننا كتبنا االستعالم السابق اعتماداً على ما يلي: استعالم فرعي يعيد متوسط مجيع الرواتب. احلاجة إىل -1احلاجة إىل استعالم فرعي يعيد رقم القسم ومتوسط الرواتب يف هذا القسم جممعني حسب رقم -2

القسم. احلاجة إىل اختيار رقم القسم من االستعالم السابق... -3هلا يف االستعالم العملية األخرية ليست سوى إدراج االستعالمات السابقة بالرتتيب املنطقي -4

الرئيسي.)موقع dallasويعملون يف والية clerk(: إذا كان املطلوب بيانات املوظفني الذين مهنتهم 5مثال)

أقسامهم(:select * from emp

where deptno in (select deptno from dept where lower(loc)='dallas')

and lower(job)='clerk';

Page 3: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

3

:الستفسارات اجلزئيةبا متعلقة مالحظات

.مهما كان مستوى تداخله بقوسني جزئي استفساركل جيب أن حياط -1اليت تتعامل )املعامالت( ميكن استخدام االستفسارات اجلزئية اليت تعطي سطرًا واحدًا مع املقثرات -2

مع قيمة وحيدة أو عدة قيم.فقط مع املقثرات اليت تتعامل مع عدة ميكن استخدام االستفسارات اليت تنتج أكثر من سطر واحد -3

قيم. 3) select columns from table_name, sq1 alias_name1, sq2 alias_name2,….

Where some_condition;

. يف حني أن fromتتضمن استفسارات جزئية )مع أو بدون جداول أساسية( يف عبارة الصياغة السابقة سيتضمن شروطًا غالبًا ما تكون متعلقة باالستفسارات اجلزئية الواردة يف يف هذه احلالة whereشرط , كما أنه قد يتضمن استفسارات جزئية أخرى...fromعبارة

حىت نستطيع fromهنا هو األمساء البديلة لالستعالمات الواردة يف عبارة alias_nameاملقصود بالـ , وميكن تسمية االستعالمات اجلزئية whereمر يف عبارة التعامل مع السجالت املعادة منها إذا لزم األ

ألعمدة املعادة يف االستفسارات العادية...متاماً كما نسمي ا fromيتم تنفيذ هذا النوع من االستعالمات بإعادة السجالت املوافقة لالستعالمات الواردة يف عبارة

.whereأواًل مث اختيار ما يناسب وفق الشرط الوارد يف عبارة األقسام املختلفة مع عدد املوظفني يف كل قسم:بيانات إعادة إذا كان املطلوب (: 1مثال)

نالحظ هنا أننا حنتاج إىل استعالم يعيد أرقام األقسام وعدد املوظفني يف كل قسم مع التجميع حسب .empرقم القسم, واالستفسار هنا يتم تطبيقه على اجلدول

ار أعمدة حمددة من االستعالم السابق, وهذا يتطلب وضعه يف عبارة بعد ذلك حنن حباجة إىل اختيfrom وتسميته تسمية بديلة , (emp_num_q) الستخدامه يف شرط االستفسار بغرض اختيار بيانات

.deptيف االستعالم الفرعي واجلدول deptnoاألقسام بناء على تساوي عمودي الـ select dept.deptno, dname, loc, emp_num_q.emp_num

from dept, (select deptno, count(ename) emp_num from emp group by deptno)

emp_num_q

where dept.deptno=emp_num_q.deptno;

إذا كان املطلوب إعادة بيانات األقسام املختلفة, مع متوسط الرواتب, الراتب األعلى, الراتب (: 2مثال) األدىن يف كل قسم:

select dept.deptno,dname,loc, sal_q.avg_sal, sal_q.max_sal, sal_q.min_sal

from dept, (select deptno, avg(sal) avg_sal, max(sal) max_sal, min(sal) min_sal

from emp group by deptno) sal_q

Page 4: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

4

where dept.deptno=sal_q.deptno;

مل يشرتك م قبل أمساء األعمدة املعادة, وذلك يف حال مالحظة: ال ضرورة لذكر االسم البديل لالستعال .fromهبذا االسم أعمدة موجودة يف استفسارات جزئية أخرى أو جداول مذكورة يف عبارة

)أو األقسام يف حال اشرتكت القسم ذي متوسط الرواتب األعلى بيانات املطلوب إعادة(: 3مثال) :متوسط الراتب ذاكباملتوسط األعلى ذاته( مع

select dept.deptno, dname, loc , sal_avg_q.sal_avg

from dept, (select deptno, avg(sal) sal_avg from emp group by deptno)

sal_avg_q

where dept.deptno=sal_avg_q.deptno and sal_avg =

(select max(sal_avg) from (select deptno, avg(sal) sal_avg from emp group by

deptno) );

من fromيف القسم الفرعي ال بد من اإلشارة هنا إىل أننا ال نستطيع استخدام االسم البديل لالستعالم بالشكل:يف االستعالم السابق whereعبارة كتابة , فال نستطيعاستعالمات فرعية أخرى

where dept.deptno=sal_avg_q.deptno and sal_avg =

(select max(sal_avg) from sal_avg_q) إعادة بيانات القسم الذي يعمل فيه املوظف ذو الراتب األعلى مع قيمة ذلك الراتب:(: 4مثال)

select deptno, dname, loc , max_sal_q.max_sal

from dept, (select max(sal) max_sal from emp) max_sal_q

where deptno in (select deptno from emp where sal = max_sal_q.max_sal); مالحظة: قد نصادف أشكااًل أخرى لتداخل االستعالمات, غري أهنا غالبًا ما تكون جتميعًا لألشكال

السابقة.

:متفرقة عن االستعالمات املتداخلة أمثلةيها, األقسام مع أمساء املوظفني الذين يتقاضون أعلى راتب فإذا كان املطلوب إعادة بيانات (: 1مثال)

:, ومهنة املوظفراتبوقيمة ذلك الselect dept.deptno, dname, loc, max_sal_q.max_sal, ename, job

from emp, dept, (select deptno, max(sal) max_sal from emp group by deptno)

max_sal_q

where dept.deptno=emp.deptno and dept.deptno=max_sal_q.deptno

and ename in (select ename from emp where sal = max_sal_q.max_sal);

واحتجنا إىل )أو عدة أعمدة( عمودين sqi يف حال ما إذا أعاد أحد االستعالمات الفرعيةمالحظة: :, نستطيع أن نكتب(مثالً inباستخدام )هذين العمودين معاً قيم املقارنة مع

where (col1, col2) in (sqi);

Page 5: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

5

اء األعمدة اليت نبحث عن تساوي قيمها مع القيم املعادة يف أعمدة هي أمس col1, col2حيث أن , وجيب أن يكون عددها دوماً مساوياً لعدد تلك األعمدة...sqiاالستعالم

إعادة بيانات املوظفني الذين يتقاضون أعلى راتب يف كل قسم:إذا كان املطلوب : (2مثال)select * from emp

where (deptno,sal) in

(select deptno,max(sal) from emp group by deptno); كما ونستطيع كتابة االستعالم السابق كما يلي:

select * from emp

where sal in

(select max_sal from (select deptno,max(sal) max_sal from emp group by

deptno));

راء عمليات التحديث للبيانات املخزنة يف (: ميكن استخدام االستعالمات املتداخلة عند إج2مالحظة) .updateللتعليمة whereاجلداول, وذلك بكتابة تلك االستعالمات يف عبارة

مبقدار salesيعملون يف قسم املبيعات ملوظفني الذين ا commعمولة زيادة إذا كان املطلوب (: 3مثال)10 :

update emp

set comm=nvl(comm,0)+10

where deptno=(select deptno from dept where lower(dname)='sales');

على األقل يف ناتج واحد التحقق من وجود سطر بيقوم , لwhereويكتب يف القسم : exists معامل

يف احلالة falseو ,وجود ذلك السطريف حالة trueاستفسار جزئي. وتكون قيمة ناتج تطبيق املعامل هي التالية: existsحتتوي املعامل اليت selectة لتعليم الشكل العام .املعاكسة

Select column_name, other_columns … from table_name alias_name

where exists(sqi);

وعادة ما يكون بالشكل: هو استفسار جزئي, sqiحيث أن Select column_name, other_columns from table_name where

table_name.column_name = column_name …………;

إن التسمية البديلة للجدول واجبة فقط يف حال كان اجلدول الوارد يف االستفسار اخلارجي هو ذاته الوارد يف االستفسار اجلزئي.

ض األقسام قد مت افتتاحها حديثاً, وال يعمل فيها حاليًا أي موظفني, إذا علمت أن بع (:4مثال) م اليت يعمل فيها موظفون:املطلوب إعادة بيانات األقسا

select * from dept d

where exists(select * from emp where d.deptno=emp.deptno);

Page 6: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

6

هي ختفيض العمل الالزم من أجل إعادة النتائج املطلوبة, فبداًل من أن existsإن الغاية من املعامل ال إىل االستفسار اخلارجي, فإنه يقوم بتنفيذ كامل االستفسار اجلزئي, ومن مث االنتق DBMSيقوم الـ

بإعادة أسطر حمددة, ويتم التنفيذ كما يلي: .deptيتم أخذ سطر من اجلدول -1لتحقيق شرط empيف اجلدول deptnoيف هذا السطر مع قيم العمود deptnoيقارن رقم القسم -2

االستفسار اجلزئي. deptحيقق الشرط, يتم إعادة سطر اجلدول emp فإذا مت إجياد سطر واحد على األقل يف اجلدول -3

ختزن مققتًا حىت ال يعود النظام deptnoوال بد من اإلشارة هنا إىل أن قيمة الـ يف نتيجة االستعالم. ملعاجلتها الحقاً...

يتم تكرار اخلطوات السابقة من أجل مجيع األسطر...قبل notموظفني حاليًا نضيف عامل النفي (: إلعادة بيانات األقسام اليت ال حتتوي على 5مثال)

:existsالعامل select * from dept d

where not exists(select * from emp where d.deptno=emp.deptno);

إعادة أمساء املهن اليت يزواهلا موظفان فقط, مع أمساء أولئك املوظفني:إذا كان املطلوب (6مثال)select ename, job from emp E

where exists(select job, count(ename) from emp

where e.job=job group by job

having count(ename)=2); هذا ونستطيع كتابة االستعالم السابق كما يلي:

select ename, job from emp

where job in (select job from (select job, count(ename) from emp

group by job having count(ename)=2));

ة سابقاً: يتم ذلك موجود أو جمموعة جداول إنشاء جدول اعتمادًا على استعالم منفذ على جدول

كما توضح الصيغة التالية: createبتوسيع تعليمة create table table_name as select_statement;

باسم اجلدول الذي سيتم إنشاؤه, متاماً كما متبوعتني create tableتبدأ التعليمة بالكلمتني احملجوزتني , selectمتبوعة بعبارة asالكلمة احملجوزة هو احلال عند إنشاء اجلداول التقليدية. يلي اسم اجلدول

وهذه العبارة ميكن أن تكون يف أي صياغة من الصياغات اليت مرت معنا حىت اآلن...حيتوي بيانات املوظفني الذين مهنتهم managerإذا كان املطلوب إنشاء جدول باالسم مثال:

manager: create table manager as select * from emp where lower(job)='manager';

Page 7: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

7

ر و تقوم عملية الربط بني اجلداول عند االستعالم عن املعطيات بإنشاء سط :joinأو الدمج الربطمن قيمة األعمدة املستخدمة يف الربط(متوافقني )ب سطرينحاصل وضع عبارة عن ة, كل منهاجديد

كال اجلدولني املربوطني يف سطر واحد...فعملية الربط بذلك تنشئ جدواًل مققتًا جديدًا مبنيًا على استعالم مت تنفيذه على جدولني, وتتم عملية

الربط باستخدام أعمدة ذات أمناط وقيم معطيات متوافقة بني اجلدولني.أن العديد من مناذج البيانات ال تعتمد هذه الطريقة يف الربط, وإمنا يعتمد أغلبها وال بد من اإلشارة إىل

على املقشرات من أجل حتقيق ذلك.لتوضيح عملية الدمج بني اجلداول, سوف نستعرض مثااًل عن عملية جتميع ال تتعلق بدمج اجلداول

بشكل مباشر... Aميع قطعتني جاهزتني, األوىل من الصنف نفرتض أن لدينا مهمة لتصنيع جهاز ما من خالل جت

, وعدة أنواع A1A(A ,2(… ,. ولنفرتض أن هنالك عدة أنواع فرعية من الصنف Bوالثانية من الصنف i, BiA. وأن عملية التجميع )الربط( تتم إذا كان لكل من الصنفني B)B1B ,2(… ,فرعية من الصنف

نفس الرقم )الدليل(., وحيتوي الثاين على قطع من Aصناديق, حيتوي األول على قطع من الصنف لنفرتض أن لدينا أربعة

, بينما يتم استخدام الصندوق الثالث لتخزين األجهزة اليت مت جتميعها, والصندوق الرابع Bالصنف لوضع القطع اليت مل يتم جتميعها لعدم املطابقة.

لقطعة لتحديد القطعة الثانية الالزمة ومن مث نعاين هذه ا Bنبدأ العملية بأخذ قطعة من الصندوق . إذا وجدنا القطعة املوافقة نقوم Aللمطابقة والتجميع. مث نقوم بالبحث عن هذه القطعة يف الصندوق

, نضع Aبالتجميع )الربط( ونضع النتائج يف الصندوق الثالث. وإذا مل جند قطعة موافقة من الصنف املوافقة يف الصندوق الرابع الذي حيتوي على القطع Aر القطعة ال ميكن جتميعها لعدم توفاليت Bالقطعة

B غري اجملمعة, وتبقى القطعA غري اجملمعة يف صندوقها األصلي, وتستمر العملية حىت يتم تفريغ .Bالصندوق يف هذا املثال مشاهبة للجداول املرتبطة من خالل مفتاح أساسي ومفتاج خارجي. كما A, Bإن القطع

, وبني التوافق باملعطيات Bوالصنف Aك تشاهبًا بني التوافق باألرقام بني القطع من الصنف أن هنال عند إنشاء عملية ربط بني جدولني, والقطعة اجملمعة تشبه اجلدول احلاصل عن الربط بني جدولني.

equi_joins الربط املتكافئ

Page 8: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

8

يف كال اجلدولنييقدي الربط يف شكله األكثر شيوعًا إىل تشكيل أسطر جديدة عندما تتوافق املعطيات .natural equi-joinويسمى هذا النوع من الربط بالربط املتكافئ أو الربط الطبيعي املتكافئ األولني.

كحقل deptnoعلى احلقل deptاجلدول , حيتويdept, empكمثال على ذلك لنأخذ اجلدولني على نفس احلقل كمفتاح خارجي, ويتم الربط بني اجلدولني من empمفتاح أساسي, وحيتوي اجلدول

خالل توافق املعطيات بني حقول كال اجلدولني...وأمساء موظفي كل قسم يف جدول واحد اعتماداً لنفرتض اآلن أننا نرغب باحلصول على أمساء األقسام

على اجلدولني السابقني, وإنشاء جدول حمصلة كل سطر فيه مقلف من سطر من اجلدول األول وسطر .deptnoمن اجلدول الثاين, يتساوى هذا السطران بقيمة احلقل

حيث يتم مقارنة كل تكون النتيجة واحدة.سمن أي من الجدولين و يمكن أن يبدأ الربط المتكافئدول الثاين, وعندما تتساوى قيم عمود الربط بني سطرين من سطر من اجلدول األول بأسطر اجل

اجلدولني يتم إنشاء سطر حمصلة جديد يف اجلدول الناتج... deptno, فإذا علمت أن قيم احلقل كجدول مصدر أول deptلنفرتض أننا نستخدم جدول األقسام

الربط خطوة خطوة:, نستطيع استعراض عملية 40 ,30 ,20 ,10فيه هي .deptnoيف العمود 10عن األسطر اليت حتتوي القيمة empالبحث يف جدول املوظفني -1

Select * from emp where deptno=10;

أسطر يف اجلدول احملصلة, يف كل سطر منها مت 3أسطر موافقة, وكنتيجة لذلك سيتم إنشاء 3يوجد وضع معطيات املوظف يف هناية سطر القسم.

. deptnoيف العمود 20عن األسطر اليت حتتوي القيمة empملوظفني البحث يف جدول ا -2

Select * from emp where deptno=20; أسطر يف اجلدول احملصلة... 5أسطر موافقة, وكنتيجة لذلك سيتم إنشاء 5يوجد

.40, أما عند معاجلة القيمة 30املساوية لـ deptnoويتكرر األمر ذاته بالنسبة لقيمة الـ

Select * from emp where deptno=40;

, ولن يتم إنشاء أي سطر يف اجلدول احملصلة...empال يوجد أي أسطر موافقة يف اجلدول غير موجودة في كال الجدولين فلن يتم إضافة أسطر إلى deptnoمالحظة: إذا كان هنالك قيمة لـ

.inner joinداخلي الجدول المحصلة من أجل هذه القيمة, هذا ما نسميه بالربط الميكن أن يتم تنفيذ عملية الربط من الناحية اجلربية اعتمادًا على عمليتني أساسيتني: جداء جدولني,

.whereاعتماداً على عبارة واختيار أسطر حمددة من جدولاألسطر املمكنة من كال اجلدولني, األمر ينتج عن عملية اجلداء )الرياضي الديكاريت( مجيع ثنائيات

هو جمموعة جزئية يف النهاية اجلدول الناتج عن عملية الربطألن ,الذي يزيد من زمن وتكلفة االستفسار .هسجالت نتيجة لتطبيق شرط معني على تلك اجملموعة تنتجو , من ذلك اجلداء

Page 9: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

9

بالعودة إىل اجللسة الرابعة, فإن صيغة الربط التقليدية املذكورة هي الصيغة املستخدمة عادة من أجل راجع اجللسة الرابعة... تنفيذ عمليات الربط الداخلي...

إىل ذاته, ونستخدم مثل هذه العملية إلعادة جمموعة ونعين به ربط جدول : self joinالربط الذايت

.إذا كان املطلوب إعادة اسم املوظف مع اسم مديرهفعلى سبيل املثال أسطر يف جدول واحد.والذي )من أجل سجل معني( خيزن رقم املوظف mgrتوي على العمود حي empنعلم مجيعاً أن اجلدول

.empnoالذي هو مدير املوظف ذي الرقم املخزن يف احلقل فهذا يعين أن 5هي mgrمثاًل, وقيمة الـ 10هي empnoفإذا كان لدينا يف أحد السجالت قيمة الـ

.10هو املدير املباشر للموظف ذي الرقم 5املوظف ذي الرقم مرتني, وإدراج شرط يتضمن enameاختيار حقل اسم املوظف نالحظ أن االستفسار السابق يتطلب

.mgrو الـ empnoمساواة ما بني الـ , وعمومًا يأخذ مثل هذا الربط الصيغة empميكن حتقيق ما سبق بإجراء ما نسميه ربطًا ذاتيًا للجدول

التالية:Select alias_name1. column_name, alias_name2.column_name

from table_name alias_name1, table_name alias_name2

where join_condition;

مع مرتني fromهو اجلدول األساسي الذي مت ربطه بذاته, وقد ورد يف عبارة table_nameحيث أن اعتماداً ةاملطلوب ألعمدةاهي اليت مت اختيار واألمساء البديلة ,باسم بديل خمتلف تسميته يف كل مرة

عليها... alias_name1, alias_name2يتم تنفيذ عملية الربط السابقة ببساطة كما لو أن لدينا جدولني

قمنا بربطهما باستخدام األعمدة املناسبة. ونستطيع تنفيذ االستعالم السابق كما يلي:

select A.ename, b.ename from emp a, emp b

where a.mgr=b.empno;

Page 10: SQL Subqueries

اجللسة العملية السادسة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

10

عمليات جربية متقدمة السرتجاع املعطيات: : unionعملية االجتماع -1