반응형

DB출처: http://www.thisisgame.com



안녕하세요!


오늘은 '날짜형변환' 에 대해 다뤄보도록 하겠습니다.




날짜형이란 무엇일까요?



우선, 데이터 유형의 변환은 크게 2가지 암시적 형변환과 명시적 형변환으로 나뉩니다.



암시적형변환은  오라클 데이터베이스의 장점이자 단점이라고 볼 수 있습니다.



문제1. 과연, 아래의 SQL문은 과연 실행이 될까요?


 Slect ename, sal

           From 테이블명

           Where sal like '35%';


힌트) 


sal은 연봉을 의미하며 숫자 data가 들어있습니다.


'35%'는 ' ' 싱글쿼테이션으로 감싸져 있으니 문자형이라는 것을 쉽게 알아챌 수 있으셨겠죠?


( 만약 LIKE문을 모르신다면 여기에서 확인하시고 돌아오셔도 됩니다.)





위와 같은 경우를 암시적 형변환이라고 합니다.


어떤 DB에서는 위와같은 경우 형이 맞지 않는 data끼리를 비교하였기 때문에 오류가 발생합니다.


하지만, 오라클의 경우에는 오류가 나지 않기 때문에 형변환으로 많은 시간이 걸린다는 단점이 있습니다.





다음으로 명시적 형변환이 있습니다. 이는 우리가 임의로 데이터 유형을 변경시키는 것입니다.



명시적 형변환은 3가지가 있습니다.


1. to_char: 문자형으로 형변환하는 함수


2. to_number: 숫자형으로 형변환하는 함수


3. to_date: 날짜형으로 형변환하는 함수



오늘은 앞서 언급한 것과 같이 날짜형을 변환하는 방법에 대해 알아보겠습니다.




문제2. 81년 9월 10일에 입사한 사원들의 이름(ename)과 입사일(hiredate)을 알고싶습니다.






그럼 여기서 궁금증이 생깁니다.


과연 어떤 방법이 제일 간단하면서 빠를까요?




사실 그 질문보다 먼저 해야하는 질문이 있습니다.


과연 어떤 방법이 제일 성능이 떨어지는 방법인가요?



그것은 바로 좌변을 가공하는 이와같은 방법입니다.


 SELECT ename, hirdate

FROM 테이블이름

WHERE to_char(hiredate, 'RR/MM/DD') = '81/09/10';



이것은 강제로 날짜 형식을 변경시켜서 찾는 여러 방법 중


실제로 많이 사용하지만 SQL 속도면에서 가장 좋지 않은 방법이라고 할 수 있습니다.




WHERE 조건에서 좌변을 가공하면 인덱스가 사용되지 않습니다. 


즉 처음부터 끝까지 비교를 해야하는거죠 (FULL TABLE SCAN을 하게됩니다.)

출처: 한국데이터진흥원


다음으로 새로 DB에 접속할 때마다 날짜형을 변환하는 다음과 같은 방법이 있겠죠.


 ALTER SESSION SET nls_date_format = 'RR/MM/DD';



그것도 귀찮다면!



아래와 같이 날짜형 데이터의 형변환을 하는 습관을 들이시는 것은 어떨까요?


SELECT ename, hiredate

FROM 테이블명

       WHERE hiredate = to_date('81/09/10') 






오늘도 수고하셨습니다.


매일매일 SQL을 공부하며 성장하는 으니입니다!


앞으로도 화이팅합시다!!



만약 위포스팅에서 잘못된 부분이 있다면 댓글로 알려주세요~



이 글이 도움되셨다면 아래 공감 꾹~ 





반응형
반응형


SQL이란,



 관계형 데이터베이스 관리 시스템에서


 자료의 검색 및 관리 등을 위해 설계된 프로그래밍 언어입니다.


출처: 위키백과




이러한 SQL 에는 다양한 함수가 존재하는데요.


이러한 함수는 크게 '단일 행 함수'와 '복수 행 함수'로 나뉠 수 있습니다.






오늘은 단일 행 함수의 속하는 다양한 함수 중 문자함수에 대해 알아보겠습니다.





데이터 검색을 할 때 함수가 필요한 이유는 무엇일까요?



그 이유는!



함수를 이용하면 더 다양하게 데이터를 검색할 수 있기 때문입니다.



문제를 통해 이 사실을 확인합시다.


현재 DB에 있는 EMAIL의 형식을 아래와 같이 가정합니다.


                       '아이디 @ naver.com'

'아이디 @ daum.com'

'아이디 @ gmail.com'


 .

 .

 .

 .




과연 함수 없이 다음 문제를 풀 수 있을까요?



문제1. 이메일에서 @가 몇 번째 철자에 있는지 알려주세요!



문제2. 내 이메일 주소를 다른 사람이 알 수 없도록 다른 철자로 변경해주세요!



문제3. 이메일을 입력하다 모르고 처음에 공백을 넣어서 찾을 수가 없습니다. 해결해주세요.




이때 사용하는 함수를 각각 소개하겠습니다.


문제1. 이메일에서 @가 몇 번째 철자에 있는지 알려주세요!






이 때 사용하는 함수가 바로 INSTR 함수입니다.


instr함수는 특정 철자가 단어에서 몇 번째 철자인지 확인하는 함수죠!


(단, 처음 나오는 특정 철자의 자리를 알려준답니다!)



형식: 


 INSTR (string, substring [, position ] )



'string'


 입력할 문자열을 지정하는 부분입니다.



'substring'


 위치를 반환할 문자열을 지정하는 것입니다.



'position'


 탐색을 시작할 string의 위치를 나타내며, 문자 재수 단위로 지정됩니다.

 이 인자가 생략되면 기본값인 1이 적용됩니다. 즉, 선택사항이죠



반환 값은 INT 형식으로 숫자가 return됩니다.


출처: CUBRID




문제2. 내 이메일 주소를 다른 사람이 알 수 없도록 다른 철자로 변경해주세요!





물론 더 좋은 보안 시스템을 이용할 수도 있죠.




하지만,


제가 여기서 강조하고 싶은 부분은 바로 'regexp_replace'함수 입니다.



regexp_replace 함수는 여러개의 철자를 한번에 다른 철자로 변경하는 함수입니다.



형식:


REGEXP_RPLACE ( source_string, pattern [ , replace_string [ , position] ] ) 



'source_string'


 열 이름 같이 검색할 문자열 표현식입니다.



'pattern'


 SQL 표준 정규 표현식 패턴을 나타내는 문자열 리터럴입니다.



'replace_string'


 발견되는 패턴을 각각 변형할 문자열 표현식(열 이름 등) 입니다. 기본값은 빈 문자열 입니다.



'position'


source_string 내에서 검색을 시작할 위치를 나타내는 양의 정수입니다. 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 기본 값은 1입니다.



반환 값은 VARCHAR 형식으로 문자가 return 됩니다.


출처: AWS




추가) 만약 특정 철자만 다른 철자로 변경하고 싶다면 어떻게 해야할까요?



바로 replace 함수를 이용하면 됩니다.


비교해서 알아두면 좋습니다.


replace 함수와 regexp_replace 함수의 차이를 찾아보도록해요~

여기 (엄청 많은 포스팅이 있습니다!)




마지막 문제!!


문제3. 이메일을 입력하다 모르고 처음에 공백을 넣어서 찾을 수가 없습니다. 해결해주세요.





여기서 소개할 함수는 'TRIM' 함수 입니다.


TRIM함수는 특정 철자를 잘라내는 함수 입니다.

TRIM함수의 종류와 기능은 아래와 같습니다.


TRIM()

--> 양쪽 공백을 잘라내겠다

RTRIM()

--> 오른쪽 공백을 잘라내겠다.

LTRIM()

--> 왼 공백을 잘라내겠다.



형식:


TRIM( [ BOTH ] [ 'characters' FROM ] string] ) 



'BOTH'


LEADING : 왼쪽에서 제거  


TRAILING : 오른쪽에서 제거


BOTH : 양쪽에서 제거


특별히 설정해주는 값이 없으면 기본값은 BOTH 입니다.



'characters'


문자열에서 잘라낼 문자입니다. 이 파라미터를 생략하면 공백이 잘립니다.


'string'


자르기 대상이 되는 문자열입니다.



반환 값은 varchar 또는 char 문자열을 return 합니다.


출처: aws, 좋은 블로그






우와! 드디어 끝!!!


여기까지 보신 분들 오늘 남은 시간도  화이팅 합시다!



이 글이 도움되셨다면 아래 공감 꾹~ 



반응형
반응형



Data는 중요하죠!


또한 우리가 data를 이용하기 위해서는


그것을 저장해두고 사용해야 합니다!

 


이러한 Data를 저장하고 관리하는 Database(DB) 시스템에는 다양한 종류가 있습니다.



테이블형식으로 data를 저장하는 관계형 데이터베이스 SQL DB과



SNS 데이터량 증가 등의 이유로 다양한 형태의 data를 저장하기 용이한


비관계형 데이터베이스 NoSQL ('Not Only SQL') 이 있습니다.



Oracle DB의 경우 관계형 DB에 속하며


오픈소스인 Mysql과 달리


많은 기업체에서는 구매하여 사용하는 DB중 하나입니다.



빅데이터 분석가는 Data를 다루는 사람으로서,


Database는 절대 피할 수 없는, 그리고 꼭 필요한 기술이라고 할 수 있습니다.





(흔히 database를 이렇게 표현하더라구여.. 이유는 모르겠음 알고 계신 분은 댓글로 공유해 주세요! )





오늘은 기본 연산자 이외에 존재하는 기타 연산자 중 LIKE연산자에 대해 알아보도록 하겠습니다.



[연산자]


1. 산술 연산자: * (곱하기), / (나누기), + (더하기), - (빼기)


2. 비교 연산자:  >, <, >=, <=, <>, !=, ^=


참고)  <>, !=, ^= 는 각각 같지 않음을 나타낸다.


3. 논리 연산자: and, or, not



[기타 연산자]


1. BETWEEN ... AND 연산자


 2. LIKE 연산자


 3. IN 연산자


 4. IS 연산자




데이터 검색 조건을 기술하는 WHERE절에서


LIKE연산자를 사용하여


지정한 패턴과 일치하는 값을 필드에서 찾을 수 있습니다.

(출처: Microsoft)




우선 우리가 갖고 있는 DB시스템은 직원관리 시스템으로


여기서 사용할 TABLE은 직원 테이블 입니다. (이하 emp라고 부르겠음)



emp TABLE에 들어 있는 컬럼(Columns)은 각각 아래와 같습니다.


EMPNO                사원번호

ENAME                사원이름

JOB                직업

MGR                관리자의 사원번호

HIREDATE        입사일

SAL                월급

COMM                커미션

DEPTNO        부서번호 




여기서 첫 번째 문제!


이름의 첫번째 철자가 S로 시작하는 사원들의 이름을 출력하고 싶다면?





위처럼 작성하면 됩니다. 쉽죠? 



이해가 안된다면 이 아래를 참고하세요






LIKE문


[ WHERE 기준 컬럼명 LIKE 패턴지정 ]



여기서 잠깐! (뚜둔!)



LIKE 연산자를 사용할 때 사용하는 키워드 2개가 있습니다.


1. %


특수문자 %는 여기서 wild card라는 SQL 키워드 입니다


와일드 카드


"이 자리에 무엇이 와도 관계없다!" 그리고 "철자의 갯수가 몇 개가 되어도 관계없다!" 라는 의미를 갖고 있습니다.



단, LIKE 연산자와 함께 쓸 때만 가능하며


평소에는 Percent를 의미하는 % 그대로 인식합니다.



2. _ (under bar)


흔히 언더바라고 불리는 이 키워드는


"이 자리에 무엇이 와도 관계없다!" 그리고 "자릿수는 한 자리여야 한다!"라는 의미를 갖고 있죠.




따라서 첫번째 문제의 답



SQL> SELECT ename

FROM emp

WHERE ename LIKE 'S%';



을 다시 풀어보면,




" 이름의 첫 번째 철자가 S로 시작하는

  (그 이후의 철자 갯수가 몇 개가 되어도 관심없다!)


  사원들의 이름을 출력하라! "



는 의미입니다.






여기서 두번째 문제!



이름의 두번째 철자가 %인 사원의 이름을 출력하고 싶다면?





라고 작성하면 됩니다. 



" 잘 모르겠다! " 라고 하셔도 됩니다! 저도 몰랐으니까요! (당당)




여기서 모르는 가장 큰 이유는!


바로!


ESCAPE를 알지 못했기 때문일테지요~




위 SQL코드의 ESCAPE문은


" m 바로 다음에 나오는 % 는 와일드카드가 아니라 퍼센트를 나타내는 특수문자 '%' 이다. "


라는 의미입니다.



참고) m의 자리에는 어떤 문자가 와도 상관이 없습니다.


단 그경우에는, ESCAPE문 다음에 나올 문자와는 같아야겠죠?




오늘은 여기까지 입니다!... 만!



추가 문제 하나 더 풀어보죠!



이름의 두번째 철자와 세번째 철자가 %인 사원의 이름을 출력하세요!



정답은 각자 풀어보고 댓글로 남겨주세요 ~!


이 글이 도움되셨다면 아래 공감 꾹~ 




반응형

+ Recent posts