[국비지원과정] Database(3) 뷰, 인덱스, 일련번호, 고급함수
📕ch08 뷰(View)
- 테이블에 대한 가상의 테이블(논리적인 개념)
- 테이블에 대한 보안 기능을 설정해야 하는 경우 활용
- 장점: 복잡하며 자주 사용하는 SQL 명령어를 쉽고 간단하게 사용할 수 있다.
- View 생성 및 변경 → CREATE OR REPLACE VIEW 뷰이름 AS (select명령어);
- View 삭제 → drop view 뷰이름;
📌예제check
CREATE OR REPLACE VIEW test_v
AS //실행할 명령어
SELECT empno, ename, e.deptno, dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
SELECT * FROM user_views; //뷰의 세부 정보 확인(데이터 사전)
📕ch09 인덱스(Index)
- 색인/인덱스: 대량의 레코드가 저장된 테이블의 데이터를 빠르게 검색할 수 있도록 지원해주는 객체
- 인덱스 생성 → CREATE INDEX 인덱스명 ON 테이블명 (컬럼명);
- 인덱스 삭제 → DROP INDEX 인덱스명;
📌예제check
CREATE INDEX emp_name_idx on emp3(name, sal);
//인덱스 추가 복합인덱스(and)
//*cf. 복합인덱스는 and 연산에서는 사용 가능, or 연산에서는 사용불가
SELECT * FROM emp3 WHERE name = 'shin691' and sal > 200;
//F10: 인덱스를 사용해 range scan, cost(cost:1) 감소확인
SELECT * FROM user_indexes WHERE table_name = 'EMP3';
//인덱스 정보확인(uniqueness → nonunique 인덱스)
📕ch10 일련번호
- 시퀀스 (Sequence): 일련번호를 만들어주는 객체
1. 시퀀스 생성
create sequence 시퀀스이름
start with 숫자
increment by 숫자
minvalue 숫자
maxvalue 숫자
cycle or nocycle //일련번호 순환여부
cache or nocache //시퀀스의 값을 메모리에 저장
📌예제check
create sequence c_emp_seq
start with 1 //시작
increment by 1; //1씩 증가
select c_emp_seq.nextval from dual; //nextval: 다음번호
select c_emp_seq.currval from dual; //currval: 현재번호
2. 서브쿼리를 이용한 일련번호 설정
📌예제check
(Q) c_emp 테이블에 id를 입력하기 위한 sequence 생성하시오. 단, 300부터 시작하여 1씩 증가하고 최대값은 999로 설정
create sequence c_emp_sq
start with 300 //시작번호 조건
increment by 1 //증가 조건
maxvalue 999; //최대값 조건
insert into c_emp values(c_emp_sq.nextval,'kim', 1000, '02-123-4567', 10);
//select * from c_emp; 결과확인
(Q) c_emp 테이블에 새로운 레코드를 입력하시오.
조건: 기존내용 삭제 후, 사번: 시퀀스로 입력, 이름: 김철수, 부서번호: 10번
delete from c_emp; 기존 레코드 입력내용 삭제
//select nvl(max(id)+1,1) from c_emp →서브쿼리 응용
insert into c_emp (id, name, dept_id) values
((select nvl(max(id)+1,1) from c_emp), '김철수', 10);
//select * from c_emp; 결과확인
📕ch11 고급함수
1. nvl : null에 대한 대체값을 지정하는 함수
- nvl(A,B) → A의 값이 null이면 B, null이 아니면 A를 반환
2. decode
- decode(A, B, C, D) → A,B가 같으면 C, 다르면 D
3. case : 복잡한 조건문을 처리할 때 사용하는 함수
📌예제check
score 테이블에서 이름, 국어점수, 영어점수, 수학점수, 총점, 평균, 등급을 나타내시오.
단, 평균점수가 90~100점이면 A등급, 80점대이면 B등급, 70점대이면 C등급, 60점대이면 D등급, 60점 미만이면 F등급
(1) decode 함수 활용
select name, kor, eng, mat, (kor+eng+mat) 총점, round((kor+eng+mat)/3,2) 평균,
decode(trunc(((kor+eng+mat)/3)/10), 10, 'A', 9, 'A', 8, 'B', 7, 'C', 6, 'D', 'F') 등급
// *cf.trunc 버림함수 점수 구간별 등급(A~F) 설정 & alias 등급
from score;
(2) case문 활용
select name, kor, eng, mat, kor+eng+mat 총점, round((kor+eng+mat)/3,2) 평균,
case //점수 구간별 등급(A~F) 설정 & alias(등급) 설정
when (kor+eng+mat)/3 >= 90 then 'A'
when (kor+eng+mat)/3 >= 80 then 'B'
when (kor+eng+mat)/3 >= 70 then 'C'
when (kor+eng+mat)/3 >= 60 then 'D'
else 'F'
end 등급
from score;
4. rank : 순위를 구하는 함수
- rank() over
- dense_rank() over → 동률 순위 무시
- partition by → 그룹에 대한 순위
📌예제check
사원정보 테이블에서 전체 사원의 부서번호, 이름, 급여, 급여순위를 조회
select deptno, ename, sal,
rank() over(order by sal desc) 순위
from emp;
select deptno, ename, sal,
dense_rank() over(order by sal desc) 순위
//dense_rank() → 동률 순위를 무시
from emp;
select deptno, ename, sal,
rank() over(partition by deptno order by sal desc) 순위
//partition by → 부서별 순위
from emp;
Leave a comment