나의 답:
SELECT ED.ID, ED.GENOTYPE, EDP.GENOTYPE AS PARENT_GENOTYPE FROM ECOLI_DATA AS ED
LEFT JOIN (SELECT ID, GENOTYPE FROM ECOLI_DATA) AS EDP
ON ED.PARENT_ID = EDP.ID
WHERE ED.GENOTYPE & EDP.GENOTYPE = EDP.GENOTYPE
ORDER BY ID;
주어진 테이블의 SIZE_OF_COLONY, DIFFERENTIATION_DATE 는 필요없음.
비트연산자에 대한 개념을 몰라서 이렇게 간단한 쿼리인줄 모르고 끙끙 앓았다.
이진법이 나오면 비트연산자를 의심하자.
부모의 형질을 다 포함하냐는 말은 자식 형질과 부모 형질의 교집합이 부모 형질이냐는 말과 같다 !
즉, & 비트연산자를 사용했을 때 결과가 부모 형질과 같아야 한다.
비트연산자
a = 25, b = 10
이를 이진법으로 표현하면
a = 0001 1001, b = 0000 1010
두 값의 각 자리를 비교하며 해당 자리의 결과를 출력하는 연산자
AND 연산( & ): 둘 다 1일 때만 1을 출력
a & b = 0000 1000 = 8
OR 연산( | ): 둘 중 하나라도 1이면 1을 출력
a | b = 0001 1011 = 27
XOR 연산( ^ ): 둘 중 하나만 1일 때만 1을 출력
a ^ b = 0001 0011 = 19
하나의 값과 사용되는 연산자
보수 연산( ~ ): 모든 비트를 반전시킨다
~a = 1110 0110 = -26
왼쪽 시프트(<<): 지정된 비트 수만큼 왼쪽으로 이동
a << 2 = 0110 0100 = 100
오른쪽 시프트(>>): 지정된 비트 수만큼 오른쪽으로 이동
a >> 2 = 0000 0110 = 6
조건절에서 사용되는 기타 연산자
각 단어의 뜻을 이해하면 암기하지 않아도 쉽다.
- IN: 목록 내의 값과 일치하는지 확인할 때 사용
- ANY: 여러 값 중 하나라도 조건을 만족하면 됨
- ALL: 모든 값이 조건을 만족해야 함
- EXISTS: 서브쿼리의 결과가 존재하는지 여부만 확인 (IN과 비슷)
SELECT * FROM 상품 WHERE 카테고리 IN ('의류', '신발', '가방');
SELECT * FROM 상품 WHERE 가격 > ANY (5000, 10000, 15000); -- 5000보다 비싼 상품들 조회됨
SELECT * FROM 상품 WHERE 가격 < ANY (5000, 10000, 15000); -- 15000보다 저렴한 상품들 조회됨
SELECT * FROM 상품 WHERE 가격 = ANY (5000, 10000, 15000); -- IN과 동일 기능
SELECT * FROM 상품 WHERE 가격 > ALL (5000, 10000, 15000); -- 15000보다 비싼 상품들 조회됨
SELECT * FROM 상품 WHERE 가격 < ALL (5000, 10000, 15000); -- 5000보다 저렴한 상품들 조회됨
SELECT * FROM 상품 WHERE 가격 = ALL (5000, 10000, 15000); -- X
SELECT * FROM 주문 WHERE EXISTS (SELECT * FROM 배송완료);