'to_date'에 해당하는 글 2건



다운로드


- Oracle 11g Express

- Oracle SQL Developer(jdk포함)





DQL(Data Query Lenguage)


1. SELECT 구문에 의해서 테이블의 자료를 검색하는 명령

2.

SELECT 컬럼리스트

FROM 테이블

WHERE 조건식

GROUP BY 기준컬럼

HAVING 조건식

ORDER BY 기준컬럼;


-- 특정 테이블의 자료 확인

select * from employees;



--특정 테이블의 자료 일부 출력.  행(column) 제한

select first_name, last_name, phone_number

from employees;


-- 특정 테이블의 자료 일부 출력. 열(Row) 제한.

select *

from employees

where job_id = 'IT_PROG';


-- 특정 테이블의 자료 일부 출력. 행(column), 열(Row) 제한.


select first_name, last_name, phone_number

from employees

where job_id = 'IT_PROG';






조건식(행 제한)


1. 

select 컬럼리스트

from 테이블

[where 조건식]



2. 연산자 종류

연산자 종류

비교연산자 : =, >, <, >=, <=, <>

논리연산자 : and, or, not

SQL 연산자 : IN(값, ...), BETWEEN ~ AND , LIKE



3. 자료형

-문자형 : CHAR2, VARCHAR2

-날짜형 : DATE

-숫자형 : NUMBER



4. 리터럴(상수)

문자형 : 작은 따옴표로 표기된 문자열. EX) '테스트' 

날짜형 : 날짜 서식을 가진 문자열. '년-월-일', '월/일/년' 형식을 가진 문자열. ex)'2012-10-22'

숫자형 : 정수 또는 실수로 표기된 숫자. ex) 10


올바른 자료형 비교 예.

select *

from employees

where job_id='IT_PROG'; -- 성공


틀린 자료형 비교 예.

select *

from employees

here job_id="IT_PROG";" -- 실패






날짜 데이터 검색하는 방법

-> 날짜 데이터를 문자열 형식으로 변환하는 과정 필요.

-> to_char(날짜데이터, '서식') 함수 이용


--employees 테이블에서 입사년도(hire_date)가 '2003'년인 경우 출력.

select *

from employees

where to_char(hire_date, 'yyyy') = '2003';



--employees 테이블에서 입사월(hire_date)이 '1'월인 경우 출력.

select *

from employees

where to_char(hire_date, 'mm') = '01';


--employees 테이블에서 입사년도(hire_date)가 '2005'년이고, 입사월이 '1'월인 경우 출력.

select *

from employees

where to_char(hire_date, 'yyyy-mm') = '2005-01'; 


-- 혹은

select *

from employees

where to_char(hire_date, 'yyyy') = '2005' and to_char(hire_date, 'mm') = '01';


--employees 테이블에서 입사년도(hire_date)가 '2000'년대인 경우 출력.

-> substr(원본데이터, 출발위치, 길이)


select *

from employees

where to_char(hire_date, 'yyyy') = '2000' or to_char(hire_date, 'yyyy') = '2001' or to_char(hire_date, 'yyyy') = '2002'

      or to_char(hire_date, 'yyyy') = '2003' or to_char(hire_date, 'yyyy') = '2004' or to_char(hire_date, 'yyyy') = '2005'

      or to_char(hire_date, 'yyyy') = '2006' or to_char(hire_date, 'yyyy') = '2007' or to_char(hire_date, 'yyyy') = '2008'

      or to_char(hire_date, 'yyyy') = '2009';

      

-- 혹은

select *

from employees

where substr(to_char(hire_date, 'yyyy'), 1, 2) = '20';


-- 혹은 (문자열도 크기 비교가 됨.)

select *

from employees

where to_char (hire_date, 'yyyy') >= '2000' and

         to_char(hire_date, 'yyyy') <= '2009';






숫자 데이터 검색하는 방법



-- employees 테이블에서 salary(급여)가 20000달러 이상인 경우 출력

select *

from employees

where salary >= 20000;


--employees 테이블에서 salary(급여)가 5000~10000번위인 경우 출력


and연산자 사용.








SQL 연산자


1. IN(값, ...): or 연산 역할. 괄호 안의 나열된 값중 하나와 일치하면 true


2. BETWEEN 값1 AND 값2: and 연산 역할. 값1~값2 범위 지정시


3. LIKE: 피연산자가 패턴(_, %)과 일치하는 경우 true;



--jobs 테이블에서 job_title이 'President' 이거나, 'Sales Manager'인 경우 출력.

select *

from jobs

where job_title='President' or job_title = 'Sales Manager';


-- 혹은

select *

from jobs

where job_title in ('President', 'Sales Manager');



--employees 테이블에서 salary(급여)가 5000~10000번위인 경우 출력


select *

from employees

where salary between 5000 and 10000;




--employees 테이블에서 전화번호가 4567로 끝나는 경우 출력

-> substr은 길이가 서로 다른 문자열에서는 일부 문자열을 얻기가 힘듬.

-> like 연산자 사용


select *

from employees

where phone_number like



--employees 테이블에서 전화번호가 국번이 123로 끝나는 경우 출력


select *

from employees

where phone_number like '%123_____';


select *

from employees

where phone_number like '___.123.____';








null 확인


1. 데이터베이스 내의 데이터 저장 공간을 확보한 후 데이터를 채우지 않으면

자동으로 NULL값이 저장된다.


2. is 로 확인.


-- employees 테이블에서 commission_pct 정보가 null인 경우 출력


select *

from employees

where commission_pct is null;









내장 함수


- 함수는 데이터를 입력시 , 단일 결과를 리턴하는 프로그램의 집합


1. 입력데이터가 없는 경우

select sysdate from dual; -- 시스템의 현재 날짜


select to_char(sysdate,'yyyy-mm-dd') from dual;


select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;






2. 입력 데이터가 있는 경우

TO_DATE('날짜문자열') : 문자열을 날짜 형식으로 변환


select sysdate - to_date('특정날짜') from dual;

-- 특정 날짜부터 특정 날짜 사이의 날짜수 계산



TO_CHAR(날짜자료형, '서식')


select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

--서식에 맞게 날짜, 시간 출력


ROUND(값)


select round (10.123) from dual; --10

select round (10.567) from dual; --11

select round (10.567, 2) from dual; --10.57

select round (10.567, 1) from dual; --10.6

-- 반올림 함수



TRUNC(값)


select trunc (10.123) from dual; --10

select trunc (10.567) from dual; --10

-- 절삭함수

ex) employees 테이블에서 salary가 10000이상이면서, 20000 미만인 경우 출력

select *

from employees

where trunc (salary/10000) = 1;



MOD(값1, 값2)


-- 나머지 연산 함수


LOWER('대문자') : 입력된 문자를 소문자로 변경


UPPER('소문자') : 입력된 문자를 대문자로 변경


ex)

select *

from employees

where first_name = 'ellen'; --X


select *

from employees

where first_name = 'Ellen'; --O


select *

from employees

where first_name = 'ELLEN'; --X


select *

from employees

where LOWER(first_name) = LOWER('ellen'); --O


select *

from employees

where UPPER(first_name) = UPPER('ellen'); --O



CONCAT(문자열1, 문자열2) : 입력된 문자열1과 문자열2를 하나의 컬럼으로 합쳐 출력


LENGTH(원본문자열) : 문자열 길이


SUBSTR(원본문자열, 위치, 길이) : 부분 문자열 리턴


INSTR(원본문자열, 검색문자열) : 문자열 검색.


REPLACE(원본문자열, 검색문자열, 대체문자열) : 문자열 대체


LPAD(식,길이,표시문자열) : 문자열 대체. 특정 문자열로 채워짐. (LIFT)

EX) 

select '801010-1234567' from dual;

select lpad((substr('801010-1234567', 7, 8), 14, '*') from dual;



RPAD(식,길이,표시문자열) : 문자열 대체. 특정 문자열로 채워짐. (RIGHT)

EX) 

select rpad(substr('801010-1234567', 1, 7), 14, '*') from dual;


NVL(식, 값) : 식의 결과값이 null 이면 값 리턴 (if구문만 있는 상태)


NVL2(식, 값1, 값2) : 식의 결과값이 null이면 값1 리턴 아니면 값2 리턴 (if~else 구문 상태)


DECODE(식, 조건, 값1, 조건2, 값2, ...) : 식의 조건이 참이면 값1을 리턴하고 조건2를 만족하면 값2를 리턴.. (if ~ else if~ else 인 상태)

ex)

select first_name, last_name, decode(department_id, 90, 'Excutive', 60, 'IT', 50, 'Shipping')

from employees;


ex)employees 테이블에서 salary가 10000미만인 경우는 C등급, 10000이상 20000미만인 경우는 B등급, 20000이상인 경우는 A등급으로 출력

select first_name || ' ' || last_name AS 이름, 

decode(trunc(salary/10000), 0, 'C등급', 1, 'B등급' , 2, 'A등급') as 급여등급

from employees;


WRITTEN BY
빨강꼬마

,

- sysdate
  현재 시스템 시각을 보여줌. (=current_date)

- to_char
  숫자 및 날짜 타입을 문자로 변환시켜주는 함수.
 

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
from dual;

 

 - to_char(sysdate, '[X]') *목요일인경우
          X = day   : 목요일 로 출력
          X = dy    : 목   으로 출력
          X = d     : 5      로 출력(1~7까지로 일~토 별로 대입. 예로 3인경우 화요일)
          X = ddd   : 현재 년도의 1월 1일로 가서 오늘의 날짜까지 총 몇일째인지 출력
          X = dd    : 현재의 월의 1일로 이동해서 현재의 날짜까지 총 몇일째인지 출력. 즉, 현재의 일자.
          X = sssss : 현재 일자가 시작된 0시0분0초부터 현재까지 총 몇초째인지 초단위로 출력.
          X = year  : 년도만 (=yyyy와 동일)
          X = month : 월만   (=mm과 동일)
          X = hh    : 시간
          X = mi    : 분
          X = ss    : 초
          X = q     : 올해 4분기중 현재 속하는 분기를 출력.

※ hh24에서 24시간제로 표시하는 것을 am 혹은 pm으로 변경할 수 있음
※ 날짜는 -으로 구분, 시간은 :으로 구분.

 

 - to_char(123.456, 9999.99)
          123.456을 정수4자리 와 소수점이하2자리로 표현하라 라는 의미.
          9999.99앞에 통화기호를 쓰면 결과에 포함되며, 통화기호를 L로 기재하면 운영체제등을 기반으로 소속국가의 통화량으로 표기.
         

- extract
  날짜 데이터에서 날짜를 숫자타입으로 뽑을때 사용.
  * extract(year from sysdate)
  * extract(month from sysdate)
  * extract(day from sysdate)

 

select extract(year from sysdate), extract(month from sysdate), extract(day from sysdate)
from dual;

 

- to_number
  문자타입을 숫자로 변환시켜주는 함수.

 

select '000001', to_number('00001')
from dual;

 


- to_date
  문자타입을 날짜타입으로 변환시켜주는 함수.

 

select sysdate + 1, sysdate - 1
from dual;

※ 날짜데이터에 +1 이나 -1을 입력하면 하루로 계산되어 결과데이터(날짜)가 출력됨
※ 현재날짜는 sysdate로 처리하면 날짜타입이므로 +나 -로 처리가능하나,
   임의날짜를 입력하면 문자형태로 입력되기 때문에 to_date로 처리하여 날짜타입으로 변경하여 처리해야함.

 

- add_months(임의의날짜, [X])
  임의의 날짜로 부터 X개월 만큼 추가

 

select add_months(sysdate, 1), sysdate, add_months(sysdate, -1)
from dual;

 

  ex: 현재로 부터 1년 2개월 3일 4시간 5분 6초 뒤를 출력

select to_char(sysdate, 'yyyy-mm-dd hh24:mm:ss'),
       to_char(add_months(sysdate, 12*1+2) + 3 + 4/24 + 5/(24*60) + 6/(24*60*60), 'yyyy-mm-dd hh24:mm:ss')
from dual;


 

- to_yminterval('yy-m') / to_dsinterval('ddd hh:dd:ss')
  오라클9g 부터 지원되는 명령어
  add_months(sysdate, 12*1+2) 와 sysdate + to_yminterval('01-02') 는 동일.

 

 

 

 

 

 

 

문제1. case문을 사용하여 to_char(sysdate, 'd')를 이용, 현재 요일을 숫자가 아닌 요일명으로 출력하게 하는 쿼리문을 작성하라.

 

문제2. 아래의 그림처럼 처리하는 쿼리문을 작성하라.

 

 

 

 

 

 

 

답.1.

select case to_char(sysdate, 'd')
            when '1' then '일요일'
            when '2' then '월요일'
            when '3' then '화요일'
            when '4' then '수요일'
            when '5' then '목요일'
            when '6' then '금요일'
            when '7' then '토요일'
            else '없음' end as "오늘의 요일명"
from dual;

 

답.2 (이외 쿼리문도 결과만 같으면 됨)

select saname as "사원명",
            extract(year from sysdate) - ( substr(jubun, 1, 2) + case when substr(jubun, 7, 1) in ('1', '2') then 1900 else 2000 end) + 1 as "현재나이",
            case when substr(jubun, 7, 1) in ('1', '3') then '남' else '여' end as "성별"
from jikwon;


WRITTEN BY
빨강꼬마

,