Sql Union And Union All Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    8 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of SQL UNION and UNION ALL

SQL UNION and UNION ALL: A Detailed Explanation with Important Information

Overview:

Purpose:

  • Combinational Retrieval: Both UNION and UNION ALL are used to combine the result sets of two or more SELECT statements into a single dataset.
  • Consolidation of Data: They enable the consolidation of data from different tables or even different databases, creating a unified view for analysis and reporting.

Syntax:

  1. UNION:

    SELECT column1, column2, ...
    FROM table1
    UNION
    SELECT column1, column2, ...
    FROM table2;
    
  2. UNION ALL:

    SELECT column1, column2, ...
    FROM table1
    UNION ALL
    SELECT column1, column2, ...
    FROM table2;
    

Both UNION and UNION ALL require that the SELECT statements have the same number of columns and that corresponding columns have compatible data types.

Differences and Characteristics:

  1. Elimination of Duplicates:

    • UNION: Removes duplicate rows from the final result set. This means that if there are identical rows across the different SELECT statements, they appear only once in the output.
    • UNION ALL: Includes all rows from both SELECT statements, including duplicates. Therefore, rows that are identical in both tables will appear twice in the result set.
  2. Performance:

    • UNION: Generally slower than UNION ALL because it requires an additional operation to check for and remove duplicate rows.
    • UNION ALL: Faster as it directly merges the results of the SELECT statements without duplicate elimination.
  3. Order By Clause:

    • The ORDER BY clause applies to the combined results of the SELECT statements, not to the individual query results.
    • Only one ORDER BY clause can be used in a UNION or UNION ALL statement and it must be placed at the end.
  4. Use in Complex Queries:

    • Both UNION and UNION ALL can be used in conjunction with subqueries and other SQL clauses like WHERE, GROUP BY, and HAVING.

Important Considerations:

  1. Column Names:

    • The names of columns in the result set for UNION or UNION ALL are taken from the first SELECT statement.
    • If you want specific column names in the result, use the AS keyword after the column name in the first SELECT statement.
  2. Data Types:

    • Ensure that the data types of corresponding columns across the SELECT statements are compatible. SQL typically performs implicit type conversion but may result in errors if data types are not compatible.
    • Use explicit type casting (e.g., CAST(column_name AS data_type)) when necessary.
  3. Sorting and Filtering:

    • You can sort the combined result using ORDER BY.
    • Filtering should be done within each SELECT statement to reduce unnecessary computational overhead.
  4. Limitations:

    • UNION and UNION ALL cannot be used with GROUP BY and HAVING clauses directly in the combined statement unless used within subqueries.
    • They can only be used with SELECT statements that have the same number of columns.

Example:

Suppose we have two tables:

  1. employees_us | employee_id | first_name | last_name | salary | |-------------|------------|-----------|--------| | 1 | John | Doe | 50000 | | 2 | Jane | Smith | 60000 |

  2. employees_ca | employee_id | first_name | last_name | salary | |-------------|------------|-----------|--------| | 3 | Emily | Johnson | 55000 | | 2 | Jane | Smith | 60000 |

Combining using UNION:

SELECT employee_id, first_name, last_name, salary
FROM employees_us
UNION
SELECT employee_id, first_name, last_name, salary
FROM employees_ca;

Result: | employee_id | first_name | last_name | salary | |-------------|------------|-----------|--------| | 1 | John | Doe | 50000 | | 2 | Jane | Smith | 60000 | | 3 | Emily | Johnson | 55000 |

Combining using UNION ALL:

SELECT employee_id, first_name, last_name, salary
FROM employees_us
UNION ALL
SELECT employee_id, first_name, last_name, salary
FROM employees_ca;

Result: | employee_id | first_name | last_name | salary | |-------------|------------|-----------|--------| | 1 | John | Doe | 50000 | | 2 | Jane | Smith | 60000 | | 3 | Emily | Johnson | 55000 | | 2 | Jane | Smith | 60000 |

Notice how the row (2, Jane, Smith, 60000) appears twice in the UNION ALL result due to its presence in both tables.

Practical Applications:

  • Cross-Table Reporting: Combining data from different sources for comprehensive reports.
  • Merging Similar Data: When working with multiple datasets that share similar structures and need to be merged together.
  • Data Deduplication: Utilizing UNION to eliminate duplicate entries across datasets.
  • Handling Large Datasets: Using UNION ALL when dealing with large volumes of data where duplicate elimination is not critical for performance reasons.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement SQL UNION and UNION ALL

Understanding UNION and UNION ALL

  • UNION: Combines the results of two or more SELECT statements and removes duplicate rows.
  • UNION ALL: Combines the results of two or more SELECT statements but includes all rows, even duplicates.

Step 1: Setting Up the Environment

For these examples, let's assume we have two tables: Employees and Contractors. Both tables have similar structures:

Employees Table | EmployeeID | FirstName | LastName | Department | |------------|------------|----------|------------| | 1 | John | Doe | Finance | | 2 | Jane | Smith | IT | | 3 | Robert | Brown | HR |

Contractors Table | ContractorID | FirstName | LastName | Department | |--------------|-----------|----------|------------| | 101 | Alice | Johnson | IT | | 102 | John | Smith | IT | | 103 | Sarah | Lee | Finance |

Step 2: Basic UNION Example

Let's retrieve a list of all first and last names from both the Employees and Contractors tables. We'll use UNION to ensure there are no duplicate rows.

SELECT FirstName, LastName
FROM Employees
UNION
SELECT FirstName, LastName
FROM Contractors;

Output: | FirstName | LastName | |-----------|----------| | John | Doe | | Jane | Smith | | Robert | Brown | | Alice | Johnson | | Sarah | Lee |

Note: John Smith appears only once because UNION removes duplicates.

Step 3: Basic UNION ALL Example

Now, let's use UNION ALL to include all rows, even duplicates.

SELECT FirstName, LastName
FROM Employees
UNION ALL
SELECT FirstName, LastName
FROM Contractors;

Output: | FirstName | LastName | |-----------|----------| | John | Doe | | Jane | Smith | | Robert | Brown | | Alice | Johnson | | John | Smith | | Sarah | Lee |

Note: John Smith appears twice because UNION ALL includes all rows.

Step 4: Advanced UNION Example with ORDER BY

Let's order the combined results by LastName.

SELECT FirstName, LastName
FROM Employees
UNION
SELECT FirstName, LastName
FROM Contractors
ORDER BY LastName;

Output: | FirstName | LastName | |-----------|----------| | Robert | Brown | | John | Doe | | Alice | Johnson | | John | Smith | | Jane | Smith | | Sarah | Lee |

Step 5: UNION with Different Columns

Both SELECT statements in a UNION must have the same number of columns, and the corresponding columns must be compatible in terms of data types. If they are not, you can use NULL values to ensure compatibility.

Let's say we want to combine the Employees and Contractors tables but include an additional column for each, indicating the type of employee.

SELECT FirstName, LastName, 'Employee' AS EmployeeType
FROM Employees
UNION
SELECT FirstName, LastName, 'Contractor' AS EmployeeType
FROM Contractors;

Output: | FirstName | LastName | EmployeeType | |-----------|----------|--------------| | John | Doe | Employee | | Jane | Smith | Employee | | Robert | Brown | Employee | | Alice | Johnson | Contractor | | Sarah | Lee | Contractor |

Step 6: UNION with Aggregation

You can also use UNION with aggregate functions. Here’s an example where we count the number of employees and contractors in each department.

SELECT Department, COUNT(*) AS EmployeeCount, 'Employee' AS EmployeeType
FROM Employees
GROUP BY Department
UNION
SELECT Department, COUNT(*) AS EmployeeCount, 'Contractor' AS EmployeeType
FROM Contractors
GROUP BY Department;

Output: | Department | EmployeeCount | EmployeeType | |------------|---------------|--------------| | Finance | 2 | Employee | | IT | 2 | Employee | | HR | 1 | Employee | | Finance | 1 | Contractor | | IT | 2 | Contractor |

Conclusion

  • UNION: Use when you want to combine and deduplicate results from multiple SELECT queries.
  • UNION ALL: Use when performance is critical and you want to keep all rows, including duplicates.

Top 10 Interview Questions & Answers on SQL UNION and UNION ALL

1. What is the difference between SQL UNION and UNION ALL?

Answer:

  • UNION: Combines results from two or more SELECT statements, but removes duplicate rows from the final result set.
  • UNION ALL: Combines results from two or more SELECT statements and includes all duplicate rows in the final result set.

Example:

-- Using UNION
SELECT name FROM employees WHERE department = 'Sales'
UNION
SELECT name FROM employees WHERE department = 'Marketing';

-- Using UNION ALL
SELECT name FROM employees WHERE department = 'Sales'
UNION ALL
SELECT name FROM employees WHERE department = 'Marketing';

2. What are the requirements for using UNION or UNION ALL?

Answer:

  • All SELECT statements must have the same number of columns in their result sets.
  • Corresponding columns in each SELECT statement must be of compatible data types.
  • Columns in each SELECT statement must be in the same order (unless specified), although column names in the final result set come from the first SELECT statement.

3. Can you use UNION or UNION ALL with different types of data columns?

Answer:
No, the data types of the columns in each SELECT statement must be compatible. If the data types are incompatible, you need to cast them to a compatible type using functions like CAST() or CONVERT().

4. When should you use UNION ALL instead of UNION?

Answer:

  • Use UNION ALL when you are sure there are no duplicate rows or when performance is a priority. UNION ALL is generally faster than UNION because it doesn’t perform the additional step of removing duplicates.
  • UNION is preferred when you need a distinct list of results and the removal of duplicates is necessary.

5. How does ORDER BY work with UNION or UNION ALL?

Answer:

  • ORDER BY can be used to sort the final result set of a UNION or UNION ALL operation.
  • ORDER BY should be placed at the end of the entire UNION or UNION ALL statement, not after individual SELECT statements.

Example:

SELECT name FROM employees WHERE department = 'Sales'
UNION
SELECT name FROM employees WHERE department = 'Marketing'
ORDER BY name;

6. Can you use UNION or UNION ALL with subqueries?

Answer:
Yes, UNIONS and UNION ALL can be used with subqueries. Each subquery should follow standard SELECT syntax and must return a result set that is compatible with the other subqueries.

Example:

SELECT customer_name FROM (SELECT customer_name FROM orders WHERE order_amount > 1000) AS high_orders
UNION
SELECT customer_name FROM (SELECT customer_name FROM returns WHERE return_reason = 'Defective') AS defective_returns;

7. What is the effect of using DISTINCT with UNION or UNION ALL?

Answer:

  • UNION: Implicitly applies DISTINCT to the final result set, removing duplicate rows.
  • UNION ALL: Does not imply DISTINCT; all rows, including duplicates, are included in the final result set.
  • If you explicitly use DISTINCT with UNION ALL, it will convert UNION ALL to a UNION, removing duplicates.

Example:

SELECT name FROM employees WHERE department = 'Sales'
UNION ALL
SELECT DISTINCT name FROM employees WHERE department = 'Marketing';

8. How does UNION or UNION ALL handle NULL values?

Answer:

  • NULLs are treated as equal, meaning if one SELECT statement returns NULL and another returns NULL, they will be considered duplicates by UNION.
  • NULLs are included in the final result set, and duplicates with NULL values will be removed by UNION but included by UNION ALL.

Example:

SELECT name, department FROM employees WHERE name IS NULL
UNION
SELECT name, department FROM employees WHERE department IS NULL;

9. Are UNION and UNION ALL permitted in subqueries?

Answer:
Yes, UNION and UNION ALL can be used within subqueries. This is useful when you need to combine multiple result sets and reference them within a larger query structure.

Example:

SELECT employee_id, salary FROM (
    SELECT employee_id, salary FROM full_time_employees
    UNION ALL
    SELECT employee_id, salary FROM part_time_employees
) AS combined_employees
WHERE salary > 50000;

10. Can you use UNION or UNION ALL with more than two SELECT statements?

Answer:
Yes, you can combine results from more than two SELECT statements using UNION or UNION ALL. Just continue chaining the SELECT statements with the UNION or UNION ALL operator.

Example:

You May Like This Related .NET Topic

Login to post a comment.