본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

[DB]날짜데이터, 형변환,NVL,DECODE,GROUP BY

by 초응 2022. 12. 14.

 


 

 

*날짜 데이터문자 자료형의 특징과 수치 자료형의 특징 모두 가지고 있다.

*날짜 데이터는 산술 연산을 했을 때 일(day)로 계산한다.

 

[날짜 관련 함수]

SYSDATE 현재 날짜와 시각 출력한다.
MONTHS_BETWEEN(d1,d2) 날짜 d1과 d2 사이의 기간이 몇 개월인지 반환한다.
ADD_MONTHS(d1,m1) d1에 m1개월을 더한 날짜 계산
LAST_DAY(d) 날짜 d가 속한 달의 마지막 날짜를 반환한다.
NEXT_DAY(d,'요일') 날짜 d를 기준으로 다음 첫째 주 중에서 지정한 '요일'의 날짜를 반환한다.
(1= 일요일)

 

--select now() --ㅡmysql
--날짜 데이터는문자자료형의 특징과 수치자료형의 특징 모두 가지고 있다. 
--[SYSDATE] : 현재 날짜와 시각 출력
select sysdate
from dual

select sysdate+2 --2일을 더한다. 
from dual 

select sysdate -2
from dual

select sysdate +100
from dual
--날짜 데이터는 산술연산을 했을때 일(day)로 계산한다. 
select empno,ename,hiredate,trunc(sysdate - hiredate,0)
from emp
--------------------------------------------------
--[MONTHS_BETWEEN] : 날짜와 날짜 사이의 개월 계산. 
select empno, ename , hiredate,trunc(months_between(sysdate,hiredate),0)
from emp
--------------------------------------------------
--[ADD_MONTHS] : 날짜에 개월을 더한 날짜 계산. 
select sysdate , add_months(sysdate,4) 
from dual 

select empno,ename,hiredate,add_months(hiredate,6)
from emp
--------------------------------------------------
--[LAST_DAY] : 날짜 d가 속한 달의 마지막 날짜를 반환한다.
select sysdate, last_day(sysdate)
from dual 

select empno,ename,hiredate , last_day(hiredate)
from emp
--------------------------------------------------
--[NEXT_DAY] :날짜 후 오는 요일의 날짜 계산
--1은 일요일
select sysdate, next_day(sysdate,3)
from dual

[형변환 함수]

TO_CHAR ( 숫자나 날짜 ,문자로 변환) 숫자나 날짜를 주어진 문자열 타입으로 변환한다.
TO_NUMBER(문자열, 숫자로 변환) 문자열을 숫자 타입으로 변환한다.
TO_DATE(문자열, 날짜 형식) 문자열을 날짜 형식으로 변환한다.
--[형변환 함수] 
select '3'+5
--select to_number('3')+5 --업데이트되면서 자동 형변환됨 외울필요X 
from dual

--[TO_CHAR] :날짜나 숫자형을 문자로 변환 
select sysdate - to_date('2022-12-02','yyyy-mm-dd')
from dual 


select sysdate, to_char(sysdate,'mm/dd/yy')
from dual 
--12/14/22

[NVL(nullvalue) : NULL에 대한 대처 값]

NVL(표현식1, 표현식2) 표현식 1의 결과값이 NULL이면 표현식 2의 값을 반환
--[nvl(데이터, 문자)] : nullvalue :null에 대한 대처값
select empno,ename,hiredate,sal,sal *12 ,comm,sal*12+nvl(comm,0)
from emp
 
select empno, ename,nvl(to_char(mgr),'CEO')as mgr 
from emp 

desc emp

[DECODE, CASE 함수 : C언어의 else if문과 같은 함수]

DECODE (데이터, 값, (참)표현식1, (거짓)표현식2) 데이터의 값이 참이면 표현식1을 수행한다.
다중 DECODE( 데이터, 값1 , (참)표현식1, 값2, (참)표현식2, 거짓(표현식1) 데이터의 값1이 참이면 표현식 1을 수행하고 거짓이면 데이터의 값2가 참인지 확인하고 참이면 표현식 2를 수행한다.
CASE
WHEN 조건1 THEN 결과 1
WHEN 조건 2 THEN 결과2
ELSE 결과 N
END
조건 1이 참이면 결과 1을 수행하고
조건 2가 참이면 결과 2를 수행한다.
참이 없으면 결과 N을 수행한다.
--[DECODE 함수: C언어의 else if 문과 같은 함수]] 
--(데이터, 값,조건이 참, 거짓)
--다중 조건 ( 데이터, 값 , 조건 참, 값, 조건참,값,조건참) 
select *
from tab

select empno, ename, hiredate,deptno,
decode(deptno,10,'ACCOUNTING',20,'RESEARCH',30,'SALES',40,'OPERATIONS')as dname
from emp

--사원의 번호와 직무 이름, 급여 출력
--직무가 매니저이면 현재급여 +15%,세일즈이면 5% 급여 인상
select empno,job,sal,
decode(job,'SALESMAN',sal*1.05,'MANAGER',sal*1.15,sal) as sal2
from emp 

--[CASE END] 
select *from dept

select empno, ename, deptno,
case
    when deptno = 10 then 'ACCOUNTING'
    when deptno = 20 then 'RESEARCH'
    when deptno = 30 then 'SALES'
    when deptno = 40 then 'OPERATIONS' 
end as dname
from emp

select empno,ename,job,sal,
case
    when job = 'SALESMAN' then sal*1.05
    when job = 'MANAGER' then sal*1.15
    else sal
end as sal2
from emp

[그룹 함수 = 통계 함수 ] // 여러 개의 데이터를 통해 결과가 하나만 나온다.

 

**일반컴럼은 일반 칼럼끼리/ 그룹 칼럼은 그룹 칼럼끼리 나열할 수 있다.

ㄴ 일반 칼럼과 그룹 칼럼은 같이 출력될 수 없음! (1대1 매칭이 되지 않기 때문에)

COUNT(*) NULL 값을 포함한 행의 개수를 출력한다.
COUNT(표현식) 표현식의 행의 개수를 출력 (NULL값 제외)
SUM(표현식) 표현식의 합계를 출력( NULL값 제외)
AVG (표현식) 표현식의 평균을 출력 (NULL 값 제외)
MIN(표현식) 표현식의 최대값 출력(문자, 날짜 데이터 타입도 가능)
MAX(표현식) 표현식의 최소값 출력(문자, 날짜, 데이터 타입도 가능)

 

--[그룹함수=통계 함수] 여러개에 대한 데이터를 통해 결과가 **하나만** 나온다. 
select sum(sal) from emp

select avg(sal) from emp

select max(sal),ename from emp --에러 
--그룹컬럼은 그룹걸럼끼리/ 일반컬럼은 일반컬럼끼리  나열. 
--일반컬럼과 그룹컬럼은 같이 출력될 수 없다. 
select max(sal),min(sal) from emp 

select max(ename), min(ename), min(hiredate),max(hiredate)
from emp 

select count(*)--low의 개수 
from emp

select count (comm) from emp
--그룹 함수에서 null제외하고 연산. 

select avg(sal) from emp
where deptno =10

--직무의 종류 개수를  출력
select count(distinct job)
from emp


---실습 
select count(*)as "total",
sum(decode (substr(hiredate,1,4),1980,1,0))as "1980",
sum(decode(to_char(hiredate,'yyyy'),1981,1,0)) as "1981",
count(decode(to_char(hiredate,'yyyy'),1982,1))as "1982"
from emp

select /from / where/ group by /having /order by
실행 순서 : from > where> group by > having > order by > select

[GROUP BY절과 HAVING 절]
group by : 특정데이터를 그룹화해서 그룹 함수를 만들수 있음 

having : group by 절에 의해 생성된 그룹을 대상으로 특정 조건에 맞는 그룹을 선택할 때 사용
일반 칼럼 - where 
그룹 칼럼 - having
--[GROUP BY 절] 
select sum(sal) from emp
where deptno = 20

select sum(sal),deptno
from emp
group by deptno 

--부서별 최저 급여와 최고 급여
select min(sal),max(sal),deptno
from emp
group by deptno 

--부서별 전체 사원수와 커미션을 받는 사원수 출력
select deptno,count(*),count(comm)
from emp
group by deptno


--select 6개의절: select /from / where/ group by /having /order by
--실행순서 from > where> group by > having > order by > select 
--[HAVING 절] 조건: 일반 컬럼 - where/ 그룹 컬럼- having 
select deptno, avg(sal)
from emp
group by deptno
having avg(sal)>=2000

select deptno ,avg(sal)
from emp
where sal>=1000
group by deptno
having avg(sal)>=2000
order by deptno asc​