🚀 흩어진 데이터, 어떻게 하나로 볼까?
어제까지는 하나의 테이블 안에서 데이터를 조작하는 법을 배웠다
하지만 실제 데이터는 여러 테이블에 나뉘어 저장된다는 것을 알고 있었기에
‘이 테이블들을 어떻게 연결해서 의미 있는 정보를 만들지?’ 하는 궁금증이 있었다
오늘은 그 해답이 되어준 JOIN과 Subquery를 배우며
데이터베이스의 진정한 힘을 느낄 수 있었다
📚 JOIN: 흩어진 데이터를 연결하는 기술
JOIN은 여러 테이블에 흩어져 있는 데이터를 공통된 키(key)를 중심으로 합쳐, 의미 있는 정보로 만드는 핵심적인 기능이라는 것을 배웠다. 관계형 데이터베이스의 진정한 힘은 이 JOIN에서 나온다고 해도 과언이 아니다.
JOIN 종류 | 핵심 기능 및 역할 |
---|---|
INNER JOIN | 두 테이블에 공통으로 존재하는 데이터만 합쳐서 보여준다. 가장 기본적이고 자주 사용된다. |
OUTER JOIN | LEFT/RIGHT JOIN: 한쪽 테이블의 데이터는 모두 보여주면서, 다른 쪽 테이블의 일치하는 데이터를 붙여준다. 기준 테이블에 따라 LEFT 와 RIGHT 를 선택할 수 있다. 일치하는 값이 없으면 NULL 이 된다.FULL OUTER JOIN: 양쪽 테이블의 모든 데이터를 보여주며, 서로에게 짝이 없는 데이터는 NULL 로 표시된다. |
SELF JOIN | 테이블 하나가 자기 자신을 참조하여 합치는 특별한 경우다. 테이블 내 데이터 간의 계층 구조(예: 사원과 관리자)를 파악할 때 유용하다. |
특히 LEFT JOIN
을 활용하면, 기준이 되는 테이블의 정보(예: 모든 부서 목록)를 하나도 빠짐없이 보면서, 관련된 정보(예: 해당 부서의 사원)를 추가로 확인할 수 있어 데이터의 전체적인 현황을 파악하는 데 아주 유용했다.
-- 모든 부서의 목록과, 거기에 속한 사원의 이름을 보고 싶을 때
SELECT
d.dname, -- 부서 이름
e.ename -- 사원 이름
FROM
dept d
LEFT JOIN emp e ON d.deptno = e.deptno;
🔍 Subquery: 쿼리 속의 또 다른 쿼리
Subquery는 복잡한 문제를 해결하기 위해
큰 문제 안에 작은 질문을 던지는 것과 같았다
‘가장 월급을 많이 받는 사람은 누구지?’ 와 같이
답을 바로 알 수 없는 질문을 Subquery로 먼저 해결하고
그 결과를 이용해 최종 답을 찾는 방식이 굉장히 논리적이라고 느꼈다
Subquery 위치 | 역할 |
---|---|
WHERE 절 | 🎯 필터링할 조건을 다른 쿼리에서 가져오는 가장 직관적인 사용법 |
FROM 절 | 📋 쿼리의 결과를 하나의 새로운 테이블처럼 사용하는 방법, 인라인 뷰라고 부른다 |
SELECT 절 | scalar subquery, 아직은 낯설지만, 행마다 다른 계산 결과를 보여줄 때 유용할 것 같다 |
-- 'SMITH'와 같은 부서에서 일하는 동료를 찾고 싶을 때
SELECT ename
FROM emp
WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH');
✨ CTE: 쿼리를 깔끔하게 정리하는 기술
Subquery가 길어지고 복잡해지니
내가 지금 무엇을 하고 있는지 길을 잃는 기분이 들었다
그때 WITH
절을 사용하는 CTE(Common Table Expression) 를 만났다
복잡한 Subquery에 이름을 붙여주니
코드가 훨씬 깔끔해지고, 여러 번 재사용할 수 있어 편리했다
마치 긴 글을 쓰기 전에 개요를 짜는 것처럼
CTE로 쿼리의 구조를 먼저 잡고 나니
더 복잡한 분석도 자신감이 생겼다
✨ 오늘의 회고
JOIN과 Subquery, 그리고 CTE를 배우며
데이터를 단순히 조회하는 것을 넘어
데이터 간의 관계를 파악하고, 논리적으로 문제를 해결하는 능력이 중요함을 깨달았다
처음에는 복잡해 보였지만
하나씩 분해하고, 순서를 생각하며 쿼리를 작성하니
결국 원하는 결과를 얻을 수 있었다
앞으로 어떤 복잡한 데이터셋을 만나더라도
오늘 배운 것들을 활용해 차근차근 분석해 나갈 것이다 🚀