
오늘 할 포스팅은 멋있지만(?) 까다로운 SQL문법에 대해 설명하려고 한다.
물론 SQL은 SELECT, INSERT, UPDATE, DELETE 같은 DML이 핵심이지만,
실무에서 성능과 유연성을 좌우하는 고급 문법들도 있기에.
이번 글에서는 자주 사용되지만 이해하거나 사용하는 데 까다로운
SQL 고급 문법들을 예제 중심으로 설명하려고 한다.
아. 그리고 블로그 포스팅에 불만을 제기한 지인중 한명(젊꼰대)이 피드백을 줬는데
아무래도 다양한 연령층이 보기에 반말보단 존댓말이 보기에 편하다고 의견을 주어서
앞으로 할 포스팅은 모두 존댓말로 하려고 합니다.
그러면 SQL문법정리 시작하도록 하겠습니다.
1. CASE WHEN 조건 분기 처리
복잡한 조건 분기나 컬럼 기반 가공에 매우 유용합니다.
SELECT
lol_no,
lol_name,
CASE
WHEN rank >= 2400 THEN '준프로게이머'
WHEN rank BETWEEN 1200 AND 2399 THEN '일반게이머'
ELSE '약자'
END AS 랭크
FROM lolplayer;
+a 실무 팁: CASE는 WHERE, ORDER BY, GROUP BY, HAVING 등 거의 모든 절에서 사용 가능합니다.
2. WITH (공통 테이블 표현식, CTE)
가독성 확보 및 재사용에 유리한 서브쿼리 대체 문법입니다.
WITH sales_summary AS (
SELECT emp_no, SUM(sales) AS total_sales
FROM sales
GROUP BY emp_no
)
SELECT e.emp_name, s.total_sales
FROM employee e
JOIN sales_summary s ON e.emp_no = s.emp_no;
+a 실무 팁: WITH 문은 재귀 쿼리에도 사용됩니다. 단, MySQL은 8.0 이상에서 지원합니다.
3. ROW_NUMBER() / RANK() / DENSE_RANK()
순위 매기기 함수로, 그룹 내 정렬 시 매우 유용합니다.
SELECT emp_no, dept_no, salary,
RANK() OVER(PARTITION BY dept_no ORDER BY salary DESC) AS salary_rank
FROM employee;
+a 실무 팁: 이 함수들과 CTE를 결합하면 그룹별 Top-N 조회도 쉽게 구현할 수 있습니다.
4. MERGE INTO (Upsert)
Oracle, SQL Server 등에서 INSERT + UPDATE 조합을 처리하는 문법입니다. MySQL은 ON DUPLICATE KEY UPDATE나 INSERT ... ON CONFLICT DO UPDATE (PostgreSQL)을 사용합니다.
MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
UPDATE SET t.value = s.value
WHEN NOT MATCHED THEN
INSERT (id, value) VALUES (s.id, s.value);
+a 실무 팁: 대량 배치 시 MERGE는 코드의 간결성과 성능을 동시에 확보할 수 있는 좋은 방법입니다.
5. FOREACH (MyBatis)
SQL 문법 자체는 아니지만 MyBatis에서 반복 처리를 위해 자주 사용됩니다. (제가 자주 사용)
<foreach collection="idList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
+a 실무 팁: <foreach>는 IN 조건이나 벌크 INSERT 등에 널리 쓰이며, 자바에서 전달한 리스트나 배열을 쿼리에서 안전하게 반복 처리할 수 있습니다.
6. LATERAL JOIN (PostgreSQL, Oracle 등)
서브쿼리에서 외부 테이블 컬럼을 참조할 수 있게 해줍니다.
SELECT e.emp_no, d.*
FROM employee e
LEFT JOIN LATERAL (
SELECT * FROM department d WHERE d.dept_no = e.dept_no
) d ON true;
+a 실무 팁: 일반적인 서브쿼리로는 불가능한 참조를 가능하게 해 주며, 복잡한 가공 로직에서 활용도가 높습니다.
마무리
위에서 다룬 문법들은 단순히 문법을 아는 것보다 적재적소에 실무에 어떻게 활용할지가 핵심입니다. 특히 성능 이슈가 발생하는 지점에서는 WITH, RANK, MERGE, FOREACH 같은 문법들이 실질적인 해결책이 되는 경우가 많습니다. 다음 글에서는 이 중 몇 가지를 예제로 더 깊이 다뤄보겠습니다.
학스의 개발일지
일상과 코딩 그 사이 어딘가에있는 블로그.. 블로거이자 빅데이터개발자 학스 입니다 JAVA, jQuery, PostgreSQL, MySQL, HIVE, Hadoop 더 많은 정보는 깃허브 주소 https://github.com/hacs2772 를 방문해주세요
hacs2772.tistory.com
'TIPS' 카테고리의 다른 글
| 실무에서 인덱스를 똑똑하게 활용하는 전략 (심화편) (14) | 2025.08.11 |
|---|---|
| 실무에서 바로 써먹는 SQL 쿼리 성능 개선 팁 (10) | 2025.08.04 |
| Spark 실전 성능 튜닝 #Executor, #Shuffle, #GC (4) | 2025.07.21 |
| Hive + Spark 실무 — 대용량 조인 성능 튜닝 실전 예제 (4) | 2025.07.14 |
| #빅데이터 실무에서 성능 잡아먹는 핵심 원인과 실전 대응 (2) | 2025.07.07 |