COUNT: شمارش ردیفها
تا پایان فصل ۲، هر پرسوجویی که نوشتیم، ردیفهای تکتک را نمایش میداد. از این فصل به بعد، وارد دنیای توابع تجمیعی (Aggregate Functions) میشویم: توابعی که بهجای نشاندادن هر ردیف، چندین ردیف را در یک عدد خلاصه میکنند. سادهترین و پرکاربردترینشان COUNT است: «چند تا ردیف داریم؟»
در این درس از یک جدول جدید بهنام sales (فروش یک فروشگاه کوچک لوازمالتحریر) استفاده میکنیم:
| id | product | category | price | quantity |
|---|---|---|---|---|
| 1 | کتاب ریاضی | کتاب | 120000 | 3 |
| 2 | دفتر 100برگ | نوشتافزار | 25000 | 10 |
| 3 | خودکار آبی | نوشتافزار | 8000 | 20 |
| 4 | کتاب داستان | کتاب | 95000 | 5 |
| 5 | مداد رنگی | نوشتافزار | 45000 | 4 |
| 6 | کتاب تاریخ | کتاب | 110000 | NULL |
توجه کن ردیف آخر عمداً quantityاش نامشخص (NULL) گذاشته شده — چون قرار است دقیقاً همینجا رفتار جالب COUNT با NULL را ببینیم.
COUNT(*) — شمردن همهی ردیفها
SELECT COUNT(*) AS TotalRows FROM sales;
COUNT(*) تعداد کل ردیفها را میشمارد — فارغ از اینکه کدام ستون چه مقداری دارد، حتی اگر همهی ستونهای یک ردیف NULL باشند.
COUNT(column) — نادیده گرفتن NULL
وقتی بهجای *، نام یک ستون مشخص را بدهی، COUNT فقط ردیفهایی را میشمارد که آن ستون NULL نباشد:
SELECT COUNT(*) AS TotalRows, COUNT(quantity) AS RowsWithQuantity FROM sales;
بیا این تفاوت را با چشم خودت ببینی:
TotalRows برابر ۶ است، اما RowsWithQuantity برابر ۵ — چون ردیف «کتاب تاریخ» مقدار quantityاش NULL است و COUNT(quantity) آن را نمیشمارد. این دقیقاً همان نکتهای است که در درس NULL دیدیم.COUNT(DISTINCT column) — شمردن مقادیر یکتا
برای دانستن تعداد دستهبندیهای متفاوت (نه تعداد ردیفها)، DISTINCT را داخل COUNT بگذار:
SELECT COUNT(DISTINCT category) AS CategoryCount FROM sales;
ترکیب COUNT با WHERE
COUNT را میتوان مثل هر پرسوجوی دیگری با WHERE فیلتر کرد — یادت باشد، WHERE پیش از تجمیع، روی ردیفهای خام اعمال میشود:
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 میرویم: چطور مقادیر عددی چند ردیف را با هم جمع بزنیم.