2025.10.31 TIL (본캠프, 10일차)
오늘은 지금까지 튜터님의 SQL 라이브 강의를 전체적으로 복습했다. "하나라도 잘해보자"라는 목표로 진행한 복습이 생각보다 효과이 있었던거 같다..
어제 UNION과 JOIN을 배우면서 "개념은 이해되지만 실제 문제에 적용할 수 있을까?"라는 불안감이 있었다. 오늘 전체 강의를 복습하면서 그 불안감이 조금씩 사라졌다.
처음 배웠을 때는 각 개념이 독립적으로 느껴졌지만, 전체를 다시 훑어보니 모든 것이 연결되어 있다는 걸 깨달았다. SQL의 작동 순서부터 시작해서, 조건문, 집계함수, 그룹화, 서브쿼리, UNION, JOIN까지 모두 하나의 체계를 이루고 있었다.
이해가 더욱 잘된다. 오늘의 가장 큰 수확이지 않을까 싶다.
SQL 핵심 내용 정리:
1. SQL의 두 가지 순서
SQL을 작성할 때는 반드시 이 두 가지 순서를 구분해야 한다.
- 작동 순서(실제 DB가 처리하는 순서):
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
- 작성 순서(우리가 코드를 쓰는 순서):
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
이 차이를 이해하면 쿼리 에러의 원인을 빠르게 찾을 수 있다.
2. CASE WHEN을 통한 조건부 처리
CASE WHEN 조건1 THEN 결과값1
WHEN 조건2 THEN 결과값2
ELSE 결과값3 END
CASE WHEN을 사용할 때는 다양한 연산자를 지원한다. WHERE 절과 동일한 연산자들을 사용할 수 있으며, 조건은 여러 개 추가할 수 있다.
3. 조건문 연산자 (WHERE, CASE WHEN에서 사용)
| 연산자 | 예시 | 의미 |
| >, < | N<10, N>10 | N이 10 미만, N이 10 초과 |
| >=, <= | N<=10, N>=10 | N이 10 이하, N이 10 이상 |
| = | N=10 | N이 10인 값 |
| != | N!=10 | N이 10이 아닌 값 |
| LIKE | LIKE('%과자%') | 문자열이 ~와 같을 때 (%, _를 앞뒤에 붙임) |
| AND | A AND B | A 그리고 B를 모두 만족하는 값 |
| OR | A OR B | A 또는 B인 값 |
| NOT, ! | NOT A, !A | A가 아닌 값 |
| BETWEEN | A BETWEEN 10 AND 20 | A가 10과 20 사이(10 이상 20 이하) |
| IN | A IN (B) | B에 A가 포함된 값 |
| NOT IN | A NOT IN B | B에 A가 포함되지 않은 값 |
| IS NULL | A IS NULL | A가 비어있는 값 |
| IS NOT NULL | A IS NOT NULL | A가 비어있지 않은 값 |
4. 집계함수: 데이터를 요약하는 함수들
| 함수 | 기능 |
| COUNT | 테이블의 행 수 반환 |
| SUM | 테이블의 열 합계 반환 |
| AVG | 테이블의 열 평균 반환 |
| MIN | 테이블의 열 최소값 반환 |
| MAX | 테이블의 열 최대값 반환 |
집계함수는 전체 데이터를 대상으로 사용하거나, 특정 컬럼을 기준으로 사용할 수 있다.
5. GROUP BY와 HAVING의 명확한 구분
GROUP BY절은 집계함수에 "그룹(기준)"이 더해진 개념이다. 특정 컬럼을 기준으로 데이터를 요약해서 비교하고 싶을 때 사용한다.
HAVING ≠ WHERE
| 필터링 구문 | 필터링 시점 |
| WHERE | GROUP BY 전 데이터 필터링 |
| HAVING | GROUP BY 후 결과값을 기준으로 필터링 |
이 차이점은 정말정말 중요하다. WHERE로 할 수 있는 일과 HAVING으로만 할 수 있는 일이 완전히 다르기 때문이다.
6. SUB QUERY: 복잡한 연산을 단계적으로
SUB QUERY를 통해 데이터를 구조화할 수 있다. 빅데이터에서 많은 컬럼에 여러 연산(사칙, 집계, 윈도우 함수, 포맷팅)을 할 때, SUB QUERY는 이를 순차적(구조적)으로 기록하는 역할을 한다.
실행 순서: 서브쿼리(안쪽) 실행 → 메인쿼리(바깥쪽) 실행
특징:
- () 안에 SELECT, FROM을 반드시 명시해야 함
- 쿼리 마지막에 ; 기호를 사용할 수 없음
- ORDER BY절을 사용할 수 없음
인라인 뷰(가장 많이 사용):
|
7. UNION: 테이블 수직결합
| 구분 | UNION | UNION ALL |
| 공통점 | 두 테이블을 수직결합 | 두 테이블을 수직결합 |
| 차이점 | 중복된 행을 하나로 표기(중복제거) | 모든 행을 표시(중복제거 안 함) |
주의점:
- 열의 개수와 순서가 모든 쿼리에서 동일해야 함
- 데이터 형식도 같아야 함
- 2개 이상의 테이블도 결합 가능
8. JOIN: 테이블 수평결합
JOIN의 첫 번째 단계는 공통컬럼 찾기다. 공통컬럼이 두 테이블의 연결 고리가 된다.
공통컬럼의 특징:
- 컬럼의 이름이 다를 수도 있음
- 컬럼의 순서가 달라도 상관없음
- 각 테이블의 데이터 값 개수가 달라도 조인 가능
- 2개 이상의 공통컬럼이 있을 수도 있음
- 공통컬럼이 없으면 조인 불가능
JOIN의 종류:
- INNER JOIN: 두 테이블에서 일치하는 값을 가진 행만 반환
- LEFT JOIN: 왼쪽 테이블의 모든 행 + 오른쪽 테이블의 일치 행 (불일치는 NULL)
- RIGHT JOIN: 오른쪽 테이블의 모든 행 + 왼쪽 테이블의 일치 행 (불일치는 NULL)
- FULL OUTER JOIN: LEFT JOIN + RIGHT JOIN (모든 데이터, 불일치는 NULL)

9. ORDER BY: 결과값 정렬
ORDER BY 컬럼명 ASC -- 오름차순 (기본값)
ORDER BY 컬럼명 DESC -- 내림차순
ORDER BY는 SQL 구문의 가장 마지막에 수행되며, 필수는 아니지만 결과의 가독성을 크게 높일 수 있다.
복습을 진행하면서 느낀 가장 큰 깨달음은 암기해야 하는 연산자는 익숙해질 때까지 써봐야 한다는 것이다.
WHERE, CASE WHEN에서 사용하는 연산자들(LIKE, BETWEEN, IN, IS NULL 등)은 단순히 개념만 아니라 손에 익혀야 한다. 문제 풀 때 자동으로 떠오를 때까지 반복해서 사용해야겠다.
2주가 거의 지났다. 사전캠프부터 본캠프까지 지난 시간을 돌아보면, 정말 많은 것을 배웠다. 하지만 여전히 배울 게 산더미다.
오늘의 종합 복습을 통해 깨달은 것은 "SQL은 각 개념이 독립적이지 않다"는 것이다. 모든 것이 서로 연결되어 있고, 전체 그림을 이해해야 각 부분이 명확해진다.
앞으로도 이런 식의 복습을 자주 해야겠다. 새로운 개념을 배우는 것도 중요하지만, 배운 내용을 깊이 있게 이해하는 것이 훨씬 더 중요하다는 걸 알게되었다.
다음 주는 SQL의 한 단계 더 심화된 개념들을 배울 것 같다. 이번처럼 꾸준히 복습하면서 하나라도 잘해보자는 다짐을 유지하겠다.
주말에 잠깐이라도 공부를 해야겠다. 크게 두가지를 나 자신과 약속해본다.....
첫째, SQL 문제 풀기
둘째, 다음 주 강의 내용 미리 학습