MySQL UNION - 완전한 튜토리얼
⚡ 스마트 요약
MySQL UNION은 두 개 이상의 SELECT 쿼리 결과를 하나의 통합된 결과 집합으로 결합합니다. 이 설명에서는 UNION을 유효하게 만드는 열 규칙, UNION DISTINCT와 UNION ALL의 차이점, 그리고 myflixdb 데이터베이스를 사용한 예제를 다룹니다.

노동조합이란 무엇인가요? MySQL?
UNION 하는 MySQL 여러 SELECT 쿼리의 결과를 하나의 통합 결과 집합으로 결합하는 연산자입니다. 두 번째 쿼리에서 반환된 행은 첫 번째 쿼리에서 반환된 행 아래에 배치되어 두 개의 별도 목록 대신 하나의 세로 목록이 생성됩니다.
이 기능이 제대로 작동하기 위한 유일한 조건은 결합해야 하는 모든 SELECT 쿼리의 열 개수가 동일해야 한다는 것입니다.
다음과 같은 두 개의 표가 있다고 가정해 보겠습니다.
두 테이블 모두 동일한 유형의 열 두 개를 포함하고 있으므로 합치기가 가능합니다. 다음 예제에서는 이 두 테이블을 정확히 결합합니다.
UNION을 사용해야 하는 이유는 무엇일까요?
데이터베이스 설계에 결함이 있어 동일한 목적으로 서로 다른 두 테이블을 사용하고 있다고 가정해 보겠습니다. 이 두 테이블을 중복된 레코드를 제외하고 하나의 테이블로 통합하고 싶습니다.ping 새 테이블로 병합합니다. 이런 경우에는 UNION을 사용할 수 있습니다.
해당 연산자는 일상적인 보고 업무에도 유용합니다.
- Archived 및 실시간 데이터: 동일한 열을 공유하는 현재 테이블과 아카이브 테이블은 물리적으로 병합하지 않고도 함께 보고서를 생성할 수 있습니다.
- 여러 출처, 하나의 보고서: 회원 및 영화 목록, 또는 두 지역의 판매량을 한 번에 표시하여 신속하게 확인할 수 있습니다.
- 마이그레이션 검사: 기존 테이블과 새 테이블의 행을 쌓아서 비교한 후 기존 테이블을 삭제할 수 있습니다.
UNION은 JOIN을 대체할 수 없습니다. UNION은 행 아래에 행을 추가하는 반면, JOIN은 열 옆에 열을 추가합니다. 이러한 차이점이 작업에 적합한 연산자를 결정합니다.
MySQL UNION 구문 및 규칙
이제 목적이 명확해졌으니, 구문의 형식과 데이터베이스가 적용하는 규칙을 살펴보세요.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
모든 노동조합에는 세 가지 규칙이 적용된다.
- 열 개수가 같습니다. 각각의 SELECT 문 동일한 열 개수를 반환해야 합니다. 그렇지 않으면 MySQL 오류 코드 1222가 발생합니다.
- 호환되는 데이터 유형을 동일한 순서로 입력하세요. 첫 번째 쿼리의 첫 번째 열과 두 번째 쿼리의 첫 번째 열이 일치하므로 숫자는 숫자와, 텍스트는 텍스트와 일치해야 합니다.
- 이름은 첫 번째 쿼리에서 가져옵니다. 결과 집합의 제목은 첫 번째 SELECT 문에서 가져오므로 모든 별칭은 그 위치에 있어야 합니다.
An ORDER BY 또는 LIMIT 절이 끝에 위치하면 결과의 특정 분기가 아닌 전체 결과에 적용되며, 첫 번째 SELECT 문에서 생성된 열 이름을 참조해야 합니다.
개별 노동조합 vs 전체 노동조합
규칙이 정해졌으므로 이제 남은 결정은 중복된 행을 유지할지 여부입니다.
DISTINCT를 사용하여 테이블 결합
이제 DISTINCT를 사용하여 두 테이블을 결합하는 UNION 쿼리를 만들어 보겠습니다.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
여기서 중복 행은 제거되고 고유한 행만 반환됩니다.
참고 : MySQL 아무것도 지정되지 않은 경우 UNION 쿼리를 실행할 때 DISTINCT 절을 기본값으로 사용합니다.
ALL을 사용하여 테이블 결합
이제 ALL 연산자를 사용하여 두 테이블을 결합하는 UNION 쿼리를 만들어 보겠습니다.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
여기서는 ALL을 사용하기 때문에 중복된 행도 포함됩니다.
두 이미지를 통해 차이점을 쉽게 확인할 수 있으며, 아래 표는 그 차이점을 요약한 것입니다.
| 비교의 지점 | 유니온 디스트릭트 | UNION ALL |
|---|---|---|
| 중복 행 | 결과에서 제외됨 | 결과에 포함됨 |
| 기본 동작 | 네, 아무런 지정이 없을 경우 적용됩니다. | 아니요, 'ALL'이라는 키워드를 반드시 써야 합니다. |
| 속도 | 속도가 느리고 중복 제거 과정이 필요합니다. | 더 빠르고, 행은 읽히는 즉시 반환됩니다. |
| 가장 잘 사용되는 경우 | 병합된 목록에는 고유한 행이 포함되어야 합니다. | 모든 행이 중요하며, 그렇지 않으면 중복이 발생할 수 없습니다. |
💡 팁: 두 분기에서 중복되는 행이 생성되지 않으면 UNION ALL을 선택하십시오. 그러면 데이터베이스는 DISTINCT에 필요한 정렬 및 비교 작업을 건너뛰므로 대규모 테이블에서 상당한 시간 절약을 얻을 수 있습니다.
실제 예시를 사용하여 MySQL 워크 벤치
지금까지의 예제에서는 샘플 테이블을 사용했습니다. 이제 동일한 쿼리를 실제 myflixdb 데이터베이스에서 실행해 보면, 두 테이블에 저장된 레코드가 완전히 다릅니다.
myFlixDB에서 다음을 결합해 보겠습니다. membership_number full_names 멤버 테이블의 열을 사용하여 movie_id title 영화 테이블의 열입니다. 두 쿼리 모두 두 개의 열을 반환하므로 합집합은 유효합니다.
다음 쿼리를 사용할 수 있습니다.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
위 스크립트를 실행하면 MySQL 워크 벤치 myflixdb를 대상으로 검색하면 아래와 같은 결과가 나옵니다. 아래쪽 행들이 영화 레코드임에도 불구하고 헤더는 첫 번째 SELECT 문에서 가져온 것임을 알 수 있습니다.
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |




