{
  "assessmentTests": {
    "sql_test": {
      "name": "اختبار SQL",
      "desc": "30 سؤال سيناريو حول الفلترة والربط والتجميع الفرعي ودوال النافذة — اكتشف ما إذا كان فهمك لـ SQL يطابق ما تعنيه إعلانات الوظائف بمصطلح الكفاءة في SQL.",
      "recommendation": "ملف ملخص مهاراتك في SQL",
      "results": {
        "beginner": {
          "name": "مبتدئ",
          "desc": "يمكنك كتابة عبارة SELECT صحيحة والتصفية حسب بعض الشروط، لكن الأسئلة التي أخطأت فيها تتجمع حول معالجة NULL وميكانيكا الربط بدلاً من الصيغة — مقارنة عمود بـ NULL باستخدام =، ما الذي يحافظ عليه LEFT JOIN في الواقع، كيف تعمل حدود BETWEEN. لا يتعلق هذا بعدم كفاءة قواعد البيانات؛ هذه قواعد محددة تربك الأشخاص الذين تعلموا SQL بالتجربة والخطأ بدلاً من المعيار. تكمن أهميتها في العمل لأن كل واحدة منها هي المكان الذي يعود فيه الاستعلام إلى عدد صفوف معقول لكنه خاطئ.",
          "recommendation": "ابدأ بثلاثة أشياء، بهذا الترتيب: لماذا WHERE col = NULL لا يطابق أبداً أي شيء (و IS NULL مطلوبة بدلاً من ذلك)، كيفية حذف INNER JOIN الصفوف غير المتطابقة بينما يحتفظ بها LEFT JOIN، والحدود الدقيقة التي يشملها BETWEEN. توثيق Mode Analytics SQL والتوثيق PostgreSQL يغطيان كلاهما مع أمثلة قابلة للتشغيل."
        },
        "intermediate": {
          "name": "متوسط",
          "desc": "تتعامل مع استعلامات التقارير اليومية بارتياح — الربط و GROUP BY والتصفية المباشرة — ولن تبطأ من قبل عمل لوحة التحكم الروتيني أو تحليل مخصص. الفجوة بين هنا والمتقدم تتعلق في الغالب بما يحدث عندما تتفاعل الشروط: شرط WHERE في جدول مربوط يحول LEFT JOIN بصمت إلى INNER JOIN، ربط يوسع عدد الصفوف قبل تطبيق aggregate عليها، NOT IN الذي يعود بصمت لا شيء لأن NULL واحد انزلق إلى الاستعلام الفرعي. هذه هي أنواع الأخطاء التي تمر باختبار سريع وتظهر فقط عندما يقارن شخص ما الإجمالي بتقرير مختلف.",
          "recommendation": "ركز على كيفية تفاعل الشروط بدلاً من كل واحدة تفعل وحدها: فلترة WHERE على أعمدة الجانب الأيمن من LEFT JOIN، مضاعفة الصفوف من ربط واحد إلى كثير قبل تجميعها، ولماذا NOT IN ينقطع في حضور NULLs (EXISTS عادة لا ينقطع). ثم HAVING مقابل WHERE، حيث ينقسم هذا الأشخاص الذين يعرفون كلا الشرطين بالفعل."
        },
        "advanced": {
          "name": "متقدم",
          "desc": "هذا هو المستوى الذي تعنيه معظم إعلانات الوظائف بـ \"SQL قوي\". تقرأ استعلام ربط متعدد ويمكنك التنبؤ به بعدد الصفوف قبل تشغيله، وتعرف لماذا تغيرت مجموعة النتائج بدلاً من فقط أنها تغيرت، وتصل إلى CTE أو دالة نافذة بدلاً من استعلام فرعي متداخل عندما يكون هذا أداة أوضح. ما يفصل هذه الفئة عن الأعلى هو الجانب الدفاعي من العمل: معرفة أي دالة ترتيب تستخدم عندما تهم الروابط، ما يعزله COMMIT فعلياً من جلسة متزامنة، وما تفعله قاعدة ON DELETE المفقودة فعلياً على مستوى قاعدة البيانات.",
          "recommendation": "ادفع بنفسك إلى الأجزاء التي تحمي البيانات التي يلمسها أشخاص آخرون أيضاً: الفرق بين RANK و DENSE_RANK و ROW_NUMBER تحت الروابط، ما يعزله COMMIT فعلياً ولمن، وسلوك المفتاح الأجنبي على DELETE. استخدم The Index newsletter أو SQL for Devs للغوص العميق على دوال النافذة وعزل المعاملات كخطوة تالية لكليهما."
        },
        "expert": {
          "name": "خبير",
          "desc": "حققت نتيجة في الأعلى من كل قسم — معالجة NULL والدلالات والربط والعمليات المحددة والتجميع والاستعلامات الفرعية ودوال النافذة والـ CTEs والقيود. عملياً، هذا يعني أنه يمكنك الحصول على استعلام تقرير ربط متعدد من شخص غريب وشرح سبب عودته لعدد الصفوف الذي يعيده، وليس فقط ما يجب أن تفعله الصيغة، وهي المهارة الأصعب والأكثر قيمة. في هذا المستوى، لغة الاستعلام النقية نادراً ما تكون العامل المحدد؛ الحد الأقصى هو عادة تصميم المخطط أو حجم البيانات الأساسية.",
          "recommendation": "العائدات موجودة الآن في خطط التنفيذ والتصميم: قراءة مخرجات EXPLAIN قبل افتراض أن الاستعلام بطيء، استراتيجية الفهرسة كمقابل ضد تكلفة الكتابة بدلاً من فوز مجاني، وقرارات التطبيع التي تصمد مع نمو المخطط. إذا كنت يتم فحصك لدور، اوصف خطأ استعلام مثل ربط fan-out أو NOT IN/NULL الفخ الذي وجدته في الإنتاج بدلاً من تسمية ميزات SQL — فهذا يوضح التفكير وليس فقط المفردات."
        }
      },
      "questions": [
        {
          "question": "جدول به عمود age قابل للقيمة NULL. تكتب SELECT * FROM users WHERE age = NULL. كم صف يعود هذا الاستعلام، حتى لو كانت هناك عدة صفوف مع age مضبوطة على NULL؟",
          "options": [
            {
              "icon": "",
              "label": "جميع الصفوف حيث age هو NULL، لأن = يطابق NULL مثل أي قيمة أخرى"
            },
            {
              "icon": "",
              "label": "صفر — مقارنة أي شيء بـ NULL باستخدام = ينتج UNKNOWN، وليس TRUE أبداً، لذا لا صفوف تطابق؛ IS NULL مطلوبة بدلاً من ذلك"
            },
            {
              "icon": "",
              "label": "خطأ صيغة — NULL لا يمكن أن يظهر على الجانب الأيمن من ="
            },
            {
              "icon": "",
              "label": "جميع الصفوف في الجدول، لأن مقارنات NULL الافتراضية إلى TRUE"
            }
          ]
        },
        {
          "question": "تكتب SELECT DISTINCT department, role FROM employees. ماذا يزيل DISTINCT الصفوف المكررة من؟",
          "options": [
            {
              "icon": "",
              "label": "مجموعة department و role معاً — الصف يزال فقط إذا طابقت كلا العمودين صفاً آخر تماماً"
            },
            {
              "icon": "",
              "label": "قيم department المكررة فقط، مع الحفاظ على كل role"
            },
            {
              "icon": "",
              "label": "قيم role المكررة فقط، مع الحفاظ على كل department"
            },
            {
              "icon": "",
              "label": "لا شيء — DISTINCT يعمل فقط مع عمود واحد"
            }
          ]
        },
        {
          "question": "يتم تصفية عمود name بـ WHERE name LIKE 'A_'. أي من هذه القيم يطابق: 'A'، 'Al'، 'Ana'، 'Ally'؟",
          "options": [
            {
              "icon": "",
              "label": "'A' — الشرطة السفلية اختيارية وتطابق صفر أو أكثر من الأحرف"
            },
            {
              "icon": "",
              "label": "'Al' — الشرطة السفلية تطابق بالضبط حرف واحد، لذا LIKE 'A_' يطابق أي سلسلة من حرفين تبدأ بـ A"
            },
            {
              "icon": "",
              "label": "'Ana' و 'Ally' — الشرطة السفلية تطابق أي عدد من الأحرف اللاحقة"
            },
            {
              "icon": "",
              "label": "جميع القيم الأربع تطابق، لأن LIKE يتجاهل الطول"
            }
          ]
        },
        {
          "question": "يتم تصفية عمود price بـ WHERE price BETWEEN 10 AND 20. هل يتم تضمين الصفوف بـ price بالضبط 10 أو بالضبط 20؟",
          "options": [
            {
              "icon": "",
              "label": "لا — BETWEEN يستبعد كلا النقطة النهائية"
            },
            {
              "icon": "",
              "label": "نعم — BETWEEN شامل على كلا الطرفين، مكافئ لـ price >= 10 AND price <= 20"
            },
            {
              "icon": "",
              "label": "فقط price = 10 مشمول؛ الحد الأعلى حصري"
            },
            {
              "icon": "",
              "label": "فقط price = 20 مشمول؛ الحد الأدنى حصري"
            }
          ]
        },
        {
          "question": "جدول orders به 10 صفوف، و 3 منها لديها NULL shipped_date. ماذا يعود SELECT COUNT(*) FROM orders، وماذا يعود SELECT COUNT(shipped_date) FROM orders؟",
          "options": [
            {
              "icon": "",
              "label": "10، ثم 10 — COUNT يحسب الصفوف دائماً بغض النظر عن NULLs"
            },
            {
              "icon": "",
              "label": "7، ثم 7 — كلا الشكلين يتجاهلان الصفوف الفارغة"
            },
            {
              "icon": "",
              "label": "10، ثم 7 — COUNT(*) يحسب كل صف، COUNT(column) يحسب فقط الصفوف حيث هذا العمود ليس NULL"
            },
            {
              "icon": "",
              "label": "10، ثم 3 — COUNT(column) يحسب فقط قيم NULL"
            }
          ]
        },
        {
          "question": "تكتب SELECT name, salary FROM employees ORDER BY 2 DESC. ماذا يشير الرقم 2 إليه؟",
          "options": [
            {
              "icon": "",
              "label": "خطأ صيغة — ORDER BY يقبل فقط أسماء الأعمدة، وليس الأرقام"
            },
            {
              "icon": "",
              "label": "الصف الثاني من النتيجة"
            },
            {
              "icon": "",
              "label": "قيمة حرفية من 2، تستخدم كـ tiebreaker"
            },
            {
              "icon": "",
              "label": "العمود الثاني في قائمة SELECT، salary — ORDER BY يقبل رقم موضع العمود كاختصار"
            }
          ]
        },
        {
          "question": "في SQL القياسي، ماذا يعود 'Ana' || ' ' || 'Lee'؟",
          "options": [
            {
              "icon": "",
              "label": "خطأ صيغة — SQL لا توجد لديها عامل تسلسل"
            },
            {
              "icon": "",
              "label": "3 — || يُعامل كـ boolean OR ويعود عداد"
            },
            {
              "icon": "",
              "label": "'AnaLee' — || يسلسل دون الحفاظ على المسافات"
            },
            {
              "icon": "",
              "label": "'Ana Lee' — || هو عامل تسلسل السلسلة النقي في SQL"
            }
          ]
        },
        {
          "question": "أي من هذه مكافئ تماماً لـ WHERE status IN ('open', 'pending', 'review')؟",
          "options": [
            {
              "icon": "",
              "label": "WHERE status = 'open' AND status = 'pending' AND status = 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status != 'open' OR status != 'pending' OR status != 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status = 'open' OR status = 'pending' OR status = 'review'"
            },
            {
              "icon": "",
              "label": "WHERE status LIKE 'open,pending,review'"
            }
          ]
        },
        {
          "question": "customers به 100 صف؛ 20 منها لم تضع أبداً طلب. تكتب SELECT c.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id. هل يظهر العملاء الـ 20 بدون طلبات في النتيجة؟",
          "options": [
            {
              "icon": "",
              "label": "نعم، واحدة مرة، مع o.id يُظهر كـ NULL"
            },
            {
              "icon": "",
              "label": "نعم، لكن فقط إذا ظهروا أيضاً في WHERE clause"
            },
            {
              "icon": "",
              "label": "لا — INNER JOIN يعود فقط الصفوف التي لديها مطابقة في الجداول معاً، لذا يتم حذف العملاء بدون طلبات بالكامل"
            },
            {
              "icon": "",
              "label": "نعم، مكررة مرة واحدة لكل عمود في orders"
            }
          ]
        },
        {
          "question": "تريد كل عميل سواء كانوا يمتلكون طلبات أم لا، لذا تكتب SELECT c.id, o.total FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.total > 100. هل يعود هذا العملاء الذين ليس لديهم طلبات؟",
          "options": [
            {
              "icon": "",
              "label": "لا — التصفية على o.total في WHERE clause تلغي الصفوف الفارغة التي أنتجها LEFT JOIN للعملاء غير المتطابقين، لذا يتصرف مثل INNER JOIN"
            },
            {
              "icon": "",
              "label": "نعم — LEFT JOIN يحافظ دائماً على كل صف من customers بغض النظر عن ما يتبعه"
            },
            {
              "icon": "",
              "label": "نعم، مع o.total يُظهر كـ 0 للعملاء بدون طلبات"
            },
            {
              "icon": "",
              "label": "لا — LEFT JOIN تحول بصمت نفسها إلى RIGHT JOIN عندما يتم إضافة WHERE clause"
            }
          ]
        },
        {
          "question": "جدول employees لديه عمود id وعمود manager_id يشير إلى صف id آخر. لسرد كل موظف بجانب اسم مديره، تربط الجدول بنفسه: SELECT e.name, m.name FROM employees e JOIN employees m ON e.manager_id = m.id. ماذا يُسمى هذا النمط؟",
          "options": [
            {
              "icon": "",
              "label": "cross join — كل موظف يطابق كل مدير"
            },
            {
              "icon": "",
              "label": "ربط تكراري (recursive) — يجلب سلسلة الإدارة الكاملة"
            },
            {
              "icon": "",
              "label": "self-join — نفس الجدول يُربط بنفسه باستخدام اسمين مستعاريين مختلفين"
            },
            {
              "icon": "",
              "label": "هذا SQL غير صحيح — الجدول لا يمكن أن يُربط بنفسه"
            }
          ]
        },
        {
          "question": "يتم دمج اثنين من استعلامات SELECT بنفس الأعمدة باستخدام UNION. إذا أعادت كلا الاستعلامات صفاً متطابقاً، كم نسخة من هذا الصف تظهر في النتيجة النهائية؟",
          "options": [
            {
              "icon": "",
              "label": "واحد — UNION يزيل صفوف مكررة عبر النتيجة المدمجة؛ UNION ALL سيحتفظ بكلا النسختين"
            },
            {
              "icon": "",
              "label": "اثنان — UNION يحتفظ بكل صف من كلا الاستعلامات"
            },
            {
              "icon": "",
              "label": "صفر — UNION يزيل أي صف يظهر في كلا الاستعلامات"
            },
            {
              "icon": "",
              "label": "يعتمد على أي استعلام سرد الصف أولاً"
            }
          ]
        },
        {
          "question": "جدول sizes به 3 صفوف و colors به 4 صفوف. كم صف يعود SELECT * FROM sizes CROSS JOIN colors؟",
          "options": [
            {
              "icon": "",
              "label": "7 — CROSS JOIN يضيف عدد الصفوف معاً"
            },
            {
              "icon": "",
              "label": "12 — CROSS JOIN يعود كل مجموعة ممكنة من الصفوف من كلا الجداول (3 x 4)"
            },
            {
              "icon": "",
              "label": "3 — CROSS JOIN يعود صف واحد لكل صف في الجدول الأول"
            },
            {
              "icon": "",
              "label": "0 — CROSS JOIN يتطلب شرط ON أو يعود لا شيء"
            }
          ]
        },
        {
          "question": "orders به 1 صف لأمر #100، و order_items بها 3 صفوف للأمر #100 (واحد لكل عنصر سطر). تكتب SELECT o.id, o.total FROM orders o JOIN order_items i ON o.id = i.order_id WHERE o.id = 100. كم صف يعود للأمر #100؟",
          "options": [
            {
              "icon": "",
              "label": "3 — الربط ينتج صف مخرجات واحد لكل صف order_items متطابق، لذا الصف الواحد للأمر #100 يُكرر مرة واحدة لكل عنصر سطر"
            },
            {
              "icon": "",
              "label": "1 — orders بها صف واحد فقط للأمر #100، لذا الربط لا ينتج أكثر"
            },
            {
              "icon": "",
              "label": "4 — صف واحد للأمر زائد واحد لكل عنصر سطر"
            },
            {
              "icon": "",
              "label": "0 — ربط جدول صف واحد بجدول ثلاثة صفوف على مفتاح غير فريد يفشل"
            }
          ]
        },
        {
          "question": "SELECT c.name, o.id FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id يعود نفس الصفوف مثل أي من هذه؟",
          "options": [
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM orders o LEFT JOIN customers c ON c.id = o.customer_id — تبديل ترتيب الجدول واستخدام LEFT JOIN بدلاً من RIGHT JOIN مكافئ"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id"
            },
            {
              "icon": "",
              "label": "SELECT c.name, o.id FROM orders o CROSS JOIN customers c"
            }
          ]
        },
        {
          "question": "في SQL القياسي، تكتب SELECT department, name, AVG(salary) FROM employees GROUP BY department. هل هذا استعلام صحيح؟",
          "options": [
            {
              "icon": "",
              "label": "نعم — GROUP BY يحتاج فقط أن يشمل department لأنه مدرج أولاً"
            },
            {
              "icon": "",
              "label": "لا — name يُختار لكنه لم يُجمع أو مُدرج في GROUP BY، والمعيار SQL يتطلب أن كل عمود غير مجمع يُختار ليظهر في GROUP BY clause"
            },
            {
              "icon": "",
              "label": "نعم — SQL يختار تلقائياً اسم واحد تعسفي لكل department"
            },
            {
              "icon": "",
              "label": "لا — AVG() لا يمكن أن يُدمج مع GROUP BY في نفس الاستعلام"
            }
          ]
        },
        {
          "question": "تريد الأقسام التي يتجاوز متوسط راتبهم 80000. أي clause تصفي على قيمة مجمعة مثل AVG(salary) بعد التجميع — WHERE أم HAVING؟",
          "options": [
            {
              "icon": "",
              "label": "WHERE — HAVING تُستخدم فقط مع استعلامات UNION"
            },
            {
              "icon": "",
              "label": "أي واحد يعمل بشكل متطابق مع الدوال المجمعة"
            },
            {
              "icon": "",
              "label": "لا أي واحد — تصفية مجمعة تتطلب استعلام فرعي"
            },
            {
              "icon": "",
              "label": "HAVING — WHERE تصفي الصفوف الفردية قبل حدوث التجميع، HAVING تصفي المجموعات بعد التجميع"
            }
          ]
        },
        {
          "question": "تكتب SELECT salary * 1.1 AS new_salary FROM employees WHERE new_salary > 50000. هل هذا ينقذ؟",
          "options": [
            {
              "icon": "",
              "label": "نعم — الأسماء المستعارة المُعرفة في SELECT متاحة دائماً لـ WHERE في نفس الاستعلام"
            },
            {
              "icon": "",
              "label": "نعم، لكن فقط للأسماء المستعارة الرقمية"
            },
            {
              "icon": "",
              "label": "لا — AS غير مسموح داخل استعلام مُصفى بـ WHERE"
            },
            {
              "icon": "",
              "label": "لا — WHERE يُقيَّم قبل SELECT يعين الاسم المستعار new_salary، لذا الاسم المستعار لا يوجد بعد عند تلك النقطة في التنفيذ"
            }
          ]
        },
        {
          "question": "SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department = e.department). لماذا يُسمى هذا استعلام فرعي مترابط؟",
          "options": [
            {
              "icon": "",
              "label": "لأنه يستخدم JOIN بدلاً من WHERE clause"
            },
            {
              "icon": "",
              "label": "الاستعلام الفرعي الداخلي يشير إلى e.department من الاستعلام الخارجي، لذا يجب إعادة تقييمه لكل صف يعتبره الاستعلام الخارجي"
            },
            {
              "icon": "",
              "label": "لأنه يعود أكثر من عمود واحد"
            },
            {
              "icon": "",
              "label": "لأنه يعمل مرة واحدة بالضبط قبل بدء الاستعلام الخارجي"
            }
          ]
        },
        {
          "question": "استعلام فرعي SELECT manager_id FROM employees يعود بعض قيم NULL جنباً إلى جنب مع معرّفات حقيقية. تكتب SELECT name FROM employees WHERE id NOT IN (SELECT manager_id FROM employees). ماذا يحدث؟",
          "options": [
            {
              "icon": "",
              "label": "يعود كل موظف ليس مديراً، متجاهلاً NULLs"
            },
            {
              "icon": "",
              "label": "يعود صفر صفوف — NULL واحد في قائمة NOT IN يجعل كل مقارنة UNKNOWN، لذا لا يمكن لأي صف أن يرضي الشرط"
            },
            {
              "icon": "",
              "label": "يرفع خطأ لأن NOT IN لا يمكن أن يُستخدم مع استعلامات فرعية"
            },
            {
              "icon": "",
              "label": "يعود كل موظف، لأن NULL يُعامل كـ wildcard"
            }
          ]
        },
        {
          "question": "SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id). ماذا يعود هذا؟",
          "options": [
            {
              "icon": "",
              "label": "كل عميل لديه صف واحد على الأقل في orders — EXISTS يتحقق فقط ما إذا كان الاستعلام الفرعي يعود أي صفوف، وليس القيم التي تحتويها"
            },
            {
              "icon": "",
              "label": "كل عميل، لأن SELECT 1 يعود دائماً true"
            },
            {
              "icon": "",
              "label": "خطأ، لأن الاستعلام الفرعي يختار رقم بدلاً من اسم عمود"
            },
            {
              "icon": "",
              "label": "فقط العملاء الذين لديهم طلب واحد بالضبط"
            }
          ]
        },
        {
          "question": "تكتب SELECT name, (SELECT order_id FROM orders WHERE customer_id = c.id) AS last_order FROM customers c، وعميل معين له 3 صفوف في orders. ماذا يحدث عندما يعمل هذا الاستعلام؟",
          "options": [
            {
              "icon": "",
              "label": "يعود order_id الأول المتطابق ويتجاهل بصمت الاثنين الآخرين"
            },
            {
              "icon": "",
              "label": "يعود قائمة مفصولة بفواصل من جميع order_ids الثلاثة"
            },
            {
              "icon": "",
              "label": "يعود 3 صفوف لهذا العميل، واحد لكل طلب"
            },
            {
              "icon": "",
              "label": "يرفع خطأ في وقت التشغيل — استعلام فرعي قياسي في قائمة SELECT يجب أن يعود صف واحد على الأكثر، وهذا يعود ثلاثة"
            }
          ]
        },
        {
          "question": "أربع صفوف تتعادل على أعلى درجة. باستخدام RANK() ORDER BY score DESC، جميع الأربعة تحصل على rank 1. ما rank الصف التالي أسفل؟",
          "options": [
            {
              "icon": "",
              "label": "5 — RANK() يترك فراغ مساوٍ لعدد الصفوف المتعادلة قبل الاستمرار"
            },
            {
              "icon": "",
              "label": "2 — RANK() يزيد دائماً بواحد بالضبط بعد أي تعادل"
            },
            {
              "icon": "",
              "label": "1 — كل صف لاحق أيضاً يحصل على rank 1"
            },
            {
              "icon": "",
              "label": "4 — RANK() يعيد تشغيل العد من عدد التعادلات"
            }
          ]
        },
        {
          "question": "أربع صفوف تتعادل على أعلى درجة. باستخدام DENSE_RANK() ORDER BY score DESC، جميع الأربعة تحصل على rank 1. ما rank الصف التالي أسفل؟",
          "options": [
            {
              "icon": "",
              "label": "5 — DENSE_RANK() يتصرف تماماً مثل RANK()"
            },
            {
              "icon": "",
              "label": "1 — DENSE_RANK() يعين نفس rank لكل صف متبقٍ"
            },
            {
              "icon": "",
              "label": "2 — DENSE_RANK() لا يترك فراغات أبداً، لذا القيمة المميزة التالية تحصل دائماً على rank متتالي التالي"
            },
            {
              "icon": "",
              "label": "3 — DENSE_RANK() يتخطى rank واحد لكل مجموعة تعادل"
            }
          ]
        },
        {
          "question": "تُضاف SUM(amount) OVER (PARTITION BY region ORDER BY amount) إلى استعلام. ماذا يفعل PARTITION BY region هنا؟",
          "options": [
            {
              "icon": "",
              "label": "يعيد تشغيل المجموع التراكمي بشكل منفصل لكل region، بدلاً من التراكم عبر مجموعة النتائج كلها"
            },
            {
              "icon": "",
              "label": "يصفي النتائج إلى region واحد"
            },
            {
              "icon": "",
              "label": "يجمع ويسقط الصفوف إلى واحد لكل region، مثل GROUP BY"
            },
            {
              "icon": "",
              "label": "يرتب الـ regions بأبجديتها قبل الجمع"
            }
          ]
        },
        {
          "question": "يُطبق ROW_NUMBER() OVER (ORDER BY score DESC) على خمسة صفوف، اثنان منها متساويان بالضبط في الدرجة. هل يمكن لصفين أن يستقبلا نفس رقم الصف؟",
          "options": [
            {
              "icon": "",
              "label": "نعم — الصفوف المتعادلة دائماً تشارك نفس رقم الصف"
            },
            {
              "icon": "",
              "label": "فقط إذا تُستخدم PARTITION BY أيضاً"
            },
            {
              "icon": "",
              "label": "يعتمد على ما إذا كان التعادل في الموضع الأول أو الأخير"
            },
            {
              "icon": "",
              "label": "لا — ROW_NUMBER() يعين دائماً عدد صحيح فريد ومتزايد بصرامة لكل صف، حتى عندما تكون القيم متعادلة"
            }
          ]
        },
        {
          "question": "WITH high_earners AS (SELECT * FROM employees WHERE salary > 100000) SELECT department, COUNT(*) FROM high_earners GROUP BY department. ما هي high_earners؟",
          "options": [
            {
              "icon": "",
              "label": "تعبير جدول عام (CTE) — مجموعة نتائج مسماة مؤقتة التي يمكن للاستعلام الباقي الإشارة إليها مثل جدول"
            },
            {
              "icon": "",
              "label": "جدول دائم أُنشئ في قاعدة البيانات"
            },
            {
              "icon": "",
              "label": "view يستمر بعد انتهاء الاستعلام"
            },
            {
              "icon": "",
              "label": "stored procedure يجب استدعاؤه بشكل منفصل"
            }
          ]
        },
        {
          "question": "يُصرح عمود PRIMARY KEY. هل يمكنك إدراج صف حيث هذا العمود NULL؟",
          "options": [
            {
              "icon": "",
              "label": "نعم — PRIMARY KEY يفرض الفرادة فقط، وليس عدم الخلو"
            },
            {
              "icon": "",
              "label": "نعم، لكن صف NULL واحد فقط مسموح، مثل قيد UNIQUE"
            },
            {
              "icon": "",
              "label": "لا — عمود PRIMARY KEY هو ضمنياً NOT NULL، لذا إدراج NULL فيه يُرفض"
            },
            {
              "icon": "",
              "label": "يعتمد على ما إذا كان العمود لديه أيضاً قيمة افتراضية"
            }
          ]
        },
        {
          "question": "داخل معاملة مفتوحة، تشغل UPDATE لكنك لم تشغل بعد COMMIT. من اتصال منفصل ثاني بقاعدة البيانات، هل هذا التحديث مرئي؟",
          "options": [
            {
              "icon": "",
              "label": "نعم — جميع الاتصالات ترى كل كتابة في اللحظة التي تعمل"
            },
            {
              "icon": "",
              "label": "نعم، لكن فقط إذا فتح الاتصال الثاني أيضاً معاملة"
            },
            {
              "icon": "",
              "label": "يعتمد فقط على الجدول الذي تم تحديثه"
            },
            {
              "icon": "",
              "label": "لا — تغيير غير مستلم مرئي فقط داخل المعاملة التي أنشأته، حتى يجعل COMMIT دائم ومرئياً للآخرين"
            }
          ]
        },
        {
          "question": "products.category_id لديها قيد FOREIGN KEY يشير إلى categories.id. تحاول حذف صف من categories يزال له products تشير إليه، بدون قاعدة ON DELETE محددة. ماذا يحدث؟",
          "options": [
            {
              "icon": "",
              "label": "يتم حذف صف category وقيم products.category_id المتطابقة تُضبط تلقائياً على NULL"
            },
            {
              "icon": "",
              "label": "يتم حذف صف category وكل منتج يشير إليه يُحذف أيضاً"
            },
            {
              "icon": "",
              "label": "DELETE يُرفض — السلوك الافتراضي للمفتاح الأجنبي يحجب حذف صف مرجعي بينما لا تزال الصفوف التابعة تشير إليه"
            },
            {
              "icon": "",
              "label": "DELETE ينجح بصمت، تاركاً products' category_id يشير إلى category لم تعد موجودة"
            }
          ]
        }
      ],
      "optionOrderVersion": "e0466e547cfd8a45"
    }
  }
}
