📘 الدرس السادس
البطء في النظام
لا يعني دائماً مشكلة في SQL.
أحياناً يكون السبب:
- طلب غير منطقي
- تقرير غير ضروري
- فهم خاطئ للمطلوب
قبل أن تحسّن الكود،
اسأل:
هل المطلوب نفسه صحيح؟
سؤال:
❓ كم مرة حسّنت استعلاماً كان يجب إلغاءه؟
البطء في النظام
لا يعني دائماً مشكلة في SQL.
أحياناً يكون السبب:
- طلب غير منطقي
- تقرير غير ضروري
- فهم خاطئ للمطلوب
قبل أن تحسّن الكود،
اسأل:
هل المطلوب نفسه صحيح؟
سؤال:
❓ كم مرة حسّنت استعلاماً كان يجب إلغاءه؟
اجابه الدرس الخامس
كيف تعرف أن الاستعلام “جيد”؟
قلنا سابقاً:
الاستعلام قد يكون صحيحاً تقنياً
لكنه سيئ عملياً.
لكن كيف نقيس الجودة؟
الاستعلام الجيد يحقق 4 شروط:
1️⃣ يعيد البيانات الصحيحة فقط
2️⃣ لا يعيد بيانات زائدة
3️⃣ يعمل بكفاءة مناسبة
4️⃣ سهل الفهم والتعديل لاحقاً
مثال:
SELECT * FROM orders;
هل هو صحيح؟
نعم.
هل هو جيد دائماً؟ لا.
لأنه: - يعيد كل الأعمدة حتى غير المطلوبة
- قد يستهلك ذاكرة بلا داعي
- قد يُستخدم في غير سياقه
النسخة الأفضل غالباً تكون:
SELECT order_id, total, order_date
FROM orders
WHERE order_date >= '2025-01-01';
الجودة ليست في أن الكود يعمل،
بل في أنه مناسب للهدف بدقة.
إجابة سؤال اليوم:
الاستعلام الجيد هو الذي
يحقق المطلوب بدقة،
بأقل موارد ممكنة،
وبأبسط منطق واضح.
كيف تعرف أن الاستعلام “جيد”؟
قلنا سابقاً:
الاستعلام قد يكون صحيحاً تقنياً
لكنه سيئ عملياً.
لكن كيف نقيس الجودة؟
الاستعلام الجيد يحقق 4 شروط:
1️⃣ يعيد البيانات الصحيحة فقط
2️⃣ لا يعيد بيانات زائدة
3️⃣ يعمل بكفاءة مناسبة
4️⃣ سهل الفهم والتعديل لاحقاً
مثال:
SELECT * FROM orders;
هل هو صحيح؟
نعم.
هل هو جيد دائماً؟ لا.
لأنه: - يعيد كل الأعمدة حتى غير المطلوبة
- قد يستهلك ذاكرة بلا داعي
- قد يُستخدم في غير سياقه
النسخة الأفضل غالباً تكون:
SELECT order_id, total, order_date
FROM orders
WHERE order_date >= '2025-01-01';
الجودة ليست في أن الكود يعمل،
بل في أنه مناسب للهدف بدقة.
إجابة سؤال اليوم:
الاستعلام الجيد هو الذي
يحقق المطلوب بدقة،
بأقل موارد ممكنة،
وبأبسط منطق واضح.
إجابة الدرس السادس
متى لا تكون المشكلة في SQL؟
في الدرس السابق تعلّمنا كيف نقيس جودة الاستعلام.
اليوم ننتقل خطوة أعمق:
أحياناً يكون الاستعلام جيداً،
لكن النظام بطيء.
كيف؟
لأن المشكلة لم تكن في الكود،
بل في الطلب نفسه.
مثال:
الإدارة تطلب:
“تقرير بكل العمليات منذ بداية النظام”
المبرمج يكتب استعلاماً منظماً،
يحدد الأعمدة،
يستخدم WHERE مناسب.
ومع ذلك:
التقرير يستغرق 40 ثانية.
هل الخطأ في SQL؟
غالباً لا.
الخطأ في السؤال.
السؤال الصحيح كان:
“نريد تقرير آخر 3 أشهر”
عندما يكون السؤال غير منطقي،
لن ينقذك أي تحسين أداء.
إجابة سؤال اليوم:
كثيراً ما نحسّن استعلاماً
كان يجب أن نعيد التفكير في هدفه من البداية.
متى لا تكون المشكلة في SQL؟
في الدرس السابق تعلّمنا كيف نقيس جودة الاستعلام.
اليوم ننتقل خطوة أعمق:
أحياناً يكون الاستعلام جيداً،
لكن النظام بطيء.
كيف؟
لأن المشكلة لم تكن في الكود،
بل في الطلب نفسه.
مثال:
الإدارة تطلب:
“تقرير بكل العمليات منذ بداية النظام”
المبرمج يكتب استعلاماً منظماً،
يحدد الأعمدة،
يستخدم WHERE مناسب.
ومع ذلك:
التقرير يستغرق 40 ثانية.
هل الخطأ في SQL؟
غالباً لا.
الخطأ في السؤال.
السؤال الصحيح كان:
“نريد تقرير آخر 3 أشهر”
عندما يكون السؤال غير منطقي،
لن ينقذك أي تحسين أداء.
إجابة سؤال اليوم:
كثيراً ما نحسّن استعلاماً
كان يجب أن نعيد التفكير في هدفه من البداية.
❤1
فهم المطلوب (60% من الوقت) ← تصميم الاستعلام (30%) ← الكتابة (10%)
📘 الدرس السابع
ماذا تفعل قبل أن تكتب أول SELECT؟
بعد أن فهمنا أن:
- ليس كل استعلام يعمل هو جيد
- وأحياناً المشكلة ليست في SQL
السؤال الآن:
كيف نمنع الخطأ من البداية؟
قبل كتابة أي استعلام اسأل نفسك 4 أسئلة:
1️⃣ ما النتيجة النهائية المطلوبة؟
2️⃣ من سيستخدم هذا التقرير؟
3️⃣ ما القرار الذي سيُبنى عليه؟
4️⃣ ما أقل كمية بيانات تحقق الهدف؟
مثال:
طلب منك : "أعطني تقرير المبيعات"
هل المطلوب:
- كل المبيعات؟
- مبيعات شهر؟
- أعلى المنتجات؟
- مبيعات فرع معين؟
كل سؤال ينتج استعلاماً مختلفاً.
إجابة السؤال:
لا تبدأ بالكود.
ابدأ بتحديد شكل النتيجة النهائية بدقة.
الدرس القادم:
كيف تحدد الجداول الصحيحة قبل أن تبدأ الربط بينها؟
ماذا تفعل قبل أن تكتب أول SELECT؟
بعد أن فهمنا أن:
- ليس كل استعلام يعمل هو جيد
- وأحياناً المشكلة ليست في SQL
السؤال الآن:
كيف نمنع الخطأ من البداية؟
قبل كتابة أي استعلام اسأل نفسك 4 أسئلة:
1️⃣ ما النتيجة النهائية المطلوبة؟
2️⃣ من سيستخدم هذا التقرير؟
3️⃣ ما القرار الذي سيُبنى عليه؟
4️⃣ ما أقل كمية بيانات تحقق الهدف؟
مثال:
طلب منك : "أعطني تقرير المبيعات"
هل المطلوب:
- كل المبيعات؟
- مبيعات شهر؟
- أعلى المنتجات؟
- مبيعات فرع معين؟
كل سؤال ينتج استعلاماً مختلفاً.
إجابة السؤال:
لا تبدأ بالكود.
ابدأ بتحديد شكل النتيجة النهائية بدقة.
الدرس القادم:
كيف تحدد الجداول الصحيحة قبل أن تبدأ الربط بينها؟
❤1
📘 لماذا SELECT ليس مجرد عرض بيانات؟
SELECT هي أداة استخراج معلومة،
وليست مجرد إظهار جدول.
قبل كتابة SELECT اسأل:
ما المعلومة التي أريدها تحديداً؟
مثال عملي:
نريد معرفة عدد الطلبات في شهر معين.
هل نعرض كل الطلبات؟
أم نحسب العدد فقط؟
الفكرة أهم من الكود.
SELECT هي أداة استخراج معلومة،
وليست مجرد إظهار جدول.
قبل كتابة SELECT اسأل:
ما المعلومة التي أريدها تحديداً؟
مثال عملي:
نريد معرفة عدد الطلبات في شهر معين.
هل نعرض كل الطلبات؟
أم نحسب العدد فقط؟
الفكرة أهم من الكود.
📘 التطبيق العملي
لنفترض لدينا جدول orders:
SELECT order_id, total
FROM orders
WHERE order_date >= '2025-01-01';
لاحظ:
- حددنا الأعمدة
- حددنا شرطاً واضحاً
هذا استعلام بسيط،
لكن مبني على هدف واضح.
لنفترض لدينا جدول orders:
SELECT order_id, total
FROM orders
WHERE order_date >= '2025-01-01';
لاحظ:
- حددنا الأعمدة
- حددنا شرطاً واضحاً
هذا استعلام بسيط،
لكن مبني على هدف واضح.
📝 تمرين اليوم:
لديك جدول customers
يحتوي على:
id, name, city, created_at
المطلوب:
عرض أسماء العملاء من مدينة Riyadh فقط.
اكتب الاستعلام.
لديك جدول customers
يحتوي على:
id, name, city, created_at
المطلوب:
عرض أسماء العملاء من مدينة Riyadh فقط.
اكتب الاستعلام.
❤1
📘 حل التمرين + تحليل
الحل:
SELECT name
FROM customers
WHERE city = 'Riyadh';
لكن السؤال الأهم:
لماذا لم نستخدم SELECT * ؟
لأننا لا نحتاج كل الأعمدة.
المحترف يحدد ما يحتاجه فقط.
الحل:
SELECT name
FROM customers
WHERE city = 'Riyadh';
لكن السؤال الأهم:
لماذا لم نستخدم SELECT * ؟
لأننا لا نحتاج كل الأعمدة.
المحترف يحدد ما يحتاجه فقط.
❤1
📘 ما هو JOIN فعلاً؟
JOIN ليس مجرد ربط جدولين.
JOIN هو:
إعادة بناء صورة كاملة من بيانات موزعة.
عندما تفصل البيانات في جداول،
أنت تحتاج وسيلة لإعادة جمعها.
JOIN هو هذه الوسيلة.
JOIN ليس مجرد ربط جدولين.
JOIN هو:
إعادة بناء صورة كاملة من بيانات موزعة.
عندما تفصل البيانات في جداول،
أنت تحتاج وسيلة لإعادة جمعها.
JOIN هو هذه الوسيلة.
❤1
تطبيق عملي
لدينا جدول orders
وجدول customers
SELECT customers.name, orders.total
FROM orders
JOIN customers
ON orders.customer_id = customers.id;
ما الذي حدث هنا؟
- ربطنا الطلب بالعميل
- جمعنا بيانات من مصدرين
- أعدنا تكوين المعلومة
لدينا جدول orders
وجدول customers
SELECT customers.name, orders.total
FROM orders
JOIN customers
ON orders.customer_id = customers.id;
ما الذي حدث هنا؟
- ربطنا الطلب بالعميل
- جمعنا بيانات من مصدرين
- أعدنا تكوين المعلومة
❤1👍1
خطأ شائع في JOIN
خطأ شائع:
نسيان شرط الربط الصحيح.
إذا كان ON غير صحيح،
ستحصل على نتائج مضاعفة أو خاطئة.
JOIN ليس خطيراً،
لكن استخدامه بدون فهم خطير.
خطأ شائع:
نسيان شرط الربط الصحيح.
إذا كان ON غير صحيح،
ستحصل على نتائج مضاعفة أو خاطئة.
JOIN ليس خطيراً،
لكن استخدامه بدون فهم خطير.
❤1
سلام الله عليكم ان شاء الله نستمر بهذ الطريقه اتمنى من الجميع التطبيق
والذي عنده معلومات يشاركنا لكي يستفيد الجميع❤️
والذي عنده معلومات يشاركنا لكي يستفيد الجميع❤️
❤1
التعليقات Comments
تضاف التعليقات إلى الشيفرة بهدف تسهيل قراءتها أو كتابة ملاحظات جانبية مساعدة.
SELECT count(*); -- This comment continues to the end of line
SELECT count(*); /* This is an inline comment */;
تضاف التعليقات إلى الشيفرة بهدف تسهيل قراءتها أو كتابة ملاحظات جانبية مساعدة.
SELECT count(*); -- This comment continues to the end of line
SELECT count(*); /* This is an inline comment */;
وضع تعليقات لا يؤثر على الأوامر الموضوعة في الإستعلام حيث أن مفسّر الإستعلامات ينفذ الأوامر فقط و يتجاهل التعليقات.
طرق وضع تعليقات في قواعد بيانات MySQL
هناك خيارات لوضع تعليقات في قواعد بيانات MySQL و هي كالتالي:
إستخدام الرمز -- بعده تضع التعليق لوضع تعليق على سطر واحد.
إستخدام الرمز /* بداخله تضع التعليق */ لوضع تعليق يتألف من عدة أسطر.
طرق وضع تعليقات في قواعد بيانات MySQL
هناك خيارات لوضع تعليقات في قواعد بيانات MySQL و هي كالتالي:
إستخدام الرمز -- بعده تضع التعليق لوضع تعليق على سطر واحد.
إستخدام الرمز /* بداخله تضع التعليق */ لوضع تعليق يتألف من عدة أسطر.
طرق وضع تعليقات في قواعد بيانات MySQL
هناك ثلاث خيارات لوضع تعليقات في قواعد بيانات MySQL و هي كالتالي:
إستخدام الرمز -- بعده تضع التعليق لوضع تعليق على سطر واحد.
إستخدام الرمز /* بداخله تضع التعليق */ لوضع تعليق يتألف من عدة أسطر.
هناك ثلاث خيارات لوضع تعليقات في قواعد بيانات MySQL و هي كالتالي:
إستخدام الرمز -- بعده تضع التعليق لوضع تعليق على سطر واحد.
إستخدام الرمز /* بداخله تضع التعليق */ لوضع تعليق يتألف من عدة أسطر.
❤1
في المثال التالي إستخدمنا الرمز /* .. */ لوضع تعليق واحد يتألف من عدة أسطر.
/*
marks و الجدول students هذا الإستعلام يقوم بجلب معلومات طالب موزعة في الأساس بداخل جدولين هما الجدول
و إسم و علامات كل طالب معدله أكثر من 80 id فكرة هذا الإستعلام أنه يجلب رقم
بتفصيل ممل لاحقاً SQL ركز على طريقة وضع التعليق و ليس على طريقة عمل الكود لأننا سنشرح لك أوامر
*/
SELECT s.studentid, s.name, s.total_marks
FROM student s, marks m
WHERE s.studentid = m.studentid
AND m.total_marks > 80;
/*
marks و الجدول students هذا الإستعلام يقوم بجلب معلومات طالب موزعة في الأساس بداخل جدولين هما الجدول
و إسم و علامات كل طالب معدله أكثر من 80 id فكرة هذا الإستعلام أنه يجلب رقم
بتفصيل ممل لاحقاً SQL ركز على طريقة وضع التعليق و ليس على طريقة عمل الكود لأننا سنشرح لك أوامر
*/
SELECT s.studentid, s.name, s.total_marks
FROM student s, marks m
WHERE s.studentid = m.studentid
AND m.total_marks > 80;
التسمية البديلة Alias في SQL وضع أسماء مختصرة للجداول او الاعمدة
الكلمة AS مع الجداول
طريقة وضع أسماء مختصرة للجداول حين تجلب المعلومات من أكثر من جدول في نفس الوقت حتى لا تضطر إلى كتابة إسم الجدول كما هو كلما أردت الإشارة إلى عمود موجود فيه.
لوضع إسم مختصر للجدول نضع AS بعد إسم الجدول و من ثم ندخل الإسم المختصر له
بعد وضع إسم مختصر للجدول، تصبح قادر على استخدام الإسم المختصر للوصول لأعمدته.
SELECT StudentID, FirstName, Course, Lecturer
FROM students st
LEFT JOIN courses co
ON st.CourseID = co.CourseID;
سُمي الجدول students باسم st والجدول courses باسم co وذلك تسهيلًا لعملية الربط بين الجدولين.
الكلمة AS مع الجداول
طريقة وضع أسماء مختصرة للجداول حين تجلب المعلومات من أكثر من جدول في نفس الوقت حتى لا تضطر إلى كتابة إسم الجدول كما هو كلما أردت الإشارة إلى عمود موجود فيه.
لوضع إسم مختصر للجدول نضع AS بعد إسم الجدول و من ثم ندخل الإسم المختصر له
بعد وضع إسم مختصر للجدول، تصبح قادر على استخدام الإسم المختصر للوصول لأعمدته.
SELECT StudentID, FirstName, Course, Lecturer
FROM students st
LEFT JOIN courses co
ON st.CourseID = co.CourseID;
سُمي الجدول students باسم st والجدول courses باسم co وذلك تسهيلًا لعملية الربط بين الجدولين.