inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

데이터 분석 SQL Fundamentals

조인(Join) - 조인 기반 메커니즘_조인 실습 - 03 강의 속 질문입니다.

164

Busantist

작성한 질문수 6

0

1997년에 주문한 주문 정보를 추출하는 쿼리에서 날짜 조건을  아래처럼

and o.order_date = to_date('1997','yyyy') 

작성하면 결과값이 안나오는데 다른 이유가 있을까요??

강의 속 코드인 between A and B 구문보다 간단하다고 생각해서 위처럼 코드를 작성했습니다.

sql postgresql DBMS/RDBMS

답변 1

0

권 철민

안녕하십니까, 

o.order_date = to_date('1997', 'yyyy')로 하면 1997년 1월 1일 단 하루동안의 order 일자에 해당하는 것만 가져오기 때문에 결과값이 나오지 않습니다. 

원하시는 대로 between이 아니고 = 로 해당 년도의 모든 데이터를 가져오려면 아래와 같이 수행하시면 됩니다. 

select * from nw.orders

where substr(to_char(order_date, 'yyyymmdd'), 1,4) = '1997';

 

to_char(order_date, 'yyyymmdd') 는 Date 형 컬럼인 order_date를 문자열로 변환하는데 yyyymmdd와 같은 형태로 변환하는 것이고, 이렇게 8문자로 변환된 값을 substr(..., 1, 4)로 첫번째 부터 이후 4번째 까지 문자열을 추출한 것이 '1997' 인것만 가져오는 것입니다. 

그런데 이렇게 하면 SQL 성능에 영향을 줄 수가 있습니다. 강의에서는 소개하지 않았지만, 빠르게 데이터를 가져오기 위해서 order_date에 index가 달려 있다면 to_char(order_date....) 로 가공하면서 index를 사용하지 못하기 때문에 수행 속도가 느려질 수 있습니다. 

감사합니다. 

0

Busantist

늦은시간에 답변 주셔서 감사합니다. 데이터 형식과 변환함수에 대해서 좀 더 공부해보겠습니다.

0

Busantist

 order_date에 index가 달려 있다면 to_char(order_date....) 로 가공하면서 index를 사용하지 못하기 때문에 수행 속도가 느려질 수 있습니다. 

라고 답변 주셨는데 혹시 index가 달려있다라는 뜻을 조금만 더 설명해 주실 수 있으실까요??

0

권 철민

인덱스는 물리적인 요소로서 테이블의 개별 레코드의 위치를 가지고 있습니다. 

일반적으로 where 조건의 컬럼으로 인덱스가 없는 경우 테이블에서 원하는 레코드를 필터링 할때 전체 테이블을 다 읽어들이면서 where조건에 맞는 레코드만 찾아냅니다. 가령 1000만건의 order 테이블이 있고 order_date에 인덱스가 없다면 where order_date = to_date('19970101', 'yyyymmdd') 와 같이 단 하루의 주문 일자에 해당하는 데이터를 찾기 위해서 1000만건을 모두 읽으면서 필터링을 하게 되므로 시간이 많이 소모될 수 있습니다. 

이를 개선하기 위해 index를 적용할 수 있습니다.  order_date 컬럼에 인덱스를 생성하게 되면 인덱스에 order_date의 값별로 해당 레코드의 위치를 가지고 있습니다. 그래서 1000만건의 order 테이블을 읽기전에 먼저 order_date 인덱스에서 where order_date = to_date('19970101', 'yyyymmdd') 에 해당하는 레코드의 위치를 먼저 찾은 다음에 테이블을 읽기 때문에 대용량 테이블에서 더 빠르게 데이터를 가져 올 수 있습니다. 

그런데 where order_date = to_date('19970101', 'yyyymmdd') 가 아니라 where to_char(order_date, 'yyyymmdd') = '19970101' 과 같이 order_date를 to_char() 함수등으로 먼저 가공해버리면 index를 탈수가 없기 때문에 위에서 제가 말씀 드린 쿼리와 같은 형태를 적용할 때는 이런 부분이 있다는 것을 미리 인지하고 있어야 합니다. 

 

최신버젼 다운로드

0

51

2

'레벨 유지'의 의미에 대한 질문

0

68

2

date_part

0

70

2

lag/lead offset 관련 질문

0

75

2

join 관련 질문 (inner join, left join)

1

114

2

배치에서 full outer join을 쓴다고 하셨는데 예시를 알 수 있을까요?

0

105

2

Madrid에 살고 있는 고객이 주문한 주문 정보를 구할것. 실습 질문드립니다

0

65

2

rollup시 null값 매출 라벨링

0

69

2

10. 조인 실습 - 02 관련 질문

0

72

1

조인실습03 - join의 pk-fk join

0

120

2

조인실습03 - join의 pk-fk join

0

81

2

(공유)맥, 스키마 import

0

85

2

sql 입문자인데, 이 강의와 sql 코딩테스트와 연관이 있을까요?

0

147

2

1인지 M인지는 결국엔 테이블을 직접 확인을 해야 하는걸까요?

0

141

2

안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다.

0

98

1

섹션5 Group by 실습-01 강의 예제 질문

0

130

2

섹션2 조인 기반 메커니즘에서 조인 실습 - 04 강의 예제 질문

0

134

2

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

0

141

2

lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.

0

137

1

Dbeaver오류

0

649

2

직원 별 가장 높은 매출

0

125

1

강의순서대로 실습코드순알려주세요.

0

144

1

m:n inner join일 경우 cross조인과 동일하게 동작되는건가요?

0

143

1

rollup

0

94

2