Overview of Joins in MySQL


A join in SQL combines rows from two or more tables based on a related column. At its core, a join answers the question: “How do I bring together data stored in separate tables so I can see it in one combined view?”
Below we’ll start with a layman’s explanation, then move into a full technical deep dive, covering first principles, types of joins, syntax, execution, and performance considerations.
1. Layman’s Explanation
Imagine you have two stacks of index cards:
Stack A: Cards listing Student IDs and Student Names.
Stack B: Cards listing Student IDs and Grades.
Each student appears exactly once in Stack A, and exactly once in Stack B. You want a new stack of cards that show Name and Grade side by side. You look at a student card in Stack A, find the matching student ID card in Stack B, and then write down their name and grade together. That process—matching up cards by a common key—is exactly what a join does in a database.
Key points in simple terms:
Tables are like stacks of cards.
A column that appears in both tables (e.g., Student ID) is like the label you match on.
A join finds all matching labels and brings the information from both tables onto one “card.”
2. Technical Deep Dive
2.1. Relational Foundations
Tables represent relations; each row is a tuple.
A primary key uniquely identifies each row in a table.
A foreign key in one table refers to a primary key in another, establishing a relationship.
Join = relational algebra’s θ‑join or natural join, depending on predicate.
At the lowest level, MySQL often computes a join by taking the Cartesian product of the two tables (every combination of rows), then applying a filter (the join condition) to retain only the matching pairs. Understanding this helps in appreciating why joins can be expensive when tables are large.
2.2. Types of Joins
INNER JOIN
Returns only rows where there is a match in both tables.
Relationally: σ(A.key = B.key)(A × B).
LEFT (OUTER) JOIN
Returns all rows from the left table and matched rows from the right.
Unmatched right-side columns become NULL.
RIGHT (OUTER) JOIN
Returns all rows from the right table, with matched rows from the left.
Unmatched left-side columns become NULL.
FULL (OUTER) JOIN
- MySQL doesn’t support it directly; you simulate via
UNION
of Left and Right joins.
- MySQL doesn’t support it directly; you simulate via
CROSS JOIN
- Pure Cartesian product, every row of A with every row of B.
SELF JOIN
- A table joined with itself, often to compare rows within the same table.
2.3. Syntax and Examples
Assume:
-- Students table
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50)
);
-- Grades table
CREATE TABLE grades (
student_id INT,
grade CHAR(1),
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
a) INNER JOIN
SELECT s.name, g.grade
FROM students AS s
INNER JOIN grades AS g
ON s.student_id = g.student_id;
- Execution: MySQL picks the smaller table (or uses indexes) to drive the join, probing the other.
b) LEFT JOIN
SELECT s.name, g.grade
FROM students AS s
LEFT JOIN grades AS g
ON s.student_id = g.student_id;
- Result: Every student appears, even if they have no grade record (
g.grade
then isNULL
).
c) RIGHT JOIN
SELECT s.name, g.grade
FROM students AS s
RIGHT JOIN grades AS g
ON s.student_id = g.student_id;
- Rarely used when you can just swap table order and use LEFT JOIN.
d) FULL OUTER JOIN (Simulation)
SELECT s.name, g.grade
FROM students AS s
LEFT JOIN grades AS g
ON s.student_id = g.student_id
UNION
SELECT s.name, g.grade
FROM students AS s
RIGHT JOIN grades AS g
ON s.student_id = g.student_id;
e) CROSS JOIN
SELECT s.name, g.grade
FROM students AS s
CROSS JOIN grades AS g;
- Returns N×M rows (all combinations).
f) SELF JOIN
Suppose a table of employees with manager_id
pointing to another employee:
SELECT e.name AS employee,
m.name AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.employee_id;
2.4. First Principles & Fundamental Concepts
Relational Completeness
- Joins are one of the fundamental relational operators (along with projection, selection, union, difference).
Set Theory
- Results of SQL queries are sets (or bags) of tuples.
Predicate Logic
Normalization & Redundancy
- Data is split into multiple tables to reduce duplication; joins reassemble it as needed.
Indexes & Keys
- A well‑indexed join column (foreign key) is critical for performance.
2.5. Execution Strategies (Join Algorithms)
Nested Loops Join
Iterate table A rows, for each probe table B (with index lookup or full scan).Block Nested Loops
Partition into chunks, reducing index lookups.Merge Sort Join
If both tables are sorted on join key, scan both in order.Hash Join (MySQL 8.0+ supports an “in‑memory hash join” for certain cases)
Build a hash table on the smaller input, probe with the larger.
You can see which strategy MySQL chooses via:
EXPLAIN
SELECT … JOIN …;
2.6. Performance Tips
Index the join columns: foreign key and primary key.
Filter early: apply
WHERE
conditions before joining when possible.Choose the right join order: MySQL optimizer usually does this, but complex queries may need hints.
Avoid SELECT *: only fetch columns you need.
Consider covering indexes: index that includes both join and filter columns.
2.7. Putting It All Together
Joins let you reconstruct related data spread across normalized tables. You begin with the simple concept of matching rows on a common key (layman’s “matching cards”), and build up to the formal relational and set‑theoretic foundations, understand join types, learn syntax, examine execution plans, and apply performance best practices.
With this foundation, you can confidently design schemas that avoid redundancy, write queries that combine data effectively, and tune them to run efficiently even on large datasets.
Subscribe to my newsletter
Read articles from Peculiar Babalola directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Peculiar Babalola
Peculiar Babalola
I am a developer from Nigeria. I am also dedicated to helping out new developers in my own little way, because even if I do not know everything yet, I know how difficult it is to figure things out as a new or starting-out developer.