[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 5강

MinHee·2023년 5월 20일
0
post-thumbnail

MONTHS_BETWEEN : 날짜 간 개월 수 출력

months_between(기준날짜1, 기준날짜2)

'기준날짜1'이 '기준날짜2'보다 더 현재에 가까운 날짜여야 함

오늘 날짜를 출력하는 방법

SELECT sysdate
FROM dual;

EX) 이름과 입사한 날자부터 오늘까지 총 몇 달을 근무했는지 출력

SELECT ename, months_between(sysdate,hiredate)
FROM emp;
SELECT round(months_between(sysdate,'2000/02/17'))
FROM dual;

ADD_MONTHS : 개월 수 더한 날짜 출력

add_months(기준날짜, 구하고 싶은 기간)

EX) 2019년 5월 1일부터 100달 뒤의 날짜는 어떻게 되는지 출력

SELECT add_months('2019/05/01',100)
FROM dual;

NEXT_DAY : 특정 날짜 뒤에 오는 요일의 날짜 출력

next_day(기준날짜, 구하고 싶은 요일)

예제) '2021/05/05'로 부터 바로 돌아오는 월요일의 날짜가 어떻게 되는지 출력

SELECT next_day('2021/05/05','월요일')
FROM dual;

LAST_DAY : 특정 날짜가 있는 달의 마지막 날짜 출력

last_day(기준날짜)

오늘부터 이번달 말일까지 총 몇일 남았는지 출력하시오

SELECT last_day(sysdate)-sysdate
FROM dual;

to_char : 문자형으로 데이터 유형 변환

to_char(컬럼명 또는 "변경 전 데이터","변경 후 나타내고 싶은 형태")

날짜형 --> 문자형
숫자형 --> 문자형

  SELECT ename, to_char(hiredate,'day'), to_char(sal,'999,999')
  FROM emp
  WHERE ename='SCOTT';

to_char(날짜 컬럼명, '날짜 포맷')

날짜 포맷 :
년도 - RRRR, YYYY, RR, YY
달 : MON,MM
일 : DD
요일 : DAY,DY

to_char(숫자 칼럼명, '정규 표현식')

  • 천 단위 대의 숫자를 출력할 때, ','를 넣어서 출력이 되도록 함

$ : 달러 표시 (ex. $999,999 -> $ 3,000)
L : 원화 표시 (ex. L999,999 -> \ 3,000)

예제, 수요일에 입사한 사원들의 이름과 입사일과 입사한 요일을 출력하세요

SELECT ename, hiredate, to_char(hiredate,'day')
FROM emp
WHERE to_char(hiredate, 'day') = '수요일' ;

예제, 특정 날짜의 요일이 무엇인지 출력하시오

SELECT to_char(to_date('2011/02/04/','RRRR/MM/DD'),'day')
FROM dual;

to_date : 날짜형으로 데이터 유형 변환

*현재 세션의 날짜 형식을 확인하는 방법
(세션 : 내가 지금 접속한 창)

SELECT *
FROM nls_session_parameters;

*현재 세션의 날짜 형식을 DD/MM/RR로 변경

ALTER SESSION SET nls_date_format = '원하는 형식'

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

SELECT ename, hiredate
FROM emp
WHERE hiredate = '81/11/17'; -- 현제 세션의 날짜 형식과 다르므로, 해당 조건문 쿼리는 더이상 적용이 안된다..

SELECT ename, hiredate
FROM emp
WHERE hiredate = to_date('81/11/17','RR/MM/DD'); -- 현재 세션의 날짜 형식이 어떻게 되어있든간에, 문제가 없음

WHERE hiredate = to_date('날짜','작성한 날짜의 형식');

EX) 1981년도에 입사한 사원들의 이름과 입사일을 출력하는데 최근에 입사한 사원부터 출력하세요

-- 내가 작성한 답안

  select ename, hiredate
  from emp
  where to_char(hiredate,'YYYY') = '1981'
  order by hiredate desc;

-- 선생님이 작성하신 답안

  select ename, hiredate
  from emp
  where hiredate between to_date('1981/01/01','RRRR/MM/DD')
                  AND		to_date('1981/12/31','RRRR/MM/DD') + 1 -- 오전 0시 까지를 의미하므로 +1
  order by hiredate desc;

암시적 형 변환

ORACLE DB에서 조건절의 데이터를 확인 후 자동으로 형 변환을 시행

숫자의 우선순위가 높아서, 문자를 숫자로 바꿔버린다

SELECT ename, sal
FROM emp
WHERE sal = '3000';

-- 숫자와 문자의 비교로, 원래라면 실행이 되지 않아야 함, 하지만 암시적 형변환으로
아래와 같이 실행함

where sal = 3000;

-- 암시적 형변환은 성능을 안 좋게 할 수 있기 때문에 되도록이면 데이터 형에 맞는 조건 명시하도록

  explain plan for
  SELECT ename, sal
  FROM emp
  WHERE sal = '3000';

  select * from table(dbms_xplan.display);

QUERY 실행 계획 : 이 쿼리를 ORACLE이 어떻게 실행하겠다는 계획

explain plan for {SQL문} FROM TABLE(dbms_xplan.display)

SELECT ename, sal
FROM emp
WHERE sal like '30%';

-- 숫자와 문자의 비교로, 여기서는 문자로 명시된 부분을 모두 숫자로 바꿀 수 없기에 (%), sal 칼럼을 암시적으로 문자로 변환함

where to_char("sal") like '30%';

-- like를 조건문에서 많이 사용할 것 같으면 처음에 테이블 설계부터, sal 컬럼을 문자형으로 만들어야 함.

profile
성장하는 개발자

0개의 댓글