الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

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

الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)


في الجزء الثاني سنبدأ حديثنا عن العلاقات بين الجداول و كيفية الربط بينهما أيضا، ثم سنمر مباشرة للإستعلامات الرئيسية في الـ SQL و كيفية إنجاز بعض الإستعلامات التي ستحتاجها كثيرا طيلة مسيرة تعاملك مع قواعد البيانات على رأسها إستعلامات الـ CRUD . 


يمكنك الإطلاع على الجزء الأول من هنا : الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الأول) 

- شرح بسيط للـ CRUD : 

ستجد عبارة الـ CRUD تقريبا في كل كورس برمجي تأخذه، او أي مقال برمجي شرحي مثل هذا المقال، الـ CRUD هي عبارة شهيرة و إختصار لـ Create / Read / Update / Delete ، أي الإضافة، القراءة، التعديل ثم الحذف، و هي الخواص الأربعة التي يمتاز بها أي Object برمجي كيفما كان، بحيث سنحتاج الى إضافة هذا الـ Object او العنصر، التعديل عليه إن إقتضى الأمر، جلب معلوماته من أجل الإطلاع عليها، و حذفه أيضا، و هي عبارة عن سلسلة حياة او Life Cycle لأي عنصر برمجي . 

- العلاقات بين الجداول : 


الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)


لكل جدول نقوم بصناعته في قاعدة البيانات شرط او Constraint خاص بالـ Primary Key، شيئ أساسي و ضروري في كل جدول ان يكون هناك عمود على شكل Primary Key في الغالب يكون الـ Number او الـ ID  أو الـ order Number و غيرها حسب نوع الجدول، و هذا يساعدنا على تقسيم البيانات و معرفة كل سطر على حدة و فصله عن بقية الأسطر الأخرى . 
حين يتعلق جدول بجدول آخر، فإن وسيلة الربط بينهما هي الـ Primary Key بحيث يكون الـ Primary Key في الجدول الأول هو عبارة عن مفتاح خارجي او Foreign Key في الجدول الثاني، بحيث يكون عمود الـ Foreign Key في الجدول الثاني هو نفسه عمود الـ Primary Key في الجدول الأول، لا تقلق الأمر بسيط جدا.
بالعودة للتخطيط أعلاه، سنأخذ الجدولين Customer ( الزبون )  و الجدول Orders ( الطلبيات ) فكل زبون له الحق في القيام بطلبيته الخاصة، و يمكن للزبون ان يقوم بعدة طلبيات أيضا، لكن لكل طلبية زبون واحد و لا يمكن لطلبية ان يشاركها عدة زبائن، لذلك ستجد امام جدول الزبون رمز " 1 " اي انه لكل طلبية زبون واحد، و امام جدول الطلبيات رمز " ∞ " إذ يمكن للزبون ان يقوم بعدة طلبيات، هذا ليس موضوعنا، هذا تحليل آخر متعلق بالـ UML / Merise . 
إن دققت في اعمدة جدول الطلبيات ستجد خانة بإسم CustomerID اي الـ Id الخاص بالزبون الذي قام بتلك الطلبية، و هو عبارة عن Foreign Key يربط الجدول Customer بالجدول Orders بينما يحتفظ الجدول Orders بالـ Primary Key الخاص به و هو Order N . 
دعونا نقوم بإنشاء الجدول Orders كما أنشأنا الجدول Customer في الدرس السابق، سنقوم بتطبيق الإستعلام التالي : 



حسنا، ما الذي تغير هذه المرة في هذا الإستعلام مقابل الإستعلام في الدرس السابق لصناعة الجدول ؟ ببساطة يوجد فرق واحد أساسي وهو إضافة Constraint جديد في آخر الجدول، هذا الـ Constraint متعلق هذه المرة بالـ Foreign Key  بحيث نقوم بأخذ العمود الثاني في الجدول و نقوم بتطبيق شرط المفتاح الخارجي Foreign Key و من أجل تحديد مصدره نقوم بإعطائه خاصية References ثم نستدعي الجدول الذي يمتلك الـ Primary Key و بعدها بين قوسين عمود الـ Primary Key ليصبح السطر في الأخير Foreign Key References customer(custId) و هو المطلوب في الربط بين الجدولين.

ستجد أيضا تغييرا اخر و هو نوع بيانات من نوع Date على عمود the_date و ذلك من أجل تسجيل البيانات على شكل تاريخ و ليس على شكل نص، في حين ان Time نقوم بتسجيله على شكل varchar لا مشكلة في ذلك . 
قبل ان نلج للفقرة الموالية، دعونا نضيف بعض البيانات في جدول الـ Orders من أجل تحقيق بعض الإستعلامات على الجدولين و جلب البيانات الخاصة بهما، لنطبق الإستعلام التالي : 



ملاحظات مهمة حول هذه الفقرة : أثناء تسجيل بيانات في الجدول Orders عليك التأكد ان عمود Customer ID موجود مسبقا في جدول Customer، إذ لا يمكنك إضافة ID غير موجود أصلا في جدول Customers في هذه الحالة قد يحدث خطأ في تسجيل البيانات . 
أيضا، أثناء تعاملك مع الـ SQL Server بدل MySQL قد لا تشتغل معك طريقة إضافة الـ Foreign Key كما في الأعلى و سيتوجب عليك إضافتها كما في السطر الثاني كما في الكود أعلاه ( الكود بين التعليقين ) . 

- إستعلامات جلب البيانات : 

إن كل ما جاء مسبقا سواء في هذا الجزء او الجزء السابق يعتبر فقط الجزء الأول و الأسهل من الـ SQL او من هيكلة و تصميم قواعد البيانات، بحيث ان كل ما سبق ذكره متعلق فقط بهيكلة و صناعة قاعدة البيانات و جداولها، و النتيجة كانت في الأخير قاعدة بيانات تتضمن جدولين مهيكلين جيدا قادرين على تخزين المعلومات و مرتبطين ببعضهما كذلك بشكل منطقي . 
الآن يبدأ الحماس، و تبدأ الإثارة كذلك، بحث انه و بعد تسجيل هذه البيانات سنحتاج الى إسترجاعها حسب الحاجة في برنامجنا، فإن اراد المستخدم الدخول ( كمثال بعيد عن قواعد البيانات التي نحن الآن في صدد العمل عليها ) ستحتاج الى جلب كلمة السر و البريد الإلكتروني مثلا، إن اراد المستخدم الإطلاع على بروفايله و كل معلوماته و التعديل عليها، علينا ان نوفر له ذلك، و من أجل تحقيق هذا سيتوجب علينا الإطلاع على بعض الإستعلامات و إيجاد التعامل معها . 
فكفانا حديثا، و دعونا نبدأ مباشرة بأول إستعلام : 



هذا الإستعلام سنستخدمه كثيرا كثيرا كثيرا، تقريبا أي إستعلام متعلق بالـ Read ( أي قراءة / جلب البيانات من الجداول ) يبتدأ بعبارة Select * ، و تعني Select * في الـ SQL أمر " إختر كل شيئ " و عبارة from table_name تحدد له الجدول الذي نريد ان نجلب منه كل شيئ، لذلك تقنيا عبارة Select * from customer تقول " أجلب كل البيانات من جدول customer " و النتيجة : 



الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

إن حرف او علام " * " تعني كل شيئ، او كل البيانات، في حالتنا هذه تم إسترجاع كل البيانات من جدول Customer، نحن نريد تخصيص هذه البيانات، لنفترض انه و لدواعي الخصوصية لا نريد إظهار رقم هاتف الزبناء و كذا عناوينهم، كل ما نريد إظهاره هو فقط الرقم الخاص بهم ( الذي لا يتكرر لأنه Primary Key ) و إسمهم الكامل، و نريد إظهار كل الزبناء الموجودين في الجدول كاملا، الإستعلام الأصح هنا هو كالتالي : 



هذه المرة و بدل جلب كل بيانات الأعمدة عن طريق " * " قمنا بتخصيصها أكثر و ذلك عن طريق حذف الـ " * " و تعويضها بأسماء الأعمدة، بحيث نقوم بفرز كل عمود على حدة عن طريق فارزة  " , " مع كتابة إسم العمود بشكل صحيح، في حالتنا هذه نريد الـ ID و الإسم الأخير و الإسم الأول للمستخدم، لذلك قمنا بتطبيق الإستعلام أعلاه، و النتيجة : 



الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)


ملاحظات متعلقة بهذه الفقرة : تختلف أوامر الـ SQL من منصة لأخرى، قد يدعوك بعضها لإضافة الجدول بين فارزتين في إستعلام الـ SQL و غيرها، لذلك لا تقلق فكل الإستعلامات متشابهة، و تذكر ان الـ SQL لا يفرق بين الأحرف الكبيرة و الصغيرة، فإستعلام SELECT هو نفسه Select . 
إستعلام Select سنستخدمه تقريبا الى بقية نهاية هذه الأجزاء، لذلك إن لم تفهمه جيدا، فعد قليلا لهذه الفقرة و قم بالمحاولة مجددا، لكن هذه المرة مع جدول orders مع بعض التجريب . 




- إستعلام جلب البيانات مع إستخدام الـ Alias : 


لنفترض ان رب العمل يريد منا ان نقدم له جدولا يتضمن معلومات المستخدمين، الرقم و الإسم و النسب، أثناء هيكلتنا للجدول قمنا بتسمية هذه الأعمدة بـ CustID , LN, FN ( كما ترى في الصورة أعلاه ) إن قمنا بإستخراج البيانات عن طريق Select و تقديمها لرب العمل، لربما لن يفهم هذه الإختصارات الخاصة بـ CustID او LN او FN، لذلك سنستخدم ما يسمى بالـ Alias او الأسماء الحركية إن صحت الترجمة من أجل تغيير إسمها، ببساطة نضيف عبارة as ' New Name ' مع إحترام الـ " ' " للإسم الجديد حتى يستطيع إستيعاب الفراغ في الإسم، نضيفها مباشرة بعد إسم الجدول حين تحديده بعد Select و ذلك عن طريق الإستعلام التالي : 



كما ترى  قمنا بإختيار إسم جديد مباشرة بعد كل إسم عمود نختاره، هذه العملية تسمى بالـ Alias و تسمح لنا بتغيير إسم الأعمدة في الجدول بالأسماء التي نريد، سنستخدمها بكثرة عن نتعامل مع بعض الـ Functions مثل count() و غيرها ( نحن في طريقها لا داعي للتسرع )، كما ترى سنحصل على نتيجة كالتالي : 



الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)
ستلاحظ أن اسماء الجداول الآن أكثر وضوحا، و يمكننا طباعة هذا الجدول و تقديمه لرب العمل الآن . 


- إستعلام جلب البيانات بإستخدام Distinct : 


من الطبيعي ان تكون بعض البيانات مكررة في الجداول، بالطبع مادام الـ  Primary Key مختلف، احيانا قد نود الحصول على كل البيانات بطريقة غي مكررة، على سبيل المثال لنعد الآن الى جدول Orders، في جدول Orders يوجد لدينا عمود Type هذا العمود يسمح لنا بتسجيل بيانات عن نوع الطلبية التي قام بها المستخدم، شخصيا أضفت نوعين الطلبية العادية Regular Order و طلبية Big Meal Order، لا اعرف لما اضفت هذين الخاصيتين لكن ما علينا كل هذا فقط من أجل الشرح، إن عدت للجزء الأول ستجد انني قمت بخطأ فظيع و هو انني قمت بتسجيل هذا النوع في عمود الـ Time و تسجيل الـ Time في خانة الـ Type لذلك علينا تصحيح هذا الأمر أولا، لنقوم بتصحيحه سنستعين بشرح الجزء الأول و خاصية Alter Table التي تسمح لنا بالتعديل على الجدول، بما ان العمودين من نوع varchar سأقوم فقط بتغيير إسم العمودين و ذلك بالطريقة التالية : 



بهذا الإستعلام قمنا بتغيير أسماء العمودين، قمت بتغيير عمود time الى thetime لأنه يوجد نوع بيانات او Datatype من نوع time و حتى لا يحدث اي إرتباك في الإستعلام قمنا بتغييره، كان هذا مجرد تعديل بسيط، لنعد لمحتوى هذه الفقرة . 

أخبرني رب العمل انه يريد أنوع الطلبات التي تمت، لأقوم بفعل هذا في الغالب سأقوم بإستعلام Select type from orders، و هو إستعلام صحيح، لكن ما سيحدث حقا هو انه سأحصل على أنواع طلبات متكررة، و هذا ما لا يريده رئيسي، بل يريد فقط كل نوع على حدة، لذلك سأستخدم خيار Distinct هذه المرة، و بهذا الإستعلام : 



 بهذا الإستعلام، سنحصل على نتيجة خاصة و هي كالتالي : 



الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

بالطريقة التالية أحصل على بيانات غير مكررة و ذلك عن طريق Distinct، نضيف عبارة Distinct مباشرة بعد أمر Select .


- إستعلامات جلب البيانات بإستخدام الجمل الشرطية عن طريق Where : 


إن كانت عبارة Select سنستخدمها كثيرا كثيرا كثيرا، فبالتأكيد عبارة Where سنستخدمها أيضا كثيرا كثيرا، في كل من الأمثلة السابقة، دائما ما نجلب كل البيانات كلها حسب نوع الإستعلام، و لا يوجد شرط مُطبق على الإستعلام من أجل تخصيص جلب البيانات، تسمح لنا عبارة Where و هي جزء آخر من أجزاء الإستعلام من مساعدتنا على تحديد شرط معين من أجل جلب البيانات التي تنصاع لهذا الشرط، فعلى سبيل المثال يمكنني جلب الطلبات او الـ orders التي تمت في تاريخ معين، او يمكنني جلب بيانات شخص من خلال إسمه، او يمكنني تحديد كل الأشخاص الذين يقطنون في شارع معين في جدول Customer، هذه عبارة عن شروط يمكنني تحقيقها بعبارة Where، دعونا نقوم بتجريب بعض الإستعلامات بإستخدام هذا الشرط، لنجرب جلب بيانات المستخدمين الذين يحملون إسم " Ahmed " : 



و النتيجة هي كالتالي : 




الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

ببساطة نضيف عبارة Where مباشرة بعد الإستعلام الذي يجلب كل البيانات او البيانات التي نريد وهو Select، بعد جلب كل البيانات نقوم بفلترتها عبر شرط Where متبوعا بالشرط، في حالتنا هذه شرطنا كان ان يكون عمود Name يساوي ' Ahmed ' مما وفر لنا في الأخير إستعلاما على الشكل أعلاه . 
كل الشروط تقريبا التي تتبع عبارة Where تبدأ بتحديد الـ Column او العمود الذي نريد تطبيق الشرط عليه، الشرط المتبوع يعتمد على أحد الـ Operators، ماذا ؟ ليست لديك فكرة عن الـ Operators ؟ لحظة هذا سيحتاج الى فقرة جديدة. 


- فقرة إضافية : إفهم الـ Operators : 


إن كنت مبرمجا مسبقا، او لديك خبرات أولية في البرمجة، فقد تعاملت بشكل أو بآخر مع الـ Operators، الـ Operators تساعدنا على القيام بالعمليات الحسابية أولا، ثم عمليات المقارنة ثانيا، سنقوم بتعريف فقط الـ Operators الـ Global و لن نتحدث عن المخصصة للـ SQL في الوقت الراهن حتى نصل الى فقراتها المخصصة، أهم الـ  Operators نجد : 
علامة تساوي = ، علامة الجمع + ، علامة الطرح - ، علامة القسمة / ، علامة الموديلو % ( و تعني باقي القسمة فمثلا 4%2 = 0 ) ، علامة != و تعني لا يساوي ، علامة == و تعني التحقق من المساواة، علامة <= أكبر من او يساوي ، علام =< أصغر من أو يساوي، علامة && و تعني " و " ، علامة  || و تعني " أو " ... 
يوجد العديد منها لكن مبدئيا هذه هي العالمية، في الـ SQL نستخدم بعضها و لا نستخدم البعض الآخر إذ نستخدم بعض الـ Operators الأخرى غير هذه أيضا، مثل And . 


- الإستعلام الشرطي Where مع And : 


يسمح لنا الإستعلام الشرطي بخاصية Where من جلب البيانات بعد تحقيقها لشرط محدد، لكن ماذا لو أردنا ان يتم تحقيق شرطين او أكثر في الإستعلام قبل جلب البيانات ؟ يمكن تنفيذ ذلك عن طريق خاصية " And "، في الإستعلام السابق قمنا بالبحث عن أشخاص يمتلكون إسم " Ahmed "، و قد حصلنا على نتيجتين في عملية البحث بهذا الشرط، لكن لدينا شرط آخر نريد تنفيذه، نريد أشخاصا بإسم "Ahmed" يقطنون بمدينة رمزها البريدي 28932، يمكننا تحقيق النتيجة عن طريق هذا الإستعلام : 



اما النتيجة المحصلة فهي كالتالي : 



الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

إن دققت النظر في الصورة قليلا، ستجد انه يقوم بتأطير الأعمدة التي نطبق عليها الشرط، و هو عمود LN للبحث عن إسم "Ahmed" و عمود الـ ZipCode للبحث عن الرقم البريدي للمدينة.
خاصية And تسمح لنا بتجميع العديد من الشروط دفعة واحدة في إستعلام واحد، بحيث تفضل عبارة And الشروط على حدة، فالشرط الأول هو جلب إسم "Ahmed" و الشرط الثاني هو جلب الـ ZipCode = 28932 و وسيلة الربط بينهما هي And التي توسطتهما في الإستعلام، إن أردت إضافة شرط ثالث، فمباشرة بعد الـ ZipCode أضف And ثم أضف الشرط الثالث، لا مشكلة في ذلك إطلاقا.


- الإستعلام الشرطي Where مع Or : 


على عكس And، يمكننا إستخدام Or المتناقضة كليا مع And، في إستعلام And يجب على الشرطين او الشروط المضافة ان تتحقق كلها من أجل جلب النتيجة، فإن لم يكن هناك على سبيل المثال و بالإعتماد على المثال السابق اي مستخدم إسمه 'Ahmed' يقطن بالمدينة رقم 28932 فلن نحصل على أي نتائج و سترجع النتائج فارغة، لأنه وجب إلزاما تحقق الشرطين من أجل الحصول على نتيجة.
خاصية or عكسية، بحيث تعيد النتائج فقط حين يتحقق شرط واحد من سلسلة الشروط، يتم فصل الشروط كذلك بـ or بدل And و في حالة تحقق أي شرط من الشروط يتم إسترجاع النتائج الخاصة به، كمثال لذلك، دعونا نبحث عن أشخاص يملكون إسم " Ahmed " او يملكون إسم "Rida" ، المفتاح هنا هو عبارة " أو "، لذلك إستعلامنا سيكون بالشكل التالي : 



اما النتيجة فهي كالتالي : 



الـ SQL للمبتدئين : تعلم أساسيات الـ SQL و أوامر الإستعلام ( الجزء الثاني)

يمكنك ان تلاحظ انه تم جلب كل الأسطر التي يتضمن الإسم الخاص بها عبارة "Ahmed" او "Rida"، يمكن إستخدام أزيد من شرط كذلك لجلب البيانات عند تحقيقه عند إستخدام Or كما الحال بالنسبة لـ And . 

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

شاركه على :