대학 시절 백엔드 개발을 하며 '쿼리'를 써볼 일이 많지 않았다.
주로 Springboot 프레임워크에서 JPA를 써서 개발을 했기 때문에 간단한 함수만 사용하고 직접 쿼리를 짜서 데이터를 뽑아본 적은 없었던 것이다.
물론 대학에서 데이터베이스 수업을 들었을 때는 나름 열심히 했지만....
대학을 졸업하고 개발자로 취업하여 실무를 보고 있는 지금, Java 코드보다 SQL 쿼리를 훨씬 더 많이 보고 있다.
개인 프로젝트를 했을 때 데이터베이스에서는 단순히 필요한 데이터만 가져오고 그것을 정제하는 건 백엔드 코드에서 했었다.
그런데 실무에서는 대부분 쿼리에서 원하는 데이터를 원하는 형식으로 정제하고 코드에서는 그저 그것을 리턴하는 정도의 역할만 한다.
이것이 내가 경험한 실무와 개인 개발의 가장 큰 차이인 것 같다.
이러한 문제로 나는 쿼리에서 아주 크으으은 실수를 해버렸다...
UNION ALL 을 사용하는 쿼리에서 SELECT 데이터의 순서를 맞추지 않았던 것이다...
나는 숫자값과 날짜값을 가져오는 쿼리를 짰는데 첫번째 쿼리에서는 SELECT 숫자컬럼, 날짜컬럼 으로 조회하고,
UNION 뒤에 있는 두번째 쿼리에서는 SELECT 날짜컬럼, 숫자컬럼 으로 조회하는 바람에 날짜가 invaild value로 출력돼버렸다.

이렇게 출력을 하니 UNION될 때 데이터 형식 간 문제가 생겼던 것이다.
다시 이런 문제를 일으키지 않기 위해 UNION과 UNION ALL에 대해 확실히 정리하자.
UNION과 UNION ALL 모두 데이터를 결합하는 데 사용한다.
UNION과 UNION ALL의 차이점은 '중복된 행을 다루는 방식'이다.
UNION을 먼저 살펴보자.
UNION은 두 개 테이블을 행으로 결합할 때 사용하고 각 테이블에서 중복된 행은 제거한다.
예를 들어, '회원' 테이블에서 회원 정보를 가져오고 '탈퇴회원' 테이블에서 회원 정보를 가져올 때 UNION을 쓴다면 회원 테이블과 탈퇴 회원 테이블에 있는 회원은 한번만 출력된다.
여기서 '중복된 행'이라고 하는 것은 모든 컬럼 값이 일치하는 경우를 일컫는다.
UNION ALL은 두 개의 테이블을 행으로 결합할 때 사용하고 각 테이블에서 중복된 행이라고 하더라도 결과에 다 포함되어 나온다.
예를 들어, 앞서 들은 예시에 UNION 대신 UNION ALL을 쓴다면 회원 테이블과 탈퇴 회원 테이블에 있는 회원 정보는 모두 출력된다.
그리고 주의할 점!!
UNION, UNION ALL을 쓸 때에는 SELECT 절의 컬럼값 순서를 맞춰야한다!!
조회 값의 순서가 다르면 UNION (ALL) 앞에 있는 첫번째 쿼리를 중심으로 컬럼 순서가 정해진다.
예를 들어, 아래와 같이 쿼리를 짰다고 가정해보자.
SELECT STU_ID, NM, PHONE_NUM, AGE, ADDR
FROM STUDENT
WHERE AGE >= 17 AND ADDR LIKE '%CALIFORNIA%'
UNION
SELECT STU_ID, NM, PHONE_NUM, ADDR, AGE
FROM STUDENT
WHERE AGE < 17 AND ADDR LIKE '%NEWYORK%'
첫번째 쿼리와 두번째 쿼리의 SELECT 절을 보면 AGE, ADDR의 순서가 다른 것을 알 수 있다.
(AGE는 INT, ADDR는 VARCHAR 형이라고 가정하자)
나는 이 쿼리의 결과를 화면에 표로 뿌릴 건데 AGE 컬럼은 숫자 + '세'로 되어있고, ADDR 컬럼은 문자 그대로 출력되게끔 되어있다.
이 쿼리를 실행시키면 어떻게 될까?
| STU_ID | NM | PHONE_NUM | AGE | ADDR |
| 1 | KEVIN | 010-0000-0000 | 17세 | CALIFORNIA ~~~ |
| 2 | ELISABETH | 010-0000-0000 | NEWYORK ~~~세 | 15 |
| 3 | JOHN | 010-0000-0000 | NEWYORK ~~~세 | 19 |
운이 좋으면 위처럼 출력이 될 것이고,,,
| STU_ID | NM | PHONE_NUM | AGE | ADDR |
| 1 | KEVIN | 010-0000-0000 | 17세 | CALIFORNIA ~~~ |
| 2 | ELISABETH | 010-0000-0000 | invalid value세 | invalid value |
| 3 | JOHN | 010-0000-0000 | invalid value세 | invalid value |
운이 안좋으면 위처럼 출력이 될 것이다...
그래서!! UNION (ALL) 을 쓸 때 우리는 꼭!!! 컬럼의 순서와 데이터 형식을 잘 지켜줘야한다.
UNION (ALL) 으로 데이터가 결합될 때는 첫번째 쿼리의 컬럼명을 기준으로 결과에 반영하게 된다는 점을 명심하자.
신입 개발자로 들어와서 처음 겪었던 큰 실수였다.
앞으로 조심 또 조심하며 공부해나가겠지만 어디서든 어떤 일이든 실수가 아예 없다는 것은 거의 불가능에 가깝다.
혼나는 것에도 익숙해져야하고 또 끝없이 자기개발하며 스스로를 발전시키는 데에도 익숙해져야겠지.
취업은 끝이 아니다!!! 오히려 진짜 시작이다!!
일이 많아 급하더라도 급한 마음을 내려놓고 신중하고 꼼꼼하게 일을 대하는 자세를 배워나가야겠다.
'SQL' 카테고리의 다른 글
| PAD + MOD (0) | 2026.02.03 |
|---|---|
| 빈 그릇 테이블, DUAL (3) | 2025.12.16 |
| 두 테이블을 비교하여 값 갱신하기, MERGE 사용법 (0) | 2025.12.11 |