DUAL 테이블
- 한 행으로 결과를 출력하기 위한 테이블
- 산술 연산이나 가상 컬럼 등의 값에 사용
- 오라클에서 제공하는 테이블
FUNTION(함수)
- Single Row Funtion 한 가지 입력 한 가지 출력
- Multipl Row Function 다중 입력 한 가지 출력
Single Row Funtion
- 함수명(INPUT) 내부처리 OUPUT
- 함수의 이름이 기능을 대변한다.
- 종류 : 문자대소, 문자조작, 숫자
1. 문자대소 : UPPER, LOWER, INITCAP
- UPPER : 대문자
ex)UPPER(ENAME)
- LOWER : 소문자
ex)LOWER(ENAME)
- INITCAP : 글자의 첫자만 대문자 나머지 소문자 (이니셜 부분만 캐피탈)
ex)INITICAP(ENAME)
※ SQL 함수 아님 오라클 함수
2. 문자조작 : SUBSTAR, INSTR, LENGTH, LPAD, RPAD
- SUBSTR : 문자의 일부분을 자르다
ㅇ SUBSTR( [추출할곳], [추출시작위치], [추출글자수] )
ex)이름 SMITH / SUBSTR(ENAME, 4)
- INSTR : 문자의 위치
ㅇ INSTR( [검색할곳], [특정문자], [검색시작위치], [결과선택] )
ex)이름 SCOTT / INSTR(ENAME, 'A') 없으면 0 있으면 표기
- LENGTH : 문자의 길이 'SMITH' => 5
ex)LENGTH(ename) 이름의 길이 출력
- LPAD : 문자열 자릿수 채우기(왼쪾)
ex) LPAD(SAL, 10, '*') 10자리에서 급여를 쓰고 왼쪽으로 채우다.
- RPAD : 문자열 자릿수 채우기(오른쪽)
ex) RPAD(SAL, 10, '*') 10자리에서 급여를 쓰고 오른쪽으로 채우다.
- CONCAT : 두 함수를 연결
ex) 이름 ALLEN, 직업 SALESMAN / CONCAT(ENAME, JOB) ALLENSALESMAN
문제
1. emp 테이블에서 사원 이름(ename)을 소문자로 출력하세요.
2. emp 테이블에서 사원 이름의 첫글자만 대문자로 출력하세요.
3. emp 테이블에서 사원 이름의 길이를 출력하세요.
4. emp 테이블에서 사원이름과 이름에 A가 몇번째 있는지 출력하세요.
5. emp 테이블에서 세번째 자리가 R인 사원의 정보를 출력하세요.
6. emp 테이블에서 이름의 끝자리가 N으로 끝나는 사원의 정보를 출력하세요.
7. AND나 BETWEEN을 사용하지 않고 87년도에 입사한 직원의 이름과 월급을 출력하세요.
8. emp 테이블에서 사원의 이름이 5글자인 사원의 이름을 첫글자만 대문자로 출력하세요.
3. 숫자 : ROUND, TRUNC , MOD
- ROUND : 반올림(소수점 기준)
ex) ROUND(45.129 ,2) 소수 두번째 자리 => 45.13
- TRUNC : 절삭(소수점 기준)
ex) TRUNC(45.192 ,1) 소수 첫번째 자리 => 45.1
- MOD : 나누어서 몫이 아닌 나머지를 구함
ex)MOD(101, 2) => 1
※ 회계업무에서 주로 사용
문제
1. 45.564을 소수 세번째 자리에서 반올림하여라.
2. 45.564를 반올림하여 정수로 만들어라.
3. 45.564를 1의 자리에서 반올림 하여라.
4. 45.564를 소수 첫번째 자리까지만 남기고 버림하여라.
5. 1200을 14로 나눈 나머지를 구하여라.
6. emp의 월급컬럼(sal)을 100으로 나눈뒤 그 나머지를 출력하여라.
7. emp에서 사번이 홀수인 사람의 정보를 출력하여라.
4. 날짜 : SYSDATE, MONTHS_BETWEEN, ADD_MONTHS, NEXT_DAY, LAST_DAY
- SYSDATE : 오늘날짜, 현재시간
ㅇ +와 - : + 다음 날 - 이전 날 ex)sysdate + 1, sysdate -1
ex) SYSDATE - HIREDATE 기간(ex)근속일수)
ㅇ SYSDATE + HIREDATE 구현 안함(의미없음)
ㅇ 연월일만 표기하나 실제로 시분초도 나타냄.
ex)
- MONTHS_BETWEEN : 두 날짜간의 사이를 월 수로 표현
ex) MONTS_BETWEEN(SYSDATE, HIREDATE) 중첩함수(함수 안에 함수)
※ 항상 안 쪽부터 시작
- ADD_MONTHS : date에 개월을 더한 date를 계산한다
ex)ADD_MONTHS(SYSDATE, 6) 현재 기준 6개월 후 출력
- NEXT_DAY : 해당 date를 기준으로 명시된 요일에 해당하는 날짜를 반환한다.
ex)NEXT_DAY(SYSDATE, '금')
- LAST_DAY : 해당 월의 마지막 날 표기 ex)월급날
ex)LAST_DAY('19/01/01') => 19/01/31 표기
문제
1. emp테이블에서 이름과 입사일자 그리고 현재날까지의 경과일을 산출하세요.
(소숫점을 빼버리고 해딩이름을 경과일로 바꾸세요.)
2. 1번문제를 경과일을 개월수로 바꿔서 산출하세요.
(소숫점을 빼버리고 해딩이름을 경과개월수로 바꾸세요.)
3. emp테이블에서 입사후 첫 휴일(일요일)은 언제일지 구하세요.
4. emp테이블에서 입사후 6개월이 지난날짜 바로 다음 일요일을 구하세요.
5. 자료형 : TO_DATE, TO_CHAR, TO_NUMBER
방법 : TO_변환형(기존값, '형식') 바뀌는 방향의 자료형
- TO_DATE : 문자열을 날짜 형으로 변환
ex) SELECT SYSDATE-TO_DATE('1989/09/20', 'YYYY/MM/DD') 문자를 날짜로 변환
- TO_CHAR : 날짜나 숫자형을 문자로 변환
ex) SELECT TO_CHAR(SYSDATE, 'CC YYYY/MM/DD:HH24:MI:SS') 세기 연월일 시간, 분, 초로 변환
ex) SELECT ENAME, TO_CHAR(SAL, '$999,999.99') $ > L =>\ 로컬 통화기호
- TO_NUMBER : 문자형을 숫자형으로 변환
문제
1. 오늘날짜를 "xx년 xx월 xx일" 형식으로 출력하세요.
2. 지금현재 몇시 몇분인지 출력하세요.
3. 이번년 12월 31일까지 몇일이 남았는지 출력하세요.
4. emp에서 급여를 출력하는데, 세자리마다 쉼표(,)를 찍고 맨 앞에 $를 표시하시오.
(해딩을 "이름", "급여"로 바꾸어 출력하여라.)
6. 일반 : NVL, DECODE, (CASE)
- NVL : 컬럼의 값이 NULL일 때 표기된 숫자 혹은 문자로 표현한다.(NULL VALUE)
- 모든 컬럼에 사용 가능
- 문자 = 문자, 숫자 = 숫자 입력되는 데이터값 일치 ex) nvl(to_char(mgr, '9999'), 'CEO')
ex) SELECT ENAME "사원명" , SAL*12+NVL(COMM, 1) "연봉" comm이 널값을 가지고 있으면 1을 대입하라
문제
1. emp에서 이름과 매니져번호(mgr)를 출력하는데 매니져번호가 null이면 ceo로 출력하세요.
- DECODE : 여러가지 경우에 대해서 선택할 수 있도록 하는 기능
ㅇ DECODE ( 컬럼, 조건 , 입력값, / 조건, 입력값 / 나머지 ) "별칭"
ex)SELECT ENAME, JOB, SAL, DECODE(JOB, 'MANAGER', SAL*1.1, 'CLEARK', SAL*1.05, SAL*1.01) "UPSAL"
- CASE : 여러 가지 경우에서 하나를 선택하는 함수
ㅇ CASE WHEN 조건 THEN 입력값 else 나머지 end "별칭"
ex)SELECT ENAME, JOB, SAL, CASE WHEN JOB='MANAGER' THEN SAL*1.1 WHEN JOB='CLERK' THEN SAL*1.05
ELSE SAL*1.1 END "UPSAL2"
문제
1. emp테이블에서 이름,직책,직책수당(Up Sal)을 출력하는데
직책수당을 직책이 점원이면 5%, 매니져면 15%를 인상하고 나머지는 그냥 출력하시오.(DECODE함수)
2. emp테이블에서 이름,직책,직책수당(Up Sal)을 출력하는데
직책수당을 직책이 점원이면 5%, 매니져면 15%를 인상하고 나머지는 그냥 출력하시오.(CASE함수)
JOIN
- 2개 이상의 테이블을 마치 하나의 테이블처럼 연결
올바른 연결을 위해 조건을 부여 이러한 조건을 조인 조건이라고 한다.
(FROM 절에 2개이상 테이블 => 가능한 모든 조합 생성 => 조건필요)
- 잘 못되면 중복되는 데이터 발생
- 조인시 각 컬럼에 주소를 지정해주면
- 테이블 명칭 축약 가능
- 테이블 N 조인 조건 N-1
EQUI-JOIN : 값을 일치
ex)WHERE EMP.DEPTNO = DEPT.DEPTNO =연산자
ex)SELECT ENAME, DNAME, EMP.DEPTNO 두 테이블에 동일한 컬럼시 명확히 지정
NonEqui-JOIN : 값을 비교
ex)WHERE SAL BETWEEN LOSAL AND HISAL = 연산자를 사용하지 않음
SELF-JOIN(테이블 별칭)
- WHERE절은 RAW단위로 이동
- 같은 테이블에 다른 별칭을 달아 복사한 거 같은 효과
- 조건 : 공통되는 값 일치
ex)FROM EMP E, EMP C
OUTER-JOIN
- JOIN 결과에 NULL인값을 추가
ex)WHERE E.MGR = C.EMPNO(+)
- MGR에는 NULL값이 있고 EMPNO에는 NULL값이 없다. (+) 입력 값을 일치
문제
1. 사원 이름이 SCOTT인 사원의 사번(empno), 이름(ename), 부서명(dname)를 출력하세요.
2. 사원이름과 급여(sal)와 급여등급(grade)을 출력하세요.
3. 위 2번문제에서 부서명을 추가시켜 출력하세요.
4. 사원이름과 매니저의 이름을 아래와 같은 형식으로 출력하세요.
"XXX"의 매니져는 "XXX" 입니다.
5. 부서번호가 30번인 사원들의 이름, 직급(job), 부서번호(deptno), 부서위치(loc)를 출력하세요.
6. 보너스(comm)을 받은사원의 이름, 보너스, 부서명, 부서위치를 출력하세요.
7. DALLAS에서 근무하는 사원들의 이름, 직급, 부서번호, 부서명을 출력하세요.
8. 이름에 'A'가 들어가는 사원들의 이름과 부서명을 출력하세요.
9. 사원이름, 부서번호와 해당사원과 같은 부서에 있는 사원을 출력하세요.
(해당사원과 같은부서에 있는 사원의 해딩을 '동료'라고 설정해주세요)
ORDER BY ( 정렬 )
- 오름차순 : ASC, ORDER BY (기본값)
- 내림차순 : DESC
- 데이터를 꺼내올때 정렬해서 꺼내온다.
- 동시에 2개 이상 컬럼이 올 수 있다.
ex)ORDER BY SAL DESC, ENAME DESC 1차정렬 2차정렬 중복되는 수 2번째 DESC로 정렬
- 1차로 월급을 정렬하고 2차로 중복되는 월급에서 이름을 알파벳 순서로 정렬
- 컬럼명에 별칭을 써도 정렬 가능
- 출력되는 컬럼명을 제외하고도 정렬 할 수 있다.
- SELECT절에 순서(POSTIONJ)대로 정렬 할 수 있다.
- ORDER BY SELECT문의 가장 마지막에 위치
ex)ORDER BY 3 DESC
문제)
1. 부서번호가 30인 사람의 이름,사원번호,부서번호를 사원번호로 오름정렬하여라.
2. 이름과 급여의 데이터를 급여가 많은 순으로 정렬하라.
3. 부서번호로 오름차순 정렬한후 급여가 많은 사람순으로 이름,부서번호,급여를 출력하라.
4. 부서번호를 내림차순 정렬한후 ,직업순으로 오름정렬,급여순으로 내림정렬하여라. (전제 데이터출력)
숙제 [ 문제 ]
조인 실습 문제
1. 사원들의 이름, 부서번호, 부서이름을 출력
2. 30번 부서의 사원들의 이름, 직업 부서위치 출력
3. 커미션을 받는 사원의 이름, 부서이름 및 부서위치를 출력
4. DALLAS에서 근무하는 사원의 이름, 직업, 부서번호, 부서이름을 출력
5. 이름에 A가 들어가는 사원들의 이름과 부서이름을 출력
6. 사원이름과 그 사원의 관리자 이름을 출력하라 (단 컬럼 HEADING을 EMPLOYEE, MANAGER로 출력)
7. 사원이름과 직업, 급여, 급여등급을 출력
8. 사원이름과 부서명과 월급을 출력하는데 월급이 3000이상인 사원을 출력
9. 사원이름, 부서번호와 같은 부서에 근무하는 동료사원들을 출력
10. BLAKE이란 사원보다 늦게 입사한 사원의 이름과 입사일을 출력
1. 부서번호가 10번인 부서의 사람중 사원번호, 이름,월급을 출력하여라.
2. 사원번호가 7369인 사람중 이름,입사일,부서번호를 출력하라.
3. 이름이 ALLEN 인 사람의 모든 정보를 출력하라.
4. 입사일이 81/05/01인 사원의 이름,부서번호,월급을 출력하라.
5. 직업이 MANAGER 가 아닌 사람의 모든 정보를 출력하라.
6. 입사일이 81/04/02 이후에 입사한 사원의 정보를 출력하라.
7. 급여가 $800 이상인 사람의 이름,급여,부서번호를 출력하라.
8. 부서번호가 20번 이상인 사원의 모든 정보를 출력하라.
9. 이름이 K로 시작하는 사람보다 높은 이름을 가진 사람의 이름을 출력하라.
10. 입사일이 81/12/09 보다 먼저 입사한 사람들의 모든 정보를 출력하라.
11. 입사번호가 7698 보다 작거나 같은 사람들의 입사번호와 이름을 출력하라.
12. 입사일이 81/04/02 보다 늦고 82/12/09 보다 빠른 사원의 이름,월급,부서번호,입사번호를 출력하라.
13. 급여가 1,600 보다 크고, $3,000 보다 작은 사람의 이름,직업,급여를 출력하라.
14. 이름이 B와 J사이의 모든 사원의 이름을 출력하라.
15. 입사일이 81년 이외에 입사한 사람의 입사일과 이름을 출력하라.
16. 직업이 MANAGER와 SALESMAN인 사람의 이름과 직업을 출력하라.
17. 부서번호가 20,30 번을 제외한 모든 사람의 이름,사원번호,부서번호를 출력하라.
18. 이름이 S로 시작하는 사원의 사원번호,이름,입사일,부서번호를 출력하라.
19. 입사일이 81년도인 사람의 입사일,이름을 출력하라.
20. 이름 중 A자가 들어가 있는 사람만 입사번호,이름을 출력하라.
21. 이름이 S로 시작하고 마지막 글자가 T인 사람의 이름을 출력하라.
22. 이름의 두번째 문자가 A인 사람의 이름을 출력하라.
23. 커미션이 NULL인 사람의 이름과 커미션을 출력하라.
24. 커미션이 NULL인 아닌 사람의 이름과 커미션을 출력하라.
25. 부서번호가 30번 부서이고,급여가 $1,500 이상인 사람의 이름,부서번호,월급을 출력하라.
26. 이름의 첫 글자가 K로 시작하거나 부서번호가 30인 사람의 사원번호,이름,부서번호를 출력하라.
27. 급여가 $1,500 이상이고,부서번호가 30번인 사원중 직업이 MANAGER인 사람의 급여,부서번호,직업을 출력하라.
28. 부서번호가 30인 사람의 이름,사원번호,부서번호를 사원번호로 오름정렬하여라.
29. 이름과 급여의 데이터를 급여가 많은 순으로 정렬하라.
30. 부서번호로 오름차순 정렬한후 급여가 많은 사람순으로 이름,부서번호,급여를 출력하라.
31. 부서번호를 내림차순 정렬한후 ,직업순으로 오름정렬,급여순으로 내림정렬하여라. (전제 데이터출력)