رقم الحلقة (42)
إضافة سجلات
من الواضح أن الاستعلام عن البيانات لا يتم إلا في وجود بيانات. في تطبيقات قواعد البيانات، تضاف البيانات باستمرار، وقد تعدل وتحذف، بخلاف عمليات الاستعلام من أجل استخلاص معلومات مفيدة. إضافة البيانات إلى قاعدة بيانات تتكون من جداول، تتم على أساس الصفوف. في كل مرة تضيف فيها بيانات جديدة إلى جدول، فإنك تضيف صفاً أو أكثر إلى هذا الجدول. قد تكون مجبراً على ملء كل أو بعض الحقول، وقد لا تكون مجبراً (في أسوأ حالات التصميم) إلى ملء أي حقل، لكن صفاً قد أضيف بقيم خالية. لا نتحدث هنا عن إضافة حقول إلى الجداول، لأن هذا يعني تعديل بنية الجدول، وهذه العملية تدخل ضمن ما يسمى (تعريف البيانات Data Definition)، وليس معالجة البيانات (Data Manipulation) التي نتحدث عنها.
توفر Jet SQL عبارة خاصة هي عبارة الأمر INSERT INTO من أجل إضافة السجلات إلى جدول. لهذه العبارة القدرة على إضافة سجل واحد أو أكثر من سجل مرة واحدة، ولهذا فإن لها شكلين:
- واحد تحدد فيه القيم الجديدة يدوياً، ويستخدم لإضافة سجل واحد فقط في المرة الواحدة،
- وشكل آخر يستخدم العبارة SELECT لإحضار صف أو أكثر من جدول (أو استعلام) آخر، يسمى المصدر، إلى الجدول (أو الاستعلام) الوجهة (نعم، يمكن أن تضيف إلى استعلام؛ إن كان الاستعلام مبنياً على أكثر من جدول، ولم تنس حقول المفاتيح الأساسية والأجنبية، فإن الصف ستتم إضافته إلى الحقول المناسبة في جداول الاستعلام).
دعنا الآن نر هذا الأمر وهو يعمل. من أجل إضافة صف واحد إلى جدول الموظفين، يمكن استخدام العبارة التالية:
INSERT INTO tblEmployee (EmpNO, EmpName, EmpManager, EmpHireDate, EmpSal, EmpPhone, EmpDept) VALUES (9999, "AHMAD", NULL, #28/10/2009#, 3000, "0123034880", 50)
لاحظ التالي:
- بعد تحديد اسم الجدول، تم سرد كل حقول الجدول بين قوسين. هذا ليس ضرورياً إذا لم تكن عازماً على إدخال قيم في كل الحقول؛ يمكن فقط أن تحدد الحقول التي ستستقبل بيانات. طبعاً كل الحقول المفتاحية والمطلوبة يجب أن تكون من ضمن الحقول المحددة. في الحقيقة، هذا الجزء بين القوسين ليس ضرورياً إن كنت ستحدد قيماً لكل الحقول، بالترتيب الصحيح في الجزء التالي.
- الجزء التالي ضروري، وهو الكلمة VALUES، وبعد ذلك بين قوسين، قيم كل الحقول المذكورة في الجزء السابق، أو قيم كل الحقول بالترتيب الصحيح في حالة عدم تحديد أسماء الحقول المطلوبة.
- في حالة عدم وجود قيمة حاضرة لحقل ما، لاحظ كيف تم تحديد القيمة الخالية NULL للحقل.
- القيم النصية تكتب بين علامتي تنصيص كالعادة، كذلك قيم التاريخ تحدد بين علامتي هاش #.
يصبح جدولنا بعد العبارة السابقة كالتالي:
يمكن كذلك إضافة مجموعة من الصفوف إلى الجدول باستخدام الصيغة الثانية للعبارة INSERT INTO، وذلك باستخدام استعلام لجلب الصفوف المدخلة من جدول أو استعلام آخر. بافتراض أن هنالك جدول آخر (tblTemp) يحوي قيماً لأرقام وأسماء وأقسام موظفين، يمكن كتابة العبارة التالية لإضافة هؤلاء الموظفين إلى جدولنا:
INSERT INTO tblEmployee ( EmpNo, EmpName, EmpDept ) SELECT EmpNo, EmpName, EmpDept FROM tblTemp
بلغة الأكسس، يسمى هذا القسم من أقسام معالجة البيانات باستعلام الإلحاق Append Query.
تعديل السجلات
يستخدم الأمر UPDATE في عبارة خاصة من أجل تعديل بيانات موجودة في قاعدة البيانات. يسمى هذا النوع باستعلام التعديل Update Query. مثال بسيط يوضح كيفية استخدام هذه العبارة هو تعديل راتب آخر موظف قمنا بإضافته في المثال السابق. لنقم من باب التفاؤل بزيادة راتبه إلى 5000 مادام يعمل في قسم تقنية المعلومات:
UPDATE tblEmployee SET EmpSal = EmpSal + 2000 WHERE EmpNo = 9999
من المهم جداً بالطبع التنبه إلى تقييد التعديل بشرط، وإلا تم التعديل على كل صفوف الجدول (لن يكون المدير ممنوناً لك). كما ترى، بعد الأمر UPDATE تحدد اسم الجدول أو الاستعلام (أو الجداول كما سنرى بإذن الله قريباً) التي تريد تعديل بيانات فيها. بعد ذلك الأمر SET، ثم الحقول التي تريد تعديل قيمها مع القيم الجديدة. في حالة تعديل أكثر من حقل، افصل كل حقل مع قيمته الجديدة عن الآخر بفاصلة. لاحظ كيف قمنا بتعديل الراتب بإضافة 2000 إلى الراتب الحالي، كما قمنا بتحديد موظف بعينه بواسطة رقمه.
كمثال أوسع قليلاً، دعنا نجرب تعديل اسم قسم مع زيادة رواتب موظفيه في نفس الوقت في عبارة واحدة. أسماء الأقسام موجودة في جدول الأقسام، في حين أن رواتب الموظفين موجودة في جدول الموظفين. نحتاج كالعادة إلى الربط بين الجدولين، بواسطة حقل رقم القسم (مفتاح أساسي في جدول الأقسام، ومفتاح أجنبي في جدول الموظفين). لا نريد بطبيعة الحال تعديل كل صفوف الدولين، لذا سنختار فقط القسم رقم 50 (IT)، فنغير اسمه إلى (Information Technology)، ونزيد رواتب موظفيه بمقدار 500. لاحظ ان الصف المتأثر هو فقط صف واحد لأننا لا نملك إلا موظفاً واحداً في هذا القسم:
UPDATE tblDepartment INNER JOIN tblEmployee ON tblDepartment.dptNo=tblEmployee.EmpDept SET dptName = "Information Technology", EmpSal = EmpSal+500 WHERE dptNo=50
ملحوظة مهمة: انتبه إلى عدد مرات تنفيذ استعلام التعديل من النوع السابق، لأن الراتب سوف يزيد في كل مرة تنفذ فيها الاستعلام بالمقدار المحدد، لذا ينبغي تقييد تنفيذ الاستعلامات من هذا النوع ضمن عملية مدروسة. مثال على ذلك حركات احتساب وترحيل الأرصدة والفواتير ينبغي تأطيرها في عملية غير قابلة للتكرار إلا بعد التراجع عن الترحيل السابق.
حذف السجلات
حذف السجلات هي أسهل عمليات المعالجة. بسبب هذه السهولة وبسبب ما قد ينجم عنها من أثر وخيم (فقدان البيانات إلى الأبد) فهي من أخطر العمليات. ينبغي الاحتراز عند استخدام هذه العملية، كما ينبغي الاحتياط بأخذ نسخ احتياطية من البيانات بشكل دوري. صيغة عبارة الحذف مباشرة للغاية، وتحوي الأمر DELETE (كلمة معبرة)، مع اسم الجدول المراد حذف أحد صفوفه (أو أكثر)، ثم بالتأكيد أي شرط لتحديد الصف أو الصفوف المراد حذفها. لا تهمل شرط المقطع WHERE لأن ذلك يعني حذف كل صفوف الجدول. لأن الحذف يتم على مستوى صفوف كاملة، فإنك لا تحتج إلى تحديد أي حقول من أجل الحذف، كل الصف سيتم حذفه، وهذا يعني أنه من أجل حذف الموظف الذي قمنا بإضافته، وزيادة راتبه للتو (هذا المسكين)، يمكن ان نكتب التالي:
DELETE * FROM tblEmployee WHERE EmpNo = 9999
إذا أردت التخلص من قيمة محددة في حقل محدد (وليس من كامل الصف)، فإن بإمكانك بالطبع استخدام الأمر UPDATE مع تحديد قيمة الحقل بـNULL. كما قد تجدر الإشارة إلى أن الأمر DELETE يحذف البيانات من الجدول، ولا يحذف الجدول.
خاتمة
بهذه اللمحة السريعة على قسم معالجة البيانات من اللغة SQL أختم هذه الدورة. لست أنوي الخوض في قسم تعريف البيانات حالياً (ربما في جزء لاحق). لقد طالت هذه الدورة (السريعة) أكثر مما يجب، لكنني أرجو أن يكون ذلك قد أضاف شيئاً ما إلى المصادر العربية. المشكلة الكبيرة هنا أن هناك انعداماً تاماً في المردود (سلباً أو إيجاباً) من أجل معرفة أوجه القصور أو الجودة، ومن أجل الاستفادة من الأخطاء، أو توضيح الغامض أو تمديد المقتضب أو إيجاز المسهب. لكن تكرار ذلك أصبح بالفعل مملاً.
تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 2 ديسمبر 2009 في 19:27
