본문 바로가기
Data Science/SQL

[SQL] 비트연산&, 기간중복, 서브쿼리 Alias 규칙, EXISTS, HAVING

by 에르모사 쩐뉴 2026. 2. 15.

1️⃣ 비트 연산자 (&): 다대다 포함 관계의 치트키

스킬 코드나 권한 관리처럼 데이터가 2의 제곱수로 저장된 경우 사용합니다.

  • 핵심 로직: (SKILL_CODE & CODE) > 0 이면 "스킬 보유"로 판단.
  • : WHERE 절이나 CASE WHEN에서 0이 아닌 숫자는 SQL 엔진이 TRUE로 간주합니다.
  • 실무 활용: 여러 Front End 스킬을 SUM(CODE)로 합쳐 하나의 비트 마스크를 만들면, 단 한 번의 연산으로 포함 여부를 체크할 수 있어 성능이 압도적입니다.

2️⃣ 기간 중복(Overlap) 체크 공식

"특정 기간에 대여 가능한 차"를 찾을 때, 반대로 **"겹치는 예약"**을 찾아 제외하는 방식입니다.

  • 마법의 공식: 두 기간이 겹칠 조건은 시작일 <= 타겟_종료일 AND 종료일 >= 타겟_시작일입니다.
  • 프로세스:
    1. 서브쿼리로 11월에 걸쳐 있는 '대여 불가' 차량 ID 추출.
    2. 메인 쿼리에서 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 등)에서는 에러가 날 수 있으니 주의!