أحنا المرة الماضية بدأنا و تكلمنا في chapter 3 له
relational model و تكلمنا ماذا يعني relational
database model و فهمنا أن ال relations هي ال
tables في مفهوم ال relational database model الذي
هو سمينا ال logical schema تكلمنا أننا راح
نشرح في هذا ال chapter و نركز على ال DDL language
من SQL التي هي ال data definition language التي
نعرف من خلالها ال relationsو ال relation قسمناها
إلى two main parts ال instance و ال schema ال schema
التي فيها التعريف التي تتعامل معها ال DDL
language شكل ال table ما هي أسماء ال fields التي فيه
ال columns اسم ال table أو ال relation و ال data
type لكل column الذي هو سميناه ما هو ال data type
هذا سمينا ال domain وحكينا إن ال instance هي
البيانات التي نعبئها داخل ال table أو داخل ال
relation لذلك ال instance هذه لها rows و
fields أو rows و columns سميناهم cardinality و
degree وحكينا أن ال cardinality تتغير باستمرار
لأننا ندخل بيانات و نحذف بيانات بينما ال
degree عادة لا تتغير إلا في لحظة البرمجة يعني
المبرمج الذي يصمم ال database أو لما يعدل
design ال database وهذه الأمور يعني لا تحدث دائماً
هو فقط المبرمج الذي يعدل على ال degree بتاعة ال
instance
أخذنا مثال الجدول الذي عندنا حكينا أن هذا المثال
ال degree بتاعة ال table أو ال relation كم؟ خمسة
خمسة columns ال instance التي عندي ال cardinality
بتاعتها three لو أضفنا طالب جديد تصبح
cardinality .. لو حذفنا كمان طالب من الثلاث
يصبحون اثنين تمام؟ طيب بعدها تكلمنا أننا ال
order
ال order تبع ال instance ليس له أي معنى irrelevant
ليس له أي معنى في ال database لأننا ال database
أصلاً تخزنهم ليس بالترتيب الذي نحن معتادين عليه
الأبجدية دي أو حسب الأرقام ترتيب تصاعدي أو تنازلي
ascending or descending ليس هناك أي order فكان لو نفس
ال instance هاي جئت بها لكن لخبطت الrows يعني السطر
الأول جعلته الأخير الرقم 201 وضعته بدل 215 وسألت هل
ال two instances نفس بعض the same الجواب أنهم the
same الترتيب لا يؤثر عليهم لكن لو أتيت على الثاني
وأضفت عليها سطر جديد أصبح it changed أو اختلاف على
ال instance لو حذفنا سطر أصبح it changed لو أتينا
غيرنا مثلاً قيمة حساب هذا بدل 400 عملنا 500 رغم أن
بقية المعلومات كما هي وعدد الأسطر نفسه ال
cardinality كما هي لكن ال instance تغيرت لماذا
أنه صار تغيير على البيانات أما بزيادة سطر أو بحذفه
أو تغيير قيمة هكذا ال instance تختلف هذا الكلام
كله يؤكد معلومة أن ال instance مع الوقت مع
استخدام ال database ليس كل يوم فيها تغيير كل يوم
يكون فيها تغيير في الشركة أو في المؤسسة
حكينا كمان عن ال constraints وأكدنا إن ال domain
constraint التي هي القيود التي نضعها على ال
data type وعلى القيم المسموح تخزينها في ال column
ال set of allowed values لل column هذا نسميه
domain constraint هذا موجود في كل column يعني ال
domain constraint موجود لكل column في ال database
بمعنى أنه أكثر constraint أستخدمه لأنه ليس هناك
كلم ليس عليه type ليس عليه domain constraint
وأكدنا أنه لو جاءك سؤال أن ال domain constraint
يعني مثلاً is not important أو يعني not each column
must have a domain constraint الجواب أنه false لا
لازم كل column يكون عليه domain constraint
وحكينا في النهاية أن ال database تشكل عندي من
multiple relations وصار مفهوم ال relation عندي
الذي هو ال table ليس ال relation التي كنا نأخذها
التي هي ال action بين ال entity sets لا لأن ال
entity set و ال relation اسمهم relation وأخذنا
مثال للبنك أن البنك فيه accountsTable ال accounts
للحسابات Table لل customers relation لل customers
أسمائهم و عناوينهم معلومات عنهم Depositars الناس
التي تودع في الحسابات من هم ماذا في معلومات عنهم
ما هي الحسابات التي يملكونها تكلمنا
أن في عندي language اسمها relational query
language التي فيما بعد سنسميها نتعرف عليها باسم
ما هي SQL SQLrelational query language هاي حكينا
تتميز بأنها simple, powerful and easy تكلمنا في
الكلام هذا حكينا أنها simple لأنها لغة بسيطة تكتب
بال written naturally language باللغة العادية لما
أنت ستقرأ في ال command set ال SQL أن create
table students لو أنا لا أعرف أي شيء عن البرمجة
ولا أي شيء عن ال database مجرد أني أعرف لغة
انجليزية natural طبيعي create table students سأفهم
أن create أريد أن أنشئ table جدول students للطلاب أريد
أن أنشئ جدول للطلاب لا تحتاج معرفة في البرمجة ليس مثل
ما أذهب لأتعلم لغة مثل مثلاً C++ أو Java أو Python تحتاج
فهم برمجي و أريد أن أدخل في تفاصيل في تعريفات لا لغة
SQL لغة تستخدم ال natural English language
written language كل الكلمات التي فيها واضحة و
مباشرة فهذا جزء من الذي يعطيها ال simplicity
powerful يعني قوية لأنه أنا ممكن أعمل من خلالها
complex queries بكل سهولة حكينا في عندي simple
query و complex query ما هو الفرق بينهم؟ من يتذكر؟
الـ .. ال simple query هذه تأخذ البيانات أو ال
data من جدول واحد من جدول واحد من أكثر من جدول إذا
أنا عندي query تعمل retrieval لل data من one
table one relation هذه simple إذا من أكثر من table
يعني أجيب معلومات من table الطلاب و الكورسات
المثقات و المدرسين مثلاً صاروا ثلاثة tables أجيب
منهم معلومات مع بعض في نفس اللحظة أصبحت complex
query حتى ال complex query سهل جداً أن نكتبها في
لغة STL فعشان هي هذه لغة بورفها آخر شيء يهيئ له
وصلنا عند الجملة هذه صح ال precise semantics ماذا
يعني precise semantics precise يعني دقيق semantics
مفهوم يعني الدلالات اللفظية بتاعة أوامر السؤال
مفهومة و واضحة لما أحكي أنا create table مستحيل
يعني أن يصير عندي سوء فهم أننا نريد أن نصنع row
واحد فقط لا نريد أن نصنع table كامل لما أحكي create
view واضح أنني أريد أن أصنع view وليس table لما أحكي
أنا drop table واضح أنني أريد أن أحذفه ليس هناك
confusion ليس هناك ما هو غامض ليس فيها غموض فِلغة
precise لها precise semantics دلالات ومفاهيم
واضحة وبالتالي فاهمها على المبرمج سهل وفاهمها على
ال DBMS أن ال DBMS تُرجم أوامرك لِشغل هو يشتغله أيضاً
واضح ومباشرة هذه كلها أجزاء من كونها simple و كونها
powerful آخر نقطة أن عشان أوامرها لها مفاهيم دقيقة
و واضحة سهل جداً نعملها optimizer هذا جزء من DBMS
حكينا DBMS في chapter 1 مطلوب منه مهام كثيرة أن
يخزن على ال physical storage مطلوب منه أن يعمل
transactions مطلوب منه أن يعمل concurrency control
يعمل data independence يعمل backup يعمل restore لل
database كل هذه مهام لل DBMS جزء من مهمته أن يعمل
optimization لل query ماذا يعني optimization تحسين
وتسريع لأن كيف يعمل تحسين وتسريع ليس شغلنا شغل ال
engineers الذين يبرمجون ال product تبع ال data
business نفسه ليس شغلنا نحن لكن الفكرة أن سهل جداً
أن نعمل optimizer مثل ال DBMS في ال relational
model لأن المفاهيم هذه واضحة و مباشرة أريد أن أعطي
مثال صغير لا نريد يعني نحفظه لو أنا أريد أن أجيب
معلومات الطلاب أستعرض جدول الطلاب أسمائهم ممكن أنا
بكل بساطة أكون أعرف أن هذه مقدمة لأنه مادام هو يريد
يستعرض معلومات الطلاب أو أسماء الطلاب ال user الذي
عندي معناه غالباً إما يريد أن يعدل لهم علامات أو يريد
يسجلهم في كورسات أو يريد أن يجيب عناوينهم وبالتالي أنا
ممكن أسرع شغل ال database بتاعتي بإني أستبق بأن ليس
مثلاً أجيب له الأسماء أجيب بقية معلومات الطلاب
والشيء الذي له علاقة بالطلاب و أخزنه عندي في مكان
سريع الوصول إليه cache نسميه cache أو buffer حيث أنه
لما يأتي المستخدم بعدها ينفذ ال query التي بعدها
يبدأ بده يغير تكون ال data أنا جايبه إياهم جاهزين
إياها من أول طبعاً الكلام هذا ليس شغلنا يعني ليس ..
يعني مش مطلوب مننا نعرف كيف بيشتغل بالضبط أو
بالتفصيل بس الفكرة أنه في Optimization في الـ DBMS
للـ queries بيعتمد على كونها لغة واضحة المفاهيم
وهذه ميزة للـ SQL language هاي كيف ظهرت وكيف أتت
في البداية الـ SQL كانت منتج لشركة اللي هي شركة IBM
شركة IBM عملت أول Relational Database سمتها System
R اختصار كلمة Relational أجوا منظّرين بتعاون
الـ Computer Science و اتكلموا أن احنا ممكن نعمل
Relational Model وأن هذا ممكن يكون له ميزات أتت
IBM أخذت الـ Research والبحث هذا وطبقته في
Product عملي سمتها الـ System R في السبعينات وعملت
لغة لبرمجة الـ Database سمتها الـ Structured Query
Language وبعدين IBM طورت منتجها الـ System R وعملت
منتج Database جديد سمتها DB2 طبعًا ليش سمتها DB2 ؟ DB
يعني Database Two لإنه أتى بعد بعد الـ System R صار
اسمه DB2 يعني الـ Database رقم اثنين واستخدمت الـ
SQL وصارت الـ SQL ملك لمين؟ لـ IBM بعد فترة لما السوق
أحس بأهمية الـ Database بشكل Relational وأنها قوية
وProduct يعني Reliable والـ Performance سرعتها
عالية صارت شركات ثانية تصنيع الـ Database صارت
تستخدم لغة الـ SQL لأنها لغة زي ما حكينا سهلة و
قوية فأجت مؤسسات اللي بتعمل Standards زي ANSI و
ISOاللي بيعملوا Standards العالمية يعني المعايير
للاستخدام أمور كثيرة من ضمن الأمور البرمجية حكوا
بدنا نحول SQL للغة Standard بحيث أن كل System
يستخدمها فعملوا أول Standard لـ SQL في سنة الـ 86
IBM اخترعته في السبعينات في الـ 86 صار Standard في
الـ 89 صار عليه تعديلات بسيطة في 92 ظهرت نسخة جديدة
من SQL في الـ 99 ظهرت نسخة أكثر حداثة من SQL الكتاب
اللي عندنا بيشرح الـ Standard تبع الـ SQL 99 فروق
بينهم بين الـ 99 وحتى الـ 86 فروق بسيطة فروق بسيطة
في الـ Syntax أو في القوة بتاعة الـ Query الفكرة أن
احنا الآن الـ Standard اللي مشغول عليه اللي هو SQL
99 هنلاقي أن الـ DBMS Products اللي عندنا في السوق
سواء كان الـ DB2 أو Oracle أو MySQL أو Microsoft
SQL أو Access أو غيرها من الـ DBMS كلها بتستخدم الـ
Standard هذا مع يعني شوية تغييرات بسيطة
يعني لو جيبنا الـ Code اللي بده يشغله على Oracle و
أجيبه نفسه وأشغله على الـ DB2 بيكون بده تغيير بسيط
عشان يشتغل بده يشغله على MySQL بده تغيير بسيط عشان
يشتغل مش هيشتغل مباشرة لكن اللغة بمفهومها العام
أو أوامرها العامة تقريبًا متشابهة زي إيش في
اختلافات ممكن تكون بسيطة بينهم بدي أعطي مثال واحد
على الاختلافات البسيطة مثلًا في الـ .. في الـ Numbers
احنا لما كنا نشوف الأمثلة حكينا بدنا نعمل الـ Age
تبع الطالب Integer صح؟ رقم صحيح بينما معدل التراكمي
أو رصيد البنك أو الـ Salary بتاعة الموظف اللي
بنعملها إيش؟ Real والـ Integer موجودين في الـ
SQL الـ Standard تبع الـ 99 لكن لو روحنا على الـ
Oracle في الـ Oracle ما فيش لا Integer ولا Real الـ
Oracle بتحكيلك أي رقم بده يكون إيش؟ بيكون Number
بيكون Number
طب أنا كيف أديميز أن هذا Number Integer ولا Real
أو Float إذا كتبت لـ Oracle بس Number هتاخد الرقم
منك زي ما هو سواء Integer أو Real زي ما خزنته
ترجعلك إياه بنفس الشكل لكن لو أجيت فتحت قوسين و
كتبت خمسة فاصلة صفر يعني أنت يا Oracle بديّاك تخزني
الـ Number هذا خمس خانات Five Digits وبعد الفاصلة
العشرية ولا إشي بدي صفر يعني الرقم هيكون ماله؟
Integer لو أجينا حكينا بدنا Number خمسة فاصلة ثلاثة
يعني بدي ثلاث أعشار يعني لو دخلنا مثلًا راتب بالشكل
هذا إنه فيه Salary للـ Employee Number خمسة فاصلة
ثلاثة وأنا أجيت حكيت أن الـ Employee راتبه ألف لمّا
أجي أطبع الـ Oracle اللي هتعطيني من الراتب عبارة عن
01000.000 لماذا؟ لأنه طلبت أن أخزنه بشكل خمسة
ثلاثة بس أنا لما دخلت وعطيتها ألف فهي لما هتطبع
لها هتطبع ليها 00000.000 على الشمال مالوش قيمة و
الأصفار بعد الفاصلة مالهاش قيمة بس هتحافظلي على
الشكل اللي أنا طلبته منها فيه إيش الاختلاف البسيط؟
أن بدل الـ Integer وReal استخدمنا Number فنقرأ
كذا هنروح لـ MySQL هنكون فيه اختلافات بسيطة لكن الـ
Commands بشكل عام الـ Select لـ Create Table كيف نعمل
الـ Primary Key كذا الأمور هي تقريبًا كلها يعني
خليني أحكي 95% من الـ Commands كلها مالها نفس الـ
Commands ساعة الـ SQL 99 مع اختلافات بسيطة صغيرة
طبعًا الاختلافات هي بتأخذوها في المعمل أنا في
الشريحة بنشرح Pure SQL 99 ممكن أني يعني شوي أتكلم
عن الـ Oracle إذا في اختلاف مهم بدي أحكي عنه بحكيه
لكن في المختبر أنتم أصلًا هتشتغلوا Oracle فصلًا مش
راح ياخد منكم الـ Compiler إلا Command يكون متطابق
مع الـ Oracle بدي أبدأ أتعرف على SQL Language أول
أبسط جملة بنعلمها دائمًا هي الـ Select اللي هي جزء من
إيش؟ من الـ DDL من الـ DDL Select من الـ DDL DRL جزء
من الـ DRL Data Retrieval Language أو Command
SQL Select ببساطة معناها اختيار Select بالـ
English معناه بدي اختار يعني بدي أعمل Show أو View
بدي أعرض بيانات موجودة أصلًا في الـ Database Select
* يعني بدي أعرض كل الـ Columns اللي في الجدول
أنا المثال اللي عندي هي الجدول اللي في الـ Database
هذا الجدول لـ Students لطلاب اللي لهم أرقام وأسماء
ومعدل تراكمي وعمر وLogin الجدول هذا بدي أستعلم
عنه بدي آخد منه معلومات فبدي أحكي للـ Database
Select يعني View أعرضيلي * يعني كل الـ Columns
ممكن بدل الـ * إيش؟ Age أعمل افتح قوس وأكتب أن
أنا بتعرض لـ SID فاصلة الـ Name بدي أعرض كمان الـ
Login وأكمل الـ Age والـ GPA إذا كتبت Select و
فتحت قوسين وكتبت هدول وعملت * الاثنين هدول
إيش مالهم؟ The Same نفس الشيء لكن من الآن بأعطيكم
نصيحة ماحدش في برنامجه يعمل Select * النتيجة
اللي هتعرضها الـ Database أو الـ DBMS نفس النتيجة
لكن اللي بيختلف الـ Performance السرعة لما احنا
بنحدد أسماء الـ Columns الـ Database مباشرة بتاخد
أسماء الـ Columns وبتنفذ الـ Query لكن لما بنحط
* الـ Database شو بيعرفها شو هم أسماء الـ Columns
مابتعرف فبتروح لسه تدور عليهم وتتعرف عليهم وتروح
تحطهم تكتبهم بدل كذا يعني هو فعليًا الـ * إيش بتعمل؟
بتخلي الـ Database تروح تدور على أسماء الـ Columns
بتاعة الجدول بتاعة الـ Table وترجم هذه الأسماء
وتكتبها في الشكل هذا هذا بياخد وقت من الـ Database
خاصة إن تكون الـ Database كبيرة ويكون في عندي ألف
أو مئات الـ Queries بتنفذ على الـ System System
كبير مثلًا لو وزارة الصحة في كل مستشفى في كل عيادة
فيه Computer شايك على وزارة الصحة وبيفحص التأمين
وبيفحص معلومات المريض وزارة الداخلية في كل محافظة
وفي كل مكان فيه مكتب للداخلية بيغير هويات وبيطبع
شهادات ميلاد فيه مئات الاستعلامات في نفس اللحظة
إذا كلهم بدهم يستخدموا Select * سرعة البرنامج
مالها؟ هتنزل فالصح أن أعود نفسي من الآن لما أنا
أبرمج برنامج خاص فيا أو Website خاص فيا في
Database أتعود أني ما أستخدمش Select * أتعود
أن أكتب أسماء الـ Columns لكن للامتحانات للتعليم
للدراسة لبرنامج Project صغير الـ * Okay هتعطيني
نفس النتيجة ومش هنتمي أنا على الـ Performance لأن
مشروعي أو الـ Project اللي أنا بعمله في الجامعة
كطالب Project صغير مش هيبين معايا لكن بكرا لما
تروحوا تشتغلوا خلو المعلومة هي في إيه عندكم أن
لازم أحط أسماء الـ Columns أعملنا Select *
بدي أحدد اسم الـ Table اللي بدي آخد منه المعلومات
From من أّحدد اسم الـ Table إيش؟ Students ورحت حطيت
له اختصار سمتها S الاختصار هذا اسمه Alias
الاختصار
فيه أنه يسهل عليا كتابة البرمجة أن بدل ما كل مرة
بدي أحكي أن اسم الـ Table Students بدل ما يظلني
أحكي Students Students وكتابتها طويلة بصير أرمز
اللي هبقيّاش بس بالرمز اللي أنا بحطوها الرمز هذا
أنا ممكن اختاره أنا زي ما بدي اسم الـ Table لازم
يكون نفس اسمه هنا في الـ Database الـ Students لكن
الرمز هذا الـ Alias هذا أنا بحطه كمبرمج بحط إيش؟
ما بدي ممكن أحط X ممكن أحط Std الـ
Where تعطيني شرط لو أنا ما كتبتش الـ Where هذه وعملنا
اذا select * from students هيطبع للجدول هذا
نفسه ليش؟ لأن احنا طلبنا كل الأعمدة من جدول ال
students محددناش أي شروط فكل الطلاب المسجلين
الثلاثة طلاب هيعرض بياناتهم هيعرضها زي ما هي لما
أجينا حطينا ال where حكينا له لأ احنا مابناش كل
الطلاب احنا بدنا طلاب فقط اللي ال age تبعهم 18 من
الطلاب اللي ال age تبعهم 18؟ Jones و Smith فاللي
هتطلع معه نتيجة زي الـ table هذه هيجي بس يجيب
Jones و Smith ومش Smith الثالث الثاني اللي ايش
رقمه بينتهي بثمانية و ثمانية هيطبع بياناتهم و ايش
هيطبع لهم؟ هيطبع لهم كل الـ columns الـ SID و ال
name و ال login و ال age و ال GPA لطالبين هدول عمرهم
18 طلبنا كل الأعمدة حددنا العمر 18 ولحظة طبعا بدل
ما أكتب students.age كتبت بس s.age طب لو كتبتها دي
أنا std دي حط std.age لو ما عملتش alias بدي اكتبها
كاملة students.age لو كتبت بدل ال s بدي اكتب y
.age
طبعا يساوي مثال على شرط من الشروط انا ممكن اعمل
بدل يساوي ممكن اعمل أكبر من ممكن اقل ممكن أكبر من
أو يساوي أقل من أو يساوي ممكن احط أي شرط حسب انا
ايش بدي أنا ايش محتاج نرجع
بنأكد ان الـ star جبتلي كل الأعمدة طب نفرض انا
مابديش كل المعلومات بتاعة الطالب انا بدي اللي
عمرهم 18 لكن بس بدي أسماءهم و ال login اللي هو ال
email تبعه او ال username اللي بيدخل فيه على ال
portal او على ال moodle فقط فبدي اجي في ال select
بدل الـ star بدي احدى ده أسماء الـ columns بدي مين
بدي ال name و ال login فهاجي بسطر زي هذا شايفينه
select ال
name و ال login و نحطه بدل السطر هذا select *
ونكمل ال query يعني select s.name فاصلة s.login
from students s where s.age بيساوي 18 هتعطيني
نفس النتيجة هذه لكن بدون الـ SID بدون الـ age بدون
الـ GPA هيصير عندي شكل جدول هيكون انه بس عند ال name و
ال login و لاحظوا لما حطينا star اعطاني SID name
login age gpa زي اسمهم في الـ table لما انا كتبتله
select S.name هيجي يعرضلي اياهم هيكتبلي S.name على
الجدول هيكتبلي S.login زي ما كتبتله وين في ال
select هيعرض في ايش صعب؟ الـ select واضحة كيف ممكن
انا اعمل select لكل الأعمدة يعني اظهر كل الأعمدة
كيف انا ممكن احدد أعمدة معينة من نفس الجدول وكيف
ممكن احنا نحط شرط اللي هو من خلال ال where clause
كيف ممكن نحط شرط في ال where clause بحيث انه احنا
نحدد مين ال records اللي بدنا نعرضهم ممكن بدل ما
اعمل ال S.age بيساوي 18 ممكن اعمل انا ال S.GPA بيساوي
3.2 كم سطر هيعرض عندي؟ سطر واحد اللي هو لمين؟ سميث
اللي رقمه بينتهي بايش؟ ستة ثمانية ثمانية طب لو حكينا
له بدنا ال S dot GPA أكبر من ثلاثة هيعرض الثلاثة
rows اللي عندي كلهم لأن كلهم أكبر من ثلاثة
الـ query اللي نفذناها كانت simple query كم table
عندي from مين؟ دائما بدنا نعرف الـ complex و الـ
simple query من يبطلع عليه from اذا اسم table واحد
ال query هذه مالها؟ اذا كانوا أكثر complex لأننا
متعرفين على الـ multiple queries الـ multiple
relations في عندي select ال name و ال SID من وين
بدي أجيبهم؟ من ال students و ال enrolled كم
tables صاروا؟ طيب اتعرف على الـ two tables الـ table
الأول تبع ال students نفس الـ table اللي شفنا عندي
ثلاثة students اللي هم رقم ID اللي هم name login
age و GPA في عندي جدول ثاني للكورسات CID يعني
course ID رقم ال course عندي رقم ال course و
الطالب اللي مسجل فيه و كم علامته علامته بنظام
اللي هو ايش الـ A B C D تمام مش بنظام أرقام
characters ال
table هذا table enrolled يعني الطلاب اللي مسجلين في
الكورسات هذا ال table الطلاب بدي أعرض من الجدول لل
students اللي رمزينه بـ S أعطيته alias S بدي أعرض
منه مين؟ بس ال name بدي أعرض شيء ثاني منه؟ إذا انا
اهتمامي في ال name و
بدي أعرض الـ course ID رقم ال course من أي جدول ال
E اللي هو رمزنا لمين ال enrolled هي CID في ال
enrolled إذا انا بدي أعرض بس هدول معلومتين لكن انا
حطيت شرط أول شيء بدي انا فقط الطلاب ال grade
بتاعتهم A ال E dot grade A يعني الـ table enrolled
لازم تكون العلامة A مين ماخذ A؟ بس واحد الـ row هذا
هو فقط اللي ماخذ العلامة A لكن فيه كمان شرط اني
انا بدي اربط انا عشان اجيب ال name من الجدول
الثاني بدي علاقة تربط بين جدولين تتذكروا في
chapter 1 و chapter 2 اتكلمنا عن الـ primary key و
الـ foreign key و ان هم اللي بيعملوا ال relations
بين ال tables الان ال SID هو الـ primary key لمين
الطلاب فش طالب الرقم تبعه بيتكرر بين الطلاب الرقم
كل طالب رقمه لحاله اذا انا كيف أتعرف على الطالب
هذا موجود رقمه كـ foreign key كـ foreign key لاحظوا
ال SID في الجدول تبع ال students هو primary key في
جدول ال enrolled هو عبارة عن foreign key فانا بدي
اجي مدام هو هذا الطالب اللي هي رقم هو اللي ماخذ
ايش كيف بدي اعرف اسمه بدي اخد رقم و ادور عليه و
المكان اللي بتساوى فيه الرقمين بدي اخد منه الاسم
فهي الشرط الثاني and رقم الطالب في ال enrolled
يكون نفس رقم الطالب في ال students يعني ال foreign
key اللي في ال enrolled يساوي الـ primary key لوين
في ال students فحنيجي خمسة ثلاثة ستة خمسين وين هذا
الطالب اخر واحد اذا
احنا بدنا ال row هذا اخر
row مع ال row الثالث قبل الأخير لكن احنا مابناش
نرد كل البيانات ايش بدنا ال name و ال SID
Topology واسمه Smith فالنتيجة ايش هتكون Smith
Topology 112 وهي عنوان الكولوم ايش عنوانه S.NIMB
زي ما انا كاتبهين في ال select عنوان الكولوم هذا
ECID اللي هو نفس عنوانه في ال select complex
query من two tables بكل بساطة تنحل بهذا الأسلوب
ونتذكر أنه دائما لما احنا بنستخدم complex queries
غالبا نربط بين ال tables من خلال مين الـ primary و
ال foreign يعني كل ما أشوف complex query لازم
مباشرة اتوقع انه في where clause بتربط الـ primary
مع ال foreign key كل ما أشوف Complex Query جاي من
أكثر من Table مباشرة انه بدي أتذكر انه في شرط لازم
يربط بين ال tables اللي هو ان الـ primary و الـ
foreign key يكونوا نفس بعض بعد
ما تكلمنا عن ال select اللي هي بتعرضنا البيانات
اللي موجودة في ال tables بناخد اول command في ال
DDL اول command في ال DDL بهمني اللي هو create
table لانه انا اصلا كل شغلي علاقته بال tables
كل
شغلنا في ال relational model انه بننشئ tables أهم
شيء انه ننشئ tables لان لو ما أنشأناش tables مش
هنعدل tables لو ما أنشأناش tables مش هنحذف tables
نعملها drop لو ما أنشأناش tables مش هنعمل ال views
اللي حكينا اننا هنتكلم عنها في اخر ال chapter لان
ال view مبني على ال table حتى ال select اللي
شفناها في ال slide السابقة كانت بتاخد معلومات من
table طب هذا ال table لازم قبل ما يكون فيه select
يكون فيه انشاء لل table ال table كيف ننشئه من خلال
create table statement ال
syntax بتاعها نكتب create table اسم ال table
students enrolled بنفتح قوس وبنسكره لما نخلص وبدي
أعبي أسماء ال attributes و ايش ال type اللي هو
بيسمينا ال domain ال data type اسم ال attribute
مثلا SID رقم الطالب مثلا كان string أو كان integer
أو كان number BOD مثلا ال DOB مثلا تاريخ الميلاد
بيكون مقابله date فيه شيء مقابله مثلا number أو
real فيه شيء address مقابله بيكون string وفي
ال table اللي واحد لازم يكون عنده دائما في ايش
primary key فال attribute اللي بدنا اياه يكون
primary key ما بدناش نكتب بعده ايش primary key صعب
هذا ابسط شكل لل table الان كيف بدنا نحط foreign key
كيف بدنا نضيف constraints جديدة بنصير نضيفها شوي
شوي لكن ابسط شكل ل create table اني اعمل create
table اسم ال table احط ال attributes ال data types
ساعتهم و field واحد أحط له primary key
بدي أنا create table ال students اللي اشتغلنا عليه
الأمثلة السابقة حاجة أحكي ايش create table
students SID نوع ما عيش character لإنه ال string
بنعمله من ايش احنا من characters ال string اللي هو
ال text معمول من أحرف character يعني أحرف ال name
character ال login character ال age integer ال GPA
real لو نفس ال common بتاخده على ال Oracle حط بدل
ال integer ال real عاش number و number ممكن في
حالة ال integer احط مثلا number العمر عادة يعني مش
هيزيد عن تلت خانات صح؟ و صفر ما بديش كسور و ال real
اللي هو المعدل التراكمي مثلا بدي خانتين و كسر واحد
فبنعمل اتنين أو أحد فصار عندي number بين قوسين 2.1
number بين قوسين 3.0 في حالة الأوراكيل ده مش على
ال standard ده ال standard فيه integer و فيه under
الأوراكيل
برضه بتاخد ال character ده مش واقعي احنا نتعرف عن
نوع ثاني من ال characters في ال variable character
two varchar2 هنشوف نتعرف عليه
كم الساعة؟ الا عشرة؟ هل اسمعنا خمس دقائق؟ الآن
ال table هذا اللي أنشأناه لاحظوا أنه بدأنا نضيف
معلومات ال domain في إنشاء ال tables وهذا جزء من
ايش؟ من ال domain constraints
الآن بدأ أضيف معلومات زي ال foreign key في عندي
table employees ده أنشأ تابل لل employee create
table employee أنشأنا ال table ايش بياناته ايش ال
columns اللي في في عندي employee number تتذكر لما
كنا نحكيلكم في ال attributes ما تحطوش في اسم فراغ
في ال ER diagram بدورنيش إن يكون فيه فراغة بس
حكينا لكم حضروا حالكم لمرحلة لما بدنا نبدأ نبرمج لو
في الجملة هذه ال employee number ما كانش فيه
underscore وكانت فراغة مباشرة ال Oracle ال
compiler اه هيعطينا إن فيه مشكلة بيصير الإسم إذا
فيه فراغ بيصير الإسم بده quotations و بيصير لما
بدنا نعمل select لازم نحطه جوا quotations و
هيعملنا مشاكل فأسلم شيء في البرمجة عشان نريح حالنا
ما بنحطش فراغات دائما أي شي بده فراغ نستعيد عنها ب
underscore في الأسماء تحت ال columns و ال
attributes employee_number integer هدوء
بيكون primary key لمن؟ لل employee ده ميز كل موظف
من خلال رقمه الوظيفي name VARCHAR2
هذا object data type موجود في القراكل شبيه بال
character مبدأيا نعتبر احنا character إنه أحرف طب
ايش يعني character عشرين أو اربعين أو خمسين بس
اسمع ورا ورا ورا ورا
اربعين حرف يعني أنا مسموح ليه أخزن string طوله
اربعين حرف يعني لو كان تاني نام مثلا كان خمسة و
بدي أحط اسم الموظف محمد زي اسمي هيمشي تمام لكن لو
اجى واحد بدي أسجل نفس اسم مثلا ثلاثي بدي أحط محمد
خليل و كانت ال character خمسة ال Oracle أو ال DBMS
مش هيرضى يدخله أو هيدخله بس اول خمس حروف والباقي
ايش هيتركه تمام فانا بحدد ال maximum size من عدد
ال characters إنه مسموح يخزن اربعين بالنسبة لل
position اللي هو ايش منصبه يعني في الشركة فقط
عشرين حرف لو كان المسمى الوظيفي تبعه طويل أكثر من
عشرين حرف اه مش هياخده طيب الآن هنحكي الآن ال
character هذا في منه نوعين في ال Oracle و لاحظوا
أن أنا بحكي عن ال Oracle مش عن ال standard في ال
Oracle في character و في variable character var
char2 ليش 2؟ لأنه كان في ال Oracle زمان في var
char بدون رقم واحد و بطلوا يستخدموه طوروا عليه
عملوا عليه تطوير و بطلوا يستخدموه فهذا عشان يميزوه
عن القديم في ال code في البرمجة يسموه var char2
عرفنا ليش ال 2؟ طيب ليش اسمه variable character؟
ليش ما اسموهاش character؟ ال character لما بحجز أنا
character اربعين لإن معناه كل اسم في الجدول أنا
بحجز له اربعين حرف سواء عبيت فيه عشرة أو عشرين بدي
احجز له اربعين fixed size تمام؟ ال character ماله؟
fixed size حجمه ثابت لكن ال variable character
بالضبط بيظلوا فراغ في ال hard disk يعني ما بيستنفذش
ال storage اللي عندي لو أنا كنت عامل variable
character زي هيك اربعين و خزنت فقط في الاسم عشرين
حرف هيخزن لي على ال hard disk physically عشرين
و العشرين التانين هيظلوا فراغ بينما لو كانوا
character اربعين هياخد الاربعين هذا ايش ميزته وهذا
ايش ميزته ال character ال variable character بيوفر
علي ايش storage مساحة لكن ال character ال fixed
size بيعطيني ايش speed سرعة يستهلك مساحة أكثر لكن
ال database لما بتسترجع معلومات و بتعدل بيانات
بتشتغل ايش بسرعة لأن عملية ال location إن هتوجد
location للمعلومة بيكون أسهل خلاص معروف بعد مائة
حرف هلاقي المعلومة الثانية اللي بديها بينما هنا
الاطوال مختلفة ال character بيعطيني speed بس
بيستهلك storage أكثر ال variable character بيعطيني
storage أكثر لكن السرعة تعته أقل من ال character
آخر شي بدي أحكيه خلصنا و حطينا ايه number name
position salary لحظة المثال هذا من نوع number مع
integer رغم إنه فعليا مش صحيح يا بحط integer real
و باشتغل standard يا ما number و هذا كمان بيكون
number ال project number field جديد ماله هذا ال
project number بيكون number نوعه number لكن هذا مش
ال primary key هذا foreign key ال primary key بحكي
ال primary key و خلاص ال primary key لمين هو لأي
table لل employee لحاله لنفسه بس ال foreign key
لازم أحكيله هو لمين foreign key لأن هو foreign key
ل table ثاني لمين حكينا ال references reference
project معناته أنا بفهم إنه في ال database عندي في
table ثاني و لو ماكنتش منشي و لازم أروح أنشي و
أعمله تمام عرفنا كيف نعمل ال foreign key بس بنضيف
بعد ال variable foreign key زي primary key بس لازم
نحدد منه reference من اسم ال table نكتفي بهيك و
المرة اللي جاي بنكمل إن شاء الله أعطيكم العافية