🗄️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