أهم أقسام المدونة

الصفحات

الثلاثاء، 30 أغسطس 2016

تجميع السجلات باستخدام GROUP BY


تجميع السجلات باستخدام GROUP BY:
رأينا كيف نجري بعض العمليّات الحسابيّة باستخدام دوال التجميع.. ولكن ماذا لو أردنا مثلا أن نحصل على سجل يحتوي على عدد الكتب التي ألفها كل مؤلف؟
في هذه الحالة لن تسعفنا التعبيرات التي تعلمناها حتى الآن.
هنا تبرز أهمّية التعبير GROUP BY، الذي يقوم بتقسيم سجلات الجدول إلى مجموعات فرعية، تمتلك كل مجموعة منها القيمة نفسها في حقل معين (كرقم المؤلف مثلا)، ومن ثم يتم تطبيق دوال التجميع على كل مجموعة فرعية بمفردها، وبهذا يكون ناتج دوال التجميع عمودا يحتوي على مجموعة من الصفوف، وليس صفا واحدا كما ألفنا من قبل.. هذه هي الجملة التي تحسب عدد كتب كل مؤلف:
SELECT AuthorID, COUNT(AuthorID) AS [عدد الكتب]
FROM Books
GROUP BY AuthorID
ORDER BY [عدد الكتب]
لاحظ قدرتنا على استخدام الاسم المستعار للعمود الناتج في باقي جملة SQL.
ولكن.. الجدول الناتج من الاستعلام السابق يحتوي على أرقام المؤلفين وليس أسماءهم.. لهذا لا ضير من استخدام الفقرة Where للربط بين الجدولين كالتالي:
SELECT Author, COUNT(AuthorID) AS [عدد الكتب]
FROM Authors, Books
Where  AuthorID = Authors.ID
GROUP BY Author
ORDER BY [عدد الكتب]
لاحظ أننا قمنا بعملية التجميع في الجملة الأخيرة باستخدام الحقل Author.. السبب في هذا، هو أن هناك قيدا صارما على الحقول المذكورة في المقطع SELECT، وهو أنها جميعا يجب أن تظهر إما في المقطع GROUP BY وإما في المقطع ORDER BY.. لهذا لو تركنا التجميع على الحقل AuthorID فستعترض سيكويل سيرفر على ظهور اسم الحقل Author في المقطع SELECT! 
 

ملحوظة:
لاستخدام الفقرة Group By في باني الاستعلام، اضغط اسم الحقل في قسم المعايير Criteria Pane بزرّ الفأرة الأيمن، ومن القائمة الموضعيّة اضغط الأمر Add Group By.. سيظهر عمود جديد في جدول الحقول اسمه Group By، وسيكون مكتوبا فيه مبديا النص Group By.. هذا معناه تجميع القيم المتشابهة لهذا الحقل.
ولو أردت إضافة دالة تجميع مع الفقرة Group By لنفس الحقل، فكرر اسم الحقل مرة أخرى في قسم المعايير بضغط صف فارغ بالفأرة واختيار اسم العمود من القائمة المنسدلة الموجودة في العمود Column، وبهذا تستطيع أن تضيف إلى هذا الحقل دالة التجميع التي تريدها.

 
من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

 

السبت، 27 أغسطس 2016

تيه عيناك


تيهٌ عيناك 

يا مثلَ قمرْ

قلبي منهوكٌ بعدَ سَفَرْ

تِيهٌ عيناكِ، الحبُّ قَدَرْ

وأنا عطشانٌ دونَ مَطَرْ

 

يا عَزْفَ وَتَرْ

سِحرٌ في العينِ القلبَ شَطَرْ

نصفًا للشوقِ أسيرَ سَهَرْ

والنصفَ الآخرَ عِندَكِ فَرّْ

 

يا عطرَ زَهَرْ

عِشقُكِ أضناني، العمرُ عَبَرْ

ذُوبي شوقًا يا قلبَ حجرْ

وطني في حِضنِكِ حينَ أَقَرّْ

محمد حمدي غانم

17/8/2016

 

 

دوال التجميع Aggregate functions


دوال التجميع Aggregate functions:

تمنحك SQL بعض الدوال الجاهزة ل‘جراء بعض الحسابات على سجلات قاعدة البيانات.. لاحظ ما يلي:

- هذه الدوال تقبل معاملا واحدا فقط، هو أحد أعمدة الجدول، أو أيّ عمود جديد ناتج عن إجراء عمليّة حسابيّة (كالجمع والطرح والضرب والقسمة) على واحد أو أكثر من الأعمدة، أو أيّ عمود ناتج من جملة SELECT فرعيّة.

- هذه الدوال تعيد قيمة واحدة فقط (رقما منفردا).. أيّ أن الناتج منها هو عمود يحتوي على خانة واحدة فقط.. ولو كنت ستعرض هذه النتيجة، فاستخدم التعبير AS لمنح هذا العمود الجديد اسما مناسبا، وإلا فإن SQL ستمنحه اسما افتراضيّا.

- لا مانع من استخدام الفقرة WHERE لتحديد السجلات التي ستتمّ العمليّة الحسابيّة عليها.

وهذه الدوال هي:

 

الأحد، 21 أغسطس 2016

عصابة خطوط المحمول


عصابة خطوط المحمول 

اشتريت خط فودافون الأسبوع الماضي، وحاولت تسجيله ببطاقتي.. لكن الشركة رفضت تسجيله بحجة أن لدي خطوطا كثيرة مسجلة باسمي!!

ذهبت إلى فرع فودافون في دمياط، واستعلمت عن الأرقام المسجلة ببطاقتي، فاكتشفت وجود رقمين غريبين لم أرهما من قبل قط، فتقدمت بطلب لإلغائهما، لأن من الخطر بقاء خطين باسمي في يدي غريبين قد يرتكبان بهما أي جريمة فأتحمل أنا مسئوليتها!

لكن كيف تم تسجيل هذين الخطين؟

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

وحتى بدون كل هذا: لماذا تساعد عصابة التزوير هذه في عملها بشرائك لهذه الخطوط المضروبة؟

ولماذا تمنع شخصا آخر من تسجيل خط جديد باسمه لأن هناك مجرما عديم الضمير سجله رغم علمه واشتريته أنت؟

وماذا لو اكتشف هذا الشخص الأمر مثلي، وقام بإلغاء الخط المزيف بعد أن اشتريته أنت؟

نقطة هامة أخرى:

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

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

ونصيحة أخيرة:

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

لا تتكاسل، فالأمر جد خطير.

فقرة الترتيب ORDER BY


فقرة الترتيب ORDER BY:

يمكنك ترتيب السجلات الناتجة من الاستعلام تبعا لحقلٍ أو أكثر.. وفي المثال التالي سنعرض أسماء الكتب ومؤلفيها مرتبة باسم الكتاب:
SELECT Book, Author
FROM Books, Authors
ORDER BY Book
WHERE AuthorID = Authors.ID

ولكن لو كانت هناك كتب تحمل نفس الاسم، فكيف سيتمّ ترتيبها؟
في هذه الحالة يمكنك أن تحدّد حقل المؤلفين كمفتاح ثانٍ للترتيب، بحيث لو تشابهت أسماء الكتب، يتم ترتيب الكتب المتشابهة على حسب أسماء مؤلفيها:
SELECT Book, Author
FROM Books, Authors
ORDER BY Book, Author
WHERE AuthorID = Authors.ID

ويكون هذا الترتيب تصاعديّا في الوضع الافتراضيّ.. ولو أردت أن تغير طريقة الترتيب، فاستخدم الكلمة DESC بعد اسم أيّ حقلٍ تريد ترتيبه تنازليّا، والكلمة ASC بعد اسم الحقل الذي تريد ترتيبه تصاعديّا (وهي افتراضيّة ويمكن ألا تكتبها).. مثال:
SELECT Book, Author
FROM Books, Authors
ORDER BY Book DESC, Author ASC
WHERE AuthorID = Authors.ID
 

ملحوظة:
لوضع كيفيّة الترتيب في باني الاستعلام، حدد الحقل الذي تريد أن يتمّ الترتيب على أساسه في قسم المخطط Diagram Pane واضغطه بزرّ الفأرة الأيمن، ومن القائمة الموضعيّة اضغط الأمر Sort Ascending إذا كنت تريد الترتيب تصاعديّا، أو الأمر Sort Descending إذا كنت تريد الترتيب تنازليّا.. ستجد أن أيقونةً تمثل نوع الترتيب قد ظهرت بجوار اسم الحقل.. ولو أردت إزالة الترتيب، فاضغط نفس الأمر من القائمة الموضعيّة مرّة أخرى.. ويمكنك فعل ذلك مع أكثر من حقل ومن أيّ جدول، حيث ستظهر كلها في جملة SQL بالترتيب الذي أضفتها به.
كما يمكنك اختيار نوع الترتيب بطريقة أخرى، وذلك باستخدام قسم المعايير Criteria Pane، حيث يمكنك استخدام القائمة المنسدلة في العمود الذي يحمل العنوان Sort Type لتغيير طريقة ترتيب أي حقل.
وإذا أردت استخدام أكثر من حقل للترتيب على أساسها، فعليك استخدام العمود Sort Order للتحكم في أولوية هذه الحقول في عملية الترتيب، فالحقل الذي سيتم الترتيب على أساسه أولا أعطه الرقم 1، والحقل الذي سيتم الترتيب على أساسه في حالة تشابه قيم الحقل الأول أعطه الرقم 2، وهكذا.

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

الخميس، 18 أغسطس 2016

أحلى منجزاتك


أحلى مُنجزاتِك

 

لماذا لستُ أحلى مُنجزاتِكْ؟ = ألا أكفيكِ في تحقيقِ ذاتِكْ؟

لماذا لا أكونُ أنا التحدّي: = غدًا إثمارُ زهري في نَباتِكْ؟

أليسَ الشِّعرُ في شَفَتَيَّ فخرًا = إذا أغلاكِ بينَ صُوَيْحِباتِكْ؟

ألا أَحويكِ في قلبي سنينا = كَسِرٍّ غامرٍ بالسِّحرِ فاتِكْ؟

فما يُؤذيكِ في عشقي فَتاتي = إذا لَملمتُ حُلمي مِن فُتاتِكْ؟!

أنا أُعلِيكِ حينَ عليكِ أَعلو = ألا معنى لشمسٍ في حياتِكْ؟

فكوني ـ مثلما أهواكِ ـ بدري = تَكُنْ نَجماتُ ليلي حارساتِكْ

فلا تتمرّدي في أسرِ عشقي = أنا وحدي أعيشُ بذكرياتِكْ

أحبيني فهذا كلُّ عَرضي = وضمّيني لأنهلَ مِن فُراتِكْ

محمد حمدي غانم

30/4/2016

 

 

القيم المنعدمة Null Values


القيم المنعدمة Null Values:

تشيرُ القيمة Null في قاعدة البيانات، إلى أن الخانة لم توضع بها أيّ قيمة أساسا.. لهذا تختلف الخانة التي بها نص فارغ "" عن الخانة التي ليس بها أي شيء على الإطلاق.

وعند تنفيذ الفقرة WHERE، فإنها لا تسترجع أيّ خانة فارغة، لأن القيمة NULL تنتج False بطريقة دائمة في أيّ عمليّة مقارنة.. هذا بالإضافة إلى أن دخول هذه القيمة في أيّ عمليّة حسابيّة يؤدّى إلى حدوث خطإ في البرنامج.

لهذا يجب أن تعامل هذه القيمة بحذر، حيث يمكنك أن تختبر وجودها باستخدام أحد التعبيرين IS NULL أو IS NOT NULL.. وكمثال، استخدم الاستعلام التالي للبحث عن أيّ خانة في الحقل Author تمّ تركها فارغة:

SELECT * FROM Authors

WHERE Author IS NULL

لاحظ أنك تستطيع تلافي الكثير من احتمالات الخطأ الناتجة عن القيمة Null، بإزالة علامة الاختيار من العمود Allow Nulls عند تصميم الحقول، بحيث لا يستطيع مدخل البيانات ترك خانة فارغة في هذا الحقل.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 

الأربعاء، 17 أغسطس 2016

قلب صخري


يا قلب صخري = أنا جبت آخري

أنا حبي بدري = ليه تحبي وخري

يا أحلى حوّا = يا سر فخري

من حاسدينك = حواليكْ مباخري

محمد حمدي غانم، 2016

 

الكلمة DISTINCT


الكلمة "منفصل" DISTINCT:

استخدم هذه الكلمة لإزالة السجلات المكرّرة من ناتج الاستعلام.. فمثلا، لو عرضنا جدولا بأسماء الكتب بدون مؤلفيها، فقد يتكرر اسم أحد الكتب أكثر من مرة (لمؤلفين مختلفين).. هنا يمكن تلافي هذا التكرار باستخدام الجملة التالية:

SELECT DISTINCT Book

FROM Books

  

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

الثلاثاء، 16 أغسطس 2016

كيف ما قلت شيئا


كيفَ ما قلتَ شَيَّا؟ 

يا جميلَ المُحيّا = رُدَّ مَنْ ماتَ حيّا

أَهْدِ للشوقِ قُربًا = يُسعِدُ القلبَ، هيّا

أينَ مَنْ فاهَ شِعرًا؟.. خانهُ الشِّعرُ عَيَّا

قالَ بالعينِ: "أهوَى" = كيفَ ما قلتَ شَيَّا؟

هل تَرَى الحبَّ طُهرًا = أم تَرى الحبَّ غَيّا؟

فامنحِ الرَّوحَ حُسنًا = وامنحِ القلبَ فَيَّا

يَرقُصِ القلبُ فَرحًا = بالمُـنى قد تَزَيّا 

محمد حمدي غانم 

ملحوظة عروضية:
يمكن اعتبار هذه الأبيات من البحر المتدارك (فاعلن فاعلن فع)،
أو الخفيف (فاعلاتن متفعلْ)،
أو الممتد (فاعلن فاعلاتن)،
أو المضارع (فاعلن فاعلاتن) بخرم التفعلية مفاعلن.

الكلمة TOP


الكلمة TOP:

يمكنك استخدام هذه الكلمة بعد SELECT مباشرة، وذلك إذا كان عدد السجلات الناتجة عن تنفيذ الاستعلام كبيرا، بينما ينحصر اهتمامك في مجموعة قليلة منها فقط.. فمثلا، لعرض أوّل خمس سجلات من أسماء الكتب ومؤلفيها استخدم الجملة التالية:

SELECT TOP 5 Book, Author

FROM Books, Authors

WHERE AuthorID = Authors.ID

وإذا لم تكن تعرف بالضبط عدد السجلات المطلوبة، فيمكنك استخدام النسبة المئويّة PERCENT كالتالي:

SELECT TOP 5 PERCENT Book, Author

FROM Books, Authors

WHERE AuthorID = Authors.ID

  

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

الاثنين، 15 أغسطس 2016

في انتظارك


زهدتِ الآنَ إعلانَ انتصارِكْ = على المجنونِ شوقا في حصارِكْ؟
فلا تبكي على المِسكينِ حبّي = إذا ما ماتَ من طولِ انتظارِكْ

محمد حمدي غانم

 

وضع اسم مستعار


وضع اسم مستعار باستخدام الكلمةAS :
رأينا من قبل كيف يمكن استخدام الكلمة AS لوضع اسم مستعار للجدول.. مثلا:

SELECT A.*, B.ID, B.Book
FROM Authors As A, Books As B

ويمكنك أيضا استخدام الكلمة AS لوضع اسم مستعار للحقل.. مثال:
SELECT Book AS [اسم الكتاب], Author AS [المؤلف]
FROM Books, Authors
WHERE AuthorID = Authors.ID

الآن ستظهر أسماء المؤلفين وكتبهم، ولكن عنواني العمودين سيكونان اسمين عربيّين هذه المرّة.
ومن الاستخدامات الطريفة للاسم المستعار، استخدامه لتسميّة أحد الحقول الناتجة عن دمج حقلين معا.. افترض أننا نريد عرض حقل يحتوي على اسم الكتاب متبوعا بشرطة متبوعةً باسم المؤلف.. لفعل هذا، علينا تشبيك Concatenate الحقلين، تماما كما نفعل مع المتغيّرات النصّيّة في لغات البرمجة العادية، مع منح الحقل الناتج اسما مستعارا باستخدام الكلمة AS، كالتالي:

SELECT Book + '_' + Author AS [اسم الكتاب]
FROM Books, Authors
WHERE AuthorID = Authors.ID
 

ملحوظة:
عند تنفيذ الجملة السابقة في باني الاستعلام سيتم وضع التعبير Book + '_' + Author كحقل في قسم المعايير Criteria Pane، مع منحه الاسم المستعار "اسم الكتاب".. هذه هي الطريقة التي تضيف بها الحقول المدمجة في باني الاستعلام.. اكتب العمليّة التي تجمع بين الحقلين في أيّ خانة فارغة في العمود Column، وامنح هذا الحقل الجديد الاسم المستعار المناسب.

 وليست الحقول النصّيّة فقط هي ما نستطيع دمجه، حيث يمكننا أن نجرى عمليّات الجمع والطرح والضرب والقسمة على الحقول الرقميّة كما يحلو لنا. 

 من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

دوبان


ولسة هتضعفي أكثر
وشوق القلب قربانك
تدوبي كحتة السكر
وهستمتع بدوبانك

محمد حمدي غانم، 2016

 

بعض الدوال النصية في SQL


بعض الدوال النصية المستخدمة في إنشاء الشرط:
يمكنك استخدام بعض الدوال في تكوين شرط WHERE، مثل دوال تقطيع النص SUBSTRING و LEFT و RIGHT، ودالة حذف المسافات الطرفية TRIM ودالة طول النص LEN، بطريقة شبيهة باستخدامها في دوت نت.. والمثال التالي يعيد الناشرين الذين تنتهي أسماؤهم بالحرفين "ية":

SELECT Publisher
FROM Publishers
WHERE (RIGHT(Publisher, 2) = 'ية')

أما المثال التالي فيعيد أطوال أسماء الناشرين:
SELECT LEN(Publisher)
FROM Publishers 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل: