شـبـكــة عـمّـــار
إخبارية - ترفيهية
- تعليمية



جديد الصور
جديد الأخبار
جديد المقالات


جديد الصور

جديد البطاقات

جديد الصوتيات

المتواجدون الآن


تغذيات RSS

2012-08-15 03:39

بعد أن تعرفنا على أوامر السيكيول ودوالها خلال الأربعة أيام الماضية ، وقطعنا شوطاً كبيراً فيها ولله الحمد ، نأتي اليوم إلى نهاية المطاف ، الدرس الخامس والأخير في الدورة ، ولكن الدروس ستستمر بعد الدورة إن شاء الله للتعمق أكثر في اللغة .

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



الربط في السيكيول SQL Join :

الغرض من ربط الجداول ببعضها هو استخراج البيانات من أكثر من جدول في قاعدة البيانات !! كذلك يستخدم الربط كوسيلة لمنع تكرار القيم في أي حقل من حقول الجداول بصورة مزعجة أحياناً ، فمثلاً حينما يكون للطالب أكثر من مادة وتدرج جميع المواد مع اسم الطالب في نفس الجدول ، ستكون النتيجة وجود عدد كبير من السجلات لنفس الطالب في نفس الجدول ، كل سجل خاص بمادة !! وهذا غير عملي أبداً إذ أنه يؤدي إلى كبر الجدول وبالتالي زيادة المساحة التخزينية له !! لذلك فإننا نقوم بعمل جدولين جدول للطالب بكامل بياناته ( الاسم -الرقم - تاريخ الميلاد -التخصص - المعدل ... ألخ ) وجدول آخر للمواد يحوي أسم المادة وأرقام الطلاب الذين يدرسونها ، ونربط بين الجدولين برقم الطالب بالتأكيد حيث أننا اخترناه مفتاحاً لاستحالة تكراره لأكثر من طالب !!

ولاستخراج بيانات من جدولين ، نستخدم المفتاح الذي يربط بينهما في الشرط ، كالتالي :


SELECT Table1.any_column, Table2.any_column




FROM Table1, Table2




WHERE Table1.Keycolumn = Table2.foreign_Keycolumn;

مثال :

اطبع اسماء الموظفين ورقم القسم الذي يعملون فيه واسم المشروع الذي يعملون عليه ؟ - ملاحظة : هذه البيانات موجودة في جدولين -
الحل :


SELECT FNAME , DNUM, PNAME




FROM EMPLOYEE , PROJECT


WHERE DNUM = DNO;

OR
SELECT EMPLOYEE.FNAME, PROJECT.DNUM, PROJECT.PNAME




FROM EMPLOYEE, PROJECT




WHERE PROJECT. DNUM = EMPLOYEE.DNO;
مثال :

اطبع اسماء الموظفين ورقم القسم الذي يعملون فيه واسم المشروع الذي يعملون عليه ؟ - ملاحظة : هذه البيانات موجودة في جدولين -
الحل :


SELECT FNAME , DNUM, PNAME




FROM EMPLOYEE , PROJECT


WHERE DNUM = DNO;

OR
SELECT EMPLOYEE.FNAME, PROJECT.DNUM, PROJECT.PNAME




FROM EMPLOYEE, PROJECT




WHERE PROJECT. DNUM = EMPLOYEE.DNO;


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

الشكل الأول :INNER JOIN:

هذا النوع من الربط سيعطينا النتائج من الجدولين والتي يتحقق فيها الشرط ، صيغته :


SELECT field1, field2, field3




FROM first_table INNER JOIN second_table

ON first_table.keyfield = second_table.foreign_keyfield;


مثال :

نفس المثال السابق :اطبع اسماء الموظفين ورقم القسم الذي يعملون فيه واسم المشروع الذي يعملون عليه ؟
الحل :


SELECT EMPLOYEE.FNAME, PROJECT.DNUM, PROJECT.PNAME




FROM EMPLOYEE INNER JOIN PROJECT ON EMPLOYEE.DNO = PROJECT.DNUM;


الشكل الثاني : LEFT JOIN:

هذا النوع من الربط يعطينا جميع السجلات ( الصفوف ) من الجدول الأول ( وهو الجدول الذي ييكتب على يسار كلمة LEFT JOIN في الأمر ) سواء المرتبطة بقيم في الجدول الثاني أو غير المرتبطة ، جميع سجلات الجدول الأول ستظهر في النتائج ، صيغته :


SELECT field1, field2, field3




FROM first_table LEFT JOIN second_table

ON first_table.keyfield = second_table.foreign_keyfield;


مثال :

اطبع قائمة باسماء الموظفين وعدد ساعات عملهم ؟
الحل :


SELECT EMPLOYEE.FNAME, WORKS_ON.HOURS




FROM EMPLOYEE LEFT JOIN WORKS_ON ON EMPLOYEE.NUMBER = WORKS_ON.ENUMBER;


والنتيجة : ظهر لدينا السجل الذي أضفناه إلى جدول الموظفين في الدرس السابق ، سجل الموظف "MOHD AHMED" بالرغم من أننا لم نحدد له ساعات العمل في جدول العمل ،لذلك خانة الساعات أمام هذا الموظف ظهرت خالية :







الشكل الثالث : RIGHT JOIN:

هذا النوع من الربط هو معكوس النوع السابق تماماً ، فهو يعطينا جميع السجلات ( الصفوف ) من الجدول الثاني ( وهو الجدول الذي يأتي على يمين كلمة RIGHT JOIN عند كتابة الأمر ) سواء كانت مرتبطة بقيم في الجدول الأول أو لا ، جميع سجلات الجدول الثاني ستظهر في النتائج ، صيغته :


SELECT field1, field2, field3




FROM first_table RIGHT JOIN second_table

ON first_table.keyfield = second_table.foreign_keyfield;


وكمثال عليه :
سنأخذ نفس المثال السابق ولكن سنغير ترتيب الجداول في FROM وكذلك ترتيب الحقول في SELECT ولا ننسى أن نكتب RIGHT JOIN ، كالتالي :


SELECT WORKS_ON.HOURS, EMPLOYEE.FNAME




FROM WORKS_ON RIGHT JOIN EMPLOYEE ON EMPLOYEE.NUMBER = WORKS_ON.ENUMBER;

مثال يوضح ربط ثلاثة جداول ببعضها البعض :

اطبع اسماء الموظفين ورقم القسم الذي يعمل فيه كل موظف واسم المشروع الذي يعمل عليه وعدد ساعات عمله !

الحل :


SELECT EMPLOYEE.FNAME, EMPLOYEE.DNO, PROJECT.PNAME,WORKS_ON.HOURS




FROM (EMPLOYEE INNER JOIN PROJECT ON EMPLOYEE.DNO = PROJECT.DNUM)

INNER JOIN WORKS_ON ON (PROJECT.PNUMBER = WORKS_ON.PNO) AND (EMPLOYEE.NUMBER = WORKS_ON.ENUMBER);


بهذا نكون قد أكملنا دروس دورتنا بفضل من الله .. فالحمد لله الذي هدانا وما كنا لنتهدي لولا أن هدانا الله .





الواجب :

اطبع اسماء جميع الموظفين الذين تتوفر لهم البيانات التالية مع ملاحظة أن هذه البيانات ستظهر في جدول النتائج رقم الموظف - رقم القسم الذي يعمل فيه هذا الموظف - اسم المشروع الذي يعمل عليه - عدد ساعات عمله ) ؟







تعليقات 0 | إهداء 0 | زيارات 613


خدمات المحتوى
  • مواقع النشر :
  • أضف محتوى في Digg
  • أضف محتوى في del.icio.us
  • أضف محتوى في StumbleUpon
  • أضف محتوى في Google


تقييم
1.00/10 (3 صوت)


Powered by Dimofinf cms Version 3.0.0
Copyright© Dimensions Of Information Inc.