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 میرویم: بهجای یک عدد خلاصه برای کل جدول، یک عدد خلاصه برای هر دسته جداگانه میسازیم.