SQL JOINs combine rows from two tables based on a related column.
Given: **users** (id, name) and **orders** (id, user_id, product)
**INNER JOIN** — only rows that match in both tables: ```sql SELECT users.name, orders.product FROM users INNER JOIN orders ON users.id = orders.user_id; -- Returns users who have orders ```
**LEFT JOIN** — all rows from left table, matched rows from right (NULL if no match): ```sql SELECT users.name, orders.product FROM users LEFT JOIN orders ON users.id = orders.user_id; -- Returns ALL users, even those with no orders ```
**RIGHT JOIN** — opposite of LEFT JOIN. **FULL OUTER JOIN** — all rows from both tables.
Memory trick: think of Venn diagrams. INNER = intersection, LEFT = left circle + intersection.