الفرق بين المراجعتين لصفحة: «SQL/having»
لا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
سطر 208: | سطر 208: | ||
* [https://sqlite.org/lang_select.html#resultset توثيق HAVING في محرك SQLite] | * [https://sqlite.org/lang_select.html#resultset توثيق HAVING في محرك SQLite] | ||
* [https://docs.microsoft.com/en-us/sql/t-sql/queries/select-having-transact-sql توثيق HAVING في محرك SQLServer] | * [https://docs.microsoft.com/en-us/sql/t-sql/queries/select-having-transact-sql توثيق HAVING في محرك SQLServer] | ||
[[تصنيف:SQL]] | [[تصنيف:SQL|{{SUBPAGENAME}}]] | ||
[[تصنيف:SQL Select]] | [[تصنيف:SQL Select|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 15:36، 28 يناير 2018
تستخدم عبارة 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 |
---|---|---|---|---|
نعم | نعم | نعم | نعم | نعم |