문제 링크
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# 스킬을 포함하고 있다고 판단해 해당 개발자를 결과에 포함시키는 것
'PRACTICE > SQL' 카테고리의 다른 글
[MySQL] 2단계 36. 부모의 형질을 모두 가지는 대장균 찾기 (0) | 2025.01.07 |
---|---|
[MySQL] 2단계 35. 연도별 대장균 크기의 편차 구하기 (0) | 2025.01.05 |
[MySQL] 2단계 33. 조건에 맞는 사원 정보 조회하기 (0) | 2025.01.03 |
[MySQL] 2단계 32. 업그레이드 된 아이템 구하기 (0) | 2025.01.03 |
[MySQL] 2단계 31. 분기별 분화된 대장균의 개체 수 구하기 (0) | 2025.01.02 |