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

إن كنت مطور او مبرمج، فسيحين ذلك الوقت الذي ستود جعل برمجيتك الخاصة ديناميكية، قادرة على حفظ البيانات التي يتم إدخالها و البيانات التي يتم إسترجاعها، في الحقيقة كل برمجية ناجحة في هذا العالم تعتمد على الديناميكية المفعلة داخلها، و تختلف حسب نوع البرمجيات و نوع الإستخدام كذلك لكن جميعها تعتمد على قواعد بيانات مهيكلة و مصممة بشكل فعال من أجل حفظ و تنظيم البيانات و إسترجاعها بطريقة صحيحة و آمنة متى ما إستدعت الضرورة لفعل ذلك . 

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


تتهيكل قواعد البيانات بشكل منتظم، بحيث يتم حفظ بيانات كل مشروع فيما يسمى بقاعدة بيانات او Database، لكل مشروع قاعدة بيانات واحدة، تتضمن قواعد البيانات مجموعة من الجداول او Tables، هذه الـ Tables او الجداول تخص كل عنصر من عناصر المشروع البرمجي الخاص بك، فإن كان على سبيل المثال المشروع عبارة عن إدارة المستخدمين الذين يتم تسجيلهم في أقسام مدرسة معينة، فالمستخدم يعتبر عنصرا و المدرسة كذلك عنصر، في الغالب قد قمت بإستخراج عناصر مشروعك البرمجي عبر بعض تقنيات التحليل مسبقا مثل UML او Merise، او ان العنصر الخاص بك هو في الأساس Class في مشروعك البرمجي، بتحويله الى لغة قواعد البيانات ( ليست الـ SQL بل فقط تعبير مجازي ) فإن الـ Class او العنصر يمكن إعتباره Table داخل الـ Database، يمتلك كذلك الـ Table او الجدول عناصر محددة و هي الـ Column او العمود و الـ  Row او السطر، يتضمن العمود نوع او إسم البيانات التي يتضمنها الـ Table مثل الـ ID او الـ Name الخاص بالمستخدم و هكذا، بينما يتضمن الـ Row او السطر المعلومات المسجلة مثل " 1 " بالنسبة للـ ID و " Ahmed " بالنسبة للـ Name . 
بعكس الكل، يتم تخزين البيانات على شكل سطور Row يحدد نوع محتواها مسبقا عن طريق الـ Column يتم تخزين الكل على شكل Table الذي يجسد نفسه داخل Database . 
لا تقلق إن لم تستوعب الأمر حتى الآن، فلازال لدينا الكثير من الوقت لفهم كل هذا و التعامل معه بطريقة أعمق. 

- فهم أساسيات قواعد البيانات : 


الصورة الأولى : قاعدة البيانات

قاعدة البيانات تعتبر حاوية او Container ( نقوم بترجمة بعض العبارات للإنجليزية في حالة أردت التعمق كثيرا عبر مقالات أجنبية لاحقا، كما انك ستتعامل مع كل شيئ بالإنجليزية و الترجمة بالعربية ما هي الا اداة مساعدة على الفهم )، هذه الحاوية لا تتكرر، بحيث لكل مشروع برمجي حاوية، اي قاعدة بيانات خاصة به، لا يمكن لمشروع برمجي ان يتضمن عدة قواعد بيانات إلا في حالة خاصة جدا و التي لن تستخدمها حاليا، كل قاعدة بيانات تتضمن جدولا او عدة جداول Tables، كما في الصورة أعلاه، إذ نجد جدولا يسمى Customer و آخر إسمه Orders و الآخر Order&Pizzas و غيرها، تلك هي مكونات و عناصر المشروع، تستطيع ان تلاحظ ان لكل جدول بعض الخصائص، لنأخذ مثلا جدول Customer، تستطيع ان ترى خاصية Cust ID و LN ( Last Name ) و FN ( First Name ) و Phone Number و غيرها، تلك هي خصائص الجدول او Properties / Attributes، كل خاصية تعتبر عمودا محددا يستطيع تخزين بيانات من ذلك النوع، فمثل عمود Last Name سيقوم بتخزين فقط الإسم الأخير للـ Customers، لن يقوم بتخزين أي شيئ آخر، اما الـ Row او السطر فهو البيانات التي تم تخزينها، يمكن تخزين عدد لا محدود من البيانات على شكل سطر، في حالتنا هذه إن ادخلت بيانات مستخدم في Customer على الشكل التالي : (id: 1 , LN: Mahmoud, FN: Ahmed, Phone Number:0588899662, Street Name: Mystreet, Street Number:25, Zipcode: 25200)، فهذا يعتبر سطرا او Row إذ يتضمن معلومات مستخدم تم تخزينها وفق بيانات العمود.
بما اننا نتعامل مع قواعد بيانات علائقية او RDBMS ( يمكنك الإطلاع على مفهوم الـ RDBMS من خلال هذا المقال ) فهذا يعني ان الجداول مرتبطة ببعضها على شكل علاقات، سنناقش كل جزء على حدة حين نصل إليه في هذا المقال، يتم تجسيد هذه العلاقات في المبيان أعلاه على شكل خطوط . 


- ما هي الـ SQL : 

كتعريف بسيط للـ SQL قبل البدئ في شرحنا لهذا اليوم، الـ SQL هي إختصار لعبارة Structured Query Language و يمكن شرحها او ترجمتها الى لغة إستعلا مهيكلة، هي ليست لغة برمجة بالكامل بل فقط لغة إستعلام تقوم بتنفيذ أوامر على قواعد البيانات و جداولها و محتوياتها و إسترجاع النتائج، يتم إستخدامها على نطاق واسع في التعامل مع قواعد البيانات العلائقية . 


- إنشاء قاعدة بيانات : 



يمكنك إختيار المنصة المناسبة لك او لمشروعك من أجل بناء قواعد البيانات و هيكلتها و إستعلامها، شخصيا سأستخدم منصة MySQL لتنفيذ الأوامر و مشاركتها معكم مع شرحها، يمكنك إستخدام منصات أخرى حسب نوع مشروعك مثل SQL Server، لا تختلف الأوامر كثيرا . 
لإنشاء قاعدة بيانات يمكن فعل ذلك بشكل يدوي عن طريق الولوج الى خدمة PhpMyAdmin ثم النقر على تبويب Database الذي سيوفر لنا تلقائيا مساحة كتابة إسم قاعدة البيانات الخاصة بالمشروع، ثم بعدها ننقر على Create من أجل صناعتها : 



لكننا هنا نريد تعلم أوامر الإستعلامات و ليس الأوامر اليدوية، لذلك سنتوجه الى تبويب SQL في الأعلى الى جانب تبويب Database ثم نقوم بكتاب الأمر التالي : 



هذا الإستعلام يساعدنا على إنشاء قاعدة البيانات، يتكون الإستعلام من 3 فقرات الأولى Create و هو أمر أساسي من أجل صناعة قاعدة البيانات، الثاني Database لنحدد ان ما نريد صناعته هو قاعدة البيانات، اما الثالث فهو إسم قاعدة البيانات، لاحظ معي انه يمكن تطبيق الإستعلام دون الحاجة الى غلق السطر بواسطة فاصلة منقوطة ( ; )، بالطريقة التالية ستنشئ قاعدة بيانات ستجدها في الجانب، يمكنك النقر عليها و الذهاب مجددا لتبويب SQL من أجل تنفيذ الأوامر و الإستعلامات القادمة . 



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


بعد إختيار قاعدة البيانات، يمكنك التوجه أيضا الى تبويب SQL، لاحظ جيدا ان كل الإستعلامات في شرح هذا المقال سيتم تنفيذها في تبويب SQL في قاعدة البيانات التي قمنا بنصاعتها لذلك لن نقوم بالتذكير في كل مرة، دعونا نأخذ بعين الإعتبار قاعدة البيانات السابقة في الصورة الأولى، لنقم بصناعة جدول Customer و ذلك عن طريق الإستعلام الآتي : 



لا تقلق سنشرح كل شيئ على حدة، أولا لاحظ معي ان لغة الـ SQL لا تعير إهتماما للحروف الكبرى او الصغرى، فـ Create هي نفسها CREATE هي نفسها create لا مشكلة في ذلك . 

يبدأ الإستعلام بعبارة Create Table table_name ، يتم تغيير table_name حسب نوع الجدول، بالنسبة لنا إسم الجدول هو Customer.
ثم نقوم بفتح قوسين () و نقوم بتحديد الـ Columns داخله، يتميز الـ Column بميزتين أساسيتين و هما الإسم و النوع، فمثلا العمود الثاني ( دعونا نتجاوز الأول لوهلة ) نجد سطر LN varchar(50) اي قمت بتحديد إسم العمود و هو LN ثم نوعه و هو varchar و قمت بتحديد عدد الأحرف في 50 حرف، يوجد العديد من الانواع مثل Text, Integer, double,float,date,boolean، كل نوع يحفظ نوعا محددا من البيانات، فمثلا الـ Integer يحفظ فقط الأرقام الصحيحة، بينما varchar يحفظ النصوص بكل أنواعها في حدود 50 حرف، بينما Text يحفظ النص مهما كان طوله و هكذا دواليك . 
إذن الكود أعلاه سيقوم بإنشاء جدول بإسم Customer و هذا الجدول يتضمن تلك الأعمدة، و لكل عمود نوع خاص من البيانات سيقوم بإستقباله ، لكن ما خطب الـ Primary Key ؟ 


- إفهم الـ Constraints : 


تحدثنا عن كيف أن الـ Column يتميز بميزتين أساسيتين و هما الإسم و النوع، يوجد كذلك ميزة ثالثة ثانوية في الـ Column تسمى بالـ Constraint يسمح لنا هذا الـ Constraint بمنع او السماح بتسجيل المعلومات في العمود تحت شرط معين، على سبيل المثال أعلاه إستخدمنا Constraint يُسمى بالـ Primary Key او المفتاح الأساسي، كل جدول يمتاز بعمود أساسي يحمل رقما او ميزة لا يمكن تكرارها و ذلك من أجل جعل كل نوع من البيانات يتم تسجيلها في الجدول غير مكرر، بل و حتى ان تكررت نفس البيانات الأخرى يبقى الـ Primary Key فريدا من نوعه . 
يوجد العديد من الـ Constraints مثل Unique, Not Null, Index ... دعونا نطبق بعضها في الجدول ذاته لنحصل على النتيجة التالية : 



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



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





نستخدم أمر Drop Table متبوعا بإسم الجدول كما في الإستعلام الأول أعلاه من أجل حذف الجدول كاملا، تأكد انك حقا لا تريد الجدول من أجل تنفيذ هذا الأمر لأن كل البيانات المستخدمة في هذا الجدول ستضيع منك، أيضا تأكد من أن الجدول لا تربطه أي علاقات مع جداول خارجية او في هذه الحالة قد يحدث خطأ و يرفض الحذف، في هذه الحالة سيتوجب عليك القيام بأمر آخر سنعود له لاحقا حين نتحدث أكثر عن العلاقات بين الجداول و كيفية إدارتها.

يتم إستخدام أمر Drop للحذف دائما، يمكن إستخدام Drop Database myDatabase من أجل حذف قاعدة بيانات كاملة إن اردت.
أحيانا قد تجد ان الجدول الخاص بك و المليئ بالمعلومات و البيانات يحتاج الى عمود جديد، في حالتنا هذه و مع جدول Customer إكتشفنا انه قد نحتاج الى عمود السن او Age، لا يمكننا حذف الجدول كاملا و إعادة صناعته مع إضافة العمود، لذلك سنحتاج فقط الى التعديل على الجدول من أجل إضافة هذا العمود، لفعل ذلك سنستخدم إستعلام Alter Table table_name، هذا الأمر يساعدنا على إختيار أولا الجدول الذي نريد التعديل عليه، ثم بعدها يأتي المقطع الثاني الخاص بالتعديل، في حالتنا نريد إضافة عمود Age لذلك مقطع التعديل سيحتوي على Add column_name column_type  في حالتنا نحن Add Age integer ليصبح الإستعلام كاملا كما في الأعلى في الإستعلام الثاني . 
إكتشفنا لاحقا انه لا يمكنك طلب عمر الزبون أثناء شرائه للبيزا، حقا من يفعل ذلك ؟ لا احد، لذلك قررنا حذف العمود فإضافته كان خطأََ في الأساس، لذلك سنستعين مجددا بخاصية Alter Table، المقطع الأول لتحديد الجدول لن يختلف، سيختلف فقط المقطع الثاني الخاص بأمر التعديل و كما أشرنا فإن أمر Drop يشير دائما للحذف، لذلك لحذف العمود نعتمد على الإستعلام الأخير . 
تختلف الإستعلامات الخاصة بالتعديل حسب نوع التعديل الذي تريد القيام به على الجدول، لكن الإستعلام الرئيسي هو Alter Table table_name


- إضافة بيانات في الجداول : 





إضافة البيانات في الجداول أمر ضروري، يتم إضافة البيانات على شكل Row او سطر يتضمن معلومات تناسب كل عمود، فعمود الـ ID سيحصل على رقم، عمود الـ LN سيتضمن الإسم الأخير للمستخدم و هكذا، يمكن إضافة البيانات في الجدول عن طريق أمر Insert Into table_name values() كإستعلام أساسي، لكن يمكن تخصيص هذا الإستعلام حسب الحاجة : 

- في الإستعلام الأول قمنا بإضافة بيانات في الجدول الخاص بنا وهو Customer عبر الإستعلام سابق الذكر، في الـ Values نقوم بإضافة القيم التي نريد تسجيلها في الجدول بالترتيب المتعلق بالجدول و بإحتراف نوع كل بيانات، فمثلا في ترتيب الجدول لدينا على التوالي : custID, LN, FN, PhoneNumber, StreetAdress, StreetNumber, ZipCode  و نوع البيانات التي تستقبلها على التوالي هي : Integer, varchar, varchar, varchar, text, Integer, Integer لذلك البيانات التي يجب إدخالها يجب ان تحترم هذا الترتيب و نوع البيانات، فإن كان Integer يجب وضع رقم صحيح طبيعي، إن كان varchar/text يجب وضع البيانات بين علامتين ' ' ، و هكذا . 
- في الإستعلام الثاني قمنا بإضافة أزيد من بيانات دفعة واحدة، لست مضطرا ان تعيد أمر Inster Into في كل مرة تريد إضافة بيانات، يمكن إضافة الكل دفعة واحدة عن طريق الإستعلام الثاني، قمنا بتفريق كل سطر Row بيانات في سطر خاص به من أجل تسهيل قرائته، لا تقلق سيشتغل الكود لا مشكلة في ذلك . 
- لنفترض أن احد الزبناء رفض إعطائنا أي معلومات حول نفسه، فقط الإسم الكامل، لا عنوان و لا رقم هاتف، رغم ذلك وجب علينا تسجيله في قواعد البيانات الخاصة بنا، كيف نفعل ذلك ؟ نحن لا نملك كل المعلومات الخاصة به التي يتطلبها الجدول ؟ ببساطة نقوم بإضافتها عن طريق الإستعلا الثالث، يختلف الإستعلام الثالث أعلاه عن بقية الإستعلامات السابقة في الجزء المتعلق بإختيار الجدول، بحيث مباشرة بعد إختيار الجدول الذي اود ان اضع بياناتي داخله، اقوم بتحديد مباشرة نوع البيانات المدخلة، في حالتنا هذه إخترنا جدول Customer بالطبع و البيانات التي سأدخلها هي custId, LN, FN فقط لذلك سيصبح الإستعلام Insert Into Customer(custId,LN,FN) ثم بقية الإستعلام كما السابقين مع إضافة فقط البيانات التي لدينا بترتيب متوالي . 
ملاحظات حول هذه الفقرة : أولا تذكر ان تحترم الـ Constraint من أجل تسجيل البيانات بشكل صحيح، على سبيل المثال لدينا الـ CustID عبارة عن Primary Key أي لا يمكنه ان يتكرر، فلا يمكنك إدخال بيانات بنفس الـ CustID إن حاولت إدخال سطرين ب CustID يساوي 1 سيحدث خطأ في الإضافة. 
أيضا في الإستعلام الثالث، الخانات التي لم يتم إدخالها سيتم إضافة عبارة NULL في محتواها . 
في حالة كان الـ Constraint على أحد الخانات هو NOT NULL و لم تقم بإدراجه في الإستعلام الثالث، سيظهر لك خطأ كذلك، لذلك إنتبه جيدا مع الـ Constraint و إحترمها . 

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

شاركه على :


تعرف على كاتب المقال