0Pricing
Coding Interview Prep · درس

MIN وMAX والتجميع غير الرقمي

تجميع التواريخ والسلاسل النصية، ومعنى MIN على النصوص

MIN وMAX والتجميع غير الرقمي درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

MIN وMAX خارج نطاق الأرقام

يفترض المرشحون أن MIN وMAX لا يعملان إلا مع الأرقام. ويحب مسؤولو المقابلات طرح السؤال التالي: «ماذا يُرجع MAX(name)؟ وماذا عن MIN(order_date)؟»

الحقيقة هي أن MIN وMAX يعملان مع أي نوع قابل للترتيب — الأرقام والتواريخ والسلاسل النصية. أما المهارة الحقيقية التي يجري اختبارها هنا فهي فهم قواعد الترتيب الخاصة بكل نوع.

الحالة الرقمية

لنبدأ بالمألوف. في الأعمدة الرقمية، يُرجع MIN أصغر قيمة، ويُرجع MAX أكبر قيمة. الأمر بسيط.

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

SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;

MIN وMAX للتواريخ

التواريخ والطوابع الزمنية قابلة للترتيب بالكامل، لذلك تُرجع MIN(order_date) التاريخ الأقدم، بينما تُرجع MAX(order_date) التاريخ الأحدث.

بهذه الطريقة يمكنكم الإجابة عن سؤالَي «متى تم إنشاء أول طلب؟» (MIN) و«ما أحدث نشاط؟» (MAX) من دون الترتيب ثم تحديد عدد الصفوف. فهذا هو الحل الاصطلاحي القائم على المجموعات.

SELECT
  MIN(order_date) AS first_order,
  MAX(order_date) AS latest_order
FROM orders;

النطاق الزمني في استعلام واحد

سؤال متابعة شائع: «منذ متى ظل هذا العميل نشطًا؟» ادمجوا MIN وMAX، ثم اطرحوا إحداهما من الأخرى.

يحسب هذا النطاق بين أول طلب وآخر طلب. تختلف الصياغة الدقيقة لعملية الطرح باختلاف اللهجة، لكن فكرة MIN/MAX عالمية، وتوضح قدرتكم على التعبير عن النطاقات بطريقة تصريحية.

SELECT
  customer_id,
  MIN(order_date) AS first_order,
  MAX(order_date) AS last_order,
  MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;

MIN وMAX للسلاسل النصية

إليكم الجزء الذي يفاجئ الناس. عند استخدامها مع أعمدة نصية، تعتمد MIN وMAX على الترتيب المعجمي (الأبجدي) وفقًا لـ collation الخاص بالعمود.

لذلك تُرجع MIN(name) الاسم الذي يأتي أولًا أبجديًا، بينما تُرجع MAX(name) الاسم الذي يأتي أخيرًا. تُرجع MIN على {'Carol', 'Alice', 'Bob'} القيمة 'Alice'، بينما تُرجع MAX القيمة 'Carol'.

SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'

Collation وحساسية حالة الأحرف

يعتمد ترتيب السلاسل النصية على collation، الذي يتحكم في حساسية حالة الأحرف وقواعد اللغة المحلية. في العديد من عمليات collation الافتراضية، قد تُرتَّب الأحرف الكبيرة قبل الأحرف الصغيرة، ولذلك قد تكون نتيجة MAX على {'apple', 'Banana'} مفاجئة.

في مقابلة، اذكروا أن نتائج MIN/MAX للسلاسل النصية تعتمد على collation. فهذا التفصيل يميز بين إجابة محفوظة وفهم حقيقي.

ما لا تعنيه MIN(text)

من المفاهيم الخاطئة الشائعة أن MIN(name) تُرجع أقصر سلسلة نصية، أو أن MAX(name) تُرجع أطولها. هذا غير صحيح. فالأمر يتعلق بترتيب الفرز فقط، وليس بالطول.

إذا كنتم تحتاجون فعلًا إلى أطول سلسلة نصية، فرتبوا باستخدام LENGTH(name) واختاروا الصف الأول، أو استخدموا MAX(LENGTH(name)) للحصول على الطول فقط. لا تخلطوا بين ترتيب القيم وطولها.

SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;

MIN/MAX لا تدمجان الأعمدة

تنبيه مهم: تعمل MIN وMAX على عمود واحد بشكل مستقل. وهما لا تُرجعان الصف بأكمله الذي يحتوي على القيمة الدنيا أو القصوى.

إذا كتبتم SELECT MIN(salary), name من دون تجميع، فلن تحصلوا على اسم صاحب الراتب الأقل — بل ستحصلون على خطأ أو اسم عشوائي، بحسب اللهجة. لجلب الصف بأكمله، استخدموا ORDER BY + LIMIT أو دالة نافذة.

-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;

مراجعة سلوك NULL مع MIN/MAX

مثل SUM وAVG تمامًا، تتجاهل MIN وMAX قيم NULL. فقيمة NULL ليست أصغر قيمة ولا أكبرها.

  • قيم مختلطة مع NULL: يتم تجاهل NULL، وتُرجع القيمة الدنيا أو القصوى الفعلية.
  • جميع القيم NULL أو عدم وجود صفوف: تُرجع MIN وMAX القيمة NULL.

يمكنكم ذكر هذه النقطة الواضحة حول الاتساق بين الدوال التجميعية: «تتجاهل جميع الدوال التجميعية القياسية قيم NULL».

وضعها ضمن مجموعة

تتألق MIN وMAX عند استخدامهما مع GROUP BY لإيجاد القيم القصوى لكل مجموعة. ويُعد «أعلى راتب لكل قسم» مثالًا نموذجيًا.

يُرجع هذا صفًا واحدًا لكل قسم، ويحتوي على أعلى راتب في ذلك القسم. تذكروا أنه يُرجع القيمة، وليس الموظف. أما إقران الاسم بها فهو مسألة منفصلة وشائعة في المتابعة.

SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;

كيفية الإجابة بثقة

إجابة قوية في مقابلة: «تعمل MIN وMAX مع أي نوع قابل للترتيب. فبالنسبة إلى الأرقام، تعنيان الأصغر والأكبر؛ وبالنسبة إلى التواريخ، الأقدم والأحدث؛ وبالنسبة إلى السلاسل النصية، الترتيب الأبجدي وفقًا لـ collation الخاص بالعمود. وتتجاهلان قيم NULL، ولا تُرجعان NULL إلا عند عدم وجود أي قيمة غير NULL. كما أنهما تُرجعان قيمة واحدة، وليس الصف بأكمله، لذلك لجلب الصف سأستخدم ORDER BY مع LIMIT أو دالة نافذة».

تحقق سريع

فكّروا في كيفية تجميع السلاسل النصية.

مراجعة

كل ما يتعلق بـ MIN وMAX:

  • تعملان مع أي نوع قابل للترتيب: الأرقام والتواريخ والسلاسل النصية.
  • تستخدم السلاسل النصية ترتيبًا أبجديًا/وفقًا لـ collation، وليس ترتيبًا حسب الطول.
  • التواريخ: MIN = الأقدم، وMAX = الأحدث.
  • تتجاهلان قيم NULL؛ وعند كون جميع القيم NULL أو عدم وجود صفوف، تُرجعان NULL.
  • تُرجعان قيمة، وليس الصف بأكمله — استخدموا ORDER BY + LIMIT لذلك.

التالي: ما الذي يحدث عند استخدام الدوال التجميعية من دون GROUP BY.

الأسئلة الشائعة

هل درس «MIN وMAX والتجميع غير الرقمي» مجاني؟

نعم — نص درس «MIN وMAX والتجميع غير الرقمي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «MIN وMAX والتجميع غير الرقمي»؟

تجميع التواريخ والسلاسل النصية، ومعنى MIN على النصوص تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «MIN وMAX والتجميع غير الرقمي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)
  2. SUM وAVG مع NULL
  3. MIN وMAX والتجميع غير الرقمي
  4. التجميعات دون GROUP BY
← العودة إلى Coding Interview Prep