الرئيسية
سجل الزوار
القائمة البريدية
راسلنا
خريطة الموقع
جديد الصور
جديد البطاقات
جديد الصوتيات
المتواجدون الآن
تغذيات 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);
بهذا نكون قد أكملنا دروس دورتنا بفضل من الله .. فالحمد لله الذي هدانا وما كنا لنتهدي لولا أن هدانا الله .
الواجب :
اطبع اسماء جميع الموظفين الذين تتوفر لهم البيانات التالية مع ملاحظة أن هذه البيانات ستظهر في جدول النتائج رقم الموظف - رقم القسم الذي يعمل فيه هذا الموظف - اسم المشروع الذي يعمل عليه - عدد ساعات عمله ) ؟
|
|
خدمات المحتوى
|
تقييم
|
|
|
Powered by Dimofinf cms Version 3.0.0
Copyright© Dimensions Of Information Inc.