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

COUNT: شمارش ردیف‌ها

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

تا پایان فصل ۲، هر پرس‌وجویی که نوشتیم، ردیف‌های تک‌تک را نمایش می‌داد. از این فصل به بعد، وارد دنیای توابع تجمیعی (Aggregate Functions) می‌شویم: توابعی که به‌جای نشان‌دادن هر ردیف، چندین ردیف را در یک عدد خلاصه می‌کنند. ساده‌ترین و پرکاربردترین‌شان COUNT است: «چند تا ردیف داریم؟»

در این درس از یک جدول جدید به‌نام sales (فروش یک فروشگاه کوچک لوازم‌التحریر) استفاده می‌کنیم:

idproductcategorypricequantity
1کتاب ریاضیکتاب1200003
2دفتر 100برگنوشت‌افزار2500010
3خودکار آبینوشت‌افزار800020
4کتاب داستانکتاب950005
5مداد رنگینوشت‌افزار450004
6کتاب تاریخکتاب110000NULL

توجه کن ردیف آخر عمداً quantityاش نامشخص (NULL) گذاشته شده — چون قرار است دقیقاً همین‌جا رفتار جالب COUNT با NULL را ببینیم.

COUNT(*) — شمردن همه‌ی ردیف‌ها

sql
SELECT COUNT(*) AS TotalRows
FROM sales;

COUNT(*) تعداد کل ردیف‌ها را می‌شمارد — فارغ از این‌که کدام ستون چه مقداری دارد، حتی اگر همه‌ی ستون‌های یک ردیف NULL باشند.

COUNT(column) — نادیده گرفتن NULL

وقتی به‌جای *، نام یک ستون مشخص را بدهی، COUNT فقط ردیف‌هایی را می‌شمارد که آن ستون NULL نباشد:

sql
SELECT COUNT(*) AS TotalRows, COUNT(quantity) AS RowsWithQuantity
FROM sales;

بیا این تفاوت را با چشم خودت ببینی:

امتحانش کن — COUNT(*) در برابر COUNT(column)
TotalRows برابر ۶ است، اما RowsWithQuantity برابر ۵ — چون ردیف «کتاب تاریخ» مقدار quantityاش NULL است و COUNT(quantity) آن را نمی‌شمارد. این دقیقاً همان نکته‌ای است که در درس NULL دیدیم.

COUNT(DISTINCT column) — شمردن مقادیر یکتا

برای دانستن تعداد دسته‌بندی‌های متفاوت (نه تعداد ردیف‌ها)، DISTINCT را داخل COUNT بگذار:

sql
SELECT COUNT(DISTINCT category) AS CategoryCount
FROM sales;
امتحانش کن — COUNT(DISTINCT ...)

ترکیب COUNT با WHERE

COUNT را می‌توان مثل هر پرس‌وجوی دیگری با WHERE فیلتر کرد — یادت باشد، WHERE پیش از تجمیع، روی ردیف‌های خام اعمال می‌شود:

sql
SELECT COUNT(*) AS BookCount
FROM sales
WHERE category = N'کتاب';
نکته‌ی کارایی: COUNT(*) معمولاً از COUNT(column) کمی سریع‌تر است، چون موتور پایگاه‌داده لازم نیست مقدار هر ستون را برای بررسی NULL باز کند. اگر فقط تعداد ردیف‌ها را می‌خواهی (نه بررسی NULL بودن یک ستون خاص)، همیشه COUNT(*) را ترجیح بده.

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

  • COUNT(*) همه‌ی ردیف‌ها را می‌شمارد، بدون توجه به NULL.
  • COUNT(column) فقط ردیف‌هایی را می‌شمارد که آن ستون NULL نباشد.
  • COUNT(DISTINCT column) تعداد مقادیر یکتا (غیر NULL) را می‌شمارد.
  • COUNT را می‌توان با WHERE ترکیب کرد تا فقط زیرمجموعه‌ی خاصی شمرده شود.

در درس بعدی سراغ SUM می‌رویم: چطور مقادیر عددی چند ردیف را با هم جمع بزنیم.