خانه/ تجمیع داده‌ها/ AVG

AVG: میانگین مقادیر

مبتدی ۱۱ دقیقه مطالعه

ساختار پایه

sql
SELECT AVG(price) AS AvgPrice
FROM sales;

نکته‌ی حیاتی: AVG هم NULL را نادیده می‌گیرد — نه به‌عنوان صفر

این‌جا جایی است که AVG می‌تواند غافلگیرکننده باشد. تصور غلط رایج این است که AVG برابر است با «جمع همه‌ی مقادیر تقسیم‌بر تعداد کل ردیف‌ها». اما واقعیت این است: AVG فقط مقادیر غیر NULL را جمع می‌زند و بر تعداد همان مقادیر غیر NULL تقسیم می‌کند — نه بر COUNT(*).

روی جدول sales، دسته‌ی «کتاب» سه ردیف دارد با مقادیر quantity برابر ۳، ۵ و NULL. بیا دو محاسبه را کنار هم مقایسه کنیم:

sql
SELECT
  AVG(quantity) AS RealAvg,
  SUM(quantity) * 1.0 / COUNT(*) AS WrongAvg,
  SUM(quantity) * 1.0 / COUNT(quantity) AS ManualCorrectAvg
FROM sales
WHERE category = N'کتاب';

بیا نتیجه را ببینیم:

امتحانش کن — AVG واقعی در برابر محاسبه‌ی دستی اشتباه
ببین چه اتفاقی افتاد: RealAvg برابر ۴ است — یعنی (۳+۵)/۲، چون فقط دو ردیف مقدار غیر NULL دارند. اما WrongAvg که با تقسیم بر COUNT(*) (که ۳ است) محاسبه شده، عددی متفاوت و اشتباه می‌دهد. AVG از همان ابتدا محاسبه‌ی درست (تقسیم بر تعداد مقادیر غیر NULL) را انجام می‌دهد — دقیقاً برابر ManualCorrectAvg.

گرد کردن نتیجه با ROUND

نتیجه‌ی AVG اغلب اعشار طولانی دارد. برای نمایش خواناتر، از ROUND(expression, digits) استفاده کن:

sql
SELECT ROUND(AVG(price), 0) AS AvgPriceRounded
FROM sales;

AVG با WHERE

sql
SELECT ROUND(AVG(price), 0) AS AvgStationeryPrice
FROM sales
WHERE category = N'نوشت‌افزار';

جمع‌بندی این درس

  • AVG(column) میانگین مقادیر غیر NULL را حساب می‌کند — نه میانگین همه‌ی ردیف‌ها.
  • این یعنی AVG(x) می‌تواند با SUM(x) / COUNT(*) فرق داشته باشد، اگر NULL در کار باشد.
  • ROUND(expression, digits) برای خواناتر کردن نتیجه‌ی اعشاری به‌کار می‌رود.

در درس بعدی سراغ GROUP BY می‌رویم: به‌جای یک عدد خلاصه برای کل جدول، یک عدد خلاصه برای هر دسته جداگانه می‌سازیم.