📍 문제
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다.
ID - 대장균 개체의 ID
PARENT_ID - 부모 개체의 ID
SIZE_OF_COLONY - 개체의 크기
DIFFERENTIATION_DATE - 분화되어 나온 날짜
GENOTYPE - 개체의 형질
2번 형질을 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA
WHERE (GENOTYPE & 2 = 0 )
AND (GENOTYPE & 5 != 0)
갑자기 이진수 문제가 나와서 어려웠다...
이건 이진수 비교 문제다. 일반 숫자를 대입해 풀면 안 된다. 복수전공 할 때 잠시 배웠던 게 도움이 됐다.
TYPE 1 = 0001
TYPE 2 = 0010
TYPE 3 = 0100
TYPE 4 = 1000
이렇게 타입별로 이진수로 이루어져 있으므로
GENOTYPE도 이진수로 분해해서 생각해야 하는 것이다.
일단 2번 형질을 보유하지 않아야 된다 고 했다.
그렇다는 건, TYPE 2 형태를 가진 대장균을 제외해야 한다는 것.
즉 _ _1_ 의 형질을 가진다면 조회 대상에서 제외해야 한다.
이진수의 자리마다 형태를 비교하는 & 연산자 를 사용 한다.
0010과 GENOTYPE 둘 다 1일 때만 1을 반환하는 연산이다. 나머지(둘 다 0 / 둘 중의 하나가 0) 연산은 모두 0이 반환된다.
해당 문제에선 TYPE 2 즉 0010을 제외해야 한다고 했으므로, GRNOTYPE & 2(0010) 연산의 결과가 0이 되는 대상들만 출력해야 한다.
그래야만 0010 & _ _1_ = 1,
즉 0010의 1과 연산되어 GENOTYPE에 2번 형질이 포함되는 것을 막는다.
WHERE GENOTYPE & 2 = 0
1번이나 3번 형질을 포함하거나
1번과 3번 모두 포함 해야 한다고 했다.
1 TYPE = 0001
3 TYPE = 0100
위의 TYPE 2 포함시키지 않았던 것과 비슷하게 식을 도출한다.
1 TYPE 와 3 TYPE 를 더해 함께 계산.
0001 + 0100 = 0101, 즉 5와 비교해야 한다.
0101 & _ 1 _ 1 결과값이 0이 아니어야 한다. 1과 만나 이진수값이 출력되어야만이
1 TYPE
혹은
3 TYPE
혹은
1 TYPE과 3 TYPE
이 포함되는 것이므로.
WHERE (GENOTYPE & 2 = 0)
AND (GENOTYPE & 5 != 0)
✔️
1, 3번 형질이 포함되는 걸 AND 연산자로 붙이는 등 따로 계산하지 않는 이유는, 둘 중 하나가 포함되거나 둘 다 포함되는 경우가 조건이기 때문이다.
만약,WHERE (0001 & 1) AND (0100 & 4)로 붙이면 두 형질 모두 가진 것들만 출력될 것이고,
WHERE (0001 & 1) OR (0100 & 4)로 붙이면 둘 중에 하나만 포함되는 것들만 출력될 것.
둘 다 포함 or 둘 중 하나만 포함 을 함께 계산해야 하므로, 1번과 3번을 더해 & 연산자로 0101과 GENOTYPE를 비교하는 형식으로 계산해야 옳은 결과가 도출된다.
아이구. 복잡혀라.