프로그래머스 SQL 고득점 Kit - 조건에 맞는 개발자 찾기

Jinyoung Cheon·2024년 12월 20일
0

코딩테스트

목록 보기
3/25

프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

SELECT

problem

SKILLCODES 테이블의 구조는 다음과 같으며, NAME, CATEGORY, CODE는 각각 스킬의 이름, 스킬의 범주, 스킬의 코드를 의미합니다. 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.

DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.
예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.

task

  1. 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성
    -> bit 연산자 활용 생각

  2. DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자
    -> 두 TABLE JOIN 필요

FROM DEVELOPERS D

JOIN SKILLCODES S

ON S.CODE & D.SKILL_CODE = S.CODE
  
  AND S.NAME IN ('Python', 'C#')  
  1. 개발자의 ID, 이메일, 이름, 성을 조회
SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
  1. 결과는 ID를 기준으로 오름차순 정렬
ORDER BY D.ID ASC;

code

SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME

FROM DEVELOPERS D

JOIN SKILLCODES S

ON S.CODE & D.SKILL_CODE = S.CODE
  
  AND S.NAME IN ('Python', 'C#') 

ORDER BY D.ID ASC;

note

1차 시기

SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME

FROM DEVELOPERS D

JOIN SKILLCODES S

ON  D.SKILL_CODE & S.CODE = S.CODE

WHERE S.NAME IN ('Python', 'C#')

ORDER BY D.ID ASC;

실행 결과는 맞는데 test에서 계속 다른 결과값이 나옴

WHY❓

... 💡

  1. 같은 개발자가 여러 개의 스킬을 가진 경우 중복 행이 나올 수 있음
    -> DISTINCT 활용
  1. WHERE 조건을 JOIN으로 이동
    -> JOIN 시점에 불필요한 데이터를 걸러내 성능 개선 가능성 존재
profile
데이터를 향해, 한 걸음씩 천천히.

0개의 댓글