JOIN কী?
একাধিক table-এর ডেটা মিলিয়ে আনা। সম্পর্ক (FK) অনুযায়ী row যুক্ত হয়।
Sample
users orders ┌──┬─────┐ ┌──┬───────┬─────┐ │id│name │ │id│user_id│total│ ├──┼─────┤ ├──┼───────┼─────┤ │1 │করিম │ │1 │ 1 │ 500 │ │2 │রহিম │ │2 │ 1 │ 300 │ │3 │জামিল│ │3 │ 2 │ 700 │ └──┴─────┘ └──┴───────┴─────┘
১. INNER JOIN ⭐
দুই table-এই match থাকলেই row।
SELECT u.name, o.id, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id; -- করিম | 1 | 500 -- করিম | 2 | 300 -- রহিম | 3 | 700 -- (জামিল বাদ)
২. LEFT JOIN
বাম table-এর সব row, ডান-এ না থাকলে NULL।
SELECT u.name, o.id, o.total FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- করিম | 1 | 500 -- করিম | 2 | 300 -- রহিম | 3 | 700 -- জামিল| NULL | NULL ⭐
৩. RIGHT JOIN
ডান table-এর সব row। (LEFT JOIN ব্যবহার করাই ভালো)
৪. FULL OUTER (MySQL-এ UNION দিয়ে)
SELECT u.name, o.id FROM users u LEFT JOIN orders o ON u.id=o.user_id UNION SELECT u.name, o.id FROM users u RIGHT JOIN orders o ON u.id=o.user_id;
৫. SELF JOIN
-- Employee-Manager (একই table) SELECT e.name AS employee, m.name AS manager FROM employees e LEFT JOIN employees m ON e.manager_id = m.id;
৩+ Table JOIN
SELECT
u.name AS customer,
o.id AS order_id,
p.name AS product,
oi.quantity, p.price
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.created_at >= '2025-01-01'
ORDER BY o.created_at DESC;
Practical
-- প্রতি user-এর মোট order SELECT u.id, u.name, COUNT(o.id) AS orders FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id, u.name; -- যাদের order নেই SELECT u.* FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE o.id IS NULL; -- Category সহ product SELECT p.name, c.name AS category, p.price FROM products p INNER JOIN categories c ON p.category_id = c.id;
Best Practices
- সবসময় alias (
users u) - Join column-এ index থাকতে হবে
- WHERE দিয়ে আগে filter, তত দ্রুত