MySQL GROUP BY وHAVING جملة مع الأمثلة

⚡ ملخص ذكي

تُحوّل عبارات SQL GROUP BY وHAVING الصفوف التفصيلية إلى تقارير موجزة. تقوم عبارة GROUP BY بدمج الصفوف التي تشترك في نفس القيم في صف واحد لكل مجموعة، بينما تقوم عبارة HAVING بتصفية تلك المجموعات بعد تطبيق دوال التجميع مثل COUNT.

  • 📊 الغرض الأساسي: تقوم عبارة GROUP BY بتجميع الصفوف ذات القيم المتطابقة وإرجاع صف واحد لكل عنصر مجمع.
  • 🧩 مجموعة عمود واحدping: الحبوping يدمج جدول الأعضاء حسب الجنس تسعة صفوف في صفين، صف للإناث وصف للذكور.
  • 🔗 مجموعة أعمدة متعددةping: الحبوping في عمودين، يتم التعامل مع الصف على أنه فريد عندما تختلف أي من القيمتين، لذلك يتم دمج النسخ المتطابقة تمامًا فقط.
  • 🧮 تجميع الأزواج: العد، المجموع، AVGتقوم الدوال MIN و MAX بحساب قيمة واحدة لكل مجموعة، مما ينتج عنه التقرير الموجز.
  • 🚦 امتلاك مقابل مكان: يقوم WHERE بتصفية الصفوف قبل المجموعةping، تقوم HAVING بتصفية المجموعات لاحقًا، ولا تقبل سوى HAVING النتائج المجمعة.
  • ⚠️ تنبيه بشأن الوضع الصارم: في ظل ONLY_FULL_GROUP_BY، يجب تجميع كل عمود محدد أو تغليفه في دالة تجميعية.

SQL GROUP BY و HAVING Clause

ما هي عبارة GROUP BY في لغة SQL؟

جملة GROUP BY هي أمر SQL يُستخدم لـ صفوف المجموعة التي لها نفس القيم. يتم كتابتها داخل عبارة SELECT، وعادة ما يتم استخدامها مع الدوال التجميعية لإنتاج تقارير موجزة من قاعدة البيانات.

هذا ما يفعله: هو يلخص البيانات يتم تخزينها في قاعدة البيانات. تُسمى الاستعلامات التي تحتوي على عبارة GROUP BY بالاستعلامات المجمعة، وهي تُرجع صفًا واحدًا لكل عنصر مجمع.

مجموعة SQL حسب بناء الجملة

الآن وقد أصبح الغرض من العبارة واضحاً، انظر إلى بناء جملة الاستعلام المجمع الأساسي.

SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];

هنا

  • "عبارات SELECT…"هو المعيار" حدد SQL استعلام الأوامر.
  • "GROUP BY اسم_العمود 1"هي العبارة التي تؤدي وظيفة المجموعة"ping بناءً على اسم العمود 1.
  • "[, column_name2, …]" اختياري ويمثل أسماء أعمدة أخرى عندما تكون المجموعةping يتم ذلك على أكثر من عمود واحد.
  • "[حالة الإصابة]"" اختياري ويُستخدم لتقييد الصفوف المتأثرة بعبارة GROUP BY. وهو مشابه لـ حيث الشرطية، باستثناء أنه يتم تطبيقه بعد المجموعةping.

الحبوping استخدام عمود واحد

أسرع طريقة لفهم تأثير عبارة GROUP BY في لغة SQL هي مقارنة استعلام غير مُجمّع باستعلام مُجمّع. ابدأ باستعلام بسيط يُعيد جميع بيانات الجنس في جدول الأعضاء.

SELECT `gender` FROM `members`;
جنس
أنثى
أنثى
ذكر
أنثى
ذكر
ذكر
ذكر
ذكر
ذكر

يتم إرجاع تسعة صفوف، وكل قيمة مكررة. لنفترض أننا نريد القيم الفريدة للجنس بدلاً من ذلك. يضيف الاستعلام أدناه عبارة GROUP BY.

SELECT `gender` FROM `members` GROUP BY `gender`;

تنفيذ البرنامج النصي أعلاه في MySQL طاولة العمل مقابل myflixdb يعطينا النتائج التالية.

جنس
أنثى
ذكر

لاحظ أنه تم إرجاع صفين فقط، لأن الجدول يحتوي على نوعين فقط من الجنس. قامت عبارة GROUP BY بتجميع جميع الأعضاء "الذكور" معًا وأرجعت صفًا واحدًا لهم، وفعلت الشيء نفسه مع الأعضاء "الإناث".

الحبوping استخدام أعمدة متعددة

الحبوping غالباً ما يكون الاعتماد على عمود واحد غير كافٍ لإعداد تقرير حقيقي. تقبل دالة GROUP BY قائمة أعمدة مفصولة بفواصل، ويُحدد كل مجموعة بناءً على مجموعة قيم هذه الأعمدة.

لنفترض أننا نريد قائمة بقيم category_id للأفلام والسنوات المقابلة التي صدرت فيها. لاحظ أولاً ناتج هذا الاستعلام البسيط.

SELECT `category_id`, `year_released` FROM `movies`;
معرف الفئة year_released
1 2011
2 2008
اغية 2008
اغية 2010
8 2007
6 2007
6 2007
8 2005
اغية 2012
7 1920
8 اغية
8 1920

تُظهر الصفوف المظللة أن النتيجة تحتوي على بيانات مكررة. يؤدي تنفيذ نفس الاستعلام باستخدام عبارة GROUP BY إلى إزالتها.

SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;

تنفيذ البرنامج النصي أعلاه في MySQL يعطينا برنامج Workbench عند استخدامه مع قاعدة بيانات myflixdb النتائج التالية الموضحة أدناه.

معرف الفئة year_released
اغية 2008
اغية 2010
اغية 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

تعمل عبارة GROUP BY على كل من category_id و year_released لتحديد فريد من نوعه تم دمج الصفين المكررين للفئة 6 في عام 2007 في صف واحد.

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

الحبوping والوظائف التجميعية

إزالة العناصر المكررة مفيدة، لكن القوة الحقيقية للمجموعاتping يظهر عند اقترانه بـ وظائف مجمعةتحسب دالة التجميع قيمة واحدة لكل مجموعة: دالة COUNT تحسب عدد الصفوف، ودالة SUM تجمع القيم، و AVGيصف كل من MIN و MAX مدى الانتشار.

لنفترض أننا نريد معرفة العدد الإجمالي للأعضاء الذكور والإناث في قاعدة البيانات. يقوم البرنامج النصي أدناه بذلك.

SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;

تنفيذ البرنامج النصي أعلاه في MySQL يعطينا برنامج Workbench النتائج التالية عند استخدامه مع قاعدة بيانات myflixdb.

جنس COUNT(`membership_number`)
أنثى 3
ذكر 6

تُجمّع الصفوف حسب كل قيمة جنس فريدة، ويُحسب عدد الصفوف داخل كل مجموعة باستخدام دالة التجميع COUNT. وتُدمج سجلات الأعضاء التسعة في صفين ملخصين.

تقييد نتائج الاستعلام باستخدام عبارة HAVING

الحبوpingلا يُشترط وجود شرط HAVING في كل صف من صفوف الجدول. أحيانًا يجب تقييد التقرير بمعيار محدد، وهذه هي وظيفة شرط HAVING.

لنفترض أننا نريد معرفة جميع سنوات إصدار الأفلام المصنفة تحت الرقم 8. يحقق البرنامج النصي أدناه هذه النتيجة.

SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;

تنفيذ البرنامج النصي أعلاه في MySQL يعطينا برنامج Workbench عند استخدامه مع قاعدة بيانات myflixdb النتائج التالية الموضحة أدناه.

movie_id الاسم مدير year_released معرف الفئة
9 Honey moonالمتطلبات البيئية جون شولتز 2005 8
5 بنات أبي الصغيرات اغية 2007 8

تم الاحتفاظ فقط بالأفلام التي تحمل معرف الفئة 8 وفقًا لشرط HAVING.

: تحذير MySQL في الإصدار 5.7 والإصدارات الأحدث، يتم تفعيل وضع ONLY_FULL_GROUP_BY افتراضيًا، وفي هذا الوضع، يتم رفض عبارة SELECT * مع عبارة GROUP BY، لأن movie_id وtitle وdirector غير مجمعة. في بيئة الإنتاج، يجب تسمية الأعمدة المجمعة بشكل صريح، على سبيل المثال حدد category_id و year_released من جدول الأفلام وقم بتجميع النتائج حسب category_id و year_released بشرط أن يكون category_id = 8؛

WHERE مقابل HAVING مقابل GROUP BY مقابل ORDER BY

كثيراً ما يخلط المبتدئون بين هذه الجمل الأربع، لأنها جميعاً تُشكّل مجموعة النتائج. ويكمن الاختلاف في متى MySQL يتم تطبيقها: يتم تشغيل WHERE قبل تجميع الصفوف، ويتم تشغيل HAVING بعد ذلك، ويتم تشغيل ORDER BY في النهاية.

بند ماذا يفعل عندما يتم تشغيله يقبل الدوال التجميعية
WHERE يقوم بتصفية الصفوف الفردية قبل أي مجموعةping. قبل GROUP BY لا
GROUP BY يقوم هذا الإجراء بدمج الصفوف التي تشترك في نفس القيم في صف واحد لكل مجموعة. بعد أين غير قابل للتطبيق
وجود يقوم بتصفية المجموعات الناتجة عن GROUP BY. بعد GROUP BY نعم، على سبيل المثال، HAVING COUNT(*) > 2
ترتيب حسب يقوم بفرز الصفوف التي تبقى بعد تنفيذ البنود السابقة. اللقب نعم، يمكن فرز الاسم المستعار المجمع.

النتيجة العملية هي انخفاض في الأداء. يؤدي استخدام عبارة WHERE في التصفية إلى إزالة الصفوف التي تسبق المجموعة.ping يبدأ العمل، لذا فإن الشرط الذي لا يعتمد على نتيجة إجمالية ينتمي إلى WHERE بدلاً من HAVING.

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

نعم. تُعيد عبارة GROUP BY وحدها صفًا واحدًا لكل قيمة فريدة، مما يُزيل التكرارات بنفس طريقة عبارة SELECT DISTINCT تقريبًا. ولا تُستخدم دوال التجميع إلا عندما تحتاج كل مجموعة إلى قيمة محسوبة.

يظهر الخطأ عندما لا يكون العمود المحدد مدرجًا في عبارة GROUP BY ولا يتم تضمينه في دالة تجميعية. MySQL لا يمكن تحديد قيمة العمود التي يجب عرضها للمجموعة، لذلك يرفض الاستعلام.

تحسب الدالة COUNT(*) عدد كل صف في المجموعة. بينما تحسب الدالة COUNT(column) عدد الصفوف التي لا تحتوي على هذا العمود فقط. اغيةلذلك يختلف الرقمان كلما احتوى العمود على قيم مفقودة.

نعم. مساعدو الذكاء الاصطناعي داخل أدوات مثل MySQL طاولة العمل قم بترجمة طلب مثل "الأعضاء حسب الجنس" إلى استعلام مُجمّع. تحقق من المجموعةping أعمدة بنفسك، لأن مجموعة خاطئةping ينتج عنه إجماليات تبدو معقولة ولكنها غير صحيحة.

في كثير من الأحيان، نعم. تُشير مساعدات الاستعلام المدعومة بالذكاء الاصطناعي إلى الأسباب الشائعة مثل الانضمام الذي يضاعف الصفوف قبل التجميعpingأو وضع عامل تصفية في HAVING بدلاً من WHERE. يبقى القرار النهائي للشخص الذي يعرف البيانات.

تلخيص هذه التدوينة بـ: