الجمعة، 30 نوفمبر 2018

الدرس الثاني والعشرون WHERE IS NULL

في الدرس السابق ناقشنا استخدام عبارة WHERE والغرض العام منها. في هذا الدرس سوف نتطرق إلى استخدام عبارة WHERE مع معامل مهم وهو (IS NULL) . في الدروس السابقة تطرقنا إلى مفهوم القيمة الخالية او NULL وهي تختلف كليا عن قيمة الصفر او قيمة العبارة الخالية ('') . مثلا اذا كان لدينا جدول يمتلك حقل من نوع INT فإن هذا الحقل يخزن الاعداد الصحيحة وبضمنها الصفر وكذلك يمكن أن يخزن القيمة الخالية NULL اذا تم إعداد هذا الحقل لخزن القيمة الخالية. ان نظام إدارة قواعد البيانات سوف يعامل قيمة الصفر بشكل مختلف عن قيمة NULL.  مثلا اذا اردنا استعادة كل الأسطر التي تمتلك قيمة صفر في هذا الحقل يمكن كتابة الاستعلام التالي
SELECT * FROM TABLE1 WHERE COL1=0

هذا الاستعلام سوف يعيد كل الأسطر التي تمتلك قيمة صفر في العمود COL1 . ولكن لن يعيد الأسطر التي تمتلك قيمة NULL  في الحقل COL1.

لاستعادة الأسطر التي تمتلك قيمة NULL في الحقل COL1 نستخدم معامل IS NULL (يجب ترك مسافة بين كلمة IS وكلمة NULL )

SELECT * FROM TABLE1 WHERE COL1 IS NULL

سوف يعيد الاستعلام كل الأسطر التي تمتلك قيمة خالية ولكن سوف لا يعيد الأسطر التي تمتلك قيمة صفر في هذا الحقل.

الان لو أردنا أن نعيد كل الأسطر التي تمتلك قيمة صفر والتي تمتلك قيمة خالية ؟
يمكن القيام بذلك بعدة طرق وكما يلي
اولا : نستخدم شرطين و يتم تحقيقها باستخدام المعامل المنطقي OR
SELECT * FROM TABLE1 WHERE (COL1 IS NULL ) OR (COL1 =0)
في الاستعلام السابق سوف يعيد كل الأسطر التي تمتلك قيمة صفر في هذا الحقل او التي تمتلك قيمة خالية.

ثانيا: يمكن استخدام تحويل البيانات data transformation هناك دالة في SQL Server  اسمها ISNULL (ملاحظة هنا تكتب كلمة IS ملاصقة لكلمة NULL وبدون مسافة فاصلة) هذه الدالة تعطينا الخيار باستبدال او تحويل قيمة NULL  إلى قيمة أخرى مثل صفر في الحقول العددية او عبارة خالية في الحقول النصية او تاريخ محدد في حقول التواريخ وهكذا والصيغة العامة لهذه الدالة كما يلي
ISNULL(COLUMN NAME, NEW VALUE)

اي نفتح قوس ثم اسم حقل البيانات ثم فاصلة ثم القيمة الجديدة وكما يلي
ISNULL (COL1, 0)

هنا سوف يقوم نظام إدارة قواعد البيانات بفحص قيم الحقل COL1 فأذا كانت القيمة NULL سوف يستبدلها بصفر واذا كانت اي قيمة أخرى غير NULL سوف يبقيها كما هي لذلك عند استخدام هذه الدالة مع عبارة WHERE سوف تعيد كل الأسطر التي تمتلك قيمة صفر وبضمنها الأسطر التي تمتلك قيمة خالية لأننا حولنا القيمة  الخالية إلى قيمة صفر .
SELECT * FROM TABLE1 WHERE ISNULL(COL1,0)=0

يمكن أن نستخدم الدالة  ISNULL ضمن عبارة SELECT وهي سوف تعمل بشكل مشابه حيث تقوم بفحص قيم الحقل COL1 فأذا كانت القيمة NULL سوف يستبدلها بصفر واذا كانت اي قيمة أخرى غير NULL سوف يبقيها كما هي
SELECT ISNULL(COL1,0),* FROM TABLE1 WHERE ISNULL(COL1,0)=0

الأربعاء، 28 نوفمبر 2018

الدرس الواحد والعشرون عبارة WHERE

تعتبر عبارة WHERE من أهم عناصر برمجة قواعد البيانات. الغرض الأساسي من هذه العبارة هي تصفية ( فلترة ) البيانات التي تعيدها عبارة SELECT. يمكن استخدام عبارة WHERE بشكل منفرد او استخدامها مع عبارات أخرى مثل عبارة IN او عبارة NOT IN او مع عوامل تصفية مثل (= ، <،>،<= ، >= ) والعوامل المنطقية مثل ( AND , OR) وعوامل أخرى مثل (BETWEEN , LIKE , NOT LIKE) سوف نشرح لاحقا هذه الاستخدامات بشكل مفصل.

كذلك تستخدم عبارة WHERE في عمليات معالجة البيانات DML مثلا تستخدم مع عبارة UPDATE لحصر الاسطر التي نيرد تطبيق التحديثات عليها و تستخدم مع عبارة DELETE لحصر الاسطر التي نريد حذفها من قاعدة البيانات. 

الصيغة المبسطة لأستخدام عبارة WHERE هي كما يلي

SELECT * FROM TABLE1 WHERE CONDITIONS 

الشروط او conditions هي التي سوف تستخدمها عبارة WHERE في عملية تصفية اسطر البيانات . فذا كانت الاسطر تتوافق مع الشروط سوف يقوم نظام قواعد البيانات بتضمين هذه الاسطر ضمن مجموعة الاسطر التي تعيدها عبارة SELECT واذا كانت الاسطر غير متوافقة مع الشروط سوف يتم اهمال هذه الاسطر. 

في المثال التالي سوف نستخدم عبارة WHERE للحصول على كل الطلبيات الخاصة بزبون معين (معرف الزبون = 29825)

SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [CustomerID]='29825'


كما نشاهد في الصورة السابقة قام  نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة حقل معرف الزبون تساوي 29825  ([CustomerID]='29825'). اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي تعود للزبون رقم 29825

في المثال التالي سوف نستخدم عامل اخر في عملية تصفية البيانات وهو اكبر >


SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] >150000


كما نشاهد في الصورة السابقة قام  نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة المبلغ الاجمالي اكبر من 150000 الف
اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي اكبر من 150000

ملاحظة: بما اننا استخدمنا معامل اكبر فقط بدون مساواة فأذا كان هناك سطر يمتلك قيمة مبلغ اجمالي تساوي بلضبط 150000 سوف لا يتم تضمين هذا السطر لانه لا يطابق الشرط.

في المثال التالي سوف نستخدم عامل اخر في عملية تصفية البيانات وهو اكبر او يساوي  >=

SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] >=150000
سوف يقوم نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة المبلغ الاجمالي اكبر او تساوي  150000 الف
اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي اكبر او تساوي 150000

ملاحظة: بما اننا استخدمنا معامل اكبر مع المساواة  فأذا كان هناك سطر يمتلك قيمة مبلغ اجمالي تساوي بلضبط 150000 سوف يتم تضمين هذا السطر لانه  يطابق الشرط.

في المثال التالي سوف نستخدم عاملين عملية تصفية البيانات وهو اصغر < و اصغر أو يساوي <=


SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] <10

اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي أصغر من 10

SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE [TotalDue] <=10

اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الاسطر التي يكون المبلغ الاجمالي أصغر أو يساوي 10

في المثال الاخير سوف نستخدم عامل عدم المساواة < > 

 SELECT * FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE OnlineOrderFlag <>0

سوف يقوم نظام قواعد البيانات بتضمين فقط الاسطر التي تطابق الشرط و الشرط في هذه الحالة هو ان قيمة حقل OnlineOrderFlag لا تساوي صفر. طبعا هذا حقل خاص يستخدم للتمييز بين الطلبات التي يتم استلامها من الزبائن اثناء زيارتهم للمتجر (OnlineOrderFlag =0) او الطلبات التي يتم استلامها من خلال الانترنت (OnlineOrderFlag =1)

اي بمعني اخر يمكن ترجمة الاستعلام البرمجي السابق بلعبارة التالية
نريد كل الطلبات التي تم أستلامها من خلال الانترنت

الأحد، 25 نوفمبر 2018

الدرس العشرين SELECT TOP INTO

في هذا الدرس سوف نتطرق إلى استخدام عبارتين بشكل مزدوج وهي عبارة TOP مع عبارة INTO مع عبارة SELECT .
كما يلي
SELECT TOP 1000 * INTO TABLE2 FROM TABLE1

١- سوف يقوم بتنفيذ استعلام SELECT على الجدول الأول TABLE1 لاستعادة اول ١٠٠٠ سطر من الجدول TABLE1 و كل حقول هذا الجدول وذلك لأننا استخدمنا * .

٢- سوف يقوم بتكوين جدول جديد بأسم TABLE2 ويكون تكوين هذا الجدول من ناحية أسماء الحقول ونوع البيانات صورة طبق الأصل من الجدول TABLE1.

٣- سوف يقوم بعملية نسخ البيانات (١٠٠٠ سطر) التي استعادها من عبارة SELECT ويقوم بخزن هذه الصفوف في الجدول الجديد TABLE2.

يمكن استخدام هذه الصيغة SELECT TOP INTO في تنفيذ بعض المهام . مثلا اذا كان TABLE1 يحتوي على ٣ ملايين سطر ونريد استخراج البيانات وخزنها في ملف اكسل. سوف نواجه مشكلة وهي ان ملف الاكسل يستطيع أن يخزن فقط مليون و ٢٠٠ ألف سطر تقريبا . لذا في هذه الحالة يجب أن نستخرج البيانات ونوزعها على ثلاث ملفات اكسل وفي كل ملف نضع مليون سطر. والقيام بذلك نحتاج إلى توزيع البيانات المخزنة في الجدول TABLE1 على ثلاث جداول و في كل جدول نضع مليون سطر فقط . ثم نقوم باستخراج البيانات من الجداول الثلاثة و وخزنها في ثلاثة ملفات اكسل.

يمكن أن توزع ٣ ملايين سطر من الجدولTABLE 1 كما يلي
نفرض ان الجدول TABLE1 لا يحتوي على حقل فريد او اي مفتاح أساسي لذا الخطوة الأولى هي ان نضيف حقل ذو قيمة فريدة UNIQUE  إلى الجدول TABLE1 عن طريق استخدام محدد القيمة الفريدة وكما يلي
ALTER TABLE TABLE1 ADD ID INT IDENTITY (1,1)

تعمل العبارة السابقة على إضافة حقل اسمه ID إلى الجدول TABLE1 وهذا الحقل سوف يحتوي على قيم فريدة من ١ الى ٣ ملايين . مثلا في السطر الأول تكون قيمة الحقل ID هي ١ وفي السطر الثاني قيمة ID هي ٢ وهكذا في السطر الاخير تكون قيمة الحقل هي ٣٠٠٠٠٠٠

ثم ننفذ العبارات التالية بالتسلسل
SELECT TOP 1000000 * INTO TABLE2 FROM TABLE1

SELECT TOP 1000000 * INTO TABLE3 FROM TABLE1 WHERE ID NOT IN ( SELECT ID FROM TABLE2)

SELECT TOP 1000000 * INTO TABLE4 FROM TABLE1 WHERE ID NOT IN ( SELECT ID FROM TABLE2 UNION SELECT ID FROM TABLE3)

تعمل العبارات الثلاث السابقة على تنفيذ المهام التالية
اولا العبارة الأولى سوف تأخذ اول مليون سطر من الجدول TABLE1 وتخزينها في جدول TABLE2.

أما العبارة الثانية فسوف تأخذ ثاني مليون سطر من الجدول TABLE1 وتخزينها في جدول TABLE3 . حيث سوف يقوم النظام باختيار الأسطر التي تكون فيها قيمة ID غير موجودة في الجدول TABLE2 وهي الأسطر من 1000001 الى 2000000 لان الجدول TABLE2 يحتوي على مليون سطر وآخر قيمة في حقل ID له هي 1000000

أما العبارة الثالثة فسوف تأخذ ثالث مليون سطر من الجدول TABLE1 وتخزينها في الجدول TABLE4
حيث سوف يقوم النظام باختيار الأسطر التي تكون فيها قيمة ID غير موجودة في الجدول TABLE2 و الجدول TABLE3 وهي الأسطر من 2000001 الى 3000000 لان الجدول TABLE2 يحتوي على مليون سطر وآخر قيمة في حقل ID له هي 1000000 والجدول TABLE3 يحتوي على مليون سطر وآخر قيمة في حقل ID له هي 2000000 .

الان وبعدما قسمنا الأسطر على  ثلاث جداول TABLE2 و TABLE3 و TABLE4 يمكن بسهولة استخراج البيانات وتوزيعها على ثلاث ملفات اكسل.