ترتیب اجرا، CASE و تجمیع شرطی

ترتیب منطقی اجرای یک پرس‌وجو را بدانی و با CASE و تجمیع شرطی گزارش‌های دسته‌بندی‌شده بسازی.

14 دقیقه مطالعه · 5 سؤال تمرینی · SQL از صفر: پرس‌وجو برای تحلیل داده

پرس‌وجو به ترتیبی که نوشته می‌شود اجرا نمی‌شود

SQL را از SELECT شروع می‌کنیم، ولی پایگاه داده منطقاً از جای دیگر شروع می‌کند:

  1. FROM (و JOIN): جدول‌ها را بردار
  2. WHERE: ردیف‌ها را فیلتر کن
  3. GROUP BY: گروه بساز
  4. HAVING: گروه‌ها را فیلتر کن
  5. SELECT: ستون‌های نتیجه (و نام‌های مستعار) را بساز
  6. ORDER BY: مرتب کن
  7. LIMIT / OFFSET: برش بزن

این ترتیب چند «چرا» را توضیح می‌دهد:

  • نام مستعاری که در SELECT ساخته‌اید در WHERE قابل استفاده نیست (هنوز ساخته نشده)، ولی در ORDER BY هست (بعد از SELECT اجرا می‌شود).
  • تابع تجمیعی در WHERE نمی‌آید، در HAVING می‌آید.
  • LIMIT بعد از ORDER BY اجرا می‌شود، پس «۳ تای اول» واقعاً ۳ تای اول مرتب‌شده است.

(پایگاه داده برای سرعت ممکن است فیزیکی ترتیب دیگری را اجرا کند، ولی نتیجه همیشه طوری است که انگار با همین ترتیب اجرا شده.)

CASE: اگر… آنگاه… وگرنه

CASE در SQL همان if/else است و برای دسته‌بندی ردیف‌ها عالی:

SELECT name, price,
       CASE WHEN price >= 300 THEN 'expensive'
            WHEN price >= 100 THEN 'medium'
            ELSE 'cheap' END AS tier
FROM products;

شرط‌ها به ترتیب بررسی می‌شوند و اولین شرطی که درست باشد برنده است. اگر ELSE ننویسید و هیچ شرطی درست نباشد، نتیجه NULL است.

تجمیع شرطی: CASE را داخل تابع تجمیعی بگذارید تا چند شمارش در یک پرس‌وجو داشته باشید:

SELECT customer_id,
       COUNT(*) AS orders,
       SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_orders
FROM orders
GROUP BY customer_id;

(در PostgreSQL ساده‌تر: COUNT(*) FILTER (WHERE status = 'paid'). CASE همه‌جا کار می‌کند.)

منابع و مطالعه‌ی بیشتر

مفهوم‌های این فصل (به‌خصوص «ترتیب منطقی اجرا» و رفتار NULL) جاهایی‌اند که حتی تحلیل‌گران باتجربه هم اشتباه می‌کنند. مرور فاصله‌دار همین‌ها را هدف می‌گیرد: اگر سؤال‌های این فصل بعداً دوباره پیش آمد و درست جواب دادی، آن مفهوم واقعاً در حافظه‌ی بلندمدتت جا افتاده است.

تمرین‌های این درس را حل کن (رایگان)