[2025.10.30] 오늘의 학습 키워드 - Union과 Join

허진원·2025년 10월 30일

내일배움캠프 TIL

목록 보기
9/41
  1. 오늘 학습 키워드
    Union 을 활용해 데이터 테이블 연결하기

  2. 오늘 학습한 내용을 나만의 언어로 정리하기
    오늘의 학습 키워드로 "Union과 Join"이라고 적어 놓긴 했지만, 사실 join은 맛보기 정도로 진도를 나갔고, 오늘 집중적으로 학습한 것은 union 기능이었다. 내용 자체는 간단해서 이론 학습은 짧게 진행하고, 실습에 시간을 더욱 할애하게 되었다.

  3. 학습 내용
    SQL 작성법 중 두 테이블을 동일한 행으로 묶어 주는 "Union" 에 대해서 학습했다.
    join에 비해서 상대적으로 공부할 분량이 적긴 했지만, 이번에는 숙제로 받은 문제가 약간 난해하여 풀어내는 데 시간이 꽤나 걸렸다. 덕분에 union에 대해서는 빠르게 숙지한 듯하여 오히려 좋긴 했다.

  • 학습 주제: Union을 활용한 테이블의 수직 결합

  • 핵심 개념 정리: Union은 서로 다른 두 테이블을 수직으로 묶을 때 활용한다. 이 때, 결합되는 두 테이블의 컬럼 수, 컬럼 순서, 데이터 형식이 동일해야 한다.

  • 코드 예시 + 결과:
    오늘의 실습 문제는 다음과 같다.


    여기서 눈여겨 볼 점은 "OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시"하는 것이다.

    처음에는 'null 값을 어떻게 user_id로 표시하지?' 라는 생각이 들었다. online_sale 테이블과 offline_sale 테이블을 수직으로 결합하기 위해서는 둘이 동일한 컬럼 수를 가져야 한다. 그러나 문제의 조건에 있는 "두 테이블에서 'user_id' 컬럼을 가져와서 값을 출력해라" 라는 문장 덕에 offline_sale 테이블에 새롭게 user_id 컬럼을 만들어야 하는 상황이었다.

    혼자서 장고를 한 결과, 도무지 그럴 듯한 해결책을 도출하지 못 했다. 이 상황을 타파하고자 구글링에 돌입했다. 구글링을 통해 확인해보니, 답은 참으로 간단했다. offline_sale 테이블
    에 데이터 자체가 없는 상황이므로, 이를 가리키는 null 값을 user_id 라는 alias를 부여하는 것으로 online_sale 테이블과 컬럼 수와 순서를 맞춰 주었다.

    이를 토대로 문제에 대한 코드를 작성하면 다음과 같다.

select date_format(sales_date, '%Y-%m-%d') as sales_date, product_id, user_id, sales_amount
from online_sale 
where sales_date>='2022-03-01' and sales_date<'2022-04-01'
union all
select date_format(sales_date, '%Y-%m-%d') as sales_date, product_id, null as user_id, sales_amount
from offline_sale 
where sales_date>='2022-03-01' and sales_date<'2022-04-01'
order by 1, 2, 3
;

여기서 where절의 경우, sales_date에 다른 연산자를 활용해도 같은 결과를 추출하는 것이 가능하다.

예를 들어 where sales_date like ('%2022-03%') 와 같이 쿼리를 작성해도 같은 데이터를 얻을 수 있다. 유의할 점은, 이런 식으로 다른 연산자를 활용할 경우 프로그램이 데이터 계산을 할 때 오류를 낼 수도 있다는 점이다. 예시의 경우에는 2022-03 앞에 다른 날짜를 의미하는 숫자가 포함되어 의도와는 다른 날짜 데이터를 추출할 수도 있다.

따라서 가장 추천되는 방식은 정확한 날짜 범위를 지정해서 오류가 발생할 확률을 줄이는 것이다. 해당 방식이 위에 적힌 정답 코드라고 할 수 있겠다.

정답 코드를 실행하면 다음의 결과를 얻게 된다.

  • 이번 학습을 진행하면서 느낀 점
    이번 문제에는 테이블 정보에 구멍이 존재했다. offline_sale 테이블에 2022-03에 해당하는 데이터가 없었던 것이다. 그렇기 때문에 online_sale 테이블에만 조건을 걸어도 원하는 데이터를 추출하는 것이 가능했다.

    다만, 이번 문제는 테이블의 수도 적고, 각 테이블의 컬럼 수도 적었기 때문에 쉽게 파악할 수 있었다는 점을 간과해선 안 된다. 실제 데이터테이블의 경우는 실습 문제보다 훨씬 많을 것이다. 하나하나 일일이 찾을 수 없다는 뜻이다. 그러므로 가능한 꼼꼼하게 조건을 파악해서 코드를 작성하는 연습을 게을리해서는 안 될 것이다.

  1. 내일 학습할 것은 무엇인지
    내일은 오늘 진행한 union을 복습하고, 다음 주에 배울 join에 대해서 간단하게라도 예습을 진행할 예정이다. SQL에 있어서 가장 큰 벽이라고 생각한다. 미리 벽을 공략할 실마리를 찾아내서 조금이라도 쉽게 허물 수 있도록 하고 싶다.

마치며 : 벌써 2 주차도 끝나 간다. 다음 주부터 본격적인 프로그래밍에 대해서 배우고, 프로젝트도 진행하게 될 것이다. 걱정도 되고, 기대도 되는 복잡미묘한 감정을 느낀다. 끝까지 달려간 끝에 나의 모습이 어떻게 변해있을지 참 설레기도 한다. 잠시 멈출지언정 포기하지는 말자! 화이팅!

profile
국문과 전공 데이터 입문자

0개의 댓글