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은 중복 행을 유지하고, 아무것도 비교할 필요가 없어서 더 빠릅니다.
예제
- UNION은 중복을 제거합니다
여기서는 두 부분이 같은 쿼리이므로, 두 번째의 모든 행은 첫 번째에 있는 행의 중복입니다.
UNION은 합쳐진 결과의 중복을 1번에 제거하므로, 한 부분 안의 반복도 부분 사이의 반복과 같은 방식으로 처리됩니다. 답은 같은 열에 대한 SELECT DISTINCT와 일치합니다.
- UNION ALL은 중복을 유지합니다
UNION ALL을 쓰세요.
- 다른 테이블의 행 쌓기
이것이 UNION의 진짜 용도입니다: 같은 종류의 것을 담은 2개의 테이블입니다. 리터럴 열이 각 행이 어느 부분에서 왔는지 말해 줍니다.
UNION은 순서를 약속하지 않습니다
어느 부분도 통째로, 또는 먼저 도착한다고 보장되지 않습니다. 서버는 플랜이 만들어 낸 순서 그대로 행을 반환하므로, 동일한 2개의 쿼리를UNION ALL하면 서로 섞여 나올 수 있습니다. 끝에 붙이는 ORDER BY가 순서를 고정하는 유일한 방법이고, 이는 LIMIT 및 GROUP BY에서와 같습니다.
두 부분의 열 수가 같아야 합니다
ORDER BY는 결과 전체에 적용됩니다
끝에 있는ORDER BY는 마지막 쿼리가 아니라 합쳐진 행을 정렬합니다. 첫 번째 부분의 별칭을 쓰세요. 결과 열이 그 이름으로 불리기 때문입니다.
ORDER BY와 LIMIT을 그 안에 넣으세요.
요약
- 2개의 쿼리의 행을 1개의 결과로 쌓으려면
UNION을 쓰세요. UNION은 중복을 제거하고UNION ALL은 유지한다고 예상하세요.- 중복이 없다는 것을 알 때는
UNION ALL을 쓰세요. 하는 일이 적습니다. - 두 부분에 같은 수의 열을 주세요. 아니면
ERROR 1222가 납니다. - 제목은 첫 번째 쿼리에서 오고, 끝의
ORDER BY는 전체를 정렬한다고 예상하세요.
함께 보기
- SELECT DISTINCT — 1개의 쿼리에서 중복 제거하기
- 조인의 동작 방식 — 대신 테이블을 나란히 결합하기
- 서브쿼리 — 쌓는 대신 값으로 쓰이는 쿼리