문제
DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.결과는 ID를 기준으로 오름차순 정렬해 주세요.
이번 문제를 풀려면 비트 연산자의 개념을 알아야한다.
비트 연산자란?
- 정의 : 비트 연산자는 정수를 이진수(0,1)의 자리 단위로 처리하는 연산자
- 종류
- 논리 연산 : AND(&), OR(|), XOR(^), NOT(~)
- 시프트 연산 : 좌측 시프트(<<), 우측 시프트(>>)
| A | B | A & B |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
두 비트가 모두 1일 때만 결과가 1이 된다.
예를 들어,
6 = 0000 0110₂
3 = 0000 0011₂
------------------------
6&3= 0000 0010₂ = 2
SQL에서 비트 연산자 활용
CODE = 2ⁿ
1 ⇒ 2⁰ ⇒ 스킬 A
2 ⇒ 2¹ ⇒ 스킬 B
4 ⇒ 2² ⇒ 스킬 C
…
256 ⇒ 2⁸ ⇒ Python
128 ⇒ 2⁷ ⇒ C#
SKILLCODES 테이블의 CODE 컬럼이 2^N 형태의 비트이고, DEVELOPER 테이블의 SKILL_CODE 테이블에 여러 스킬 비트의 조합이 저장되어 있다.
예를 들어, 특정 개발자의 SKILL CODE가 400(110 010 000)이면 256, 128, 16 스킬을 보유하고 있는 것 이다. Python은 256, C#은 1024이니까 JOIN 조건에 개발자가 해당 스킬 비트를 포함하는지를 검사하고, 그 스킬 중 이름에 Python 혹은 C#이 포함되었는지를 확인하면 된다.
복잡해 보일 수 있지만, 여러 속성을 하나의 정수로 묶어서 관리할 수 있고, 조건 비교 시 산술 연산보다 연산 비용이 적기 때문에 비트 연산자를 알아두면 좋다.
최종 쿼리
SELECT
DISTINCT
D.ID,
D.EMAIL,
D.FIRST_NAME,
D.LAST_NAME
FROM DEVELOPERS D
JOIN SKILLCODES S
ON (D.SKILL_CODE & S.CODE) = S.CODE AND S.NAME IN ('Python','C#')
ORDER BY D.ID
400 = 1 1001 0000₂
256 = 1 0000 0000₂
-------------------------------
400&256 = 1 0000 0000₂ = 256
각 자리에서 둘 다 1인 경우에만 1이 남는다. 즉, 연산 결과가 S.CODE와 같아야만 개발자가 해당 스킬을 가지고 있다고 판단한다.
만약 S.CODE가 64라면
110010000₂ (400) & 001000000₂ (64) = 000000000₂ (0) 0 ≠ 64 이므로 FALSE(스킬 미보유)
'&' 연산으로 두 수의 공통된 ‘1’ 비트만 뽑아내고, 그 결과가 S.CODE(단일 비트)와 같으면 해당 비트(스킬)를 포함한 것이다. SQL에서는 이 조건만으로 개발자가 Python(CODE=256) 또는 C#(CODE=1024) 스킬을 가졌는지를 빠르게 검사할 수 있다.
'코딩 테스트 > SQL' 카테고리의 다른 글
| [MySQL] 주요 함수 및 연산자 (1) | 2025.06.11 |
|---|---|
| [MYSQL] 대장균의 크기에 따라 분류하기 2 (0) | 2025.04.29 |
| [MYSQL] 대장균들의 자식의 수 구하기 (2) | 2025.04.26 |
| [MYSQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2025.04.13 |
| [MYSQL] 물고기 종류 별 대어 찾기 (0) | 2025.03.29 |