عبارة HAVING

من موسوعة حسوب
< SQL
مراجعة 15:36، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

تستخدم عبارة  HAVING ضمن استعلام SELECT لتحديد شرطٍ معينٍ عند تجميع السجلات مع بعضها GROUP BY، وقد أُضيف إلى لغة SQL لأنه لا يمكن استخدام عبارة WHERE مع الدوال التجميعيّة مثل SUM و MIN  و MAX ...إلخ.

تجميع السجلات وفق شرط مُحدّد

ليكن الجدول الآتي (patients) موجودًا في قاعدة البيانات:

Doctor Section Age Patient PatientID
Nasser Cardiology 76 Salem 1029
Abd Allah Neurology 17 Hasan 896
Reem Maternity 23 Nadine 964
Fateh Cardiology 65 Rami 1070
Kareem Neurology 19 Abd al-Rahim 1150
Hadi Critical Care 65 Roushd 1097
Reem Maternity 27 Sana 1034
Abd Allah Neurology 49 Helen 963
Hadi Critical Care 58 Ahmad 1154
Kareem Neurology 40 Maher 1069
Amnah Maternity 30 Zeina 1028
Fateh Cardiology 55 Sarah 1180
Hadi Critical Care 23 Fadi 1076
Abd Allah Neurology 36 Naim 987
Fateh Cardiology 70 Batoul 1156
Amnah Maternity 24 Rahaf 1181
Nasser Cardiology 66 Aya 808

الاستعلام الآتي يحدد عدد المرضى المعالجِين لدى كل طبيب اعتمادًا على الدالة count()‎ بشرط ألا يقلَّ هذا العدد عن ثلاثة مرضى:

SELECT Doctor, count(Patient) AS Number of patients
FROM patients
GROUP BY Doctor
HAVING count(Patient)>2 ;

وتظهر النتائج كما الآتي:

Number of patients Doctor
3 Fateh
3 Abd Allah
3 Hadi

الفرق ما بين WHERE و HAVING

يكمُن الفرق الرئيسي بين العبارتين بأن عبارة HAVING متناسبة مع الدوال التجميعية أما عبارة WHERE فتُستخدم للتحقق من الشرط دون وجود أي دالة تجميعية، وبالتالي فإن الاستعلامَين الآتيَين متكافئان تمامًا:

SELECT Section, count(Patient) AS Number
FROM patients
GROUP BY Section
HAVING Age>25 ;
SELECT Section, count(Patient) AS Number
FROM patients
WHERE Age>25
GROUP BY Section;

وتكون نتيجتهما:

Number Section
5 Cardiology
3 Neurology
2 Maternity
2 Critical Care

أما في حال استخدام إحدى الدوال التجميعيّة مثل معرفة عدد المرضى في كل قسم واستبعاد الأقسام بعددٍ من المرضى أقل من ثلاثة، فإن الاستعلامَين الآتييَن ليسا متكافئين:

SELECT Section, count(Patient) AS Number
FROM patients
GROUP BY Section
HAVING count(Patient)>2 ;
SELECT Section, count(Patient) AS Number
FROM patients
WHERE count(Patient)>2      -- استخدم GROUP BY;

ذلك لأنه لا يمكن استخدام العبارة WHERE مع الدوال التجميعية، ويجب بهذه الحالة استخدام العبارة HAVING للحصول على النتيجة الآتية:

Number Section
5 Cardiology
3 Neurology

التوافقية

SQLServer SQLite Oracle PostgreSQL MySQL
نعم نعم نعم نعم نعم

مصادر