قواعد البيانات و SQL: أسئلة تدريبية مع الشرح

أسئلة تدريبية مجانية متعددة الخيارات في قواعد البيانات و SQL مع تلميحات وشروح، بثلاثة مستويات: المصطلحات والحقائق الأساسية, تطبيق المفاهيم, الحالات والتحليل.

مسألة تدريبية مجانيةسهلة

أي قيد يضمن ألا يُترك عمود فارغًا (NULL) أبدًا؟

ما الذي تتدرّب عليه

  1. سهلةالمصطلحات والحقائق الأساسية
  2. متوسطةتطبيق المفاهيم
  3. صعبةالحالات والتحليل

تعلّم قواعد البيانات و SQL من البداية

1ما هي قاعدة البيانات العلائقية

تخزّن قاعدة البيانات العلائقية البيانات في جداول. يبدو الجدول كجدول بيانات: كل صف سجل واحد، وكل عمود خاصية واحدة.

قد يكون لمتجر جدول customers بالأعمدة id وname وcity، وجدول orders بالأعمدة id وcustomer_id وtotal.

المفتاح الأساسي عمود، أو مجموعة أعمدة، يحدد كل صف تحديدًا فريدًا. ولا يمكن أن يتكرر ولا أن يكون فارغًا أبدًا. وهنا هو id في كل جدول.

المفتاح الأجنبي عمود يشير إلى المفتاح الأساسي لجدول آخر. في orders، يبيّن customer_id أي عميل قدّم الطلب.

هكذا ترتبط الجداول: يمكن للعميل الواحد أن يكون له طلبات كثيرة، لكن كل طلب يعود إلى عميل واحد. وهذه علاقة واحد إلى متعدد.

SQL (لغة الاستعلام البنيوية) هي اللغة التي تستخدمها لإنشاء الجداول وتغيير البيانات وطرح الأسئلة عنها.

تحقّق ذاتي ما هو المفتاح الأساسي؟
  1. العمود الأول من كل جدول
  2. عمود أو مجموعة أعمدة تحدد كل صف تحديدًا فريدًا
  3. عمود يشير إلى صف في جدول آخر
  4. فهرس يجعل البحث أسرع

الإجابة: عمود أو مجموعة أعمدة تحدد كل صف تحديدًا فريدًا. المفتاح الأساسي فريد ولا يكون NULL أبدًا، فيحدد صفًا واحدًا بالضبط. أما العمود الذي يشير إلى جدول آخر فهو مفتاح أجنبي.

2قراءة البيانات بـ SELECT

معظم الأسئلة عن العبارة SELECT. وتُبنى من جمل (clauses)، تُكتب دائمًا بهذا الترتيب:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT يسرد الأعمدة التي تريدها. وDISTINCT يزيل الصفوف المكررة.
  • FROM يسمّي الجدول، أو الجداول المضمومة معًا.
  • WHERE يُبقي فقط الصفوف التي تحقق شرطًا، مثل WHERE total > 20.
  • GROUP BY يضع الصفوف ذات القيمة نفسها في مجموعة واحدة، فتستطيع العدّ أو الجمع لكل مجموعة.
  • HAVING يُبقي فقط المجموعات التي تحقق شرطًا. ويجوز أن يستخدم الدوال التجميعية، وهو ما لا يجوز في WHERE.
  • ORDER BY يرتّب النتيجة، تصاعديًا افتراضيًا؛ وأضف DESC للأعلى أولًا.

الدوال التجميعية تلخّص صفوفًا كثيرة في قيمة واحدة: COUNT وSUM وAVG وMIN وMAX.

لا تنفّذ قاعدة البيانات الجمل بالترتيب الذي تكتبه. بل تنفّذ FROM أولًا، ثم WHERE ثم GROUP BY ثم HAVING ثم SELECT وأخيرًا ORDER BY.

عبارات أخرى تغيّر البيانات: INSERT يضيف صفوفًا، وUPDATE يغيّر صفوفًا، وDELETE يزيل صفوفًا. وCREATE وALTER وDROP تغيّر الجداول نفسها.

تحقّق ذاتي تريد العملاء الذين لديهم أكثر من 5 طلبات فقط. أي جملة ترشّح على COUNT(*) > 5؟
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

الإجابة: HAVING. العدّ لا يوجد إلا بعد تجميع الصفوف، وHAVING يرشّح المجموعات. أما WHERE فتعمل قبل التجميع، فلا تستطيع استخدام دالة تجميعية مثل COUNT.

3الضمّ (Joins) والتطبيع والمعاملات

يجمع الضمّ (join) صفوف جدولين بشرط، عادةً المفتاح الأجنبي = المفتاح الأساسي:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN (أو JOIN) يُبقي فقط الصفوف التي لها مقابل في الجدولين.
  • LEFT JOIN يُبقي كل صف من الجدول الأيسر. وحيث لا يوجد مقابل تكون أعمدة الجدول الأيمن NULL.
  • NULL تعني أن قيمة مفقودة أو مجهولة. اختبرها بـ IS NULL، لا بـ = NULL أبدًا.

التطبيع (normalisation) يقسم الجداول بحيث تُخزَّن كل حقيقة مرة واحدة. وهذا يتجنب تحديث الحقيقة نفسها في عدة أماكن.

  • 1NF: كل خلية تحمل قيمة ذرّية واحدة، دون مجموعات متكررة.
  • 2NF: 1NF، ويعتمد كل عمود غير مفتاحي على المفتاح كله، لا على جزء من مفتاح مركّب.
  • 3NF: 2NF، ولا يعتمد أي عمود غير مفتاحي على عمود غير مفتاحي آخر.

تجمع المعاملة (transaction) عدة عبارات في وحدة واحدة. يجعلها COMMIT دائمة ويتراجع عنها ROLLBACK. وتتبع المعاملات ACID: الذرّية (الكل أو لا شيء) والاتساق والعزل والديمومة.

تحقّق ذاتي عميل لم يقدّم أي طلب. ماذا يحدث لذلك العميل في customers LEFT JOIN orders؟
  1. يظهر العميل مرة لكل طلب في الجدول
  2. يظهر العميل مرة واحدة، مع NULL في أعمدة الطلب
  3. يفشل الاستعلام بخطأ
  4. يُستبعد العميل من النتيجة

الإجابة: يظهر العميل مرة واحدة، مع NULL في أعمدة الطلب. يُبقي LEFT JOIN كل صف من الجدول الأيسر ويملأ الجانب الأيمن الناقص بـ NULL. أما استبعاد العميل فهو ما يفعله INNER JOIN.

4الطريقة خطوة بخطوة

لكتابة استعلام، أو معرفة ما يُرجعه استعلام معطى:

  1. أوجد الجداول التي تحمل البيانات، وكيف ترتبط بالمفاتيح.
  2. اكتب FROM مع عمليات الضم. اختر LEFT JOIN حين يجب أن تبقى الصفوف التي لا مقابل لها.
  3. أضف WHERE للشروط على الصفوف المفردة.
  4. إذا قال السؤال «لكل» أو «في كل»، فأضف GROUP BY والدالة التجميعية.
  5. أضف HAVING لشروط الدالة التجميعية، ثم ORDER BY إذا كان الترتيب مهمًا.
  6. تحقّق من النتيجة على مثال صغير: اسرد الصفوف بعد كل جملة، بالترتيب الذي تنفّذه قاعدة البيانات.

في سؤال نظري، سمِّ المفهوم أولًا (مفتاح أو نوع ضم أو صيغة معيارية أو خاصية من ACID)، ثم اختر الخيار الذي يطابق تعريفه.

5مثال محلول

تابع كل خطوة. حاول أن تتوقّع الخطوة التالية قبل أن تفتحها.

مثال محلول

في الجدول customers الصفوف (1, Ana) و(2, Ben) و(3, Cas). وفي الجدول orders الصفوف (id, customer_id) = (10, 1) و(11, 1) و(12, 2) و(13, 1). ماذا يُرجع هذا الاستعلام؟ SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

نفّذ FROM والضم

يُقرن كل عميل بالطلبات التي تحمل رقمه. تطابق Ana الطلبات 10 و11 و13. ويطابق Ben الطلب 12.

ليس لدى Cas طلبات. ولأنه LEFT JOIN يبقى Cas في النتيجة، مع NULL في o.id.

2

اسرد الصفوف المضمومة

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

هذه 5 صفوف.

3

جمّع حسب الاسم

GROUP BY c.name يصنع ثلاث مجموعات: Ana بـ 3 صفوف وBen بصف واحد وCas بصف واحد.

4

عُدّ لكل مجموعة

يعدّ COUNT(o.id) القيم غير NULL فقط. فتحصل Ana على 3 ويحصل Ben على 1.

لدى Cas صف واحد، لكن o.id فيه NULL، فيحصل Cas على 0.

5

تحقّق من الإجابة

مجموع طلبات Ana وBen وCas هو 3 + 1 + 0 = 4 طلبات، وهو عدد الصفوف في orders نفسه. ولو استُخدمت COUNT(*) لحصل Cas خطأً على 1، لأن COUNT(*) يعدّ الصف نفسه.

الإجابة

Ana 3، Ben 1، Cas 0.

6أخطاء شائعة

  • استخدام دالة تجميعية في WHERE. الشروط على COUNT أو SUM أو AVG مكانها HAVING.
  • كتابة = NULL. أي مقارنة مع NULL مجهولة؛ استخدم IS NULL أو IS NOT NULL.
  • استخدام INNER JOIN حين يجب أن تبقى الصفوف بلا مقابل. استخدم LEFT JOIN.
  • نسيان شرط الضم. بدون ON يُقرن كل صف بكل صف (ضم متقاطع).
  • اختيار عمود ليس في GROUP BY وليس داخل دالة تجميعية.
  • الخلط بين DELETE (يزيل صفوفًا) وDROP TABLE (يزيل الجدول كله).
  • تنفيذ UPDATE أو DELETE بدون WHERE. فهو يغيّر كل صف في الجدول.
تحقّق ذاتي في جدول 10 صفوف، والعمود col يساوي NULL في كل صف. ماذا يُرجع SELECT COUNT(col)؟
  1. 0
  2. 10
  3. 1
  4. NULL

الإجابة: 0. يعدّ COUNT(col) القيم غير NULL فقط، فيُرجع 0. أما COUNT(*) فيعدّ الصفوف ويُرجع 10.

7كيف تبدو أسئلة الامتحان

  • سهل: المصطلحات والحقائق. ما تفعله SELECT وWHERE وORDER BY وDELETE، والمفتاحان الأساسي والأجنبي، وما تعنيه NULL.
  • متوسط: تطبيق المفاهيم. الاستعلام الصحيح لمهمة، وWHERE مقابل HAVING، والضم الداخلي مقابل الخارجي، والصيغ المعيارية، وACID.
  • صعب: الحالات والتحليل. الاستعلامات الفرعية، ومستويات العزل وشذوذاتها، وBCNF، والدوال النافذة، والفهارس وأداء الاستعلام، وحقن SQL.

عند إعطاء استعلام، تتبّعه على بضعة صفوف بالترتيب FROM وWHERE وGROUP BY وHAVING وSELECT وORDER BY. معظم الفخاخ تظهر خلال ثلاثة صفوف.

تعلّمه خطوة بخطوة في التطبيقتعلّمه خطوة بخطوة في التطبيق

أمثلة على الأسئلة

مثال 1سهلة

ماذا تفعل UNION بنتائج استعلامين SELECT؟

  1. Aتضعهما جنبًا إلى جنب عبر مفتاح
  2. Bتُبقي فقط الصفوف الموجودة في كليهما
  3. Cتجمعهما في نتيجة واحدة وتزيل الصفوف المكررة
  4. Dتُبقي الصفوف الموجودة في الاستعلام الأول دون الثاني فقط
أظهر التلميحات
  1. يجب أن يكون للاستعلامين العدد نفسه من الأعمدة المتوافقة.
  2. شُطبت الآن إجابتان خاطئتان. إحدى الإجابتين المتبقيتين صحيحة.
أظهر الإجابة والشرح

لماذا هذه هي الإجابة

تكدّس UNION صفوف الاستعلامين وتزيل المكررات؛ أما UNION ALL فتُبقي المكررات.

الإجابة

C · تجمعهما في نتيجة واحدة وتزيل الصفوف المكررة
مثال 2متوسطة

ماذا يُرجع SELECT SUM(amount) FROM orders عندما لا تطابق جملة WHERE أي صفوف؟

  1. Aخطأ
  2. B0
  3. CNULL
  4. Dسلسلة نصية فارغة
أظهر التلميحات
  1. تختلف SUM عن COUNT هنا.
  2. شُطبت الآن إجابتان خاطئتان. إحدى الإجابتين المتبقيتين صحيحة.
أظهر الإجابة والشرح

لماذا هذه هي الإجابة

تُرجع SUM وAVG وMIN وMAX القيمة NULL على مجموعة فارغة، بينما تُرجع COUNT القيمة 0؛ وتعطي COALESCE(SUM(amount), 0) القيمة 0 بدلًا من ذلك.

الإجابة

C · NULL
مثال 3صعبة

ماذا يُرجع SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp؟

  1. Aالموظفين الذين يكسبون أكثر من متوسط قسمهم فقط
  2. Bكل صف موظف مع متوسط راتب قسمه
  3. Cخطأ لأن name ليس في GROUP BY
  4. Dصفًا واحدًا لكل قسم مع متوسط راتبه
أظهر التلميحات
  1. لا تدمج دوال النوافذ الصفوف.
  2. شُطبت الآن إجابتان خاطئتان. إحدى الإجابتين المتبقيتين صحيحة.
أظهر الإجابة والشرح

لماذا هذه هي الإجابة

بخلاف GROUP BY تُبقي دالة النافذة كل صف مُدخل وتضيف قيمة محسوبة على قسمها (partition)، وهو هنا القسم الوظيفي.

الإجابة

B · كل صف موظف مع متوسط راتب قسمه

أسئلة وأجوبة

ما هو قواعد البيانات و SQL؟

تخزّن قاعدة البيانات العلائقية البيانات في جداول. يبدو الجدول كجدول بيانات: كل صف سجل واحد، وكل عمود خاصية واحدة.

قد يكون لمتجر جدول customers بالأعمدة id وname وcity، وجدول orders بالأعمدة id وcustomer_id وtotal.

كيف أتعلم قواعد البيانات و SQL خطوة بخطوة؟
  1. ما هي قاعدة البيانات العلائقية
  2. قراءة البيانات بـ SELECT
  3. الضمّ (Joins) والتطبيع والمعاملات
  4. الطريقة خطوة بخطوة
  5. مثال محلول
  6. أخطاء شائعة
  7. كيف تبدو أسئلة الامتحان
ماذا تغطي تمارين قواعد البيانات و SQL؟
  • سهلة: المصطلحات والحقائق الأساسية
  • متوسطة: تطبيق المفاهيم
  • صعبة: الحالات والتحليل

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

كيف يعمل التدريب

  • لكل سؤال أربعة خيارات، واحد منها فقط صحيح.
  • هل علِقت؟ افتح تلميحًا صغيرًا أولًا، والشرح الكامل فقط عندما تحتاج إليه.
  • يُحفظ تقدّمك وأخطاؤك ومسائلك المحفوظة، لتتمكّن من مراجعتها قبل الامتحان.

مقرّرات تتضمّن هذا الموضوع

مواضيع أخرى في علوم الحاسوب

ورقة عمل قابلة للطباعة