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

ما هي عبارة 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.
