13.2.9.3 UNION 구문
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
UNION
은 여러 SELECT
문에서 결과를 하나의 결과 집합으로 결합하는 데 사용됩니다.
첫 번째 SELECT
문에서 컬럼 이름이 반환되는 결과의 컬럼 이름으로 사용됩니다. 각 SELECT
문에서 해당 위치에 나열되어있는 선택되는 열은 데이터 형식이 동일하도록합니다. (예를 들어, 첫 번째 명령문에 의해 선택되는 첫 번째 컬럼이 다른 문에 의해 선택되는 첫 번째 컬럼과 형태가 같도록합니다.)
해당 SELECT
컬럼의 데이터 형식이 일치하지 않는 경우, UNION
의 결과에서 컬럼의 형태와 길이는 모든 SELECT
문에 의해 취득 된 값을 고려하여 결정됩니다. 예를 들어, 다음의 예를 생각해 보겠습니다.
mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
+---------------+
| REPEAT('a',1) |
+---------------+
| a |
| bbbbbbbbbb |
+---------------+
이러한 SELECT
문은 일반적인 선택 문이지만 다음과 같은 제한이 있습니다.
INTO OUTFILE
을 사용할 수있는 것은 마지막SELECT
문뿐입니다. (단,UNION
의 결과 전체 파일에 기록됩니다.)HIGH_PRIORITY
를UNION
의 일부인SELECT
문에서 사용할 수 없습니다. 그것을 첫 번째SELECT
에 지정해도 아무런 효과도 없습니다. 그것을 이후 중 하나의SELECT
문에 지정하면 구문 오류가 발생합니다.
UNION
의 기본 동작은 중복 행이 결과에서 제거됩니다. 옵션 DISTINCT
키워드는 이것도 중복 행 삭제를 지정하기위한 기본 이외의 효과는 아무것도 없습니다. 옵션의 ALL
키워드를 지정하면 중복 행 삭제는 실행되지 않고, 그 결과는 모든 SELECT
문에서 일치하는 모든 행이 포함됩니다.
UNION ALL
와 UNION DISTINCT
를 같은 쿼리에서 혼합 할 수 있습니다. 혼합 된 UNION
유형은 DISTINCT
합집합 그 왼쪽에있는 ALL
합집합을 무시하도록 처리됩니다. DISTINCT
합집합은 UNION DISTINCT
을 사용하여 명시 적으로 또는 그 후에 DISTINCT
또는 ALL
키워드없이 UNION
을 사용하여 암시 적으로 생성 할 수 있습니다.
개별 SELECT
에 ORDER BY
또는 LIMIT
를 적용하려면이 절을 SELECT
를 둘러싸는 괄호 안에 넣습니다.
(SELECT a FROM t1 WHERE a = 10 AND B = 1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a = 11 AND B = 2 ORDER BY a LIMIT 10);
그러나 개별 SELECT
문에 ORDER BY
를 사용하여도 UNION
가 기본적으로 정렬되지 않은 행 세트를 생성하기 때문에 최종 결과에 행이 나타나는 순서에는 아무런 영향을주지 없습니다. 따라서 이런 상황에서는 일반적으로 ORDER BY
는 LIMIT
와 함께 사용됩니다. 이에 따라 선택된 행의 UNION
의 최종 결과에 순서에 반드시 영향을 미치는 것은 아님에도 불구하고 SELECT
로 취득하기 위해서 이러한 행의 부분 집합을 결정하는 데 사용되는 것입니다 합니다. ORDER BY
가 SELECT
에 LIMIT
없이 나타나는 경우이 절은 어쨌든 아무것도 효과가 없기 때문에 최적화에 의해 삭제됩니다.
ORDER BY
또는 LIMIT
절을 사용하여 UNION
의 결과 전체를 정렬하거나 제한하려면 개별 SELECT
문을 괄호로 묶고 마지막 문 뒤에 ORDER BY
또는 LIMIT
를 배치합니다. 다음 예제에서는이 두 어구를 사용하고 있습니다.
(SELECT a FROM t1 WHERE a = 10 AND B = 1) UNION (SELECT a FROM t2 WHERE a = 11 AND B = 2) ORDER BY a LIMIT 10;
괄호가없는 문은 지금 나타낸 괄호로 둘러싸인 문과 동일합니다.
이런 종류의 ORDER BY
는 테이블 이름 (즉, tbl_name
. col_name
형식의 이름)을 포함한 열 참조를 사용할 수 없습니다. 대신 첫 번째 SELECT
문에 열 별칭을 지정하고 그 별칭을 ORDER BY
에서 참조합니다. (또는 ORDER BY
에서 열을 그 컬럼 위치를 사용하여 참조합니다. 그러나 컬럼 위치의 사용은 비추천입니다.)
또한 정렬 된 컬럼에 별칭이 지정된 경우 ORDER BY
절은 컬럼 이름 대신 별칭을 참조해야합니다. 다음 중 첫 번째 문은 작동하지만, 두 번째는 Unknown column 'a' in 'order clause'
라는 오류와 함께 실패합니다.
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b; (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;
UNION
의 결과의 행이 각 SELECT
에 의해 하나씩 취득 된 행 세트로 구성되게하려면 정렬 컬럼으로 사용하는 각 SELECT
의 추가 컬럼을 선택하고 마지막 SELECT
의 뒤에 ORDER BY
를 추가합니다.
(SELECT 1 AS sort_col, col1a, col1b ... FROM t1) UNION (SELECT 2, col2a, col2b ... FROM t2) ORDER BY sort_col;
또한 개별 SELECT
결과의 정렬 순서를 유지하려면 ORDER BY
절에 보조 열을 추가합니다.
(SELECT 1 AS sort_col, col1a, col1b ... FROM t1) UNION (SELECT 2, col2a, col2b ... FROM t2) ORDER BY sort_col, col1a;
또한 추가 컬럼을 사용하면 각 행이 어떤 SELECT
에서 검색되는지를 결정할 수도 있습니다. 추가 컬럼은 테이블 이름을 나타내는 문자열 등의 다른 식별 정보도 지정할 수 있습니다.