FrontEnd 개발자 찾기
JOIN
FrontEnd 개발자 찾기
문제 설명
다음은 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 SKILLCODES 테이블과 개발자들의 프로그래밍 스킬 정보를 담은 DEVELOPERS 테이블입니다.
SKILLCODES 테이블
Column name | Type | Unique | Nullable | Description |
---|---|---|---|---|
NAME | VARCHAR(N) | Y | N | 스킬의 이름 |
CATEGORY | VARCHAR(N) | N | N | 스킬의 범주 |
CODE | INTEGER | Y | N | 스킬을 나타내는 비트값 |
스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.
DEVELOPERS 테이블
Column name | Type | Unique | Nullable | Description |
---|---|---|---|---|
ID | VARCHAR(N) | Y | N | 개발자 ID |
FIRST_NAME | VARCHAR(N) | N | Y | 개발자 이름 |
LAST_NAME | VARCHAR(N) | N | Y | 개발자 성 |
VARCHAR(N) | Y | N | 개발자 이메일 | |
SKILL_CODE | INTEGER | N | N | 개발자가 가진 스킬 |
SKILL_CODE
컬럼은 INTEGER 타입이고, 2진수로 표현했을 때 각 bit는 SKILLCODES 테이블의 코드를 의미합니다. 예를 들어 어떤 개발자의 SKILL_CODE
가 400 (= b’110010000’)이라면, 이는 SKILLCODES 테이블에서 CODE
가 256 (= b’100000000’), 128 (= b’10000000’), 16 ( =b’10000’) 에 해당하는 스킬을 가졌다는 것을 의미합니다.
문제
DEVELOPERS 테이블에서 Front End 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요. 결과는 ID를 기준으로 오름차순 정렬해 주세요.
풀이 과정
- 조건 확인
- SKILLCODES 테이블에서
CATEGORY
가 ‘Front End’인 스킬만 선택하기 - 각 개발자가 가진
SKILL_CODE
에 해당 스킬이 포함되어 있는지 확인해야함
- SKILLCODES 테이블에서
- LEFT JOIN을 이용해 개발자와 스킬 정보 결합
- DEVELOPERS 테이블과 SKILLCODES 테이블을
SKILL_CODE
와CODE
를 기준으로 결합 - LEFT JOIN 사용 이유: 모든 개발자를 기준으로 스킬 정보를 연결하고, 일치하는 스킬만 필터링하기 위해
- DEVELOPERS 테이블과 SKILLCODES 테이블을
- 비트 연산을 통한 스킬 소유 여부 확인
- (D.
SKILL_CODE
& S.CODE
) = S.CODE
조건을 사용하여 개발자가 특정 Front End 스킬을 보유하고 있는지 확인해야겠군 - 비트 AND 연산을 통해
SKILL_CODE
의 해당 비트가 활성화된 경우만 선택
- (D.
- WHERE 절로 Front End 스킬 필터링
- SKILLCODES 테이블에서
CATEGORY
가 ‘Front End’인 스킬만 필터링
- SKILLCODES 테이블에서
- 결과 정렬
- 정렬 기준에 따라 ORDER BY로 결과 정렬
ID
를 기준으로 오름차순 정렬
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 중복 제거
- 각 개발자는 여러 개의 Front End 스킬을 보유할 수 있기 때문에 DISTINCT 사용하여 중복된 결과 제거
- 최종 결과 출력
- SELECT 절에서 개발자의 ID(
ID
), 이메일(EMAIL
), 이름(FIRST_NAME
), 성(LAST_NAME
)만 출력
- SELECT 절에서 개발자의 ID(
- 교훈
- 비트 연산은 처음 활용해본다. 문제 푸는데 정답이 아니라 떠서 헤맸다..
- 특정 권한이나 기능이 ON/OFF로 구분될 때 쓰면 좋은 비트연산
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT DISTINCT
D.ID,
D.EMAIL,
D.FIRST_NAME,
D.LAST_NAME
FROM
DEVELOPERS D
LEFT JOIN
SKILLCODES S
ON
(D.SKILL_CODE & S.CODE) = S.CODE
WHERE
S.CATEGORY = 'Front End'
ORDER BY
D.ID;
Tip
비트 연산 (&) 사용해서 스킬 소유 여부 확인
- (D.
SKILL_CODE
& S.CODE
) = S.CODE
: D.SKILL_CODE에 특정 스킬이 포함되어 있는지 확인- 예시: 개발자의 SKILL_CODE가 400이고, Front End 스킬의 CODE가 16인 경우, 400 & 16 = 16이 성립하면 개발자가 해당 스킬을 보유한 것.
SQL Dialect Used: Oracle
개념 확인
- LEFT JOIN
- 기준 테이블의 모든 행을 유지하며, 일치하지 않는 경우에도 결과에 포함. 일치하지 않으면 NULL 반환
- 비트 연산자 (&)
- 두 수의 비트를 비교하여 모두 1일 때만 1 반환
Useful link
This post is licensed under Park Juyoung by the author.