작성
·
409
·
수정됨
0
안녕하세요 강사님의 강의에 큰 도움을 받고 있는 초보 SQL 유저입니다 문제를 풀다 궁금한 점이 생겼습니다
해당 문제의 경우 왼쪽이 customers (부모) 오른쪽 orders(자식) 관계인데 요구 조건 마다 다르겠지만 outer 조인 할 때, Null 쪽이 M 쪽을 넣는 것이 더 자주 사용될거 같은데 혹시 저의 생각이 맞을까요?
과거에 조인절이 많아져 행과 열이 늘어나면 쿼리 처리속도가 늘어난다는 얘기를 들었습니다 그래서 서브쿼리로만 풀 수 있는 쿼리는 조인문을 안 쓰는 것이 더 낫지 않나라 생각 드는데 혹시 맞을까요?
-- 주문이 단 한번도 없는 고객 정보 구하기.
select *
from customers c
left join orders o on (o.customer_id = c.customer_id)
where o.customer_id is null
select *
from customers c
where customer_id not in (select customer_id
from orders
)
답변 2
1
안녕하십니까,
도움이 되었다니, 저도 기쁘군요 ^^
outer 조인 할 때, Null 쪽이 M 쪽을 넣는 것이 더 자주 사용될거 같은데 혹시 저의 생각이 맞을까요?
=> Null 쪽이 M쪽을 넣는 다는 의미를 제가 정확히 파악하지 못했지만,
outer 조인은 주로 부모 테이블이 Outer, 자식 테이블이 Inner가 되는 경우가 많습니다. 그러니까, 적어주신 SQL과 같이 주문을 하나도 안한 고객을 찾기 위해서라든가 아님 부모 테이블에는 ROW가 있는데 자식 테이블에서 해당 조인 KEY값(위 SQL에서는 CUSTOMER_ID)이 없더라도 조인에서 제외되지 않도록, 즉 부모 테이블의 ROW가 자식 테이블과 조인 연결되지 않더라도 이를 보존하기 위해서 사용됩니다.
업무상 부모 테이블에는 데이터가 있지만, 자식 테이블은 해당 부모의 레코드로 데이터가 아직 안만들어져 있는 경우가 많은데, 이런 경우에 부모 테이블의 레코드가 조인에서 제외되지 않도록 하기 위해서 사용됩니다. 반대로 자식 테이블이 outer가 되는 경우는 주로 데이터 정합성이 안맞는 경우를 찾아내기 위해서 자주 사용됩니다. 그러니까, 부모 테이블에서는 해당 데이터가 삭제되었는데, 자식 테이블에는 아직 유지 되고 있다던가 하는 경우에 사용됩니다.
과거에 조인절이 많아져 행과 열이 늘어나면 쿼리 처리속도가 늘어난다는 얘기를 들었습니다 그래서 서브쿼리로만 풀 수 있는 쿼리는 조인문을 안 쓰는 것이 더 낫지 않나라 생각 드는데 혹시 맞을까요?
=> 그렇지는 않습니다. RDBMS는 조인에 더 최적화된 기능들이 좀 더 많습니다. 서브쿼리 자체도 조인과 유사한 형태로 풀립니다. 특히나 전체 데이터를 다 처리해야 하는 분석형 sql에서는 조인이 더 효과적인 경우가 많습니다. 다만 OLTP성에서 서브쿼리들이 좀 성능 특화적인 부분이 약간 있지만, 가장 기본은 조인을 사용하는 것입니다.
감사합니다.
0
앗 강사님 우문현답을 내주셔서 너무 감사합니다!
이런 좋은 퀄리티를 무제한으로 들을 수 있는 것에 큰 감사함을 드립니다
추 후에 SQL와 PYTHON 실력이 빨리 올려 스파크 강의도 듣겠습니다!