بسم الله الرحمن الرحيم نكمل في نهاية chapter five
المرة الماضية اتكلمنا عن null values حكينا أن ال
null value زي ما أخذنا في بداية الفصل في chapter
one وفي chapter three أنها بنستخدمها لما يكون
عندنا قيمة unknown أو inapplicable unknown يعني مش
عارفين عن القيمة inapplicable يعني مالهاش تطبيق
مناسب في حالة معينة عندنا وأعطينا مثال اللي هو ال
media name اسم العائلة السابق في حالة الرجال for
males مالهوش أي معنى عند مثلا database أو وزارة
الداخلية وجود ال null هيعمل عندي complication لل
logic احنا ال logic العادي اللي بنعرفه true or
false بس two logic لأنه هيصير عند ال logic ال
three true و false و unknown ال unknown دائماً بكون
ناتج عن وجود null values في عملية ال comparison أو
في العملية الحسابية اللي موجودة عندي وحكينا سابقاً
في chapter 3 أن احنا لما كان عندنا قيم ل columns
ما بدنا يدخل فيها null كنا نستخدم not null
constraint not null constraint لكن إذا ما كانش
موجود فمعناته ال column ممكن تكون فيه قيم null
values أثر ال null value أول شيء على ال arithmetic
operations ايش يعني arithmetic operations يعني جمع
طرح ضرب أو قسمة عملية رياضية عملية حسابية
arithmetic operations أثرها على arithmetic
operations إذا كان أحد ال operand هو null النتيجة
بتكون null فلو أنا عندي null زائد عشرة النتيجة كانت
النتيجة هتكون null لو عندي null ضرب null مش null
تربيع تمام؟ النتيجة null مش هتصير null تربيع لو أنا
عندي null تقسيم رقم أو رقم تقسيم null الجواب null
هذا الكلام كله مختصرين واسطر أن ال arithmetic
operations إذا كان فيها طرف null الجواب null نيجي
بعدها على ال comparison operators ايش يعني
comparison مقارنة اللي هم مين الأكبر واليساوي ولا
يساوي والأصغر من أصغر من أو يساوي أدوات ال
comparisons هدول هدول إذا كان في أحد الأطراف null
الجواب بيكون لا true ولا false الجواب unknown احنا
لما كنا نحكي مثلاً age أكبر من عشرة في شرط في ال
where أو في ال having في شرط لما كنت أحط age أكبر
من عشرة لو ال age ده كان خمسة ايش كان يعطيني؟
false لو كان ال age ده عشرين true الآن لو كان ال
... الجواب unknown مش true و مش false مش معروف
الجواب unknown هاي يعني three value logic true و
false و unknown فأي comparison operator مع null
هتعطيني unknown طيب كلام هذا هيترتب عليه كمان
شغلات complicated أكثر من هنا كيف يعني أنا ال
comparisons هاي كنت مرات أستخدمها وأروح بعدها
أعمل and أو or وأشبكها مع كمان مع كمان شرط مع كمان
شرط أو شرطين أو تلاتة حسب أنا احتياجي في ال select
statement لأن الكلام هذا نتيجته بدنا نشوفها كيف ده
تنعكس على ال and وعلى ال or احنا بنعرف في ال and
في حالة ال and أن true and true ايش نتيجتها طب
true مع false و false مع false
فباختصار وجود ال false في أحد الأطراف بيحسم
النتيجة أنها دائماً تكون false لأن لما يصير عندي في
null أو unknown لما يكون عندي unknown مع ال true
ايش النتيجة؟ لا مش false ال true مع unknown معناته
الأولاني ال true لازم الثاني يكون true عشان يعطيني
ال true طب الثاني مش ال true أنا مش عارف ايش قيمته
إذا نتيجتها unknown لو في عندي false مع unknown لا
الأكيد false لأن هذا ايش ما تكون قيمته شايفين لما
يكون false سواء كان true أو false النتيجة false
محسومة دائماً فلما يكون في false and unknown هيعطيني
false في حالة ال and الكلام هذا بنلخصه بأن unknown
مع true unknown لكن مع ال false النتيجة false
unknown مع unknown الطرفين مش معروفين هيعطيني
unknown نيجي على ال or الـ or عكس ال and إذا طرف من
أطراف ال true على أكيد ال true دائماً النتيجة true
دائماً النتيجة true ما بيعنيش الطرف الثاني ايش
قيمته الكلام هذا ترجمته أن ال unknown مع ال true
true لأن ال true هذه هي اللي حسمت النتيجة أنه يكون
الجواب ال true لكن لو unknown مع false معناته
النتيجة تعتمد على مين؟ على ال unknown وأنا مش عارف
قيمته فالجواب بيكون unknown unknown or unknown
برضه unknown هنيجي آخر شيء عن النقطة لما كنا نحكي
not true ايش يعني؟ false و not false يعني true ال
and not unknown برضه unknown أنا مش عارف ايش
النتيجة أنا مش عارف ايش هو عشان لما and فيه ايش
بده يصير ف not unknown برضه جوابها unknown ال
where و ال having عندي بهمها أن نتيجة الشرط تكون
true يعني إذا نتيجة الشرط false ال row هذا ال where
ايش بتعمل فيه تحذفه ونفس الشيء لو نتيجته unknown
برضه تحذفه ال where و ال having لما بنعمل
qualification في ال where وفي ال having بيهمني
النتيجة تكون true يعني هتعامل مع ال unknown زي
كأنه false مش هاخده أحياناً بيلزمني أفحص ال null نفسه
عطيت مثال لمحاضرة السابقة أنه أنا عندي طلاب اللي
هم أرقام جوالات في ال database بتاعت الجامعة بس مش
الكل مسجل أرقام وفي ناس بدل أرقام حاطين null كيف
أنا بدي أطلع أسماء وأرقام الطلاب اللي ما لهم مش
أرقام جوالات عشان نتواصل معهم نحكي لهم حدثوا
بياناتكم ودخلوا أرقام جوالاتكم على معلومات الجامعة
بدي أفحص إن الكولوم هذا قيمته is null والعكس
بالعكس لو أنا بدي الناس اللي اللي هم أرقام بدعمل
is not null إذا ال is null و ال is not null هدول
two operators بنستخدمهم في ال where وفي ال having
نستخدمهم في ال where وفي ال having عشان نتأكد أو
نفحص ال null value ما بنفعش نيجي نفحص مثلاً نعمل
where يعني ماحدش ييجي مثلاً في امتحان يكتب لي where
قيمة الكولوم مثلاً age يساوي none هذه ما لهاش مش
موجودة عندنا في ال database ما فيش أي قيمة بتساوي
none هيعطيني الجواب دائماً أنه unknown لأن هذه
comparison مش هيساوي comparison فال comparison مع
none هيعطيني unknown فمش هيطلع ولا واحد حتى لو
قيمته none مش هيطلع الحل أن أعمل where ال age
is null هيك
الشرط بيصير صح بيصير if a null بيعطيني يعني
بيعطيني عليه true أثر
null values على ال aggregate functions برضه لها
أثر على ال aggregate functions لا لأن احنا لما
نيجي نحكي minimum لل age وعندي أرقام في ال age كلها
مسجلة هيعطيني أقل... أقل رقم مش هو ال minimum طب
لو كان واحد من الأعمار هدول مش معروف ومحطوط null
وأطلب أنا ال minimum age هيعطيني أقل عمر موجود؟
ولا هيعطيني ال null يعتبر ال null مثلاً zero
ويعطيني ال null هو ال minimum؟
مش هيدخله من الأصل عندي ال min وال average وال
max وال sum هدول ما بيتعاملوا معاهم بيعتبروا ال
column اللي فيه قيمة null كأنه مش موجود يعني لما
بطلب average وفي مجموع من الأعمار مسجلة ومجموع
مش مسجلة بجمع بس المسجلين وبقسم على عددهم و
بتجاهل ال null values نفس الشيء في ال sum بيجمع
الموجودين وبتجاهل ال null values ال minimum بيشوف
الموجود وبيعطينا أقل واحد من الموجودين ال null ما
بتطلع عليهم ال max نفس الشيء الوحيدة ال aggregate
function الوحيدة بتتعامل مع ال null وبتحسبه ال
count لو أنا طلبت count لعدد الأسطر في table معين
هيعطيني ال count حتى لو ال value اللي في ال column
قيمتها null يعني لو كان عندي مثلاً ال age مسجل لستة
من الطلاب وفي تلاتة من الطلاب ما فيش لهم age null
وروحت عملت count على ال table هذا هيعطيني كام ال
count؟ هيعطيني تسعة بس لو عملت minimum أو average
أو maximum هيتعامل مع مين؟ بس مع الستة اللي لهم
values وضحت؟
حالة خاصة من ال count بتتعامل مع ال null هي إذا
استخدمت count مع distinct إذا استخدمنا count مع
distinct لن يتعامل مع ال null values سيعتبر ال
null values كأنهم زي بعض وأنهم تكرار لإيش
فاضي وسيحذفهم سيتعامل معهم زي ال minimum وال max
وال average آخر شيء كل ال aggregate functions ال
max وال min وال average وال sum ما عدا ال count
إذا ال column كله null يعني افترضت أنا ال age لكل
الطلاب عندي مش مسجل كله null النتيجة كام هتكون
minimum لل null null و maximum لل null null و ال
average لل null null و ال sum لل null null لأ بشرط
أن كل القيام nullلأنه لو في قيمة واحدة إلها قيمة
هيرجعها كإنها minimum أو هيرجعها إنها maximum
هيصير يتعامل معها زي المثال اللي حكينا عنه إنه
عندي تلاتة null وستة مش null هيتعامل مع الستة
لحاله لكن لو كلهم التسعة كلهم null نتيجة ال min و
ال max و ال average هتكون null فعشان كذالك بدنا
ننتبه لل null value وين في ال tables ممكن تغير
النتيجة اللي احنا متوقعينها ما تطلع بالشكل اللي
احنا متصورينه
الـ Duplicate Rows كمان نلقى له أثر في الـ Duplicate
Rows لما بنحكي إنه في عندي سطرين Duplicate في
نتيجة الـ Select تذكر كنا نعمل Select ولما بدنا
نشيل الـ Duplicate كنا إيش نكتب Select Distinct
عشان نشيل الـ Duplicate حين كلمة Duplicate في ال
SQL أو في ال database هي نستخدمها لأي Rows كل
قيمهم Columns بالبعض متساوية طب إذا في عندي null
يعني أنا عندي مثلا ال .. ال name كلهم لل name و
كلهم لل age و كلهم بدأ افترض مثلا لمعدل الطالب GPA
افترضت أنه كان ال GPA خمسة وعندي كمان سطر ال GPA
فيه خمسة و الاسم نفس الاسم و ال age واحد منهم عمره
عشرين و الثاني null هذا duplicate row لو مش
duplicate row إيش بدنا نعمل فيه؟ حكاية ال database
بتحكينا .. بتحكينا إذا ال null مقابلها رقم مش
duplicate ال null إذا مقابلها رقم مش duplicate لكن
إذا ال null مقابلها null هيعتبرهم duplicate خمسة
مع خمسة الاسم نفسه ال age null و null و كأنه اعتبر
.. و كأنه اعتبر أن ال null بتساوي مين؟ بتساوي null
مع إنه حكينا احنا في ال where في ال where لو عملنا
الشرط إنه age بيساوي null مش هيعطينا ولا على واحدة
من اللي قيمهم null هيعطينا عليها true مش هيعتبر
إنه null بيساوي null لكن في ال duplicate rows
بيعتبرهم ان هو بيعتبر إنه null بيساوي null هي
بيعتبرها true بس في حالة ال duplicate rows وهي
أثرها بيبين علينا على ال distinct إنه ال distinct
هتشيل السطر هذا ولا مش راح تشيله
برضه وجود ال null values هيأثر على شغلة اسمها ال joins
عندي في ال database وهذا يمكن آخر أهم موضوع هنشرحه
في ال chapter هذا ال joins اللي عندي في ال
database أربع أنواع احنا طول الفترة اللي بنشرح
فيها كنا بنشرح فقط في نوع واحد اللي هو بنسميه
simple joins أو ال inner joins هذا النوع إيش يعني
join؟ join يعني أننا نعمل query من multiple tables
من two tables أو أكتر إحنا بتذكروا حكينا إذا ال
query ال select من one table سميناها simple query
ولما كانت من two tables أو أكتر حكينا عنها
complex يعني قليل الربط بين ال complex هذه ال
complex query قليل الربط بين ال tables اللي كنا
ناخدها طول الفترة السابقة قالية الرابط اسمها ال
inner join أو ال simple inner join كلهم نفس الاسم
فكرتها ببساطة أن أجيب column من
ال table الأول table one و أخلي قيمته تكون بتساوي
قيمة column ثاني في ال table مين ال column two في
ال table الرقم اثنين بتذكر كنا نجيب ال SID مثلا من
ال table الأول و نعمل chart where بيساوي ال SID في
ال table الثاني اللي هو يعني رابطنا primary key مع
foreign key عملية الربط هذه primary key مع
foreign key أنهم القيم بتاعة ال columns بتساوي بعض
بتعطيني ال inner join لإنه هيطلع لي النتيجة .. إيش
هتطلع النتيجة .. هيطلع لي فقط ال rows اللي القيمتين
فيهم مالهم بتساوي بعض وإذا القيم ما بتساوي بعض كان
إيش يعملهم elimination .. كان يشيلهم تتذكر لما
حكينا عن ال select كيف بنحسبها .. حكينا أول خطوة
عشان نحسب ال select كنا نعمل إيش اسمه cross product
صح أن أكرر كل أسطر ال table الأول مع كل أسطر ال
table الثاني وبعدها أطلع على ال where اللي فيها
الشرط أن ال column هذا بيساوي هذا إذا بتساوي أخليهم
و اللي بتساويش كنت إيش أحذفهم هذه العملية كلها
inner join طب إيش ال left و ال right و ال full
joins ال left join فكرتها أنه يبدأ يطلع على ال
table الأول الـ right join ده بتطلع على ال table
الثاني اللي على اليمين left و right إيش هيصير في
ال left join هجيب كل ال rows في T1 في ال table
الأول all rows هاخدهم بغض النظر القيمة تحت ال
column في ال table الأول بتساوي الثاني أو ما
بتساوي هاخدهم و أطلعهم ال table الثاني هو فقط اللي
هشترطه تكون قيمة الكلوم بتساوي قيمة الكلوم
الثاني أروح أطلع قيمته طب وإذا ما بتساويش بحط مقابل
ال row اللي في ال T1 اللي ما فيش مقابله مقابل بحط
مقابله مقابله null عشان نبسط الفكرة هنطلع الجداول
اللي عندنا تحت ال sellers و ال reserves لو طلعنا
على ال sailors كم sailors عندنا في الجدول مثال
example اللي أخدناها؟ عشرة هل كلهم حجزوا قوارب في
table of reserves؟ راحوا حجزوا قوارب أو مراكب؟ مش
كلهم طب احنا لو عملنا select إنه نطلع معلومات
البحار معلومات القوارب اللي حجزها من table of
reserves بحيث إن رقم البحار في جدول البحارة هو
نفسه رقمه في الحجزات هيطلع معانا بس بس اللي حجزين
و اللي مش حجزين مش هيطلع هذه ال inner join العادية
اللي كنا نعملها طب لو أنا بدي .. لو أنا طلبت بدي
كل أسماء البحارة واللي إله حجز يبين الحجز تبعه
موعده مثلا واللي مالهوش حجز ينحط يبقى له إنه فاضي
بس بدي اسمه بدي أشوف اسمه إنه فاضي هذا كيف بنعمله
بال left outer join عشان نشرح بالتفاصيل بنشوف مثال
عشان نفهم الصورة مظبوط هفتح
عندي ال Oracle الآن
لو أنا عملت select star from sailors كم سيلر اللي
هيطلع عندي؟ عشرة في واحد أنا ضفته المرة اللي فاتت
من الذاكرين هو إيش اسمه كان fraud رقمه 96 فهي عندي
11 rows selected select start from sailors هدول
كلهم حجزين لأ مش كلهم يعني هتطلع هتلاقي رقم 96
مثلا رقم 29 ممكن رقم 71 مش متأكد 85 95 هدول مش
حجزين مالهم مش حجزين فاحنا لو روحنا عملنا select
الـ S dot S name اسم السيلر وكمان ال S dot S ID
رقمه و المركب اللي هو حاجزه من تابل الحجزات ال BID
من تابل الحجزات from كنا نكتب احنا إيش sailors مش
هي كنا نكتب أول S reserves are
وكنا نحط الشرط اللي هو where إيش ال S.SID ال
primary key تبع ال sailors بيساوي ال R.SID اللي هو
عبارة عن foreign key في جدول ال reserves هيطلعوا
معانا بس اللي اللي لهم حجزات اللي رقمه موجود في
ال sailors ورقمه موجود برضه في ال reserves شايفين
إيش طلع معايا طلع معايا Dustin أربع مرات و رقمه 22
ليش أربع مرات لأنه حاجز 101 و 102 و 103 و 104 هدول
المراكب اللي حاجزهم لوبارد طلع ثلاث مرات لأنه حاجز ثلاث
مراكب هوراشيو اللي رقمه 64 حاجز مرتين 101 و 102
هوراشيو الثاني اللي رقمه 74 حاجز المركب رقم 103
طب اللي مش حاجزين ما طلعوش طب كيف أنا ممكن اطلع نفس
شكل ال table هذا بدي أنا الطلابه معلوماتهم في النصفي و
بدي أطلع كمان الطلاب اللي ما أداومش النصفي اللي ما
أداومش النصفي مش صفر null هو ما دخلش الامتحان أصلا
فأنا بدي زي هيك مثلا اكويري زي هي طلع لي أسماء
الطلاب إذا هو عامل امتحان نصفي أو نهائي علامته مش
عامل بدي آخذ فراغ محلها أو null فهذه بدها left
outer join كيف بدي أكتبها؟ لأ لأ بسيطة جدا في ال
left outer join هتطلع رأي بسيط جدا هي هأعمل select
نفس ال select السابق ما فيش داعي أرددك تبحث أعديها
كمان مرة المرة هأحكي ب from sailors اللي هم S بس
إيش بتعمل في ال sailors بتعملها left outer join
sailors غلط صحيح
from
sailors
s left
outer join لأي table sailors على الشمال بنحكي له
هذا lift outer join مع ال table اليمين اللي هو
table مين ال reserves مكتوبة صح ال reserves are الآن
الشرط on الشرط اللي بربط بين ال two tables بيبطل
اسمه where في where طبعا بس ال where لا إيش ثاني أما
الرابط بين الجداول بيبطل عن طريق ال where صار من
خلال ال on هذه on مين اللي بديهم يتساووا مع بعض ال
S.SID يساوي ال R.SID هضغط انت طلع جاب لي أول واحد
Frodo ورقمه 96 لكن مش حاجز مالوش مركب null فاضي بس
طالما انه موجود في جدول ال sailors لازم يطلع اسمه
Dustin موجود أربع مرات لأربع حجزات Protoss مالوش
ولا حاجز جاب اسمه جاب رقمه لكن null الحاجز تبعه
null لو بار تلات حجزات and دراستي مالهمش هراشوا له
حجزين زوربه null وسط ايش يعني فكرة left outer
joint انا هاخد ال rows اللي في ال left كاملا في
table one هاخد كل ال rows أو ال rows بغض النظر عن
الشرط بس ال table التاني بتطلع الشرط على ال
condition اللي هو ال SID بيساوي ال SID إذا الشرط
متحقق بطلع القيمة متحققش بحط بدالها إيش ال right
outer join نفس الفكرة بس العكس في ال right outer
join هجيب كل ال rows تعوني ال T2 و هناك حل تزم في
الشرط ال full ال full هعمل زي ال left و أروح أكمل
عليهم تكميل اللي ما طلعوش من ال T2 أحطهم و أحط
مقابلهم فاضي نل يعني زي كانها left مع right ال
full outer join left مع right تنتم مع بعض ال left
و ال right مع بعض نعم لش طلعهم جدولين؟ أه لش طلعهم
جدولين لأن ال Oracle فيها ترتيب أن عامل فيها ترتيب
أو he by default فيها ترتيب أنه كل عشر أسطر يرد
يعيد يعيد اسم ال column عشان مثلا لو استعرضت ألف
طالب مثلا هنس أنه هذي رقم المركب ولا رقم الطالب
ولا رقم إيش فبدي أرد أرجع أطلع فوق لآخر زي ما لف
ال Excel أشوف إيش اسم ال column فهو كل عشر أسطر
بكرر أسماء ال columns طبعا ممكن نغير ال default
هذا نعمله كل عشرين كل مية بس هو by default كل عشرة
أو إشي زي
نرجع لل slides اللي عندنا اذا احنا ال simple join
أو ال inner join هذه ال join مالها هذه اللي احنا
اتعودنا ناخدها هذه اللي احنا طول الفصل نتعامل معها
اسمها ال inner join وهي لازم يكون في matching بين
ال two tables الشرط يتحقق في ال two tables تبدأ
مشكلتنا ان نشوف ال null values للاشي اللي مافيش
فيه matching مافيش فيه تطابق مع ال left و ال right
و ال full فهيني انا اكتبلكم ملاحظة ان ال all
examples اللي احنا أخدناها until نا و حتى اللحظة
كلها عبارة عن مين simple او ال inner ال inner join
نبدأ في ال inner join اللي هي أسهل واحدة اللي طول
الوقت احنا بدنا نتعامل معاها ال inner join هي ال
most common type of joins معظم ال queries اللي
هتلزمكم في الحياة العملية هي اصلا من نوع ال inner
join 90 او اكتر من 90% من ال queries اللي بتلزم
فعليا inner joins ال inner join هترجعلي كل ال rows
من multiple tables بس بشرط ايش ال condition is met
ال condition يكون true في الجهتين في ال two tables
الـ syntax تبعها كيف نكتبها select أسماء ال
columns اللي بدنا إياها from table 1 لاحظوا الصيغة
الآن اختلفت بطلنا نستخدم where inner join table 2
on ال column هذا بيساوي ال column التاني كمان مرة
select columns from هي ال table أول احنا كنا نعمل
table 1 ونروح نعمل فاصلة و نكتب هذه إيش table تو
ونروح نحط where ونحط شرط صح؟ عشان كنا نعمل لأن بدل
كلمة table two هنعمل table one inner join table
two يعني أربط ل table one مع table two نوع ال join
إيش inner طب إيش الشرط؟ هاي الشرط on ال column هذا
بيساوي ال column هذا مثال
أو example في
عندي two tables واحد للـ suppliers مزودين شركات
تعطيني قطع أو تعطيني بضاعة وفي عندي orders طلبيات
طلبيات ال suppliers في supplier ID و supplier name
إيه رقمه و إيه اسمه ألف ليه شركة IBM ألف و واحد
شركة HP ألف و اتنين Microsoft ألف و تلاتة Nvidia
ال order tables في عندي رقم لل order وفي ال
supplier اللي جابلي ال order رقمه هذا معناته إيش
هيكون ال supplier ID هذا primary ولا foreign ال
supplier ID في جدول ال supplier primary key وموجود
في هذا ال table ع شكل إيش يعني هو اللي بربط من ال
two tables وفي عند ال order date تاريخ ال order
تاريخ الطلبين و ال primary key تبع الجدول هذا اللي
هو مين اللي هو ال order ID هو ال primary key فانا
لما أحط الشرط على ال inner join اللي احنا متعودين
عليه انه ال primary بيساوي ال foreign مين هيطلع؟
الألف موجود في ال orders هاي ال supplier اللقم ألف
موجود معناه تروا هذا بدو يطلع في ال query صح؟ طيب
الألف و واحد موجود؟ موجود الألف و اتنين و الألف
تلاتة موجودين؟ مش هيطلع معناه السطرين اللي هيكونوا
النتيجة هايهم الألف و الألف واحد بس ايش اسم الألف؟
العشر تلاف العشر تلاف اللي هو مين IBM والعشر تلاف و
واحد اللي هو مين HP هاي أسماءهم تاريخ ال order
ساعتهم هايهم من السطرين هدول هاي تاريخ ال order
هاي تاريخ ال order تلتاش خمسة و اتناش خمسة هاي
تلتاش خمسة و اتناش خمسة هذه نتيجة ال inner join
اللي احنا متعودين نحسبها كيف كتبناها زمان كنا
نكتبها هيك select supplier id من جدول ال suppliers
و supplier name من جدول ال suppliers و ال date من
جدول ال orders from أسماء ال two tables اللي هم
suppliers و orders وهي الشرط أن ال supplier id هو
نفسه في ال two tables في ال orders و في ال
suppliers كيف نكتبها في الطريقة الجديدة؟ هي انه
انا عملت from suppliers كتبت اسم ال table الأول و
روحت حكيات inner join inner join ال orders inner
join ال orders on نفس الشرطة هذه ال query هي نفسها
هي نتيجتها اللي احنا متعودين نحسبها مافيش اشي جديد
طب ليش احنا بنعلمكم ال syntax الجديد؟ مش بضروري في
الامتحان تكتبوه لو كتبتوا بهذه الطريقة مافي مشكلة
لكن احنا بنتعلمه عشان كمان شويه بدي اشيل كلمة
inner join و أحط محله مين left join و right join و
full join بس عشان هيك هاخد نفس ال example و أطبقه
على left join و نشوف نتيجته على ال two tables وين؟
هذه ال primary key مربوط مع مين؟ بالعشر تلاف و
أربعة مش مقشر على أي شي صحيح مش موجود بقشرش على أي
شي موجود عندى في ال example هذا صحيح كلامك مظبوط
في عندي هنا عشر تلاف و أربعة و بقشرش مش مقشر على
أي شي ليش موجود هيك؟ موجود هيك عشان أنا بس بتعمل
example مش أكتر أما فعليا لو أنا عامل restrictions
restrictions مظبوطة في ال tables عندي و معرفه فعلا
ك foreign key مش هيدخل أصلا في ال database كلامك
مظبوط ال left outer join فكرتها زي ما شرحنا أن
احنا بدنا نطلع ال all rows من ال left hand table
ال table العيدي الشمالي في ال code في ال code ال table
العييدي الشمالي بينما العيدي اليمين بس only those
rows اللي ما لهم ال join fields are equal الشرط
تبعهم بيساوي بعض ال primary key بيساوي ال foreign
key شكلها select columns from table one left outer
join ال table التاني on و الشرطين اللي بدنا يهم
الشرط اي column بيساوي اي column كلمة author هذه
بعض ال database optional يعني مش ضروري تكتبها يعني
ممكن نكتب بس from table 1 left join بدون كلمة
author left join بدون كلمة author ال author هاي
optional طبعا في ال inner مش موجودة لأن ال inner
هي مش .. مش author ال inner واحدة و ال author
تلاتة فهذه left join أو left author join ايش
نتيجتها هتكون في ال example اللي عندي؟ لو عندي انا
supplier table زي هد فيه الأربع شركات وعندي ال
order table فش فيه غير two orders و بدعم ال left
join هذا ال left و هذا ال right مدام هذا ال left
إذا كل الأربع أسطور هدول لازم إيه إيش؟ لازم يظهروا
اللي إله order هنطلع تفاصيل ال order بتاعته و اللي
مالوش order هذه ال query select supplier ID و
supplier name و order date هايهم بدنا supplier ID
و supplier name من جدول ال supplier و من جدول ال
order بدنا بس ال order date left outer join مين
اللي على الشمال؟ هاي اللي فوق suppliers مين اللي
على اليمين؟ ال orders بما أنه left معناته ال
suppliers لازم كلهم يطلعوا عندي أربع عصر بدأ أشوف
كل واحد من أربع عصر لازم يكون موجودهنيجي على الأول
رقمه عشر تلاف الشرط رقمه عشر تلاف في مقابله عشر
تلاف سطر واحد فهيظهر سطر واحد لو في مقابله سطرين
قيمتهم عشر تلاف هيظهر سطرين اللي أخذناها السيلرز
في السيلرز لما كان داستن حاجز أربع مرات داستن طلع
مرة واحدة لأ بطلع أربع مرات هاي داستن متكرر عندي
أربع مرات رقم 22 أربع مرات لإنه أربع حجوزات لو
مالوش أي شيء هيطلع مرة واحدة و مقابلها إيش مقابلها
نفس الفكرة عندي في أنا عندي order واحد بس للشركة
اللي رقمها عشر تلاف الشركة الرقم 10000 اللي هي IBM
اللي هي بس order واحد هي تاريخه 12 5 فهيطلع 10000
IBM 12 5 اللي بعديها 10000 واحد اللي هي order نفس
الشيء هحط رقمها واسمها و تاريخها 13 5 هي طلعت
الاتنين اللي ضايلين ما اللي هم مش order ما فيش عندي
order هجيب أرقامهم و أسماءهم و تاريخ ال order ما
اللي هم مش order فتاريخ ال order
هي left outer join right
outer join زي ما أنا شرحت الفكرة المرة هي هاخد ال
all rows من ال table اللي في ال code من وين موجود
على اليمين و اللي على الشمال بس إذا بحقق ال
condition إذا بحقق الشرط select ال columns from
table 1 right outer join و كلمة outer ممكن نشطبها
عال table رقم 2 on الشرط تبعي ال tokens اللي بديهم
يكونوا بيساووا بعض هذه المثال المرة هذه عندي
suppliers في كام واحد بس اتنين suppliers واحد رقم
عشر تلاف و واحد رقم عشر تلاف و واحد شركة apple و
شركة google ال orders table في عندي اربع three
orders عندي three orders بدي أنا write right join
يعني هدول التلاتة كلهم لازم يظهر فعندي suppliers
right outer join ال orders فال orders هي اللي على
ال right هي اللي بتظهر كلهم هنبدأ العشر تلاف اللي
لها قيمة بتسويها صحيح إذا أنا هحط العشر تلاف ورقم
الشركة مثلا ما عيش اللي عامل عليه supplier ID
بيساوا بعض بس أنا اللي مظهره اللي بدي أظهر هو رقم
ال order id ورقم ال order date و ال supplier name
هاي ال supplier name من جدول ال supplier و هاي ال
order id و هاي ال order date هدول اللي أنا بدي
أظهرهم ال columns فهاخد ال order id كان خمسمية مية
خمسة و عشرين هاي ال order date في اطمعاش تمانية
هاي موجود supplier name هاي الرقم بيساوي الرقم هاي
ال name apple
اللي بعده عشر تلاف واحد موجود اه موجود إذا أنا أحط
الاسم Google ال order ID خمس تلاف مين ستة وعشرين
هيو خمس تلاف مين ستة وعشرين و تاريخه تلتاشر تماما
اللي بعده في عندي order له تاريخ و شركة لها رقم
و في order له رقم لكن مش موجود ال supplier هذا مش
موجود خلص دول ال suppliers و أنا عامل على ال right
فإذا بدأ أخد معلوماته اللي موجودة في هذا الجدول
اللي هم دول معلومتين بس order id و order date
هايهم عبيتهم و ال supplier مالوش اسم عندي حطيت له
ال
full outer join بدنا نأخد كل ال rows في ال table
الأول و كل ال rows في ال table الثاني و نكرر بيانات
فقط الناس اللي الشرط بتاعهم بتحقق و اللي شرطهم
ما بتحققش بنحط في ال columns اللي من ال table
التاني in all نفس ال syntax بس بدأ ال left و بدأ
ال right ده حط مين full بالضبط يعني ال cross
product مش هنشيل منه إيش مش احنا أول خطوة في ال
select نعمل cross product مش هنشيل منه إيش هنخليه
هي عندي نفس الفكرة بدي ال supplier id و ال
supplier name و ال order date من ال two tables و
ال two tables ده عمل عليهم full join في ال table
الأول في عندي أربع أسطر و في التاني في عندي تلاتة
هنجي على ال table الأول العشر تلاف في لها مقابل هي
موجود المقابل العشر تلاف و واحد برضه موجود العشر
تلاف و اتنين مش موجود هدى هنحطها و هنحط مقابلها
مين none العشر تلاف و تلاتة موجود هنحط مقابلها مين؟
none نرجع ال table التاني اخترنا هدول الصطرين صح؟
التالت اخترنا طلع معنا؟ ما طلعش، إذا بدي احط التالت
كمان و احط مقابله على الجهة التانية أيش؟ none أخدت
مين في الآخر؟ اللي ما أخذناهوش، ما اخترناهوش، اللي
ضايل، المتبقي مش روحت أخدتهم كلهم كمان مرة اللي
مالوش اشي مشترك جبته في الآخر هنشوفه ما هي العشر
تلاف IBM وهي تاريخ تبعه اتناشر تمانية موجود اللي
بعديه عشر تلاف واحد تاريخه تلتاشر تمانية اسم
الشركة HP هو ال bugger طيب ال الف و اتنين و الف و
تلاتة هي جيبنا ال الف و اتنين و الف و تلاتة واسمهم
لكن مالهم مالهم مش order date فحطينا null جينا على
السطل الأخير إله تاريخ هاي تاريخه لكن ما إله
supplier name ولا supplier ID في الجدولة هذا
مقابله ما فيش شيء مقابله فهحط مقابلهم و لاحظوا
ما جبناش ال supplier ID هذا supplier ID طلع عليه
شيء موجود هذا ال 1004 أخذنا تاريخه لكن ما جينا ش
أخذنا الرقم هذا و حطناه هنحطينا null ليش؟ لأنه أنا
إيش طالب ال supplier ID من أي جدول بديها من ال
suppliers من الأول فهو في الأول مش موجود ف null
لكن لو أنا كنت طالب ال supplier ID في ال select لو
طلبها من ال orders هتنحط
قيمتها و هتنحط التاريخ و تظهر هاي بس هاي بس اللي
بتظهر null شوفت وين ال trick من وين جبنا ال
supplier ID؟ لو جيبناها من جدول ال supplier مالهاش
وجود الألف و أربعة هي مالهاش وجود فحضلناله لو
جيبنا ال supplier ID أصلا كنا طالبينه في ال select
من جدول ال orders موجودة حتنحط متها لكن ال name
ما فيش عندي نفس الرقم قوله name فبدنا ننتبه في ال
left و في ال right و في ال outer joints من وين جاي
الكلمة من أي table احنا ليش بنحط اسم ال table قبل
اسم ال column؟ عشان نميز من وين جاي بنعرف إن ال
supplier ID اللي بدنا إياه اللي بنحكي عنه اللي في
table ال suppliers ولا في table ال orders رقم
الطالب اللي بنحكي عنه هو رقمه في جدول الطلاب ولا
رقمه في جدول حجز المساقات ولا رقمه في مثلا كشف
الخريجين بدي أعرف الرقم من وين جاي من أي table أو
الاسم جاي من أي table فحسب ال table بحدد إنه
القيمة هي null ولا مش null في شيء صعب في ال left و
ال right و ال outer joints إيش استخدام هالعمل اللي
عندي زي ما حكينا الأمثل اللي أنا حكيتها أنا بدي
كشف بالطلاب مع علاماتهم طب في ناس ما قدمتش الامتحان
طبيعي إن أنا بدي أطلع الكشف الاسم و اللي ما لهوش
علامة تطلع بدالها نظر بدي أنا للمساقات اللي سجلها
الطالب و علامته فيها و كمان المساقات اللي ضايلة
عليه اللي لسه ما سجلهاش مش كل طالب عنده خطة و فيه
مساقات لازم يسجلها ف أنا بدي يطلع اسم الطالب و اسم
المساق و علامته و ممكن ما يكون لهوش علامة لأنه لسه
ما أخذش المساق ف هذه الحالات اللي بيكون فيها في ال
table الثاني ما فيش مقابل بحتاج ال left و ال right و
ال full outer joins كام ساعتنا ظال دي اتنين تلاتة
طيب آخر شيء هي آخر slide في نفس الموضوع في كلمة
صغيرة ممكن نضيفها على ال outer و ال left و ال
right joint اسمها natural شايفينها الكلمة هذه
natural كلمة natural هاي بتغنيني عن الشرط مش احنا
كنا نحكي الشرط on و نحط اللي هو ال SID بيساوي ال
SID من two tables ممكن أستغني عن ال on هذه و الشرط
بس بكلمة natural طب natural إيش بتعمل؟ natural
بتروح تطلع ال two tables و ال columns اللي لهم نفس
الاسم تعتبرهم هم الشرط يعني في المثال السابق اللي
عندنا supplier ID في supplier ID في ال table
التاني فلو استخدمت أنا natural مباشرة هو لحاله
بيعمل هذا ال column إنه يساوي الشرط يكون بيساوي
هذا ال column طيب supplier name في supplier name؟
ما فيش ال order date في order date في ال table
التاني ال order ID في order ID في ال table التاني
لأ فمعناته الشرط هو مين ال supplier ID بيساوي ال
supplier ID لحاله بتعرف على الشرط لحاله automatic
بدون ما نحكيله إيش في الشرط بس هذا بالثلاثم مننا
إن احنا أصلا لما صممنا ال database لازم يكون حطينا
اسم ال column في ال table الأول نفس اسمه لو اختلف
حرف واحد ما بتعرفش عليه بيصير لازم احنا نكتبه on أو
where و نحط الشرط بإيدنا احنا نكتبه إذا بيستخدم
كلمة natural لل join لازم اسم ال column في ال two
tables يكون موحد متطابق 100% هذه المثال اللي عندي
على ال tables اللي معناه تاعة ال sailors و ال
boatsلو أنا عملت اللي هي select ال SID و ال BID
رقم البحر و رقم المركب اللي حجزه من ال two tables
ال sailors و ال reserves left outer join عملته زي
المثال اللي عملته الآن على الأوراق اللي هو نفس
المثال on الشرط أن ال SID في table ال sailors
بتساوي ال RSID في table ال reserves لاحظوا أسماء
الكولومز زي بعض فانا ممكن بدل ما أحط الشرط أكتب
natural زي هيك select from sailors بدل left outer
join بكتب natural left outer join وما فيش داعي أكتب
الشرط لأن ال two columns SID و SID معروفين لحالهم
مو لحاله هيروح يحسبهم هيعطيني نفس ال result نفس
النتيجة هاي ال query و هاي نفس النتيجة هاي كتبت
أنا فيها الشرط هاي ما كتبتوش اعتمد على كلمة natural
عشان يطلع الشرط لحاله ده سأل السؤال آخر مرة
natural كيف تعرف الشرط لحالها ال column نفسه في
الجدولين بنفس الاسم إذا اختلف حرف مش هتعتبر فيه مش
هتطلع عليه وضحكت؟ هيك احنا بنكون خلصنا موضوع ال
joins و المرة الجاي إن شاء الله بنكون خلصنا