JOIN — একাধিক Table মিলানো

লেসন ২২ / ৩৯

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, তত দ্রুত