안녕하세요!
오늘은 프로그래머스 SQL 고득점 Kit 중 SELECT 분야의 ‘조건에 맞는 개발자 찾기’ 문제 리뷰를 진행하겠습니다.
문제는 아래 링크에서 확인해주시면 됩니다.
https://school.programmers.co.kr/learn/courses/30/lessons/276034
- 문제 설명
- 문제
- 예시
- 문제를 파악하며 쿼리 생각하기
예시에서 볼 수 있듯이, 저희가 문제에서 SELECT 해야 하는 부분은
- 개발자 ID : ID
- 이메일 : EMAIL
- 이름 : FIRST_NAME
- 성 : LAST_NAME
총 4개인 것을 볼 수 있습니다.
다음으로 저희가 WHERE 조건으로 확인해야 하는 부분은
- C# 혹은 Python 스킬을 가진 개발자 : NAME IN (‘C#’, ‘Python’)
→ 이름이 아니고 각 스킬에 해당하는 CODE 값으로 진행해도 됩니다. (CODE IN (1024, 256))
총 1개인 것을 확인할 수 있습니다.
다음으로 두 개의 테이블을 JOIN 해야하는 부분은
- DEVELOPERS 테이블의 SKILL_CODE 이진수 값 안에 SKILLCODES 테이블의 CODE 값이 들어있는 경우 : JOIN SKILLCODES b ON a.SKILL_CODES&b.CODE=b.CODE
→ 여기서 a는 DEVELOPERS 테이블의 별칭입니다.
→ 문제 설명처럼 개발자의 스킬 코드는 각 스킬 코드의 합으로 이루어져 있기 때문에, 어떤 합으로 이루어졌는지 알기 위해서는 비트 연산 &를 진행해야 합니다.
※ & 연산자는 이진수로 변경했을 때, 각 자릿수를 비교하여 동일하면 1, 다르면 0을 반환하는 연산자 입니다.
→ 문제 설명의 예시를 보시면 400(110010000)은 256(100000000)+128(10000000)+16(10000) 이고, 이를 각각 400과 &연산자를 진행하면 다음과 같은 결과물을 얻을 수 있습니다.
① 400&256 = 110010000&100000000 = 100000000 = 256
② 400&128 = 110010000&10000000 = 10000000 = 128
③ 400&16 = 110010000&10000 = 10000 = 16
즉, DEVELOPERS의 SKILL_CODE와 CODE의 & 연산의 값이 CODE로 나오는 값이 개발자가 가진 스킬이라고 볼 수 있습니다.
위와 같은 것을 확인할 수 있습니다.
마지막으로 저희가 문제에서 확인해야 하는 부분은
- 개발자 ID로 오름차순 : ORDER BY ID
총 1개인 것을 확인할 수 있습니다.
- 쿼리 완성하기
이제 위에서 생각한 쿼리를 SQL 실행순서에 맞게 배치해주시면 됩니다.
그렇게 완성된 쿼리는 아래와 같습니다.
-- C#과 Python 모두를 가진 개발자는 두 번 출력이 되기 때문에 DISTINCT를 해주어 중복값을 제거해줍니다.
SELECT DISTINCT
ID,
EMAIL,
FIRST_NAME,
LAST_NAME
FROM DEVELOPERS a
JOIN SKILLCODES b ON a.SKILL_CODE&b.CODE=b.CODE
WHERE NAME IN ('C#', 'Python')
ORDER BY 1
궁금한 부분이 있으신 분들은 댓글로 남겨주시면, 답변 드리도록 하겠습니다.
★읽어주셔서 감사합니다★
'SQL > 프로그래머스' 카테고리의 다른 글
[GROUP BY] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (3) | 2024.09.06 |
---|---|
[SELECT] 서울에 위치한 식당 목록 출력하기 (2) | 2024.09.05 |
[GROUP BY] 저자 별 카테고리 매출액 집계하기 (1) | 2024.09.03 |
[JOIN] 있었는데요 없었습니다 (52) | 2024.04.11 |