SELECT id,email,first_name,last_name
from developers
where skill_code & (select code from SKILLCODES where name = 'python') or
skill_code & (select code from SKILLCODES where name = 'c#')
order by 1 asc
skill_code & (select code from SKILLCODES where name = 'python')
이 연산의 결과가 0이 아닌지, 0인지에 따라 skill_code가 ‘python’을 포함하는지 여부를 알 수 있습니다.
- python의 code 값이 4로 가정(0100)
- skill_code 값이 5일 경우(0101)
skill_code & (select code from SKILLCODES where name = 'python')
5 & 4 → 0101 & 0100 → 0100
→ 결과: 4 (0이 아니므로, python을 포함하는 스킬을 보유한 것으로 판단)- skill_code 값이 2일 경우(0010)
skill_code & (select code from SKILLCODES where name = 'python')
2 & 4 → 0010 & 0100 → 0000
→ 0 (0이므로, python을 포함하지 않는 스킬을 보유한 것으로 판단)
SELECT a.id,a.email,a.first_name,a.last_name
from developers a
join (select id,CONV(skill_code,10,2) abcode from developers) b
on a.id = b.id
where substr(abcode,-9,1) = 1 or substr(abcode,-11,1) = 1
order by 1 asc
이렇게 제출하면 예제에서는 통과, 제출하면 18점이 나왔다.
skillcodes 테이블에서 가져와서 사용해야해서 점수가 18점만 나온 것 같다.
이진수 형태의 데이터에 대해 각 비트 단위로 연산을 수행하는 데 사용
비트 AND (&)
두 값의 대응하는 비트가 모두 1일 때만 결과 비트가 1이 됩니다.
SELECT 6 & 3; -- 결과: 2
6의 이진수: 110
3의 이진수: 011
6 & 3의 결과는 010 (즉, 2)
비트 OR (|)
두 값의 대응하는 비트 중 하나라도 1이면 결과 비트가 1이 됩니다.
SELECT 6 | 3; -- 결과: 7
6의 이진수: 110
3의 이진수: 011
6 | 3의 결과는 111 (즉, 7)
비트 XOR (^)
두 값의 대응하는 비트가 다를 때만 결과 비트가 1이 됩니다.
SELECT 6 ^ 3; -- 결과: 5
6의 이진수: 110
3의 이진수: 011
6 ^ 3의 결과는 101 (즉, 5)
비트 NOT (~)
숫자의 각 비트를 반전시킵니다. 1은 0으로, 0은 1로 바뀝니다.
SELECT ~6; -- 결과: -7
6의 이진수: 00000000 00000000 00000000 00000110
~6의 결과는 11111111 11111111 11111111 11111001 (즉, -7)
여기서 결과가 -7인 이유는 MySQL에서 음수는 2의 보수를 사용하여 표현되기 때문입니다.
비트 왼쪽 시프트 (<<)
숫자의 비트를 왼쪽으로 이동시키고, 오른쪽에는 0이 채워집니다.
SELECT 3 << 2; -- 결과: 12
3의 이진수: 11 (2비트)
3 << 2는 1100 (즉, 12)
비트 오른쪽 시프트 (>>)
숫자의 비트를 오른쪽으로 이동시키고, 왼쪽에는 0이 채워집니다.
SELECT 12 >> 2; -- 결과: 3
12의 이진수: 1100
12 >> 2는 11 (즉, 3)