메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
조인은 테이블을 나란히 놓아 결과를 넓힙니다. UNION은 결과를 위아래로 쌓아 결과를 길게 만듭니다. 2개의 쿼리가 같은 형태의 행을 만들고 그것을 1개의 목록으로 원할 때 쓰세요. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

UNION의 동작 방식

각 COLUMN_LIST를 원하는 열로, FIRST_TABLE과 SECOND_TABLE을 읽을 테이블로 바꾸세요. 2개의 쿼리는 같은 수의 열을 반환해야 하고, 서버는 그 열들을 이름이 아니라 위치로 맞춥니다. UNION은 중복 행을 제거합니다. UNION ALL은 중복 행을 유지하고, 아무것도 비교할 필요가 없어서 더 빠릅니다.

예제

  1. UNION은 중복을 제거합니다

여기서는 두 부분이 같은 쿼리이므로, 두 번째의 모든 행은 첫 번째에 있는 행의 중복입니다.
2,000개에서 5개의 행입니다. UNION은 합쳐진 결과의 중복을 1번에 제거하므로, 한 부분 안의 반복도 부분 사이의 반복과 같은 방식으로 처리됩니다. 답은 같은 열에 대한 SELECT DISTINCT와 일치합니다.

  1. UNION ALL은 중복을 유지합니다

두 부분의 모든 행입니다. 중복이 없다는 것을 알 때, 또는 중복이 핵심일 때는 언제나 UNION ALL을 쓰세요.

  1. 다른 테이블의 행 쌓기

이것이 UNION의 진짜 용도입니다: 같은 종류의 것을 담은 2개의 테이블입니다. 리터럴 열이 각 행이 어느 부분에서 왔는지 말해 줍니다.
두 번째 쿼리는 리터럴에 별칭을 붙이지 않습니다. 열 제목은 첫 번째 쿼리에서만 오기 때문에 필요하지 않습니다.

UNION은 순서를 약속하지 않습니다

어느 부분도 통째로, 또는 먼저 도착한다고 보장되지 않습니다. 서버는 플랜이 만들어 낸 순서 그대로 행을 반환하므로, 동일한 2개의 쿼리를 UNION ALL하면 서로 섞여 나올 수 있습니다. 끝에 붙이는 ORDER BY가 순서를 고정하는 유일한 방법이고, 이는 LIMIT 및 GROUP BY에서와 같습니다.

두 부분의 열 수가 같아야 합니다

열 이름은 일치하지 않아도 됩니다. 수만 엄격하게 검사되며, 무엇이든 실행되기 전에 검사됩니다.

ORDER BY는 결과 전체에 적용됩니다

끝에 있는 ORDER BY는 마지막 쿼리가 아니라 합쳐진 행을 정렬합니다. 첫 번째 부분의 별칭을 쓰세요. 결과 열이 그 이름으로 불리기 때문입니다.
1개의 부분만 따로 정렬하거나 제한하려면, 그 부분을 괄호로 감싸고 ORDER BY와 LIMIT을 그 안에 넣으세요.

요약

  • 2개의 쿼리의 행을 1개의 결과로 쌓으려면 UNION을 쓰세요.
  • UNION은 중복을 제거하고 UNION ALL은 유지한다고 예상하세요.
  • 중복이 없다는 것을 알 때는 UNION ALL을 쓰세요. 하는 일이 적습니다.
  • 두 부분에 같은 수의 열을 주세요. 아니면 ERROR 1222가 납니다.
  • 제목은 첫 번째 쿼리에서 오고, 끝의 ORDER BY는 전체를 정렬한다고 예상하세요.

함께 보기