الأحد، 21 أكتوبر 2018

الدرس التاسع عشر SELECT INTO

في هذا الدرس سوف نتطرق إلى صيغة مهمة جدا وهي صيغة SELECT INTO وهي عبارة عن عبارتين يتم تنفيذهما سويا. وهذه الصيغة مهمة جدا وتساعد المبرمجين والعاملين على البيانات على القيام بمهمام معقدة وكذلك تساعد على تكوين الجداول بشكل سهل وذاتي وهذا أيضا أمر مهم. وتكتب هذه الصيغة كما يلي
SELECT * INTO TABLE2 FROM TABLE1 WHERE COL1= 123
عندما ينفذ محرك البيانات العبارة السابقة فسوف يقوم للخطوات للتالية:
١- سوف يقوم بتنفيذ استعلام SELECT على الجدول الأول TABLE1 لاستعادة كل حقول هذا الجدول وذلك لأننا استخدمنا * .
٢- سوف يقوم بتصفية او فلترة النتائج لكي يعد فقط الصفوف التي تطابق الشرط الموضوع في عبارة WHERE مثلا كل الأسطر التي تمتلك قيمة 123 في الحقل COL.
٣- سوف يقوم بتكوين جدول جديد بأسم TABLE2 ويكون تكوين هذا الجدول من ناحية أسماء الحقول ونوع البيانات صورة طبق الأصل من الجدول TABLE1.
٤- سوف يقوم بعملية نسخ البيانات التي استعادها من عبارة SELECT ويقوم بخزن هذه الصفوف في الجدول الجديد TABLE2.

الثلاثاء، 9 أكتوبر 2018

الدرس الثامن عشر SELECT TOP

في هذا الدرس سوف نتعرف على عبارة جديدة يمكن استخدامها مع عبارة SELECT وهي عبارة TOP وتكتب بعد عبارة SELECT وكما يلي
SELECT  TOP 10 * FROM PERSON.PERSON
كما نلاحظ اتبعنا كلمة TOP برقم وهو 10 وهذا سوف يخبر نظام إدارة قواعد البيانات أننا نريد استرجع اول عشر أسطر من جدول الأشخاص وسوف يعيد نظام قواعد البيانات هذه الأسطر العشرة بشكل عشوائي.
وكذلك يمكن استخدام عبارة top مع عبارة order by  وذلك لعرض الاسطر بشكل مرتب وليس عشوائي حسب الحقول التي استخدمناها في عبارة order by .

الاثنين، 8 أكتوبر 2018

الدرس السابع عشر عبارة SELECT مع NOLOCK

عبارة NOLOCK يمكن استخدامها مع عبارة SELECT  وذلك لتسريع تنفيذ الايعازات. هناك جدل كبير حول فوائد استخدام عبارة NOLOCK واذا قمت ببحث في الجوجل سوف تجد عشرات المواضيع المتعلقة بهذه المسئلة. في البداية كنت ممن يعارضون استخدام هذا HINT ولكن الحاجة في بعض الاحيان تدفع المبرمج الى اختبار الاشياء بشكل عملي. عند التعامل مع قواعد البيانات الكبيرة والتي تمتلك الملايين من سطور البيانات تصبح عملية تحسين أداء قاعدة البيانات أمر ضروري. ذكرنا سابقا لتحسين  أداء قاعدة البيانات يمكن استخدام الفهارس indexs ولكن في بعض الأحيان استخدام الفهارس يكون غير كافي لذا يضطر مبرمج قواعد البيانات  إلى البحث عن خيارات أخرى لتحسين الأداء ومنها عبارة NOLOCK. ببساطة عند ذكر هذه العبارة بعد اسم الجدول وكما يلي 

SELECT * FROM Person.person NOLOCK 

فأن نظام إدارة قواعد البيانات سوف يقوم بأسترجاع البيانات من الجدول دون الحاجة للانتظار لأكمال العمليات الأخرى التي تجري على الجدول مثل عمليات إضافة INSERT البيانات وعملية تحديث البيانات UPDATE وعملية حذف البياناتDELETE. 
مثلا أثناء تنفيذ استعلام على الجدول قد يكون هناك شخص آخر قد بدء بتنفيذ استعلام تعديل UPDATE على احد السطور هنا اذا لم نستخدم عبارة NOLOCK فإن نظام إدارة قواعد البيانات سوف ينتظر هذا الشخص لكي يكمل عملية التحديث ثم ينفذ عملية اختيار البيانات SELECT. أما إذا استخدمنا عبارةNOLOCK فإن نظام إدارة قواعد البيانات سوف لا ينتظر أكمل عملية التحديث بل يقوم بأسترجاع البيانات من الجدول كما هي وهنا يوجد احتمالان الأول ان عملية التحديث قد تمت بسرعة وبلتالي سوف تحصل على البيانات المحدثة او تكون عملية التحديث بطيئة وسوف تحصل على بيانات هذا السطر قبل التحديث. حسب خبرتي العملية وكذلك بلنقاش مع بعض المختصين من مايكروسوفت في معظم الأحيان سوف تستعيد البيانات المحدثة ونسبة عالية حتى مع استخدام عبارة NOLOCK . لذا يعتبر هذا خيار جيد اذا كنت تعاني من مشاكل بطىء في تنفيذ احد الاستعلامات وحتى بعدما اضفت الفهارس indexs.

للتنبيه عند استخدام الأسماء المختصرة الجداول (راجع الدرس السابق) يجب كتابة عبارة NOLOCK  بشكل خاص وبين قوسين وتكون قبل الاسم المختصر وكما يلي
 SELECT * FROM Person. PERSON  NOLOCK)  PRSN)

الدرس السادس عشر المزيد من الخيارات مع عبارة SELECT

كما ذكرنا في الدرس السابق ان عبارة SELECT هي واحدة من ايعازات DML  وهي تمكننا من استرجاع المعلومات من جداول قواعد البيانات او من المشاهد VIEWS.


SELECT * FROM [Person].PersonPhone PHON

في المثال السابق استخدمنا اسم مصغر PHON لوصف الجدول وتالي فان نظام DBMS سوف يتعرف على كلمة PHON على انها البديل عن اسم الجدول وهذا الامر مفيد جدا عند كتابة استعلامات معقدة تشمل اكثر من جدول. 

في المثال التالي كما نلاجظ استخدمنا الاسم المصغر في PHON بعد عبارة SELECT ثم نقطة (.) ثم النجمة (*) اي (PHON.*) هذا سوف يخبر DBMS اننا نريد استرجاع كل حقول الجدول المسمى PHON ولكن في الحقيقة ان DBMS سوف يبحث في جدول اسمه PersonPhone ولكنه يعرف عندما نذكر له PHON اننا نعني الجدول PersonPhone. 


SELECT PHON.* FROM [Person].PersonPhone PHON

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



في المثال التالي سوف نستخدم ثلاث جداول للحصول على معلومات الشخص وهاتفه والبريد الالكتروني  وكما يلي :

  1. [Person].Person: يحتوي على معلومات الشخص
  2. [Person].PersonPhone: يحتوي على ارقام الهواتف 
  3. [Person].EmailAddress: يحتوي على عناوين  البريد الالكتروني



SELECT * FROM [Person].Person 
INNER JOIN [Person].PersonPhone ON [Person].Person.BusinessEntityID=[Person].PersonPhone.BusinessEntityID
INNER JOIN [Person].EmailAddress ON [Person].Person.BusinessEntityID=[Person].EmailAddress.BusinessEntityID

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

والسبب في ذلك هو ان الحقل BusinessEntityID موجود في الجداول الثلاثة لذا انظام DBMS سوف يحتاج منا الى ان نخبره من اي جدول عليه ان يستخدم هذا الحقل 
وهنا ايضا سوف نظطر الى كتابة اسم الجدول المطول وكما يلي 

في المثال التالي استخدمنا الاسماء المختصرة وكما يلي فأصبح الايعاز اكثر وضوحا:



اضافة الى وضوح الايعاز يمكن ان ننفذ الايعاز التالي والذي سوف يعيد فقط حقول جدول PersonPhone 


كذلك يمكن تنفيذ الايعاز التالي والذي سوف يعيد كل حقول جدول PersonPhone وكل حقول جدول EmailAddress

اخيرا يمكن عرض حقول مختارة من الجداول الثلاثة، وهنا ايضا نلاحظ ان الاسماء المختصرة للجداول ساعدت في تبسيط شكل الايعاز







الجمعة، 5 أكتوبر 2018

الدرس الخامس عشر ايعازات لغة معالجة البيانات Data Manipulation Language DML

في الدروس السابقة ناقشنا العديد من المواضيع وكان معضمها يتعلق بأيعازات لغة تعريف البيانات (Data Definition Language (DDL مثل ايعازات CREATE , ALTER , DROP  هذه الايعازات في العادة تستخدم لتعريف البيانات او تستخدم لتكوين وتعديل وازالة قواعد البيانات وكائنات قواعد البيانات المختلفة مثلا الايعاز CREATE يمكن ان يستخدم لتكوين قاعدة بيانات وكذلك يمكن ان يستخدم لتكوين جدول او مشهد View او اجراء مخزن. للمزيد من المعلومات يرجى مراجعة  الدرس الثالث.

في الدروس التالية سوف نركز اكثر على القسم الثاني من ايعازات لغة الاستعلام الهيكلية (Structured Query Language(SQL وهي ايعازات معالجة البيانات Data Manipulation Language DML. وتمتلك هذه المجموعة اربعة ايعازات رئيسية وهي تمثل المحور الاساسي في برمجة قواعد البيانات حيث تشمل هذه المجموعة الايعازات التي سوف تستخدم في خزن البيانات عن طريق الايعاز INSERT وتعديل البيانات المخزنة عن طريق الايعاز UPDATE وحذف البيانات عن طريق الايعاز DELETE واخيرا استرجاع البيانات لغرض عرضها او معالجتها عن طريق الايعاز SELECT.

في هذا الدرس سوف نركز على عبارة SELECT وطرق استخدامها لاسترجاع البيانات سوف نستخدم قاعدة البيانات AdventureWorks2014  التي تقوم مايكروسوفت بتوزيعها مع نسخ نظام ادارة قواعد البيانات SQL Server 2014 لاغراض التعليم والتدريب ويمكن الحصول عليها مع بعض الادوات المفيدة الاخرى من الرابط التالي
https://www.microsoft.com/en-us/download/details.aspx?id=41704

في العبارتين التاليتين سوف تعيد نفس مجموعة البيانات الا وهي كل اسطر بيانات جدول المنتجات . الفرق بين العبارتين هو في العبارة الاولى ذكرنا اسم قاعدة البيانات [AdventureWorks2014] ثم اسم الجدول [Production].[Product]
اما في العبارة الثانية ذكرنا اسم الجدول فقط دون ذكراسم قاعدة البيانات. في معظم الاحيان قد نستخدم الطريقة الثانية وهي عدم ذكر اسم قاعدة البيانات وذلك للسهولة. ولكن في بعض الحالات التي نضطر فيها الى عرض البيانات من قاعدتي بيانات مختلفة في هذه  الحالة يجب ان نذكر اسم قاعد البيانات قبل اسم الجدول حتى يستطيع SQL Server ان يتعرف على الجداول في قواعد البيانات المختلفة سوف نشرح هذا الموضوع بمزيد من التفصيل في درس منفصل   

[SELECT * FROM [AdventureWorks2014].[Production].[Product

   SELECT * FROM [Production].[Product]


في الطريقة الاولى استخدمنا  * او asterisk بعد عبارة SELECT وهذا سوف يخبر نظام إدارة قواعد البيانات بأننا نريد عرض أسماء كل الحقول.

يمكن تنفيذ الايعاز بطريقة اخرى عن طريق ذكر اسماء الحقول مفصولة بفاصلة comma (,). هذه الطريقة سوف تعطينا مرونة بتحديد الحقول التي نريد تضمينها في مجموعة البيانات Data set.