해결된 질문
작성
·
257
·
수정됨
0
강사님 좋은 강의 감사합니다 ! (__)
다름이 아니라 답변을 보는 와중에
제가 이해한 내용이 강사님께서 말씀하신 의도가 맞는지 궁금해서 입니다.
마지막 줄에 작성해주신
여러개의 테이블로 조인할 경우에는 조인key에 따라 조인시 만들어 지는 집합의 레벨을 순차적으로 생각해 줘야 합니다.
이 뜻이
다중으로 테이블을 조인을 할때
emp 1 join emp_salary_hist M => emp_salary_hist 레벨의 조인 결과
-> emp_salary_hist M : dept 1 => emp_salary_hist 레벨의 조인 결과
이렇게 1 : M -> M : 1 - > M 이렇게 조인을 하는게 아니라
1: M -> 1 :M -> M 으로 조인을 하라는 말씀이신건가요 ?
추가 질문으로 M 집합의 크기가 큰게 뒤로 가는게 더 좋은 SQL이라고 할수있을까요?
그리고 이렇게 코드를 작성해야하는 이유도 궁금합니다.
답변 1
1
안녕하십니까,
이 뜻이
다중으로 테이블을 조인을 할때
emp 1 join emp_salary_hist M => emp_salary_hist 레벨의 조인 결과
-> emp_salary_hist M : dept 1 => emp_salary_hist 레벨의 조인 결과
이렇게 1 : M -> M : 1 - > M 이렇게 조인을 하는게 아니라
1: M -> 1 :M -> M 으로 조인을 하라는 말씀이신건가요 ?
=> 그런 의미는 아닙니다. SQL에서 조인의 순서를 강제로 지정할 수는 없습니다(물론 힌트등을 통해서 가능은 하지만 이건 튜닝의 영역이라 예외로 하겠습니다). SQL 문장상에서 조인 테이블이 먼저 나온다고 반드시 조인이 먼저 되는것은 아닙니다. 조인의 순서는 RDBMS가 내부적으로 최적의 조인 순서를 판단해서 결정합니다.
순차적으로 집합의 레벨을 생각해보라는 의미는
dept와 emp의 조인은 deptno로 1:M 이므로 조인 결과 집합은 emp 레벨을 따르게 되고, emp와 emp_salary_hist의 empno로의 조인은 1:M 이므로 결국은 emp_salary_hist 집합 레벨로 최종 조인 집합이 결정된다는 의미 입니다. 그러니까 조인 key로 연결되는 집합들끼리 순차적으로 차근차근 집합의 레벨을 생각해 보라는 의미 입니다.
위에 적어 주신 emp 1 join emp_salary_hist M => emp_salary_hist 레벨의 조인 결과는 맞습니다.
하지만 emp_salary_hist M : dept 1 이지만 1:M, M:1 관계를 명확히 이야기 하자면, 조인 KEY 레벨로 1:M 인지를 의미합니다. emp_salary_hist와 dept는 조인키가 없기 때문에 집합 자체로 보면 dept가 emp와 1:M 이고 emp가 emp_salary_hist로 1:M 이므로 1:M이 될 수는 있지만, 바로 emp_salary_hist와 dept를 조인 할 수는 없습니다.
추가 질문으로 M 집합의 크기가 큰게 뒤로 가는게 더 좋은 SQL이라고 할수있을까요?
=> 앞에서도 말씀 드렸듯이 SQL에 조인으로 먼저 나열되는 테이블이라고 반드시 먼저 수행되지는 않습니다. M집합의 크기가 큰게 뒤로 간다고 조인 연결시 맨 마지막에 수행되지는 않지만, 직관적으로 SQL 조인 연결을 이해하는데 도움이 되므로 일반적으로 M집합을 뒤로 보내는 SQL을 작성하는 경향이 있을 수는 있습니다.
감사합니다.
아하 감사합니다 !! 강의 열심히 듣고 있습니다