PostgreSQL

PostgreSQL — شرط گروه (HAVING)

آخرین بروزرسانی: 1404/08/18

شرط گروه (HAVING)

HAVING شرط روی گروه هاست. WHERE روی ردیف هاست. چون توابع تجمعی (Aggregate) مثل COUNT روی چند ردیف کار می کنند، WHERE کافی نیست؛ پس از HAVING استفاده می کنیم.

HAVING چیست؟

وقتی با GROUP BY گروه می سازیم، گاهی می خواهیم فقط گروه های خاص را ببینیم. HAVING دقیقاً همین فیلتر را روی گروه ها می زند؛ مثل گزینش کلاس هایی با بیش از 30 دانش آموز.

مثال: کشورهایی با بیش از 5 مشتری

ابتدا گروه بندی می کنیم، سپس شرط HAVING می گذاریم.

SELECT COUNT(customer_id), country
FROM customers
GROUP BY country
HAVING COUNT(customer_id) > 5;

مشاهده در ادیتور

نمونه های بیشتر HAVING

فقط سفارش هایی را می خواهیم که جمع قیمتشان 400 یا بیشتر است.

SELECT order_details.order_id, SUM(products.price)
FROM order_details
LEFT JOIN products ON order_details.product_id = products.product_id
GROUP BY order_id
HAVING SUM(products.price) > 400.00;

مشاهده در ادیتور

اکنون مشتری هایی را می خواهیم که مجموع خریدشان 1000 یا بیشتر است.

SELECT customers.customer_name, SUM(products.price)
FROM order_details
LEFT JOIN products ON order_details.product_id = products.product_id
LEFT JOIN orders ON order_details.order_id = orders.order_id
LEFT JOIN customers ON orders.customer_id = customers.customer_id
GROUP BY customer_name
HAVING SUM(products.price) > 1000.00;

مشاهده در ادیتور

گام های عملی

  1. ستون گروه را با GROUP BY تعیین کن.
  2. تابع تجمعی مناسب را انتخاب کن.
  3. شرط را با HAVING روی گروه ها اعمال کن.

نکته: برای کم کردن حجم داده، ابتدا با WHERE ردیف ها را محدود کن، سپس گروه بندی و HAVING را اجرا کن.

برای مرور قواعد گروه بندی، صفحه گروه بندی (GROUP BY) را ببین. برای بررسی وجود رکورد، به EXISTS سر بزن.

جمع بندی سریع

  • HAVING روی گروه ها فیلتر می زند.
  • WHERE قبل از گروه بندی فیلتر می کند.
  • همیشه با GROUP BY معنی دار است.
  • COUNT و SUM همراه HAVING کاربردی اند.