MySQL UNION - 완전한 튜토리얼

⚡ 스마트 요약

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

  • 🔗 핵심 목적: UNION은 여러 SELECT 쿼리가 반환한 행들을 하나의 결과 집합으로 쌓아 올리는데, 각 쿼리의 결과가 아래에 나열됩니다.
  • 📐 열 규칙: 모든 SELECT 문은 동일한 개수의 열을 동일한 순서로, 호환 가능한 데이터 형식으로 반환해야 합니다.
  • 🧹 유니온 디스팅트: 중복된 행은 제거되고 고유한 행만 반환되며, 이것이 일반적인 동작 방식입니다. MySQL 기본적으로 적용됩니다.
  • 📚 전체 연합: 중복된 행을 포함하여 모든 행이 반환되므로 중복 제거 과정이 필요 없어 속도가 더 빠릅니다.
  • 🏷️ 열 이름: 결과 집합은 첫 번째 SELECT 문에서 열 이름을 가져오므로 별칭은 해당 쿼리에 있어야 합니다.
  • 🛠️ 일반적인 사용: 동일한 유형의 레코드를 저장하는 두 테이블을 통합하되, 병합된 결과에 중복 행이 포함되지 않도록 합니다.

MySQL UNION Opera바위 산

노동조합이란 무엇인가요? MySQL?

UNION 하는 MySQL 여러 SELECT 쿼리의 결과를 하나의 통합 결과 집합으로 결합하는 연산자입니다. 두 번째 쿼리에서 반환된 행은 첫 번째 쿼리에서 반환된 행 아래에 배치되어 두 개의 별도 목록 대신 하나의 세로 목록이 생성됩니다.

이 기능이 제대로 작동하기 위한 유일한 조건은 결합해야 하는 모든 SELECT 쿼리의 열 개수가 동일해야 한다는 것입니다.

다음과 같은 두 개의 표가 있다고 가정해 보겠습니다.

MySQL UNIONMySQL UNION

두 테이블 모두 동일한 유형의 열 두 개를 포함하고 있으므로 합치기가 가능합니다. 다음 예제에서는 이 두 테이블을 정확히 결합합니다.

UNION을 사용해야 하는 이유는 무엇일까요?

데이터베이스 설계에 결함이 있어 동일한 목적으로 서로 다른 두 테이블을 사용하고 있다고 가정해 보겠습니다. 이 두 테이블을 중복된 레코드를 제외하고 하나의 테이블로 통합하고 싶습니다.ping 새 테이블로 병합합니다. 이런 경우에는 UNION을 사용할 수 있습니다.

해당 연산자는 일상적인 보고 업무에도 유용합니다.

  • Archived 및 실시간 데이터: 동일한 열을 공유하는 현재 테이블과 아카이브 테이블은 물리적으로 병합하지 않고도 함께 보고서를 생성할 수 있습니다.
  • 여러 출처, 하나의 보고서: 회원 및 영화 목록, 또는 두 지역의 판매량을 한 번에 표시하여 신속하게 확인할 수 있습니다.
  • 마이그레이션 검사: 기존 테이블과 새 테이블의 행을 쌓아서 비교한 후 기존 테이블을 삭제할 수 있습니다.

UNION은 JOIN을 대체할 수 없습니다. UNION은 행 아래에 행을 추가하는 반면, JOIN은 열 옆에 열을 추가합니다. 이러한 차이점이 작업에 적합한 연산자를 결정합니다.

MySQL UNION 구문 및 규칙

이제 목적이 명확해졌으니, 구문의 형식과 데이터베이스가 적용하는 규칙을 살펴보세요.

SELECT column1, column2 FROM `table1`
UNION [DISTINCT | ALL]
SELECT column1, column2 FROM `table2`;

모든 노동조합에는 세 가지 규칙이 적용된다.

  1. 열 개수가 같습니다. 각각의 SELECT 문 동일한 열 개수를 반환해야 합니다. 그렇지 않으면 MySQL 오류 코드 1222가 발생합니다.
  2. 호환되는 데이터 유형을 동일한 순서로 입력하세요. 첫 번째 쿼리의 첫 번째 열과 두 번째 쿼리의 첫 번째 열이 일치하므로 숫자는 숫자와, 텍스트는 텍스트와 일치해야 합니다.
  3. 이름은 첫 번째 쿼리에서 가져옵니다. 결과 집합의 제목은 첫 번째 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

자주 묻는 질문

UNION은 한 쿼리의 행들을 다른 쿼리의 행 아래에 쌓아 올리므로 결과의 높이가 더 높아집니다. JOIN 관련 행들을 찾아 열을 나란히 배치하므로 결과의 너비가 늘어납니다. 유사한 행에는 UNION을 사용하고, 관련 테이블에는 JOIN을 사용하세요.

하나를 놓으세요 주문 마지막 SELECT 문 뒤에 LIMIT 절을 넣으면 됩니다. 이 절은 결합된 결과를 정렬하며, 첫 번째 SELECT 문에서 생성된 열 이름을 사용해야 합니다. 이 위치에 LIMIT 절을 넣으면 동일하게 작동합니다.

SELECT 분기에서 반환되는 열 개수가 같지 않을 때 오류 1222가 발생합니다. 각 분기의 열 개수를 세고, 더 적은 수의 분기에 리터럴 또는 NULL 자리 표시자를 추가하여 양쪽의 열 개수 순서가 일치하도록 하십시오.

예. 내장된 기능을 포함하여 텍스트를 SQL로 변환하는 도우미 기능이 있습니다. MySQL 워크 벤치일반 요청에서 UNION 문을 생성합니다. 모델은 단순히 비슷하게 보이는 열들을 정렬할 수 있으므로 열 순서를 직접 확인하세요.

보조 기능은 중복이 불가능한 경우 UNION ALL을 제안할 수 있으며, 이는 일반적으로 속도 향상에 도움이 됩니다. 하지만 이 결정은 데이터에 따라 달라지므로, 중복 제거 단계를 제거하기 전에 분기가 실제로 겹치지 않는지 확인해야 합니다.

이 게시물을 요약하면 다음과 같습니다.