English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، ستتعلم كيفية تصفية المجموعات التي يتم إرجاعها من جملة GROUP BY.
HAVING子句通常与GROUP BY子句一起使用,以指定组或集合的过滤条件。HAVING子句只能与SELECT语句一起使用。
为了容易理解这一点,让我们来看看下面employees和departments表。
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
جداول: employees | جداول: departments |
الآن، ليس فقط العثور على أسماء الموظفين وأقسامهم، بل أيضًا أسماء الأقسام التي ليس لديها موظفين.
للجداول الصغيرة، يمكنك ببساطة تطبيقالربط الأيسرويمكنك تفحص كل قسم يدويًا، ولكن إذا كان هناك جدول يحتوي على آلاف الموظفين، فإن ذلك لن يكون سهلاً.
في هذه الحالة، يمكن استخدام جملة HAVING معGROUP BYاستخدام جملة معًا، مثلما يلي:
SELECT t1.dept_name, count(t2.emp_id) AS total_employees FROM departments AS t1 LEFT JOIN employees AS t2 ON t1.dept_id = t2.dept_id GROUP BY t1.dept_name HAVING total_employees = 0;
إذا قمت بتشغيل الجملة أعلاه، ستحصل على النتيجة التالية:
+------------------+-----------------+ | اسم القسم | عدد الموظفين | +------------------+-----------------+ | خدمات العملاء | 0 | +------------------+-----------------+
نصيحة:جملة HAVING تشبه جملة WHERE، لكنها تنطبق فقط على المجموعات بأكملها، بينماWHEREالجملة تنطبق على السطر الفريد.