1️⃣ 비트 연산자 (&): 다대다 포함 관계의 치트키
스킬 코드나 권한 관리처럼 데이터가 2의 제곱수로 저장된 경우 사용합니다.
- 핵심 로직: (SKILL_CODE & CODE) > 0 이면 "스킬 보유"로 판단.
- 팁: WHERE 절이나 CASE WHEN에서 0이 아닌 숫자는 SQL 엔진이 TRUE로 간주합니다.
- 실무 활용: 여러 Front End 스킬을 SUM(CODE)로 합쳐 하나의 비트 마스크를 만들면, 단 한 번의 연산으로 포함 여부를 체크할 수 있어 성능이 압도적입니다.
2️⃣ 기간 중복(Overlap) 체크 공식
"특정 기간에 대여 가능한 차"를 찾을 때, 반대로 **"겹치는 예약"**을 찾아 제외하는 방식입니다.
- 마법의 공식: 두 기간이 겹칠 조건은 시작일 <= 타겟_종료일 AND 종료일 >= 타겟_시작일입니다.
- 프로세스:
- 서브쿼리로 11월에 걸쳐 있는 '대여 불가' 차량 ID 추출.
- 메인 쿼리에서 NOT IN을 사용해 해당 ID를 제외.
3️⃣ 별칭(Alias) 사용의 규칙
서브쿼리에 이름을 붙여야 하는 상황과 아닌 상황을 명확히 구분해야 에러를 막습니다.
- 필수 (AS 별칭 필요): FROM 절에 사용하는 서브쿼리(인라인 뷰), JOIN 시 사용하는 서브쿼리.
- 이유: SQL 엔진이 임시 테이블의 이름을 알아야 컬럼을 참조할 수 있기 때문.
- 생략 가능: WHERE 절의 조건, SELECT 절의 스칼라 서브쿼리, EXISTS 문 내부.
- 이유: 테이블 덩어리가 아니라 '단일 값'이나 '존재 여부'로만 취급되기 때문.
4️⃣ EXISTS vs JOIN + DISTINCT
중복 데이터를 처리할 때 성능 차이가 극명하게 갈리는 지점입니다.
- JOIN + DISTINCT: 일단 다 합치고(JOIN) 나중에 중복을 깎아냄. (데이터가 많을수록 느려짐)
- EXISTS: 조건을 만족하는 데이터를 찾는 순간 탐색 종료. (훨씬 효율적)
- 인사이트: "특정 조건을 만족하는 대상이 있는가?"를 물을 때는 EXISTS가 정석입니다.
5️⃣ MySQL의 꿀팁: HAVING의 변칙 활용
원래 HAVING은 GROUP BY와 짝꿍이지만, MySQL에서는 독특하게 쓰입니다.
- 활용법: SELECT 절에서 복잡한 연산으로 만든 **별칭(FEE 등)**을 WHERE에서 쓸 수 없을 때, HAVING을 쓰면 서브쿼리로 감싸지 않고도 바로 필터링이 가능합니다.
- 주의: 이는 MySQL의 편의 기능이며, 표준 SQL(Oracle 등)에서는 에러가 날 수 있으니 주의!
'Data Science > SQL' 카테고리의 다른 글
| [SQL] 코호트 분석이란?, 쿼리테스트 출제 유형, 관련 함수 (0) | 2026.02.15 |
|---|---|
| [SQL/오답] 서브쿼리를 활용한 판매 데이터 사전 집계와 다중 조인 (프로그래머스 Lv4) (0) | 2026.02.15 |
| [SQL/오답] 기간별 할인 로직 구현; WITH 절과 LEFT JOIN의 조화 (프로그래머스 Lv4) (1) | 2026.02.15 |
| [SQL/오답] 기간 중복(Overlap)와 다중 테이블 조인을 활용한 대여 가능 차량 조회 (프로그래머스 Lv4) (0) | 2026.02.15 |
| [SQL/오답] 비트 연산자의 다대다 매칭과 EXISTS 성능 최적화 (프로그래머스 Lv4) (0) | 2026.02.15 |