Join in SQL

السلام عليكم الجميع 🙂

اليوم عندنا موضوع مهم عن Join الى هو ربط بين جدولين او اكثر من جدول بحيث يظهر لك المعلومات بشكل صحيحة وسليمة وخالية من الاخطاء.

و تقدر تسوي join على اكثر من جدول يعني 4 جداول او 6 او اكثر مافي مشكلة ولكن الاهم بالاخير يطلع لك البيانات مرتبه وجميلة.

وهنا راح اشرح لكم فقط ربط بين جدولين عشان اوصل لكم ايش الفروقات واسهلها عليكم المعلومة.

تخيل معاي انت تبي البيانات بين جدولين العملاء و السيارات تابعه لهم و اكيد راح تربطهم عن طريق join بحيث يظهر لك كل عميل مع سياراته. مثال الجدول الى تحت.

المهم. انا راح استخدم هذا الجدولين العملاء والسيارات تابعه لهم وتم ربطهم عن طريق Join

Cars and customers

هناك أنواع Join و راح اتكلم عنها و مع الامثلة و بأذن الله راح ابسط المعلومة بشكل افضل..

  • Cartesian Product: هذا النوع يدمج كل Row في جدول الاول مع Row جدول الثاني بدون ربط الاي دي بحيث راح يصير الجدول كبير جدآ بسبب عامل ضرب Row * Row

انا اقولكم كيف!

هذا جدول العملاء:

costumer

و هذا جدول الثاني السيارات تابعه العملاء:

car

لما نجي نستخدم هذا النوع من join

راح يتم عمل ضرب كل Row في جدول العملاء مع Row جدول السيارات

يعني Row * Row = Results

مثل ماتلاحظون في جدول العملاء تحت مكتوب rows 4

وجدول السيارات هي 8 rows

يعني لو نجي نضرب 4 في 8 راح يطلع لنا 32

4 * 8 = 32

المهم خلينا نشوف تجربة من الصوره.

الكود راح يكون كذا:

select * from customer, cars;

الناتج هنا…

مثل ماتشوفون بالصوره

بعد عمل تشغيل يظهر لنا الجدول اصبح كبير جدآ و معلومات متكرره بشكل كبير ولما نزلنا تحت لقينا الناتج Row هو 32 مثل ماكتبنا :).

وممكن يكون ماله فايده بس حاب اوصلكم المعلومة ايش هي بضبط و فكرتها.


  • Natural Join: هذا النوع يتم ربط جدولين مع بعض من خلال ID الى هو Primary key و Foreign key

ولكن الجميل هنا مايحتاج انك تربط ID مع بعض بشكل يدوي لانه هو من تلقاء نفسه يتم ربطها بشكل طبيعي.

طريقة كتابة الكود يكون هكذا:

select * from customer natural join cars;

بعد النتيجة عمل تشغيل:

Natural join

هنا مثال بعد ماأستخدمنا natural join و عملنا رن

اصبح الجدول مرتب وجميل جدآ :).


  • Inner Join: هذا النوع يتم ربط بين جدولين عن طريق ID ولكن هالمره يكون يدوي يعني انت تربطها من خلال ID primary key and Foreign key

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

المهم الكود ينكتب هذي طريقة:

select * from customer join cars
on customer.studID = cars.studID;

خليني اشرح حبه حبه 🙂

custmoer join cars: لازم نكتب join بين الجدولين بحيث نربط جدولين مع بعض

on customer.studID = cars.studID: لاتنسى تستخدم on يجي مع Join

وايضآ لاتنسى اذا كان Customer الاب و cars هو الاطفال يعني

customer فيه primary key الى هو StudID تمام.

cars: يوجد فيه المفتاح FK أسمه StudID تابع primary key الى موجود في customer

ولازم نحطهم كلهم قدام النقطة (.) بعد كتابة أسم الجدول مثل موضح عشان يربط بين جدولين من دون اي مشاكل.

لما نشغل البرنامج هنا النتيجة:

Inner join

تلاحظون معاي طلعت النتيجة بشكل سليم لانه ربطنا ID PK مع FK


  • Outer Join: هذا النوع له ثلاث انواع الى هو
  • Left outer Join
  • Right outer join
  • Full outer join

قبل مانشرح لازم اوضح لكم في جدولين

الى على يمين باللون الازرق هذا جدول العميل

الى على يسار باللون الاحمر هذا جدول السيارات.

  • Left outer Join: هذا النوع من join يتم ربط بين جدولين من خلال ID ولكن سوف يتمركز على اليسار مهم ماكان الجدول.

هنا المثال:

انا بكتب الكود هذا

select * from customer left outer join cars
on customer.studID = cars.studID;

بالكود كتبنا customer left outer join cars يعني جدول العملاء مفترض يكون على يسار

والجدول السيارات على اليمين. يعني Join راح يركز على الجدول اليسار الى هو جدول العملاء.

ملاحظة: حتى لو في بيانات من جدول العملاء بدون معلومات عن سياره راح يظهرها لانه كله يتمركز على اليسار الى هو جدول العملاء.

مثال بالصوره:

left outer join

تلاحظ معاي الجدول الى على يسار ظهر لنا بيانات العميل جديدة وليس له سياره هو اسمه Saleh

لهذا السبب لم يظهر اسمه اثناء عمل natural join او inner join لانه العملاء الى مالهم سياره ماراح يظهر ابد.

ولكن هنا outer left join راح يظهر كل بيانات حتى لو مالهم سياره او علاقه بالجدول اخر. :).

  • Right outer join: هذا النوع راح يتم ربط بين جدولين عن طريق ID ولكن هالمره راح يتمركز على اليمين يعني الجدول على اليمين.

مثال

انا بكتب الكود هكذا:

select * from customer right outer join cars
on customer.studID = cars.studID;

هنا كتبنا customer right outer join car يعني راح يتم ربط بين جدولين ولكن هالمره

راح يظهر لنا كل البيانات الى موجوده في جدول car حتى لو مو مربوطة في PK في جدول العملاء.

هنا مثال بالصوره:

Right outer join

بعد ماعملنا Run ظهرت لنا بهذا الشكل

معلومات في جدول السيارات ظهرت لنا ولكن في السيارات ليس مسجله تحت اسم اي عميل مثل cars, BWM and MAZDA و في جدول العميل ظهرت لنا NULL بسبب هذي سيارات ليست الاحد.

  • Full outer join: يتم ربط بين جدولين عن طريق ID ولكن هالمره جدول اليمين و اليسار مهم ويجيب عليهم ان يتمركزون بنفس اللحظه. 🙂

يعني جدول العميل الى توجد فيه بيانات العميل ليس لديه سيارات ستظهر

جدول السيارات الى توجد فيه بيانات سيارات ليس لديه مالك ستظهر ايضآ.

هنا مثال:

انا بكتب الكود هكذا:

select * from customer Full outer join cars
on customer.studID = cars.studID;

customer Full outer join cars بمعنى جدول العملاء مع السيارات سوف ينضمون بنفس الوقت يعني كلهم لديهم الآهمية الان.

النتيجة:

Full outer join

بعد تطبيق الكود هنا نلاحظ في جدول العميل ظهر لنا اسم العميل الى لديهم السيارات و ايضآ ليس لديهم سيارات بنفس الوقت.

و جدول السيارات ظهر لنا السيارات الى لديهم مالك و ايضآ السيارات الى ليست لديهم مالك.

لهذا السبب تم تسميته Full outer يعني جميعهم يتم ضمهم بنفس الوقت.

  • يوجد ملاحظة عن full outer join: هذي تشتغل في اوراكل ولكن ماراح تشتغل في MySQL

ولكن لما تطبق هذا الامر بأستخدام Union

SELECT * from customer RIGHT JOIN car 
on customer.idcust = car.idcust

UNION

SELECT * from customer left JOIN car 
on customer.idcust = car.idcust;

راح يشتغل معاك بشكل طبيعي وبدون مشاكل.

هنا انتهيت من الشرح وأتمنى يكون شرح بسيط وسهل.

اي سؤال او استفسار او يوجد خطأ او اي شي اكتبو بالتعليقات او راسلون لي بالتويتر 🙂

اشوفكم على خير

فمان الله.