2016. 09. 28. (Wed) 서른네 번째 수업
2016. 09. 29. (Thu) 서른다섯 번째 수업
2016. 09. 30. (Fri) 서른여섯 번째 수업
수업내용
L04 Function
INSTR() //특정 문자의 위치를 구하는 함수
SELECT INSTR(‘WELCOME TO ORACLE’,’O’) FROM DUAL;
SELECT INSTR(‘WELCOME TO ORACLE’,’O’,6,2) FROM DUAL;
i. 대상 문자의 6번째에서 2번째로 발견되는 ‘o’의 위치
날짜 함수
SYSDATE //시스템에 저장된 오늘 날짜 반환
MONTH_BETWEEN(date1, date2) //date1과 2사이의 날짜 반환
ADD_MONTHS(date, n) //date + n개월 날짜 반환
NEXT_DAY(date, 요일) //date와 가까운 요일이 있는 날짜 반환
LAST_DAY(date) //date를 포함하는 달의 마지막 날을 반환
ROUND(date, format) //date를 format으로 반올림
TRUNC(date, format) //date를 format으로 내림
format
CC, SCC //4자리 연도 끝의 두 글자를 기준
SYYY, YYYY, YEAR ,SYEAR, YYY, YY, YY //7월 1일 기준
HH, HH12, HH24 시를 기준
Q //한 분기의 두 번째 달의 16일을 기준
MONTH, MON, MM, RM //한 주가 시작되는 날짜
MI //분을 기준
예) ROUND(HIREDATE, ‘MONTH’)
문제1) DUAL 테이블에 어제, 오늘, 내일 날짜를 출력하세요.
SYSDATE는 연산 가능
답) select sysdate-1 어제, sysdate 오늘, sysdate+1 내일 from dual;
문제2) 사원 이름과 입사일, 사원의 근무 일수를 출력하세요.
오늘 날짜 - 입사일
답) select ename, hiredate, sysdate-hiredate from emp;
문제3) 사원 이름과 입사일 사원이 근무한 개월 수를 출력하세요.
소수점은 내림하세요.
답) select ename, hiredate, trunc(sysdate-hiredate) AS 근무일수 from emp;
답) select ename, hiredate, trunc(months_between(sysdate, hiredate)) AS
근무개월 from emp;
문제4) 사원 이름과 입사일, 입사일 + 6개월을 출력하세요.
답) select ename, hiredate, add_months(hiredate, 6) from emp;
문제5) 오늘을 기준으로 가장 가까운 수요일을 DUAL 테이블에 출력
윈도우 운영체제가 사용 중인 언어(한글)를 사용: ‘수요일’
답) select next_day(sysdate, '수요일') from dual;
Oracle언어 (NLS_LANGUAGE)를 변경하려면
ALTER SESSION SET NLS_LANGUAGE = AMERICAN
‘WENDSDAY’ 사용 가능
문제6) 사원의 이름과 입사일, 입사한 달의 마지막 날을 출력하세요.
답) select ename, hiredate, last_day(hiredate) from emp;
형 변환 함수
TO_CHAR(date, format) //날짜를 format 형식 문자로 변환
TO_CHAR(number, format) //number를 문자로 변환
숫자 format
0 //자릿수를 나타내면 자릿수가 맞지 않으면 0으로 채운다.
9 //자릿수를 나타내며 자릿수가 맞지 않아도 채우지 않는다.
L //각 지역 별 통화를 앞에 표시
. //소수점
, // 천 다윈 자리 구분
TO_DATE(‘date’, format) //문자를 format 형식 날짜로 변환
TO_DATE(date, format) //숫자를 format 형식 날짜로 변환
TO_NUMBER //문자를 숫자로 변환
날짜 format
YYYY //년도 4자리
YY //년도 2자리
MM //월을 숫자로
MON //월을 알파벳으로
DAY //요일 표현
DY // 요일을 약어로 표현
시간 format
AM or PM //오전(AM), 오후(PM) 시각 표현
A.M or P.M //오전(A.M), 오후(P.M) 시각 표현
HH or HH12 //12시간으로 표현 (1~12)
HH24 //24시간으로 표현 (0~23)
MI //분 표현
SS //초 표현
도식도
NUMBER > CHAR > DATE
DATE > CHAR >NUMBER
문제6) 오늘 날짜를 2016-09-28, 14:01:13로 출력하세요. (DUAL)
답) select to_char(sysdate,'YYYY-MM-DD, HH24:MI:SS') from dual;
문제7) 사원의 이름, 급여 (통화 기호 + 천 단위 구분) 출력하세요.
답) select ename, to_char(sal,'L999,999') from emp;
TO_DATE(date, format) //문자 or 숫자 date를 format의 시간으로 변경
TO_DATE(date, format) //문자 or 숫자 date를 format의 시간으로 변경
문제8) TO_DATE를 이용해 입사 일이 19810220인 사원을 검색하세요.
답) select * from emp where hiredate=to_date(19810220,'YYYYMMDD');
문제9) DUAL 테이블에서 오늘 날짜와 ‘2009/01/01’을 뺀 날을 출력하세요
답) select sysdate - to_date('2009/01/01','YYYY/MM/DD') from dual;
문제10) 문자열 ‘20,000’과 ‘10,000’을 마이너스 연산 하세요.
L05 Gruop Function
NVL() // NULL을 다른 값으로 바꾸는 함수
DECODE (칼럼, 조건1, 결과1, 조건2, 결과2, DEFAULT) AS NAME
NAME을
칼럼의 조건이 조건1일 경우 결과 1을 출력하고
칼럼의 조건이 조건2일 경우 결과 2를 출력하고
조건에 맞는 것이 없으면 DEFAULT를 출력한다.
문제1) 사원의 부서 번호가 10이면 ‘A’를 출력하고 20이면 ‘B’를 조건에 맞는 것이 없다면 ‘DEFAULT’를 출력하세요.
답) select ename, deptno, decode(deptno, 10, 'A', 20, 'B', 30, 'C','DEFAULT') AS
DENAME from emp;
문제2) 사원의 이름, 부서 번호를 출력하고 부서 이름(DENAME)을 부서 번호가 10이면 ‘ACCOUNTING’, 20이면 ‘RESEARCH’, 30이면 ‘SALES’, 40이면 ‘OPERATIONS’으로 출력하세요.
답) select ename, deptno, decode(deptno, 10, 'ACCOUNTING', 20, 'RESEARCH',
30, 'SALES', 40, 'OPERATIONS') AS DENAME from emp;
문제3) 직급에 따라 급여를 인상할 계획이다. 직급이 ‘ANALYST’이면 5%, ‘SALESMAN’은 10%, ‘MANAGER’는 15%, ‘CLERK’는 20% 인상한 결과를 출력하세요.
답) select ename, job, sal, decode(job, 'ANALYST', SAL*1.05, 'SALESMAN',
SAL*1.1, 'MANAGER', SAL*1.15, 'CLERK', SAL*1.2 ) AS INCREASE FROM EMP;
CASE WHEN 조건1 THEN 결과1
조건 2 THEN 결과2
ELSE 결과3 AS NAME
NAME을
조건1 (칼럼=?)이 만족하면 칼럼을 결과1로 출력
조건2 (칼럼=?)이 만족하면 칼럼을 결과2로 출력
문제4) 문제 2를 CASE로 바꾸세요.
답) select 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 DENAME FROM EMP;
문제5) 문제 3을 CASE로 바꾸세요.
답) select ename, job, sal, case when job = 'ANALYST' then SAL*1.05
when job = 'SALESMAN' then SAL*1.1
when job = 'MANAGER' THEN SAL*1.15
when job = 'CLERK' THEN SAL*1.2
ELSE SAL*1
END AS SALX FROM EMP;
L06 Group Function
그룹 함수란?
그룹 함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등을 하나의 결과로
나타낸다.
그룹 함수는 단일 행 함수 또는 단일 칼럼을 사용할 수 없다.
예) FUNCTION(칼럼) // 칼럼을 한 개의 그룹으로 보고 단일 결과를 출력하세요.
그룹 함수의 종류
SUM() //그룹의 누적 합계
AVG() //그룹의 평균
COUNT(A) //그룹의 칼럼 A중 NULL을 제외한 총 개수
COUNT(DISTINCT A) //그룹의 칼럼 A중 중복된 값과 NULL을 제외한 총 개수. DISTINT는 GROUP BY와 동일
MAX() //그룹의 최대값
MIN() //그룹의 최소값
STDDEV() //그룹의 표준편차
VARIANCE //그룹의 분산
문제1) 사원의 급여 총액을 구하세요.
답) select sum(sal) from emp;
문제2) 사원의 커미션 총액을 구하세요.
답) select sum(comm) from emp;
문제3) 부서가 30인 사원의 급여 총액을 구하세요.
답) select sum(sal) from emp where deptno=30;
문제4) 사원의 평균 급여를 구하세요.
답) select avg(sal) from emp;
문제5) 부서가 10인 사원의 평균 급여를 구하세요.
답) select avg(sal) from emp where deptno=10;
문제6) 사원의 가장 높은 급여와 가장 낮은 급여를 구하세요.
답) select max(sal), min(sal) from emp;
문제7) 커미션의 총 개수를 출력하세요.
답) select count(comm) from emp;
문제8) 사원의 직업 개수를 출력하세요.
답) select count(distinct job) from emp;
문제9) 부서가 10인 사원의 수는
답) select count(*) from emp where deptno =10;
문제10) 가장 최근에 입사한 사원과 가장 오래된 사원을 출력하세요.
답) select max(hiredate), min(hiredate) from emp;
문제11) 부서가 30인 사원 중 커미션을 받는 사원의 수는?
결과가 3이 나와야 한다.
답) select count(comm) from emp where deptno=30 and comm>0 ;
'IT story > JSP' 카테고리의 다른 글
L08 join (0) | 2016.10.22 |
---|---|
L07 group by (0) | 2016.10.22 |
D+31~33 Oracle (서버 설치하기, SQL SELECT문) (0) | 2016.09.28 |
D+29 JDBC(Java DATABASE Connection, DELETE) (0) | 2016.09.26 |
D+28 JDBC(Java DATABASE Connection, UPDATE) (0) | 2016.09.26 |