본문 바로가기
SQL

[SQL] 데이터리안 입문반을 수강하며 개인적으로 헷갈린 부분 모음집

by 포 키 2025. 12. 17.
반응형

입문반이 종강한지는 보름이 훨씬 넘어갔지만 이제야 입문반을 수강하면서 개인적으로 많이 헷갈렸던 부분들을 모아서 작성하게 됐다.

그동안 농총 알바를 하느라 정신이 없었기도 하고, 생일 핑계로 놀고 하느라 좀 뒤로 미룬건 안비밀...ㅋㅋ

여튼 더이상의 잡담은 멈춰두고 다시 본론으로 넘어가서 포스팅을 진행해보려 한다.

 

1. INNER JOIN vs LEFT JOIN

이너 조인과 아웃터 조인 이 두가지는 활용법을 어떻게 구별을 해야하는지 진짜 아직까지도 헷갈리는게 끝나질 않는다.

심지어 이거로 디스코드 질문방에 글을 올렸는데 내가 헷갈려서 어떤 부분을 명확하게 적시하지 않았는지를 헷갈려가지고 멘토님들이 추가로 어떤 문제에서 그런 어려움을 겪었는지 예시를 들어달라고 하셨는데 아직 못올렸다.. 마침 생각난김에 이거 적고 올려야겠다.

 

조인 구문 개념

조인 구문의 개념이 흔들리지는 않는다.

이너 조인의 경우에는 각자 독립적인 두 테이블이 있다고 가정할 때, 두 테이블에서 모두 존재하는 데이터만 교집합으로 추출해서 보여준다.

아웃터 조인의 경우에는 각자 독립적인 두 테이블이 마찬가지로 존재할 때, FROM 절에 작성하는 것을 왼쪽에 둔다고 하면 LEFT, RIGHT 조인에 따라 해당 조인 구문의 테이블을 동일한 값이 있다면 덧붙이고 없으면 NULL값으로 채워 보여주는 것으로, 교집합 개념과 다르다.

 

헷갈리는 부분

SELECT *
FROM TABLE1
	INNER JOIN TABLE2 ON TABLE1.A = TABLE2.A

위와 같은 코드가 있다고 가정을 했을 때, 테이블1과 2의 A 라는 항목이 같은 값을 교집합으로 추출하는 경우의 문제가 어떤 상황인건지가 매칭이 안되고 있다.

뒤에서도 다룰거지만, UNION의 경우는 2024년까지의 고객 데이터가 있는 상태에서 2025년 고객 데이터를 추가로 이어 붙이기 위해 사용한다는 것처럼 이너조인과 아웃터조인이 각각 어떻게 활용이 되는지 예시를 정확하게 모르겠고 구별도 못하겠다.

분명 문제에는 어떻게 하라고 되어 있는데 그게 이너 조인을 써서 하는지 아웃터 조인을 써서 하는지를 캐치를 못해낸다는 것.

 

이너/아웃터 조인 활용 예시

일단 지피티를 통해 추가로 더 찾아봤는데 처음에 많이들 헷갈려하는 부분이라고 언급을 해서 약간 나만 그런 생각을 하는건 아니었나? 하고 마음이 조금은 편해졌다. (아무도 관련 질문이 없길래 나만 이해를 못하는걸까 하고 좀 위축되어 있었음..ㅋㅋ)

 

일단 결론을 말하면, 문제에서 주어진 상황을 캐치하기 위해 중심만 파악하면 된다.

 

1. 한쪽 테이블에만 존재하는 데이터가 의미가 있을 때 = 이너 조인

이게 무슨말이냐? 이커머스 산업군을 예시로 들면, 가입되어 있는 모든 고객 데이터가 들어있는 테이블을 고객 테이블이라 하고 실제 주문에 대한 데이터가 들어있는 테이블을 주문 테이블이라고 하겠다.

그러면 이 기업의 경우는 모든 고객 데이터보단 실제 주문한 고객들이 재구매를 하는지, 최근 몇달안에 구매를 했는지 등에 대한 데이터를 활용해 매출 분석을 할 것이다.

그러니까 고객 테이블은 모든 고객의 정보는 있지만, 모든 고객이 주문을 하는 것은 아니기 때문에 주문건에 대해 고객 정보를 필요한 일부만 가져오면 된다.

이런식으로 문제에서 '주문한 고객에 대해서만 데이터를 알아보고 싶다' 와 같이 한 테이블을 기준으로 데이터를 활용하고자 하는 경우 이너 조인을 사용한다.

 

2. 전체 테이블의 내용을 기준으로 전체를 합해 데이터를 봐야 할 때 = 아웃터 조인

위의 사례와 다르게 매출분석이 아니라 마케팅을 하고 싶어서 가입한 고객들을 대상으로 데이터를 분석해서 어떤 기준으로 고객들이 자주 사용하는지 아니면 이탈했는지 등에 대해 알고 이탈한 고객을 위한 새로운 마케팅을 진행해야하는 상황과 같이 전체를 기준으로 내용이 있으면 덧붙여서 한번에 보는 것이 필요한 상황에서는 아웃터 조인이 필요하다.

 

결론

질문을 기준으로 볼 때, 기준이 되는 테이블이 명확하거나 특정하게 어떤 상황이 아닌 경우도 포함하라는 말이 있으면 아웃터 조인을 사용하고 둘다 존재하는 실거래가 발생한 경우라거나 성적 처리, 보안로그 검토를 위해 실제 로그가 있는 것만 탐색하기 등의 경우는 이너 조인을 사용한다.

 

 

2. 대칭(symmetric) 쌍 COUNT

이건 해커랭크 사이트에 나와있는 문제 중에 대칭쌍으로 존재하는 경우를 다룬 문제에서 발생한 이슈다.

Symmetric Pairs 문제를 직접 풀어보고 싶은 사람들을 위해 링크를 먼저 남겨놓겠다.

문제에서 요구하는 것은 (1,2) (2,1) 과 같은 대칭 쌍을 구하고자 하는 것으로, (1,1) 과 같이 x, y 좌표가 같은 경우에는 해당 좌표가 똑같이 2개를 갖지 않으면 제외를 시켜야 하는 상황이다.

이 문제는 내 힘으로 절대 풀 수 없는 수준이었다. (하하... 공부 더 해야지...!!)

일단, 입문반에서는 서브 쿼리를 다루지 않는다. 그것까지 다뤘으면 아마 좀 어려워서 나가떨어진 분들도 있었을 것 같긴해서 왜 없지 라는 생각은 안든다.

나중에 서브쿼리를 공부한 후에 다시한번 풀면 눈에 보이지 않을까 하고 다시 풀어보려고 고대하고 있는 문제 중 하나이다.

 

문제 상황

해당 문제의 경우에는 다음의 두가지 조건이 있었다.

좌표 두개가 서로 대칭 쌍을 이룰 것 + x, y 좌표가 동일한 수를 가질 때, 중복값이 필요함

결론적으로 이 둘을 통합하기 위해서는 count 라는 집계함수를 반드시 사용해야만 했다.

왜냐? 저 빨간 글씨 부분을 충족시키기 위해서!

나는 조인구문만 사용해서 문제를 풀려고 노력하다가 못풀겠다는 판단이 서서 코드를 찾아봤더니 서브쿼리에 카운트를 사용해서 조건을 명확히 하는 것을 보고 아 저 부분을 내가 캐치하지 못했구나 하는 생각이 들었다.

 

 

3. 집계함수와 GROUP BY 필요 여부

나는 집계함수를 사용하면 그룹바이를 써야하나? 집계함수는 다른곳에 사용을 해도 되나? 하는 의문이 들었다.

한 문제를 풀다가 조건절(where) 에서 집계함수를 사용했는데 코드가 오류가 난 적이 있다.

그 이유는 집계함수가 실행되는 순서가 where 절보다 느리기 때문에 불가능했다.

이건 추가로 아래에 SQL 실행 순서를 아래에 넣어두겠다.

여튼 본론으로 돌아오면, SELECT 절에서 집계함수를 사용하고, 집계함수를 쓰지 않는 다른 컬럼들과 함께 사용한다면 반드시 그룹바이가 필요하다는 것!

예시를 들어보자면, 미국의 뉴욕시의 신생아 수와 복지비 수령 비율을 위해 데이터를 추출하고자 한다면, 테이블에서 도시명을 뉴욕으로 그룹바이를 잡고, 신생아 출산 컬럼은 전체를 COUNT해서, 복지비는 수령한 가구를 COUNT 후 비율로 계산해서 나타내야 한다.

이렇게 수많은 데이터에서 한가지를 기준으로 잡고서 데이터를 추출하고자 한다면 그룹바이는 꼭 써야 한다는 것!

 

SQL 실행 순서

출처 : GPT

 

집계함수를 사용할 수 있는 구간

SELECT, GROUP BY, HAVING, ORDER BY, 서브쿼리

 

 

4. UNION vs JOIN

아까 1번 이너 조인과 아웃터 조인에서 잠시 예시를 들었던 부분이다.

이너 조인과 아웃터 조인의 실사례 활용이 헷갈려지면서 UNION도 많이 혼란스러워졌다.

특히나 이 부분은 강의에서 구글 스프레드시트로 연습을 하고 따로 실습을 안했던거로 기억을 해서 그런가 더 혼란스럽게 뭐지?? 싶었다.

 

두개의 차이점

먼저 앞에서 다룬 것 처럼 JOIN의 경우에는 내가 어떤 부분을 기준으로 잡는지에 따라 이너/아웃터로 데이터를 가로상으로 옆에 추가로 합치는 개념이다.

한마디로 나라는 사람은 그대로 있고, 내가 새로산게 있어! 이런 느낌으로 보여주는 느낌이다.

유니온의 경우에는 세로로 합친다.

사례는 위에서 설명했던 것처럼 작년도 데이터를 기준으로 올해 추가로 얻은 데이터를 같이 세로로 합쳐주고 싶을 때 사용한다는 것.

그래도 혼란스러울 수 있으니 좀 더 명확하게 사례를 말해주자면, 신규 회원 리스트를 기존 회원 리스트에 추가한다고 생각하면 된다.

그러면 신규 회원이니까 애초에 같은 데이터가 있을 수 없다는 것!

 

 

5. 매출 분석에 대한 이론 부족 문제

이 부분은 내가 매출과 관련한 부분에 대한 이론적 지식이 부족해서 문제의 의도를 잘못 파악하고 반대로 문제를 풀었던 적이 있다.

문제에서 제시한 것은 총매출액을 구하라고 했는데 나는 그게 순매출액을 뜻하는 줄 알고, 환불을 제외한 구매확정이 된 금액을 도출한 적이 있다.

이 부분의 경우에는 내가 추가로 매출 분석을 위해서 꼭 알아야 하는 내용들을 공부하고 정리해서 블로그 글로 추후에 올려볼 생각이다.

 

 

6. 제곱 코드

요거는 문제가 될 것은 아니고, 그저 내가 몰랐던 부분을 작성한다.

파이썬 등 다른 코딩에서도 POW(밑, 지수) 로 많이 표현이 된다.

SQL에서도 제곱연산자가 있는데 이걸 몰라서 문제에서 그냥 데이터 * 데이터 라고 적은 적이 있다. ㅋㅋㅋㅋㅋ

SQL은 POWER(밑, 지수) 요렇게 쓰면 됨!

 

 

7. WHERE / HAVING 차이

둘다 조건을 제시하는 구간이라 언제 어떻게 사용해야하는지가 너무 헷갈린다.

WHERE절의 경우는 행을 먼저 커트해내는 역할을 한다.

예를 들자면 우리나라 중 도시를 서울이라고 한정했을 때 서울의 값만 추출하게 나타내는 것!

** 그리고 아까 언급했듯 WHERE 절에는 집계함수 사용불가능함

 

HAVING은 그룹을 만든뒤에 결과값을 추출해내는 역할을 한다.

** GROUP BY와 세트효과로 보면 되기 때문에 집계함수 사용됨!

집계 결과를 조건으로 필터를 거치기 때문에 예시를 들자면 고객별로 주문수를 카운트해서 이 결과값이 10건 이상인 고객만 분류하고 싶을 때 사용할 수 있다!

 

앞에서도 다뤘듯이 SQL 실행 순서상 WHERE 절이 초반부에 실행되고, 그 이후에 집계함수가 실행되기 때문에 이건 잘 기억해두자!

 

 

오늘은 이정도 마무리 해두고 조만간 다시 매출분석과 관련된 이론 정리로 돌아오려 한다.

이제 다시 한창 바빠질거라 포스팅을 여전히 많이 하지는 못하겠지만 그래도 나름대로 신경써보려고 노력해야겠다.

 

 

반응형