MySQL UNION
Learn MySQL UNION syntax, duplicate handling, result ordering, and the INTERSECT and EXCEPT operators added in MySQL 8.0.31.
In MySQL, UNION combines rows from two or more query results into one result set. By default, it removes duplicate rows; UNION ALL keeps them.
MySQL 8.0.31 and later also support INTERSECT and EXCEPT. INTERSECT returns rows present in both query results; EXCEPT returns rows from the left query that are absent from the right. Both remove duplicates by default and accept ALL to retain duplicate occurrences. In mixed expressions, MySQL evaluates INTERSECT before UNION or EXCEPT; use parentheses when the intended grouping should be explicit. MySQL uses EXCEPT; it does not support the MINUS spelling used by Oracle. See the MySQL set-operations reference and the MySQL 8.0.31 release notes.
For example, INTERSECT keeps a value found in both queries, while EXCEPT keeps a value only from the left query:
SELECT 1 AS value
INTERSECT
SELECT 1 AS value;
SELECT 1 AS value
EXCEPT
SELECT 2 AS value;
Both queries return the single row 1. These operators are available in MySQL 8.0.31 and later; use UNION for earlier versions.
UNION syntax
The UNION operator is used to combine two result sets of SELECT statements. The syntax of the UNION operator is as follows:
SELECT statement
UNION [DISTINCT | ALL]
SELECT statement
Here:
UNIONis a binary operator and it require twoSELECTstatements as operands.- In the two
SELECTstatements, the number and order columns must be the same. UNION DISTINCTwill remove duplicate rows and return a unique result set, andUNION ALLwill return all rows from the two result sets.- The
DISTINCTkeyword inUNION DISTINCTcan be omited.
UNION examples
Create table for testing
In the following examples, we create a, b and c tables as demonstrations.
Create table and insert test rows:
CREATE TABLE a (v INT);
CREATE TABLE b (v INT);
CREATE TABLE c (v INT);
INSERT INTO a VALUES (1), (2), (NULL), (NULL);
INSERT INTO b VALUES (2), (2), (NULL);
INSERT INTO c VALUES (3), (2);
The rows in table a:
+------+
| v |
+------+
| 1 |
| 2 |
| NULL |
| NULL |
+------+
4 rows in set (0.00 sec)The rows in b table:
+------+
| v |
+------+
| 2 |
| 2 |
| NULL |
+------+
3 rows in set (0.00 sec)The rows in c table:
+------+
| v |
+------+
| 3 |
| 2 |
+------+
2 rows in set (0.00 sec)UNION example
The following statement combins all rows from a and b tables using the UNION operator:
SELECT * FROM a
UNION
SELECT * FROM b;
+------+
| v |
+------+
| 1 |
| 2 |
| NULL |
+------+
3 rows in set (0.00 sec)You can see that the output result set does not include duplicate rows, because the UNION operator remove all duplicate row as same as UNION DISTINCT.
UNION It is UNION DISTINCT shorthand.
You can also combine three tables using UNION operator.
SELECT * FROM a
UNION
SELECT * FROM b
UNION
SELECT * FROM c;
+------+
| v |
+------+
| 1 |
| 2 |
| NULL |
| 3 |
+------+
4 rows in set (0.00 sec)UNION ALL
The following statement combins all rows from a and b tables using the UNION ALL operator:
SELECT * FROM a
UNION ALL
SELECT * FROM b;
+------+
| v |
+------+
| 1 |
| 2 |
| NULL |
| NULL |
| 2 |
| 2 |
| NULL |
+------+
7 rows in set (0.00 sec)You can see that the output result set includes all rows from a and b tables.
UNION and UNION ALL
Let us see the following example:
SELECT * FROM a
UNION
SELECT * FROM b
UNION ALL
SELECT * FROM c;
+------+
| v |
+------+
| 1 |
| 2 |
| NULL |
| 3 |
| 2 |
+------+
5 rows in set (0.00 sec)Here is the execution steps of this example:
- First, combine the rows from
aandbtables using theUNIONoperator. It returns a unique result set fromaandbtables. - Second, combine the result set of the first step and
ctable using theUNION ALLoperator.
UNION and ORDER BY
To sort the rows return from the UNION operator, you can use ORDER BY clause after UNION statement.
The following statement combins all rows from a and b tables using the UNION ALL operator and sorts the rows in ascending order:
SELECT * FROM a
UNION ALL
SELECT * FROM b
ORDER BY v;
+------+
| v |
+------+
| NULL |
| NULL |
| NULL |
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
+------+
8 rows in set (0.01 sec)In the global ORDER BY, refer to the combined result’s output columns rather than a source-table name. If you see Error 1250 for this restriction, see MySQL Error 1250: UNION ORDER BY Cannot Reference Source Tables.
UNION columns
The two SELECT statements of the UNION operator must have the same number of columns, otherwise an error will occur.
Let us try to run the following statement:
SELECT 1
UNION
SELECT 2, 3;
ERROR 1222 (21000): The used SELECT statements have a different number of columnsBecause SELECT 1 have one column, but SELECT 2, 3 have two columns. The number of columns in the two statements are different, which leads to an error.
For a checklist and examples that fix this failure, see MySQL Error 1222: UNION SELECTs Return Different Column Counts.
UNION column name
The column names for a UNION result set are taken from the column names of the first SELECT statement.
Let us take a look at the two result set of the UNION operator:
SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)This first result set has only one column, and the column name is 1.
SELECT 2;
+---+
| 2 |
+---+
| 2 |
+---+
1 row in set (0.00 sec)This second result set has only one column, and the column name is 2.
Let us combine the two result sets using UNION operator:
SELECT 1 UNION SELECT 2;
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)The column name for the UNION result set is as same as SELECT 1 because SELECT 1 is the first SELECT statement.
Now let us exchange the two result sets in UNION statement:
SELECT 2 UNION SELECT 1;
+---+
| 2 |
+---+
| 2 |
| 1 |
+---+
2 rows in set (0.00 sec)The column name for the UNION result set is as same as SELECT 2 because SELECT 2 is the first SELECT statement.
Then, if we want to use a column alias, we just need to set an alias for the column of the first SELECT statement, like this:
SELECT 2 AS c
UNION
SELECT 1;
+---+
| c |
+---+
| 2 |
| 1 |
+---+
2 rows in set (0.00 sec)Conclusion
In this article, you learned the syntax and use cases of the UNION operator. The following are the key points of the UNION operator:
- The
UNIONoperator is used to combine two result sets into one. - The
UNIONoperator includesUNION DISTINCTandUNION ALLtwo algorithms, whichUNION DISTINCTcan be abbreviatedUNION. UNIONremoves duplicate rows in the two result set, andUNION ALLthen retain all rows.- The two result sets in a
UNIONmust have same number of columns. - The column names for a
UNIONresult set are taken from the column names of the firstSELECTstatement. - You may be used
ORDER BYto sort the result of aUNION.