মূল কন্টেন্টে যান
মডিউল 3 · 4-এর পাঠ 4কোর্সে 12/57~8 min
মডিউল পাঠ (4/4)

ফিল্টারিং গ্রুপ: থাকা

একবার আপনার প্রতি গ্রুপে ফলাফল পাওয়া গেলে (আগের পাঠ), আপনি প্রায়শই চান শুধুমাত্র সেই দলগুলিকে রাখুন যা একটি শর্ত পূরণ করে: আরও বিভাগ সহ 2 জনের বেশি, 100k এর উপরে গড় বাজেটের প্রকল্প, ব্যবহারকারীরা কমপক্ষে 10টি অর্ডার। এটি করার জন্য WHERE যথেষ্ট নয়।

কেন যেখানে যথেষ্ট নয়

WHERE ফিল্টার করে সারণী সারি, আগে সমষ্টি। তাই দেখা যাচ্ছে না COUNT(*) বা AVG(...) এর ফলাফল: WHERE রান করার সময়, সেগুলি মান এখনও গণনা করা হয়নি।

SQL
-- 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।

বাক্য গঠন

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column
HAVING   condition_on_aggregate;
SQL
-- 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 আবার কখনো বিভ্রান্ত না করার জন্য, ক্রমটি মনে রাখবেন এসকিউএল মানসিকভাবে তাদের কার্যকর করে:

  1. FROM / JOIN — উত্স যোগ করার মাধ্যমে প্রারম্ভিক টেবিল তৈরি করে।
  2. WHERE — আপনি যে সারিগুলিকে গুরুত্ব দেন না সেগুলি ড্রপ করে৷
  3. GROUP BY — অবশিষ্ট সারিগুলিকে গোষ্ঠীতে সংগ্রহ করে৷
  4. HAVING — যে গোষ্ঠীগুলিকে আপনি গুরুত্ব দেন না সেগুলিকে বাদ দেয়৷
  5. SELECT — চূড়ান্ত কলাম গণনা করে (সমষ্টি সহ)।
  6. ORDER BY / LIMIT — পুনরায় সাজান এবং কাটুন।

গুরুত্বপূর্ণ নোট:

  • WHERE এ আপনি শুধুমাত্র টেবিল কলাম ব্যবহার করতে পারবেন;
  • HAVING এ আপনি গ্রুপিং কলাম এবং সমষ্টি ব্যবহার করতে পারেন।
SQL
-- 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;

চেষ্টা করে দেখুন

ব্যায়াম#sql.m3.l4.e1
প্রচেষ্টা: 0লোড হচ্ছে...

প্রতিটি বিভাগের জন্য, নাম (departments.name) এবং কর্মচারীর সংখ্যা দেখান, কিন্তু শুধুমাত্র কমপক্ষে 2 জন কর্মচারী আছে এমন বিভাগের জন্য। দুই কলাম, প্রতি যোগ্যতা বিভাগে এক সারি।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

'অন্তত 2' শর্তটি COUNT(*) >= 2 HAVING এ পরিণত হয়।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#sql.m3.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

বিভাগগুলি দেখান (departments.name) যাদের গড় বেতন 35000-এর বেশি। শুধুমাত্র 2018 সাল থেকে নিয়োগ করা কর্মচারীদের বিবেচনা করুন। দুটি কলাম: নাম এবং গড়। গড় অবরোহ অনুসারে সাজান।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

যেখানে সারিগুলি ফিল্টার করে (2018 থেকে নিয়োগপ্রাপ্ত কর্মচারীরা), গোষ্ঠীগুলিকে ফিল্টার করে (গড় > 35000)৷

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ