PRACTICE/SQL

[MySQL] 2단계 34. 조건에 맞는 개발자 찾기

j1ngerhead 2025. 1. 4. 23:50

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/276034

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (
    SELECT SUM(CODE) FROM SKILLCODES WHERE NAME IN ('Python', 'C#'))
ORDER BY ID ASC;

 

전체 구조
  • 이 쿼리는 비트 연산자와 서브쿼리의 조합으로 특정 스킬 코드를 가진 개발자만 추출한다.
  • 결과를 아이디 기준으로 오름차순 정렬
  • 서브쿼리를 () 안에서 사용하는 이 방법은 인라인 서브쿼리라고 부른다.
서브쿼리(Subquery)란

 

하나의 SQL문안에 포함되어 있는 또 다른 SQL문을 말한다.
서브쿼리는 알려지지 않은 기준을 이용한 검색을 위해 사용한다.
서브쿼리는 메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.

 

서브쿼리 : SELECT SUM(CODE) FROM SKILLCODES WHERE NAME IN ('Python', 'C#')


SELECT 문 안의 SUM(CODE) 구문은 SKILLCODES 테이블에서 Python과 C#의 코드를 찾아 더한 값임.
이 값이 두 스킬의 코드 조합이 됨
ex ) Python의 코드가 256이고, C#의 코드가 1024라면 
이 쿼리의 결과는 1280(256+1024)이 됨

 

비트 연산자 &

 

SKILL_CODE & (서브쿼리 결과)1280 부분이 중요한데, & 연산자는 각 비트가 일치할 때 참(True) 값을 반환
즉, SKILL_CODE가 1280이랑 비트가 일부라도 겹친다면 해당 개발자는 Python이나 C# 스킬을 가지고 있다는 의미가 됨.
이 조건에 맞는 행들만 필터링해 DEVELOPERS 테이블에서 가져오게 되는 것.
ex ) Python의 코드가 256 (이진수로 100000000)이고, C#의 코드가 1024 (이진수로 10000000000)일 때

이 코드들을 합친 값인 1280을 이진수로 변환하면 10100000000이 됨.

256(Python): 100000000 (이진수)
1024(C#): 10000000000 (이진수)
1280 (Python과 C#의 코드 합): 10100000000 (이진수)
1280과 다른 SKILL_CODE 값을 & 연산자로 비교해 Python이나 C# 스킬이 포함되는지 판단할 수 있게 됨.

예시 1: SKILL_CODE가 400인 경우
400의 이진수: 110010000
1280의 이진수: 10100000000

400 & 1280
10100000000
  110010000
:
00100000000
ㄴ 256 (100000000)
여기서 결과는 256이 나와, Python 스킬이 포함되어 있다는 걸 알 수 있다.
(결과 값이 0이 아니므로 WHERE 조건을 만족하게 됨)

예시 2: SKILL_CODE가 128인 경우 (Python이나 C# 미포함)
128의 이진수: 10000000
1280의 이진수: 10100000000

128 & 1280
ㄴ> 결과가 0이므로 Python이나 C#이 포함되지 않은 걸 알 수 있게 됨.

 

결론

 

SKILL_CODE & 1280의 결과가 0이 아니면 

Python이나 C# 스킬을 포함하고 있다고 판단해 해당 개발자를 결과에 포함시키는 것

320x100