SKILLCODES 테이블은 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 테이블입니다. SKILLCODES 테이블의 구조는 다음과 같으며, NAME, CATEGORY, CODE는 각각 스킬의 이름, 스킬의 범주, 스킬의 코드를 의미합니다. 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.
| NAME | TYPE | UNIQUE | NULLABLE |
| NAME | VARCHAR(N) | Y | N |
| CATEGORY | VARCHAR(N) | N | N |
| CODE | INTEGER | Y | N |
DEVELOPERS 테이블은 개발자들의 프로그래밍 스킬 정보를 담은 테이블입니다. DEVELOPERS 테이블의 구조는 다음과 같으며, ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_CODE는 각각 개발자의 ID, 이름, 성, 이메일, 스킬 코드를 의미합니다. SKILL_CODE 컬럼은 INTEGER 타입이고, 2진수로 표현했을 때 각 bit는 SKILLCODES 테이블의 코드를 의미합니다.
| NAME | TYPE | UNIQUE | NULLABLE |
| ID | VARCHAR(N) | Y | N |
| FIRST_NAME | VARCHAR(N) | N | Y |
| LAST_NAME | VARCHAR(N) | N | Y |
| VARCHAR(N) | Y | N | |
| SKILL_CODE | INTEGER | N | N |
예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.
DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.
예를 들어 SKILLCODES 테이블이 다음과 같고,
| NAME | CATEGORY | CODE |
| C++ | Back End | 4 |
| JavaScript | Front End | 16 |
| Java | Back End | 128 |
| Python | Back End | 256 |
| C# | Back End | 1024 |
| React | Front End | 2048 |
| Vue | Front End | 8192 |
| Node.js | Back End | 16384 |
DEVELOPERS 테이블이 다음과 같다면
| ID | FIRST_NAME | LAST_NAME | SKILL_CODE | |
| D165 | Jerami | Edwards | jerami_edwards@grepp.co | 400 |
| D161 | Carsen | Garza | carsen_garza@grepp.co | 2048 |
| D164 | Kelly | Grant | kelly_grant@grepp.co | 1024 |
| D163 | Luka | Cory | luka_cory@grepp.co | 16384 |
| D162 | Cade | Cunningham | cade_cunningham@grepp.co | 8452 |
다음과 같이 DEVELOPERS 테이블에 포함된 개발자 중 Python 스킬이나 C# 스킬을 가진 개발자의 정보가 결과에 나와야 합니다.
| ID | FIRST_NAME | LAST_NAME | |
| D162 | cade_cunningham@grepp.co | Cade | Cunningham |
| D164 | kelly_grant@grepp.co | Kelly | Grant |
| D165 | jerami_edwards@grepp.co | Jerami | Edwards |
- D162번 개발자의 경우 SKILL_CODE가 8452 = 8192 + 256 +4 로 Vue, Python, Cpp 스킬을 보유하고 있습니다.
- D164번 개발자의 경우 SKILL_CODE가 1024 로 C# 스킬을 보유하고 있습니다.
- D165번 개발자의 경우 SKILL_CODE가 400 = 256 + 128 + 16 으로 Python, Java, JavaScript 스킬을 보유하고 있습니다.
문제 풀이
# 디벨로퍼에서 파이썬이나 C# 인 사람만 조회
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")
OR SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")
ORDER BY ID ASC;
내 기억상 & 은 대장균 형질 보유 관련한 문제에서 접한 적이 있다.
왜 & (비트연산 and)를 사용해야할까?
비트 AND 연산은 해당 비트가 있는지 검사하는 용도이다.
예시) 260 & 256 = 256
260 = 100000100
256 = 100000000
AND 연산) 두 비트가 모두 1일 때만 1을 반환한다.
100000100
100000000
------------
100000000
따라서 결과는 256이 나온다.
비트 연산 4가지를 기억하자.
- AND 연산 (&): 두 비트가 모두 1일 때만 1을 반환한다.
- OR 연산 (|): 두 비트 중 하나라도 1이면 1을 반환한다.
- XOR 연산 (^): 두 비트가 다르면 1, 같으면 0을 반환한다.
- NOT 연산 (~): 비트를 반전시킨다.
'SQL' 카테고리의 다른 글
| [프로그래머스] LV2. 업그레이드 된 아이템 구하기 (SQL) (0) | 2026.05.14 |
|---|---|
| [프로그래머스] LV2. 물고기 종류 별 잡은 수 구하기 (SQL) (0) | 2026.05.14 |
| [프로그래머스] LV2. 상품 별 오프라인 매출 구하기 (SQL) (0) | 2026.05.12 |
| [프로그래머스] LV2. 분기별 분화된 대장균의 개체 수 구하기 (SQL) (0) | 2026.05.12 |
| [프로그래머스] LV2. 자동차 평균 대여 기간 구하기 (SQL) (0) | 2026.05.11 |