UNION Operator in MySQL
Introduction
Combining results from multiple similar queries creates complete datasets.
The UNION operator in MySQL merges multiple SELECT statements vertically.
It is widely used for:
- Combining similar data sources
- Cross-table reporting
- Alternative condition results
What is the UNION Operator
UNION combines result sets from multiple SELECT queries into a single result.
Automatically removes duplicate rows (DISTINCT behaviour).
Basic Syntax
sql
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
Example
sql
SELECT name, marks FROM Students
UNION
SELECT name, score FROM Graduates;
Combines students and graduates, removes duplicates.
UNION with WHERE Clauses
Filter each query before combining.
sql
SELECT name, city FROM Students WHERE marks > 90
UNION
SELECT name, city FROM Graduates WHERE score > 90;
UNION Multiple Queries
Combine more than 2 SELECTs.
sql
SELECT name FROM Students WHERE city = 'Delhi.'
UNION
SELECT name FROM Graduates WHERE city = 'Mumba.i'
UNION
SELECT name FROM Alumni WHERE city = 'Bangalore';
UNION with ORDER BY
Sort applies to the final combined result.
sql
SELECT name, marks FROM Students
UNION
SELECT name, score FROM Graduates
ORDER BY marks DESC;
UNION Column Requirements
Same number of columns, compatible data types.
sql
-- Valid: same structure
SELECT name, marks FROM Students
UNION
SELECT full_name, score FROM Graduates;
UNION with Different Tables
Cross-table data merging.
sql
SELECT employee_id, salary FROM CurrentEmployees
UNION
SELECT id, amount FROM PastBonuses;
UNION with Subqueries
Complex query combinations.
sql
SELECT city, AVG(marks) FROM Students GROUP BY city
UNION
SELECT city, AVG(score) FROM Graduates GROUP BY city;
UNION with LIMIT
The limit applies to the final result only.
sql
SELECT name FROM Students WHERE marks > 90
UNION
SELECT name FROM Graduates WHERE score > 90
ORDER BY name
LIMIT 10;
UNION Performance
Processes each SELECT independently.
sql
-- Each query optimized separately
SELECT * FROM Students WHERE city = 'Delhi'
UNION
SELECT * FROM Graduates WHERE city = 'Mumbai';
Parentheses with UNION
Control complex combinations.
sql
(SELECT name FROM Students WHERE marks > 90
UNION
SELECT name FROM Graduates WHERE score > 90)
INTERSECT
SELECT name FROM Toppers;
Execution Order with UNION
Each SELECT executes independently → UNION removes duplicates → ORDER BY → LIMIT
Performance Considerations
- Indexes work on individual SELECTs
- Large datasets: UNION ALL faster
- Sort buffer used for duplicate removal
- ORDER BY on the final result only
Important Notes
- UNION = UNION DISTINCT (removes duplicates)
- Same number/compatible columns required
- Column names from the first SELECT
- ORDER BY applies to the entire result
- NULL handling is consistent across queries
Example Scenario
Combine current and past high achievers:
sql
SELECT name, marks, 'Student' as category, city
FROM Students
WHERE marks >= 95
UNION
SELECT name, score, 'Graduate' as category, city
FROM Graduates
WHERE score >= 95
ORDER BY marks DESC, name
LIMIT 20;
Common Mistakes
- Mismatched column count
- Incompatible data types
- ORDER BY in individual SELECTs (ignored)
- Expecting UNION to work horizontally (use JOIN)
- Performance surprise vs UNION ALL
Key Points to Remember
- UNION combines SELECTs vertically, removes duplicates
- Same column structure required
- ORDER BY applies to the final result only
- Individual SELECTs optimized separately
- Use UNION ALL to keep duplicates
- Column names from the first SELECT