인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

JE님의 프로필 이미지

작성한 질문수

데이터 분석 SQL Fundamentals

조인 실습 - 02

섹션2 조인 실습 01 강의 질문

작성

·

46

·

수정됨

0

안녕하세요.

섹션2 조인 실습 01 강의에서 질문이 있습니다. 

  1. 조인 실습1의 예제들에서 강사님께서는 join을 사용하시는데 left join을 사용해도 괜찮은지 궁금합니다.

     

    보통 조인 시 일반적으로 left join을 사용한다고 들어서요. 

     

    예를 들어 emp 테이블과 dept 테이블을  inner join할 경우 만약의 경우 emp 테이블에 존재하는 직원이 dept 테이블에서 누락되었다면 최종 join 테이블에도 그 직원이 누락될 수 있기 때문에 left join을 쓰는게 안전하지 않나 하는 생각이 들었습니다.

 

  1. 조인 실습1 예제의 4번째 예제에서 날짜 필터링 조건에서 to_date 함수를 쓰지 않고 fromdate >= '1983-01-01' 그냥 이처럼 써도 되는지 궁금합니다. 결과는 동일하게 나오지만 성능적 차이가 있거나 to_date 함수를 사용하는 것이 실무에서 많이 쓰는 방식인건지 궁금합니다.

     

조인실습1 문제4 - 저의 풀이

부서명 SALES와 RESEARCH의 소속 직원들의 부서명, 직원번호, 직원명, JOB 그리고 과거 급여 정보중 1983년 이전 데이터는 무시하고 데이터를 추출하시오

SELECT

d.dname,

e.empno,

e.ename,

e.job,

esh.fromdate,

esh.todate,

esh.sal

FROM dept d  

JOIN emp e ON d.deptno = e.deptno 

JOIN emp_salary_hist esh ON e.empno = esh.empno 

WHERE 

d.dname IN ('SALES', 'RESEARCH')

AND esh.fromdate >= '1983-01-01'

ORDER BY d.dname, e.empno, e.ename, esh.fromdate;

답변 2

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

1

inner join과 left join은 엄연하게 결과가 다릅니다. (차이를 모르셔서 질문을 하셨을 것 같지는 않지만,) 업무 로직에 맞는 조인을 적용하셔야 합니다.

실무에서 말씀하신대로 명확하게 구분하지 않고 그냥 left join을 적용하는 경우도 있습니다.안전(?)의 의미가 그런식으로 적용되면 안되지만, 데이터가 빠지면 왜 빠지는지, 왜 결과가 달라지는지 명확히 이해가 되지 않아서 그냥 left join을 적용하는 경우들을 종종 보아 왔습니다

하지만 이렇게 무조건 left join을 적용하시면 SQL 실력이 늘지 않거나, 이번엔 오히려 업무에서 필요로 하는 결과와 다른 결과가 출력되는데 뭐가 잘못되었는지 이해가 안되는 경우로 이어질 수 있습니다. 강의내용을 좀 더 들으시면 제가 조인시 집합의 레벨등 많이 강조하는 부분이 있습니다. 좀 더 강의를 들으신다면 조인에 대해서 확신을 가지고 사용하실 수 있으 실 것입니다.

2.

컬럼 타입 예를 들어 fromdate 컬럼의 타입이 Date 타입이면 조건절의 비교도 Date 타입으로 해주시는게 좋습니다.

그렇지 않고 Date 타입 컬럼의 조건 비교를 esh.fromdate >= '1983-01-01' 와 같이 문자열로 하시게 되면 DBMS 유형에 따라 위와 같은 SQL을 DBMS 내부에서 to_char(esh.fromdate, 'yyyy-mm-dd') > '1983-01-01' 과 같이 자동으로 변경해 버릴 수 있습니다. 이때 fromdate에 인덱스가 걸려 있으면 해당 컬럼값이 to_char()로 변환 되므로 인덱스를 사용할 수 없게 됩니다.

 

감사합니다.

JE님의 프로필 이미지
JE
질문자

답변 감사합니다. 도움 많이 되었습니다🙂

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. JE님, 질문 주셔서 감사합니다.

  1. Left Join의 사용에 대해

    • 조인 시 LEFT JOIN을 사용하는 것은 데이터의 완전성을 유지하기 위해 매우 유용합니다. 특히, EMP 테이블의 모든 직원 정보를 유지하고 싶다면, LEFT JOIN을 사용하는 것이 바람직합니다. LEFT JOIN은 주 테이블인 EMP의 데이터를 모두 유지하며, 연결되지 않은 DEPT 테이블의 값은 NULL로 표시됩니다. 반면, INNER JOIN은 두 테이블 모두에 존재하는 데이터를 반환합니다. 이로 인해 직원이 부서 정보가 없는 경우 해당 직원의 데이터는 반환되지 않을 수 있습니다. 따라서, 데이터를 잃을 우려가 있을 때는 LEFT JOIN을 고려하는 것이 좋습니다.
  2. 날짜 필터링에서 to_date 함수 사용 여부

    • to_date 함수를 사용하지 않고 ‘1983-01-01’ 형식으로 직접 비교해도 일반적으로 문제 없습니다. 다만, 사용하고 있는 DBMS의 날짜 형식 설정에 따라 문자열 비교가 영향을 받을 수 있습니다. to_date를 사용하는 것이 좀 더 명확성을 높일 수 있지만, 현대의 많은 DBMS는 문자열을 자동으로 날짜로 변환해주므로 큰 차이는 없습니다. 즉, 성능상으로도 큰 차이는 없으며, 실무에서는 팀의 스타일이나 DB에서 사용하는 데이터 형식에 따라 사용할 수 있습니다.

추가로, 기존에 유사한 질문 및 답변에서 도움이 될 수 있는 내용이 있어 함께 공유드립니다:

  • 게시글: JOIN 실습 예제 SQL 관련 질문입니다.

    • 강사님이 MARTIN이라는 직원에 대해 과거 날짜를 무시하려는 경우에 맞는 SQL문 작성 방법을 안내한 답변이 있습니다.
  • 게시글: join 실습 관련 질문 있습니다.

    • to_date 함수 사용에 대해 강사님이 DBMS 종류와 인덱스 작동에 대한 중요한 설명을 제공한 답변이 있어 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

JE님의 프로필 이미지

작성한 질문수

질문하기