어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.
이를 바탕으로 조건에 맞는 개발자 정보 조회.
SKILL_CODE가 CODE를 포함하고 있는지 알기 위해서, 핵심 아이디어는 비트 연산자이다.
비트 연사자를 사용하면 2진수로 변환할 필요 없이 내부적으로 변환하여 비교한다.
대응되는 비트가 모두 1이면 1을 반환함. (AND 연산)
대응되는 비트 중에서 하나라도 1이면 1을 반환함. (OR 연산)
대응되는 비트가 서로 다르면 1을 반환함. (XOR 연산)
비트를 1이면 0으로, 0이면 1로 반전시킴. (NOT 연산)
지정한 수만큼 비트를 전부 왼쪽으로 이동시킴. (left shift 연산)
부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)
400 & 256 => (b'110010000') & (b'100000000')
10진수 & 10진수 = 결과 10진수로 반환.
내부적으로 2진수로 바꿔서 처리.
각 자릿수를 비교해서 공통으로 1인 것만 1을 반환한다.
즉, 결과는 b'100000000'이므로 256에 해당하는 코드를 포함한다고 볼 수 있다.
select ID, EMAIL, FIRST_NAME, LAST_NAME
from DEVELOPERS D
where
SKILL_CODE & (select CODE from SKILLCODES where NAME = "Python")
or SKILL_CODE & (select CODE from SKILLCODES where NAME = "C#")
order by ID