SQL 실전 · 조인 · 퀴즈
퀴즈: 조인
문항 7개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
LEFT JOIN 뒤 WHERE 절에 오른쪽 테이블의 조건을 쓰면 어떻게 되는가?
- 짝이 없어 NULL 이 채워진 행이 조건에서 걸러져 사실상 INNER JOIN 이 된다
- ON 절에 쓴 것과 결과가 달라지지 않는다
- 문법 오류로 실행되지 않는다
- 조건과 무관하게 오른쪽 테이블의 모든 행이 남는다
LEFT JOIN 결과에서 주문이 없는 고객의 건수를 0 으로 만들려면?
- count(*) 를 쓴다
- count(o.id) 처럼 조인된 쪽의 컬럼을 센다
- COALESCE(count(*), 0) 을 쓴다
- HAVING count(*) > 0 을 붙인다
주문 하나에 상세가 3건일 때 주문과 상세를 조인한 뒤 sum(o.total_amount) 를 하면?
- 주문 금액이 3배로 부풀려진다
- 정확한 주문 금액 합계가 나온다
- 상세 금액의 합이 나온다
- 오류가 발생한다
짝이 없는 행만 찾는 안티 조인을 쓸 때 NOT IN 보다 NOT EXISTS 가 안전한 이유는?
- 서브쿼리 결과에 NULL 이 섞이면 NOT IN 은 결과를 통째로 비우기 때문
- NOT EXISTS 가 항상 더 빠르기 때문
- NOT IN 은 인덱스를 쓸 수 없기 때문
- NOT EXISTS 만 상관 서브쿼리를 지원하기 때문
같은 테이블을 자기 자신과 조인해 쌍을 만들 때 a.id < b.id 조건을 넣는 이유는?
- 비교 횟수를 줄여 성능을 높이려고
- id 가 NULL 인 행을 제외하려고
- 같은 쌍이 순서만 바뀐 채 두 번 나오는 것과 자기 자신과의 쌍을 막기 위해
- 결과 쌍의 정렬 순서를 보장하려고
조인 조건을 빠뜨리면 어떤 일이 생기는가?
- 문법 오류가 발생해 아예 실행되지 않는다
- 첫 번째 테이블의 행만 반환된다
- 모든 조합이 만들어지는 카티션 곱이 되어 행 수가 곱으로 폭증한다
- 자동으로 기본 키끼리 연결된다
실행 계획에서 Nested Loop 의 안쪽 노드가 loops=52310 으로 나왔다. 가장 먼저 확인할 것은?
- 안쪽 노드의 1회 실행 시간이 짧으니 문제없다고 판단한다
- 인덱스를 모두 지운다
- 바깥쪽 행 수 추정이 맞는지 확인한다. loops 를 곱한 총 시간이 병목일 수 있다
- 조인 순서를 무조건 뒤집는다