출처 : 프로그래머스 조건에 맞는 개발자 찾기
SKILLCODES 테이블은 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 테이블입니다. SKILLCODES 테이블의 구조는 다음과 같으며, NAME, CATEGORY, CODE는 각각 스킬의 이름, 스킬의 범주, 스킬의 코드를 의미합니다. 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.
| 컬럼명 | 설명 |
|---|---|
| NAME | 스킬 이름 |
| CATEGORY | 스킬 분류 |
| CODE | 스킬 코드 (2의 제곱수) |
| NAME | CATEGORY | CODE |
|---|---|---|
| C++ | Back End | 4 |
| JavaScript | Front End | 16 |
| Java | Back End | 128 |
| Python | Back End | 256 |
| C# | Back End | 1024 |
| Vue | Front End | 8192 |
DEVELOPERS 테이블은 개발자들의 프로그래밍 스킬 정보를 담은 테이블입니다. DEVELOPERS 테이블의 구조는 다음과 같으며, ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_CODE는 각각 개발자의 ID, 이름, 성, 이메일, 스킬 코드를 의미합니다. SKILL_CODE 컬럼은 INTEGER 타입이고, 2진수로 표현했을 때 각 bit는 SKILLCODES 테이블의 코드를 의미합니다.
| 컬럼명 | 설명 |
|---|---|
| ID | 개발자 ID |
| FIRST_NAME | 이름 |
| LAST_NAME | 성 |
| 이메일 | |
| SKILL_CODE | 스킬 코드 (비트마스크) |
| 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, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.
먼저, SKILLCODES의 CODE 컬럼을 쉽게 그림으로 표현하자면,

이렇게 2진수로 표현할 수 있다.
만약 DEVELOPERS 테이블의 SKILL_CODE가 400이라면,
400의 2진수는 110010000 이다.
또한, 따라서 400은 256 + 128 + 16으로, Python, Java, JavaScript를 활용하는 개발자인 것이다.
400 = 256(Python) + 128(Java) + 16(JavaScript)
위에 처럼 여러 스킬을 하나의 SKILL_CODE로 합칠 때는 OR 연산 (|) 처럼 생각하면 된다.
OR 연산 = 둘 중 하나라도 1이면 1

그러면 Python를 활용할 수 있는 개발자는 어떻게 찾아야될까?
AND 연산 (&)을 이용해서 찾을 수 있다.
SKILL_CODE와 Python의 CODE를 AND 연산하면 손쉽게 찾을 수 있다.
AND 연산 = 둘 다 1이어야 1
400과 Python의 CODE인 256을 AND 연산하게 되면,

이렇게 256이란 숫자가 나오게 된다.
즉, SKILL_CODE와 CODE를 AND 연산해서 0이란 숫자가 나오지 않는다면 Python이 가능한 개발자인 것이다!.
예를 한 번 더 들어서, 개발자의 SKILL_CODE가 1152이라면,
0이 나오게 되면서 Python을 사용하지 않은 개발자가 된다.
1152 = 1024(C#) + 128(Java)
-- C#과 Java를 사용하는 개발자

해당 조건들을 활용해서 서브쿼리를 통해 코드를 작성했다.
내 답안
SELECT D.ID
, D.EMAIL
, D.FIRST_NAME
, D.LAST_NAME
FROM DEVELOPERS AS D
WHERE (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) != 0
OR (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) != 0
ORDER BY D.ID ASC;