মডিউল পাঠ (4/4)
ফিল্টারিং গ্রুপ: থাকা
একবার আপনার প্রতি গ্রুপে ফলাফল পাওয়া গেলে (আগের পাঠ), আপনি প্রায়শই চান
শুধুমাত্র সেই দলগুলিকে রাখুন যা একটি শর্ত পূরণ করে: আরও বিভাগ সহ
2 জনের বেশি, 100k এর উপরে গড় বাজেটের প্রকল্প, ব্যবহারকারীরা
কমপক্ষে 10টি অর্ডার। এটি করার জন্য WHERE যথেষ্ট নয়।
কেন যেখানে যথেষ্ট নয়
WHERE ফিল্টার করে সারণী সারি, আগে সমষ্টি। তাই দেখা যাচ্ছে না
COUNT(*) বা AVG(...) এর ফলাফল: WHERE রান করার সময়, সেগুলি
মান এখনও গণনা করা হয়নি।
-- ERROR: COUNT(*) doesn't exist yet when WHERE is evaluated
SELECT department_id, COUNT(*) AS count
FROM employees
WHERE COUNT(*) > 2 -- ❌ doesn't work
GROUP BY department_id;ফিল্টার করার জন্য পর একত্রিতকরণের জন্য একটি নির্দিষ্ট ধারা রয়েছে: HAVING।
বাক্য গঠন
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM table
GROUP BY grouping_column
HAVING condition_on_aggregate;-- Departments with more than 2 employees:
SELECT department_id, COUNT(*) AS count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 2;HAVING হল GROUP BY কে কি WHERE FROM এর কাছে: একই ধারণা
("ফিল্টার"), কিন্তু পর গ্রুপিং, সমষ্টিতে প্রয়োগ করা হয়েছে।
ধারার যৌক্তিক ক্রম
WHERE এবং HAVING আবার কখনো বিভ্রান্ত না করার জন্য, ক্রমটি মনে রাখবেন
এসকিউএল মানসিকভাবে তাদের কার্যকর করে:
FROM/JOIN— উত্স যোগ করার মাধ্যমে প্রারম্ভিক টেবিল তৈরি করে।WHERE— আপনি যে সারিগুলিকে গুরুত্ব দেন না সেগুলি ড্রপ করে৷GROUP BY— অবশিষ্ট সারিগুলিকে গোষ্ঠীতে সংগ্রহ করে৷HAVING— যে গোষ্ঠীগুলিকে আপনি গুরুত্ব দেন না সেগুলিকে বাদ দেয়৷SELECT— চূড়ান্ত কলাম গণনা করে (সমষ্টি সহ)।ORDER BY/LIMIT— পুনরায় সাজান এবং কাটুন।
গুরুত্বপূর্ণ নোট:
WHEREএ আপনি শুধুমাত্র টেবিল কলাম ব্যবহার করতে পারবেন;HAVINGএ আপনি গ্রুপিং কলাম এবং সমষ্টি ব্যবহার করতে পারেন।
-- Classic combo: filter first, group, filter the groups, sort.
SELECT d.name, AVG(e.salary) AS average
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id
WHERE e.hired_on >= '2018-01-01' -- filter rows
GROUP BY d.name
HAVING AVG(e.salary) > 35000 -- filter groups
ORDER BY average DESC;চেষ্টা করে দেখুন
প্রতিটি বিভাগের জন্য, নাম (departments.name) এবং কর্মচারীর সংখ্যা দেখান, কিন্তু শুধুমাত্র কমপক্ষে 2 জন কর্মচারী আছে এমন বিভাগের জন্য। দুই কলাম, প্রতি যোগ্যতা বিভাগে এক সারি।
ইঙ্গিত দেখান
'অন্তত 2' শর্তটি COUNT(*) >= 2 HAVING এ পরিণত হয়।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
বিভাগগুলি দেখান (departments.name) যাদের গড় বেতন 35000-এর বেশি। শুধুমাত্র 2018 সাল থেকে নিয়োগ করা কর্মচারীদের বিবেচনা করুন। দুটি কলাম: নাম এবং গড়। গড় অবরোহ অনুসারে সাজান।
ইঙ্গিত দেখান
যেখানে সারিগুলি ফিল্টার করে (2018 থেকে নিয়োগপ্রাপ্ত কর্মচারীরা), গোষ্ঠীগুলিকে ফিল্টার করে (গড় > 35000)৷
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ