- SQL - Home
- SQL - Roadmap
- SQL - Overview
- SQL - RDBMS Concepts
- SQL - Databases
- SQL - Syntax
- SQL - Data Types
- SQL - Operators
- SQL - Expressions
- SQL - Comments
- SQL Database
- SQL - Create Database
- SQL - Drop Database
- SQL - Select Database
- SQL - Rename Database
- SQL - Show Databases
- SQL - Backup Database
- SQL Table
- SQL - Create Table
- SQL - Show Tables
- SQL - Rename Table
- SQL - Truncate Table
- SQL - Clone Tables
- SQL - Temporary Tables
- SQL - Alter Tables
- SQL - Drop Table
- SQL - Delete Table
- SQL - Constraints
- SQL Queries
- SQL - Insert Query
- SQL - Select Query
- SQL - Select Into
- SQL - Insert Into Select
- SQL - Update Query
- SQL - Delete Query
- SQL - Sorting Results
- SQL Views
- SQL - Create Views
- SQL - Update Views
- SQL - Drop Views
- SQL - Rename Views
- SQL Operators and Clauses
- SQL - Where Clause
- SQL - Top Clause
- SQL - Distinct Clause
- SQL - Order By Clause
- SQL - Group By Clause
- SQL - Having Clause
- SQL - AND & OR
- SQL - BOOLEAN (BIT) Operator
- SQL - LIKE Operator
- SQL - IN Operator
- SQL - ANY, ALL Operators
- SQL - EXISTS Operator
- SQL - CASE
- SQL - NOT Operator
- SQL - NOT EQUAL
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN Operator
- SQL - UNION Operator
- SQL - UNION vs UNION ALL
- SQL - INTERSECT Operator
- SQL - EXCEPT Operator
- SQL - Aliases
- SQL Joins
- SQL - Using Joins
- SQL - Inner Join
- SQL - Left Join
- SQL - Right Join
- SQL - Cross Join
- SQL - Full Join
- SQL - Self Join
- SQL - Delete Join
- SQL - Update Join
- SQL - Left Join vs Right Join
- SQL - Union vs Join
- SQL Keys
- SQL - Unique Key
- SQL - Primary Key
- SQL - Foreign Key
- SQL - Composite Key
- SQL - Alternate Key
- SQL Indexes
- SQL - Indexes
- SQL - Create Index
- SQL - Drop Index
- SQL - Show Indexes
- SQL - Unique Index
- SQL - Clustered Index
- SQL - Non-Clustered Index
- Advanced SQL
- SQL - Wildcards
- SQL - Injection
- SQL - Hosting
- SQL - Min & Max
- SQL - Null Functions
- SQL - Check Constraint
- SQL - Default Constraint
- SQL - Stored Procedures
- SQL - NULL Values
- SQL - Transactions
- SQL - Sub Queries
- SQL - Handling Duplicates
- SQL - Using Sequences
- SQL - Auto Increment
- SQL - Date & Time
- SQL - Cursors
- SQL - Common Table Expression
- SQL - Group By vs Order By
- SQL - IN vs EXISTS
- SQL - Database Tuning
- SQL Function Reference
- SQL - Date Functions
- SQL - String Functions
- SQL - Aggregate Functions
- SQL - Numeric Functions
- SQL - Text & Image Functions
- SQL - Statistical Functions
- SQL - Logical Functions
- SQL - Cursor Functions
- SQL - JSON Functions
- SQL - Conversion Functions
- SQL - Datatype Functions
- SQL Useful Resources
- SQL - Questions and Answers
- SQL - Cheatsheet
- SQL - Quick Guide
- SQL - Useful Functions
- SQL - Useful Resources
- SQL - Discussion
SQL - UNION Operator
The SQL UNION Operator
The SQL UNION operator is used to combine the result sets of two or more SELECT queries into a single result set. It removes duplicate rows by default, returning only distinct records.
- Each SELECT query must have the same number of columns.
- Corresponding columns must have compatible data types.
- The column names in the result set are taken from the first SELECT statement.
- Use UNION ALL if you want to include duplicate rows.
Syntax
The basic syntax of SQL UNION operator is as follows:
SELECT column1, column2, ... FROM table1 WHERE condition UNION SELECT column1, column2, ... FROM table2 WHERE condition;
Here, the given condition could be any given expression based on your requirement.
SQL UNION on a Single Field
The SQL UNION operator can be applied to combine results of queries that return only a single column (single field) from one or more tables. This is useful when you want to create a combined list of unique values from different tables or queries.
Example
Assume we have created a table with name CUSTOMERS in MySQL database using CREATE TABLE statement as shown below:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
Following query inserts values into this table using the INSERT statement:
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00), (2, 'Khilan', 25, 'Delhi', 1500.00), (3, 'Kaushik', 23, 'Kota', 2000.00), (4, 'Chaitali', 25, 'Mumbai', 6500.00), (5, 'Hardik', 27, 'Bhopal', 8500.00), (6, 'Komal', 22, 'Hyderabad', 4500.00), (7, 'Muffy', 24, 'Indore', 10000.00);
The CUSTOMERS table is as follows:
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | Hyderabad | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
Now, creating the second table ORDERS using CREATE TABLE statement as shown below:
CREATE TABLE ORDERS ( OID INT NOT NULL, DATE DATETIME NOT NULL, CUSTOMER_ID INT NOT NULL, AMOUNT INT NOT NULL, PRIMARY KEY (OID) );
Following query inserts values into this table using the INSERT statement:
INSERT INTO ORDERS VALUES (102, '2009-10-08 00:00:00', 3, 3000), (100, '2009-10-08 00:00:00', 3, 1500), (101, '2009-11-20 00:00:00', 2, 1560), (103, '2008-05-20 00:00:00', 4, 2060);
The ORDERS table is as follows:
| OID | DATE | CUSTOMER_ID | AMOUNT |
|---|---|---|---|
| 102 | 2009-10-08 00:00:00 | 3 | 3000.00 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500.00 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560.00 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060.00 |
Using the following query, let us combine the SALARY and AMOUNT columns from CUSTOMERS and ORDERS table (since these columns have similar datatypes):
SELECT SALARY FROM CUSTOMERS UNION SELECT AMOUNT FROM ORDERS;
Output of the above query is as follows:
| SALARY |
|---|
| 2000.00 |
| 1500.00 |
| 6500.00 |
| 8500.00 |
| 4500.00 |
| 10000.00 |
| 3000.00 |
| 1560.00 |
| 2060.00 |
SQL UNION on Multiple Fields
The SQL UNION operator can also be used to combine results from multiple columns (multiple fields) across different tables or queries. This is useful when you want to create a consolidated dataset containing several columns from multiple sources.
When using UNION on multiple fields, the number and order of the columns in each SELECT statement must match. Additionally, the data types of the corresponding columns must be compatible for the UNION to work correctly. If the data types are not compatible, you can use conversion functions such as CAST or CONVERT to align them.
Example
As the CUSTOMERS and ORDERS tables are not union-compatible individually, let us first join these two tables into a bigger table using Left Join and Right Join. The joined tables retrieved will have same number of columns with same datatypes, becoming union compatible. Now, these tables are combined using UNION query shown below:
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
This would produce the following result:
| ID | NAME | AMOUNT | DATE |
|---|---|---|---|
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | Kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | Kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
SQL UNION with WHERE Clause
The SQL UNION operator can be used with WHERE clauses in the individual SELECT statements to filter rows before combining the results. Each query can have its own WHERE condition, allowing you to select specific subsets of data from multiple tables.
Syntax
Following is the syntax for using the SQL WHERE clause with UNION operator:
SELECT column1, column2, ... FROM table1 WHERE condition1 UNION SELECT column1, column2, ... FROM table2 WHERE condition2;
Example
In the following query, we are retrieving the id's of the customers where id is greater than 5 and 2 from the 'CUSTOMERS' and 'ORDERS' tables respectively:
SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5 UNION SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2;
Following is the result produced:
| ID | SALARY |
|---|---|
| 6 | 4500.00 |
| 7 | 10000.00 |
| 3 | 3000.00 |
| 3 | 1500.00 |
| 4 | 2060.00 |
SQL UNION with ORDER BY Clause
When we use UNION with ORDER BY clause, it combines the sorted result sets of all SELECT statements and produces a single sorted result set.
The SQL UNION operator can be combined with an ORDER BY clause to sort the final result set after merging multiple SELECT queries. The ORDER BY applies to the combined results, not to individual queries.
Syntax
Following is the syntax for using the SQL ORDER BY clause with UNION operator:
SELECT column1, column2, ... FROM table1 WHERE condition1 UNION SELECT column1, column2, ... FROM table2 WHERE condition2 ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
Example
In here, we are retrieving the id's of the customers where id is greater than 5 and 2 from the 'CUSTOMERS' and 'ORDERS' tables respectively, sorted low to high from their salary:
SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5 UNION SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2 ORDER BY SALARY;
Following is the output of the above query:
| ID | SALARY |
|---|---|
| 3 | 1500.00 |
| 4 | 2060.00 |
| 3 | 3000.00 |
| 6 | 4500.00 |
| 7 | 10000.00 |
The ORDER BY clause in a UNION statement applies to the entire result set, not just the last SELECT statement.
UNION with Aliases
When using the SQL UNION operator, you can assign column aliases in the first SELECT statement to give names to the columns in the combined result set. These aliases apply to the entire union, while any aliases in the subsequent SELECT statements are ignored.
Aliases provide temporary names for columns or tables, which is helpful when working with multiple tables or columns that have similar names.
It is important to remember that the final column names in the union are determined by the first SELECT statement. To ensure consistent naming across all queries, use column aliases in the first SELECT when combining results with UNION.
Syntax
Following is the syntax for using Union with Aliases:
SELECT column1 AS alias1, column2 AS alias2, ... FROM table1 WHERE condition1 UNION SELECT column1 AS alias3, column2, ... FROM table2 WHERE condition2;
Example
The following query retrieves all the id's from both tables, along with an indication of whether each id is of the customer or the order made by them:
SELECT ID, 'customer' AS type FROM CUSTOMERS UNION SELECT OID, 'order' AS type FROM ORDERS;
Following is the output produced:
| ID | type |
|---|---|
| 1 | customer |
| 2 | customer |
| 3 | customer |
| 4 | customer |
| 5 | customer |
| 6 | customer |
| 7 | customer |
| 100 | order |
| 101 | order |
| 102 | order |
| 103 | order |
SQL UNION ALL Operator
The SQL UNION ALL operator is similar to the UNION operator, but unlike UNION, it does not remove duplicate rows. It combines the results of two or more SELECT statements and returns all rows, including duplicates.
This makes UNION ALL faster than UNION because it does not need to check for or remove duplicate rows.
- Each SELECT must have the same number of columns.
- Data types of the columns must be compatible.
- Use UNION ALL when you want to include all occurrences of rows, including duplicates.
Syntax
Following is the syntax of SQL UNION ALL operator:
SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2;
Example
In the following example, we retrieve the SALARY values from the CUSTOMERS table and the AMOUNT values from the ORDERS table, including duplicate values:
SELECT SALARY FROM CUSTOMERS UNION ALL SELECT AMOUNT FROM ORDERS;
This query returns a combined list of salaries and order amounts, including repeated values:
| SALARY |
|---|
| 2000.00 |
| 1500.00 |
| 2000.00 |
| 6500.00 |
| 8500.00 |
| 4500.00 |
| 10000.00 |
| 1500.00 |
| 1560.00 |
| 3000.00 |
| 2060.00 |
SQL UNION ALL with WHERE Clause
You can use the UNION ALL operator in combination with individual WHERE clauses for each SELECT statement to retrieve and merge specific subsets of data without removing duplicates.
Syntax
Following is the syntax of SQL UNION ALL operator with the WHERE clause:
SELECT column1, column2, ... FROM table1 WHERE condition1 UNION ALL SELECT column1, column2, ... FROM table2 WHERE condition2;
Example
The following query retrieves all entries with ID greater than 5 from the CUSTOMERS table and all entries with CUSTOMER_ID greater than 2 from the ORDERS table, preserving duplicates:
SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5 UNION ALL SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2;
This would produce the following result, showing all matching rows including duplicates:
| ID | SALARY |
|---|---|
| 6 | 4500.00 |
| 7 | 10000.00 |
| 3 | 1500.00 |
| 3 | 3000.00 |
| 4 | 2060.00 |
Important Points About SQL UNION Operator
While using the UNION or UNION ALL operators, it is important to keep a few points in mind to avoid errors:
- Column Count Must Match: Each SELECT in a UNION must return the same number of columns.
- Data Types Should Be Compatible: The columns in each SELECT should have similar or compatible data types to avoid casting or errors.
- ORDER BY Goes at the End: If used, the ORDER BY clause should be placed at the end of the final SELECT statement, as it applies to the full result set.
- Aliases Matter: Column aliases defined in the first SELECT statement are used as the column names in the final result set. Later SELECT aliases are ignored.
- Use UNION ALL for Performance: If you don't need to remove duplicates, prefer UNION ALL for better query performance, especially with large datasets.
- Nulls Are Considered Duplicates: When using UNION, rows containing NULLs are also considered for duplicate elimination.
- Functions and Expressions: You can use functions or expressions in SELECT queries within UNION, but be mindful of how they affect data types and column compatibility.
There are two other operators which are like the UNION operator.
SQL INTERSECT Operator: This is used to combine two SELECT statements, but returns rows only from the first SELECT statement that are identical to a row in the second SELECT statement.
SQL EXCEPT Operator: This combines two SELECT statements and returns rows from the first SELECT statement that are not returned by the second SELECT statement.