SELECT COUNT(ID) AS COUNT
FROM ECOLI_DATA
WHERE GENOTYPE & 2 = 0
AND (GENOTYPE & 4 >= 1 OR GENOTYPE & 1 >= 1);
ECOLI_DATA
테이블에서
ID
의 개수(COUNT()
)를 COUNT
라는 컬럼명으로 추출한다.
GENOTYPE
은 10진수로,
이를 2진수로 변경했을 때 자릿수를 n번 형질이라고 정의한다.
예를 들면 다음과 같이 표현 가능하다.
10진수 : 8
2진수 : 0100
3번 형질이 존재함.
이런 연산을 진행하기 위해서 비트 연산자
를 사용하는 방법을 취할 수 있다.
GENOTYPE
이 8이라고 할 때, GENOTYPE & 2
를 표현하면 아래와 같다.
GENOTYPE(10진수) : 8
=> GENOTYPE(2진수) : 0100
2(10진수)
=> 0010(2진수)
--- 비트 연산 ---
0100
& 0010
-------
0000(2진수)
=> 0(10진수) === 최종 연산 결과
&
연산자의 경우 비트가 모두 1인 경우에만 1이 된다.
따라서, 특정 형질이 존재하는지 여부를 판단하는 연산에 사용될 수 있다.
위 예시의 경우, 8
이라는 GENOTYPE
은 2번 형질을 가지지 않는다는 것을 확인할 수 있다.
따라서,
GENOTYPE & 2 = 0
은 2번 형질이 없는 경우를 의미하고,
GENOTYPE & 4 >= 1
은 1번 형질이 있는 경우를 의미한다.
여기서,
왜 = 1
이 아니라 >= 1
인지 의문이 들 수 있다.
그렇다면, 비트 연산자가 어떤 결과를 내는지 이해해야한다.
GENOTYPE(10진수) : 15
=> GENOTYPE(2진수) : 1111
4(10진수)
=> 0100(2진수)
--- 비트 연산 ---
1111
& 0100
-------
0100(2진수)
=> 4(10진수) === 최종 연산 결과
위 예시를 보고 GENOTYPE & 2 = 0
를 다시 보면,
= 0
은 해당 비트 자리수가 0이라는 것이 아니라 비트 연산의 결과값(10진수)이 0이라는 것을 알 수 있다.
따라서,
GENOTYPE & 4 >= 1
을 바꿔말하면
GENOTYPE & 4 = 4
가 될 수 있다.
또한, 같은 방법으로
GENOTYPE & 1 >= 1
을 바꿔말하면
GENOTYPE & 1 = 1
가 될 수 있다.
GENOTYPE & 2 = 0
를 설명하자면,
2(10진수)
는 0010(2진수)
이므로
두 번째 자릿수 외에는 전부 &
연산을 통해 0
이 되며,
2번 형질마저 없으면(두 번째 자릿수 비트가 0
이면)
비트 연산 결과, 모든 자릿수가 0
이 되어 결과값이 0000(2진수)
,
즉, 0(10진수)
이 되는 것이다.