ترتیب اجرا، CASE و تجمیع شرطی
ترتیب منطقی اجرای یک پرسوجو را بدانی و با CASE و تجمیع شرطی گزارشهای دستهبندیشده بسازی.
14 دقیقه مطالعه · 5 سؤال تمرینی · SQL از صفر: پرسوجو برای تحلیل داده
پرسوجو به ترتیبی که نوشته میشود اجرا نمیشود
SQL را از SELECT شروع میکنیم، ولی پایگاه داده منطقاً از جای دیگر شروع میکند:
FROM(و JOIN): جدولها را بردارWHERE: ردیفها را فیلتر کنGROUP BY: گروه بسازHAVING: گروهها را فیلتر کنSELECT: ستونهای نتیجه (و نامهای مستعار) را بسازORDER BY: مرتب کن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 همهجا کار میکند.)
منابع و مطالعهی بیشتر
- توابع تجمیعی در مستندات PostgreSQL: فهرست کامل (از جمله
FILTER). - فصل ۲ همان مستندات شامل
GROUP BYوHAVINGبا مثال.
مفهومهای این فصل (بهخصوص «ترتیب منطقی اجرا» و رفتار NULL) جاهاییاند که حتی تحلیلگران باتجربه هم اشتباه میکنند. مرور فاصلهدار همینها را هدف میگیرد: اگر سؤالهای این فصل بعداً دوباره پیش آمد و درست جواب دادی، آن مفهوم واقعاً در حافظهی بلندمدتت جا افتاده است.