Chapters of Frontend Dev থেকে Full-Stack Backend

Week 2 - Database DepthChapter 8 of 282 min read

Englishবাংলা

SQL গভীরভাবে - JOIN, GROUP BY আর subquery কখন কোনটা

INNER vs LEFT JOIN, GROUP BY + HAVING, subquery, একই data অনেকভাবে বের করা

Frontend-এ আপনি JSON নিয়ে খেলেন - nested object, array-র ভিতরে array। SQL-এর জগৎটা উল্টো: data থাকে আলাদা আলাদা টেবিলে, চ্যাপ্টা আকারে। Order টেবিলে শুধু order-এর তথ্য, তার items আলাদা টেবিলে, user আরেক টেবিলে। প্রশ্ন হলো, দরকারের সময় এই ছড়ানো data আবার একসাথে জোড়া লাগাবেন কীভাবে? উত্তরটাই JOIN।

INNER JOIN বনাম LEFT JOIN - পার্থক্যটাই আসল

INNER JOIN শুধু সেগুলোই আনে যেগুলোর মিল দুই টেবিলেই আছে। কিন্তু আপনি যদি জানতে চান 'কোন user-রা এখনো একটাও order করেনি', INNER JOIN সেখানে কাজ করবে না - কারণ মিল নেই বলেই তাদের খুঁজছেন। সেখানে লাগবে LEFT JOIN: বাম টেবিলের সবাই আসবে, মিল থাকলে ডান টেবিলের data, না থাকলে NULL।

-- কোন user কত টাকার order করেছে (order না করলেও তালিকায় থাকবে)
SELECT u.name, COUNT(o.id) AS total_orders, COALESCE(SUM(o.total), 0) AS total_spent
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.name
ORDER BY total_spent DESC;

GROUP BY একই user-এর সব order-কে এক সারিতে গুঁড়িয়ে দেয়, আর COUNT/SUM-এর মতো function সেই গুঁড়োনো দলের উপর হিসাব করে। HAVING হলো GROUP BY-এর পরের filter - যেমন 'শুধু যারা ৫টার বেশি order করেছে'। মনে রাখার সহজ নিয়ম: WHERE সারি filter করে grouping-এর আগে, HAVING দল filter করে grouping-এর পরে।

Subquery - প্রশ্নের ভিতরে প্রশ্ন

যখন উত্তরটা আরেকটা উত্তরের উপর নির্ভর করে, তখন subquery। যেমন 'গড় order-এর চেয়ে বড় order-গুলো' - আগে গড় বের করতে হবে, তারপর তুলনা। তবে subquery দেখলেই ভয় পাবেন না - অনেক subquery-ই JOIN দিয়ে লেখা যায়, আর JOIN সাধারণত দ্রুত হয়। Interview-তে এই বিচারটাই দেখা হয়।

-- গড় দামের চেয়ে দামি product-গুলো
SELECT name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

সবাই যে ভুলটা করে

সবচেয়ে সাধারণ ভুল: JOIN-এর শর্ত ON-এ লিখতে ভুলে যাওয়া বা ভুল column দেওয়া। তখন প্রতিটা সারি প্রতিটা সারির সাথে মিলে গিয়ে ফল লাখ লাখ সারিতে পৌঁছে যায় (Cartesian product)। JOIN লিখেই প্রথমে ছোট limit দিয়ে ফলটা চোখে দেখে নিন।

আজকের Practice

সপ্তাহ ১-এর project-এ MySQL বা PostgreSQL যোগ করুন - users, orders, order_items টেবিল বানান। তিনটা query লিখুন: (১) user ধরে মোট খরচ, (২) একটাও order করেনি এমন user-দের তালিকা, (৩) সবচেয়ে বেশি বিক্রি হওয়া ৫টা product।

Interview-এ কীভাবে বলবেন

JOIN দিয়ে আমি আলাদা টেবিলের data একসাথে আনি - মিল থাকলেই ফল চাইলে INNER, মূল টেবিলের সবাইকে রেখে মিল খুঁজলে LEFT। GROUP BY দিয়ে দল বেঁধে aggregate হিসাব করি, আর WHERE বনাম HAVING-এর পার্থক্য জানি - একটা grouping-এর আগে, আরেকটা পরে কাজ করে।

All chapters of Frontend Dev থেকে Full-Stack Backend