🗄️SQL Templates
JOIN Query Patterns
INNER JOIN, LEFT JOIN, RIGHT JOIN, and FULL OUTER JOIN examples
Explanation
Combine data from multiple tables using various JOIN types for relational queries.
Examples
INNER JOIN
Input
users INNER JOIN orders
Output
Only users who have orders
LEFT JOIN
Input
users LEFT JOIN orders
Output
All users, with orders if they exist
Code Examples
SQL
-- INNER JOIN (only matching rows)
SELECT
users.name,
orders.order_number,
orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- LEFT JOIN (all from left table)
SELECT
users.name,
orders.order_number,
orders.total
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- Find users with no orders
SELECT users.name
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.id IS NULL;
-- Multiple JOINs
SELECT
users.name,
orders.order_number,
products.name AS product_name,
order_items.quantity
FROM users
INNER JOIN orders ON users.id = orders.user_id
INNER JOIN order_items ON orders.id = order_items.order_id
INNER JOIN products ON order_items.product_id = products.id;
-- JOIN with WHERE
SELECT
users.name,
orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE orders.status = 'completed'
AND orders.created_at > '2024-01-01';
-- Self JOIN (hierarchical data)
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
-- CROSS JOIN (Cartesian product)
SELECT
colors.name,
sizes.name
FROM colors
CROSS JOIN sizes;💡 Tips
- INNER JOIN = only matching rows from both tables
- LEFT JOIN = all from left table + matches from right
- Use table aliases (users u) for readability
- Index foreign key columns for JOIN performance
- Filter before JOIN when possible
- Check NULL values with LEFT JOIN
- Use EXPLAIN to analyze JOIN performance
⚠️ Common Pitfalls
- Forgetting ON clause creates CROSS JOIN
- JOINing without indexes is very slow
- Multiple JOINs can create huge intermediate results
- NULL handling in LEFT JOIN WHERE clauses
- Ambiguous column names without table prefix
- CROSS JOIN creates n*m rows