UNION and UNION ALL in MySQL - Time & Space Complexity
When combining results from two or more queries, it is important to understand how the time to get results grows as the data grows.
We want to know how the cost changes when using UNION versus UNION ALL in MySQL.
Analyze the time complexity of the following code snippet.
SELECT column1 FROM tableA
UNION
SELECT column1 FROM tableB;
SELECT column1 FROM tableA
UNION ALL
SELECT column1 FROM tableB;
This code combines results from two tables, either removing duplicates (UNION) or keeping all rows (UNION ALL).
Look for repeated work done by the database engine.
- Primary operation: Scanning all rows from both tables.
- How many times: Once for each table's rows.
- Additional operation for UNION: Comparing rows to remove duplicates.
- How many times for duplicate check: Depends on total rows combined.
As the number of rows in each table grows, the work changes differently for UNION and UNION ALL.
| Input Size (rows in each table) | Approx. Operations for UNION | Approx. Operations for UNION ALL |
|---|---|---|
| 10 | About 20 scans + some duplicate checks | About 20 scans only |
| 100 | About 200 scans + more duplicate checks | About 200 scans only |
| 1000 | About 2000 scans + many duplicate checks | About 2000 scans only |
Pattern observation: UNION ALL grows linearly with input size, while UNION adds extra work to compare and remove duplicates, which grows faster.
Time Complexity: O(n) for UNION ALL, O(n log n) for UNION
This means UNION ALL just reads all rows once, but UNION also sorts or compares rows to remove duplicates, which takes more time as data grows.
[X] Wrong: "UNION and UNION ALL take the same time because they both combine rows."
[OK] Correct: UNION must check for duplicates, which adds extra work beyond just combining rows, making it slower as data grows.
Understanding how UNION and UNION ALL scale helps you explain query performance clearly and choose the right tool for combining data efficiently.
"What if we added an ORDER BY clause after UNION? How would that affect the time complexity?"
Practice
UNION and UNION ALL in MySQL?Solution
Step 1: Understand
UNIONbehaviorUNIONcombines results from two queries and removes duplicate rows to return only unique rows.Step 2: Understand
UNION ALLbehaviorUNION ALLcombines results but keeps all rows, including duplicates, without filtering.Final Answer:
UNIONremoves duplicate rows,UNION ALLkeeps all rows including duplicates. -> Option DQuick Check:
Duplicates removed = UNION, duplicates kept = UNION ALL [OK]
- Thinking UNION ALL removes duplicates
- Confusing sorting behavior with UNION
- Assuming UNION only works on numeric data
UNION ALL in MySQL?Solution
Step 1: Check correct keyword spacing
The correct keyword isUNION ALLwith a space between UNION and ALL.Step 2: Validate SQL syntax
The syntax must be:SELECT ... UNION ALL SELECT ...;without commas or semicolons between the two SELECTs.Final Answer:
SELECT * FROM table1 UNION ALL SELECT * FROM table2; -> Option AQuick Check:
Correct keyword and syntax = SELECT * FROM table1 UNION ALL SELECT * FROM table2; [OK]
- Writing UNIONALL as one word
- Adding commas between SELECT statements
- Using semicolons between SELECTs
Table A:id | name
1 | Alice
2 | Bob
Table B:id | name
2 | Bob
3 | Carol
What will be the result of this query?
SELECT id, name FROM A UNION SELECT id, name FROM B;
Solution
Step 1: Combine rows from both tables
Table A has (1, Alice) and (2, Bob). Table B has (2, Bob) and (3, Carol).Step 2: Apply UNION behavior
UNIONremoves duplicates, so (2, Bob) appears only once in the result.Final Answer:
1 | Alice
2 | Bob
3 | Carol -> Option CQuick Check:
Duplicates removed, unique rows shown [OK]
- Including duplicate rows with UNION
- Confusing UNION with UNION ALL output
- Ignoring duplicate row removal
SELECT id FROM table1
UNION ALL
SELECT id FROM table2 ORDER BY id;
What is wrong with this query?
Solution
Step 1: Understand ORDER BY with UNION ALL
ORDER BY applies to the entire combined result, not to individual SELECTs.Step 2: Identify correct placement
ORDER BY must be placed after the last SELECT and UNION ALL, not inside one SELECT.Final Answer:
ORDER BY must be applied only once at the end of the UNION ALL query. -> Option AQuick Check:
ORDER BY after UNION ALL, not inside SELECT [OK]
- Putting ORDER BY inside one SELECT only
- Trying ORDER BY before UNION ALL
- Assuming UNION ALL disallows ORDER BY
Employees:id | name
1 | John
2 | Jane
3 | Mike
Contractors:id | name
2 | Jane
4 | Anna
You want to list all people from both tables, including duplicates, and sort by name ascending.
Which query achieves this correctly?
Solution
Step 1: Choose UNION ALL to keep duplicates
Since duplicates like Jane (id 2) should appear twice, useUNION ALL.Step 2: Apply ORDER BY after UNION ALL
ORDER BY must come after the full UNION ALL to sort combined results by name ascending.Final Answer:
SELECT id, name FROM Employees UNION ALL SELECT id, name FROM Contractors ORDER BY name ASC; -> Option BQuick Check:
UNION ALL + ORDER BY at end = SELECT id, name FROM Employees UNION ALL SELECT id, name FROM Contractors ORDER BY name ASC; [OK]
- Using UNION instead of UNION ALL (removes duplicates)
- Placing ORDER BY inside one SELECT
- Incorrect syntax with ORDER BY placement
Ready to prove it?
Pass the test and this pattern moves unknown
