الثلاثاء، 18 يونيو 2013

الربط بين الجداول او الحصول على معلومات من اكثر من جدول وشرح دوال as,inner join,Grop by


الربط بين الجداول  
ماذا لو كان لدينا أكثر من جدول في قاعدة البيانات وأردنا الربط بين تلك الجداول او الحصول على معلومات معينة وفق شروط معينة من أكثر من جدول  وهذا من المواضيع المهمة في برمجة قواعد البيانات .    لغة  SQL توفر هذه الميزة نستطيع جلب البيانات من أكثر من جدول باستخدام دالة Select  والربط بين تلك الجداول بشروط معينة او بدون شروط حسب ما نريده.

يكون الشكل العام للجداول المترابطة

SQL Structure                                                                                                         
Select  TN.P1,TN.P2……  From TN1, TN2,….
Where Condition

·        TN.P1,TN.P2 : هي الأعمدة التي سنختارها من الجداول فيكون شكلها اننا نكتب اسم الجدول الذي سنجلب منه البيانات ثم نقطة (.) ثم اسم العمود الذي نريد بياناته .لو اردنا جلب جميع البيانات من جدول معين نكتب اسم الجدول ثم نقطة ثم علامة النجمة (*)
·        TN1, TN2 : هي اسماء الجداول التي سنجلب منها البيانات واي جدول نجلب منه البيانات يجب ذكره هنا
·        :Condition هو الشرط او مجموعة الشروط للأختيار من الجداول . في حال كان لدينا جدوليين ممكن ان تحتوي على شرط واحد لكن اذا كان لدينا ثلاثة جداول يجب ان تحتوي على شرطين مترابطين وكلما ازداد عدد الجداول المستخدمة يستوجب زيادة عدد الشروط لدخول كل الجداول  المستخدمة في هذه الشروط


مثال عملي1:قاعدة بيانات لسجلات عملاء فيها  ثلاث جداول كما في الشكل الجدول  tabel هو الجدول الرئيسي ويحتوي على المفتاح الرئيسي فيه اسماء العملاء ورقم سجلهم الداخلي ورقم سجلهم الخارجي وبقية الجداول هي جداول ثانوية . والجدول  insideفيه بيانات السجل الداخلي لكل للعملاء  والجدول  outside فيه بيانات السجل الخارجي للعملاء


1.    كتب جملة (SQL) لطباعة اسم العميل وبيانات سجله الداخلي
من الجدول tabel نجد  ان لكل عميل رقم خاص بسجله الداخلي واذا انتقلنا الى سجله الداخلي  insideوجدنا انه هذا الرقم يدل على بياناته  مثلا العميل hussien رقم سجله الداخلي هو 888 لو انتقلنا الى السجل الداخلي لهذا العميل نجد انه عمل في وضائف مختلفه manger,enginerr,amal,kiler خلال سنوات معينه اذا كيف نحصل على معلومات كل شخص شاهد جملة  SQL التالية وتتبع الشرح عليها
SQL 
Select tabel.cilent,inside.* From tabel,inside
 where tabel.inside=inside.inside
·        بعد عبارة select اخذنا بيانات العمود cilent من الجدول الرئيسي tabel وجميع البيانات من الجدول  inside
·        بعد عبارة From كتبنا الجداول التي سنسحب منها البيانات وهو الجدول الرئيسي والجدول الداخلي
·        بعد عبارة Whereحددنا الشرط انه يبحث على رقم العميل في السجل الرئيسي في حقل inside  ويقارنه مع الحقل inside في الجدول الفرعي inside  واي تطابق سوف يضع هذه البيانات بجانب اسم العميل كما في الشكل التالي


2.    كتب جملة (SQL) لطباعة اسم العميل وبيانات سجله الخارجي
نفس فكرة السؤال السابق لكن هنا نتعامل مع السجل الخارجي outside
SQL 
select tabel.cilent,outside.* from tabel,outside where tabel.outside=outside.outside

الشكل التالي يبين ماتم اختياره بعبارة  SQL


3.    بافتراض ان الجدول table و inside مترابطين على اساس ID وهذا ما يسمى بالربط المتساوي  الحقل ID في الجدول table يدل على بيانات الشخص في الجدول inside  الذي يحمل نفس ID  في نفس هذا الحقل  اكتب جملة (SQL) لطباعة اسم العميل من الجدول table ومن الجدول inside  اطبع word له
SQL 
select tabel.cilent,inside.word from tabel,inside where tabel.ID=inside.ID

الشكل التالي يبين ماتم اختياره بعبارة SQL








 الاستعلامات الفرعية
هي بكل بساطة عبارة select داخل شرط عبارة select أخرى ولا تنفذ select الخارجية إلا بتحقق شرط           select  الداخلية  .
إذن ما أهمية الاستعلامات الفرعية sub queries عندنا .؟
لو  طرح عليك سؤال من هم الأشخاص الذين عمرهم اكبر من عمر حسين بالبداية يجب ان تعرف عمر حسين وبعدها تستطيع التعرف على عمر الأشخاص الذين هم اكبر منه سناً  اذن لدينا Select داخلية تجد عمر حسين    select خارجية تجد عمر الأشخاص الأكبر منه سنا
يكون الشكل العام للاستعلامات الفرعية كالتالي
SQL Structure                                                                                                         
Select  part_setect  From Tabel_name
Where  coloumn Compare (  Select  part_setect1  From Tabel_name1(

Coloumn : هو العمود او (الأعمدة) الذي سنقارنه معه  نتائج select الداخلية
Compare :هي عملية المقارنة (ممكن ان تكون أي عملية مثل <.>.>=,<=,<>)

مثال عملي : جدول اسمه (Table1) وفيه ثلاثة أعمدة هي (name,age,live)
Live
Age
name
Dialay
22
hussien
Dialay
29
waeel
Kanaken
25
modar
جدول اسمه Tabel1
1.    اكتب جملة (SQL) لطباعة الأسماء والأعمار(name,age )  الذين عمرهم اكبر من عمر hussien
SQL 
select name,age  from Tabel1
where  age>( select age  from Tabel1 where name= 'hussien')
من الكود أعلاه يتبين إن select الداخلية  تجد عمر hussien وبعد إيجاده  تقارنه select الخارجية  مع أعمار بقية الأشخاص هذا الكود سوف يجلب جميع أسماء
  وعمر الأشخاص في الجدول  عمرهم اكبر من عمرhussien   (كما في الشكل بالأسفل) 
Age
name
29
waeel
25
modar
شكل المحتويات التي تم اختيارها من  Tabel1

2.    اكتب جملة (SQL) لطباعة معلومات الأشخاص لا يسكنون live في نفس محل سكن modar
SQL 
select *  from Tabel1
where  live <>( select live  from Tabel1 where name= 'modar')
في select الداخلية نجد محل سكن modar وفي select الخارجية نقارن محل سكنه مع البقية واي شخص لا يسكن معه في نفس المكان نطبع معلوماته (كما في الشكل)
Live
Age
name
Dialay
22
hussien
Dialay
29
waeel


 -  as
تمكننا هذه الدالة من اعطاء اسم جديد للعمود او استدعاء العمود باسم ثاني  غير اسمه الحقيقي في الجدول. تفيدنا كثيرا عندما نجلب بيانات من اكثر من جدول وفي كلا الجدولين هناك عمود  بنفس الاسم ولكي نميز الاول من الثاني نكتب اسم احد الاعمدة  وبعده as  وبعده الاسم الجديد.
يكون الشكل العام
SQL Structure                                                                                                          
Select  Coloumn  as NewColoumnName From Tabel_name

Coloumn : هو العمود او (الأعمدة) الذي نريد استدعائه باسم جديد
NewColoumnName :هو الاسم الجديد للعمود

مثال عملي : جدول اسمه (Table1) وفيه ثلاثة أعمدة هي (name,age,live)
Live
Age
name
Dialay
22
hussien
Dialay
29
waeel
Kanaken
25
modar
جدول اسمه Tabel1
1.    اكتب جملة (SQL) لطباعة الأسماء والأعمار(name,age,live )  لكن بدلname بدل UserName  
SQL 
select name as UserName ,age,live  from Tabel1


النتيجة
Live
Age
UserName
Dialay
22
hussien
Dialay
29
waeel
Kanaken
25
modar

   inner join
تمكننا هذه الدالة من دمج بيانات جدولين او اكثر. او احضار بيانات من اكثر من جدول وفق مفتاح اساسي ومفتاح ثانوي .اي نجلب بيانات اعمدة من جدول وبيانات من جدول اخر وفق شرط معين يربط الجدولين
SQL Structure                                                                                                         
select Table1. Coloumn,…., Table2. Coloumn,…….
from Table1
inner join Table2
on )Table1. Col  Condtion Table2. Col(

Table1. Coloumn  : هو العمود او (الأعمدة) الذي نريد استدعائه من الجدول الأول
 Table2. Coloumn : هو العمود او (الأعمدة) الذي نريد استدعائه من الجدول الثاني
Condtion :هو علامة الشرط الذي سنربط به الحعمود الاساسي من الجدول الاول والعمود الثانوي من الجدول الثاني
Table1 :الجدول الاول
Table2 :الجدول الثاني الذي نريد ربطه به
·        ونستطيع ان نكرر inner join-on لإضافة بقية جداول

مثال عملي: لدينا جدول اساسي اسمه DepartInformation  يحتوي على اقسام رئيسية و لمفتاح الاساسي لكل قسم DepartIDNumber  وعدد الكتب في كل قسم . ولدينا جدول ثانوي اسمه SubDepartInformation يحتوي على مفتاح اساسيIDDub    واسم الجزء الثانوي ومعلومات عنه   وعدد كتب في كل قسم
 وحقل MasterDepart يمثل عنوان  DepartIDNumber  للجدول الاساسي الذي  ينتمي له هذا السجل  




4.    كتب جملة (SQL) لطباعة اسم الجدول الرئيسي واسم الجداول الفرعية التي تنتمي لكل قسم كما في الشكل اعلاه .؟

الحل سهل نحن نعلم ان كل قسم ثانوي ينتمي لقسم رئيسي يخزن DepartIDNumber في جدوله SubDepartInformation  في حقل   MasterDepart
اذن نعمل inner join بين الجدولين ولشرط نجعله مساواة بين المفتاح الاساسي DepartIDNumber في الجدول الاساسي وحقل  MasterDepart في الجدول الثانوي
SQL 
SELECT
DepartInformation. DepartName,SubDepartInformation.DepartName

FROM DepartInformation
inner join SubDepartInformation
on SubDepartInformation.MasterDepart=DepartInformation.DepartIDNumber



 group by
تمكننا هذه الدالة من  احضار  وتجميع بيانات معينة لمجاميع معينة وفق شرط معين نحن نحدده .مثلا لدينا اشخاص حسين واحمد وصالح لحسين يوجد   ثلاث قيم ولأحمد ثلاثة ولصالح ثلاثة نريد جمع بيانات كل شخص على حدة بشكل صف سنقوم بعمل    group by على اساس الاسم ونعملsum لعمود القيم وهو تلقائيا  سيحسب لنا قيم كل شخص
SQL Structure                                                                                                          
select   opeartion(Coloumn1), Coloumn1,…..
from Table1
group by ColoumnName

opeartion : هي العملية التي نريد اجرائها على احد الاعمدة مثل (max,min,avg,sum)
 ColoumnName: هو العمود  سنكون مجاميع على اساسه


مثال عملي : جدول اسمه (Table1) وفيه ثلاثة أعمدة هي (name,values,work)
work
values
name
Dialay
2
hussien
Dialay
8
waeel
Kanaken
9
modar
Kanaken
5
waeel
Kanaken
4
hussien
Kanaken
7
hussien
جدول اسمه Tabel1
2.    اكتب جملة (SQL) لطباعة الأسماء ومجموعة قيم values لكل شخص  
SQL 
Select name, sum(values)
  from Tabel1
 Group by name



النتيجة
values
name
13
hussien
13
waeel
9
modar
جدول اسمه Tabel1