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 에서 검색되는지를 결정할 수도 있습니다. 추가 컬럼은 테이블 이름을 나타내는 문자열 등의 다른 식별 정보도 지정할 수 있습니다.