الربط
بين الجداول
ماذا لو كان لدينا أكثر من جدول في قاعدة البيانات وأردنا
الربط بين تلك الجداول او الحصول على معلومات معينة وفق شروط معينة من أكثر من
جدول وهذا من المواضيع المهمة في برمجة
قواعد البيانات . لغة 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 في الجدول الثانوي
وحقل 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