<'WARD'가 있다면 모든 사원 출력>
exists : 중복이 없다는 가정하에 조건을 충족하는 값을 찾았을때 바로 검색을 중지하는 함수
3. 다중컬럼 SUB Query
<부서별 가장 높은 급여를 받고 있는 사원 출력>
4. ROWNUM
- SUB Query에서 반환되는 각행 1부터 시작하는 순차값 할당
<emp테이블에서 월급이 높은 사람이 먼저 출력되고 순번 추가>
rownum과 order by함께 사용할때 주의사항 : order by절을 먼저 수행하고 rownum이 수행되게 해야함
그렇지 않으면 순번이 랜덤으로 정렬됨
DDL(Data Definition Language)
- 데이터 정의어, 테이블 구조생성, 변경 및 삭제
- DDL을 사용하면 자동 COMMIT
종류 | 의미 |
CREATE | 데이터베이스 객체 생성 |
DROP | 데이터베이스 객체 삭제 |
RENAME | 데이터베이스의 이름 변경 |
ALTER | 기존 데이터베이스 객체 다시 정의 |
TRUNCATE | 테이블 최초 생성 상태로 만들며 ROLLBACK 불가능 |
1. CREATE TABLE
- 새로운 테이블 생성
- 형식 : create table table_name(
컬럼명1 데이터타입1,
컬럼명2 데이터타입2,
); - 식별자(컬럼명이나 테이블명)
1. 반드시 문자로 시작
2. oracle에서 사용되는 예악어나 다른 객체명과 중복 불가
3. A~Z 대소문자, 0~9까지의 숫자, 특수기호('_', '$', '#')만 포함 가능
4. 최대 30글자까지 가능
5. 공백 불가
<empno, ename, sal을 컬럼명으로 하는 TEST1테이블 생성>
<insert into를 통해 TEST1테이블에 레코드 생성(삽입)>
- SUB Query로 테이블 생성
<emp테이블을 이용해 emp_01테이블 생성>
권한은 복사되지 않고 값만 복사됨
<emp구조는 그대로 복사하되, 레코드 없이 테이블 생성>
where절에 참이 되지 않는 값을 넣음으로써 레코드 없이 테이블 구조만 생성가능
<emp_05에 emp레코드 삽입>
- ROWID
- 테이블에서 행의 위치를 지정하는 논리적인 주소 값
- 특징 : 중복되지 않는 유일한 값
특정 레코드에 랜덤으로 접근하기 위해 주로 사용
테이블 내부에서 자동으로 생성됨 - 형태( 총 80bit / 10byte)
32bit | 10bit | 22bit | 16bit |
000000 | FFF | BBBBB | RRR |
데이터객체번호 | 상대적파일번호 | 블럭번호 | 행번호 |
<emp테이블의 이름, 월급의 rowid확인>
2. ALTER TABLE
- 테이블 구조 변경
- 구조변경 : 컬럼 추가(ADD), 삭제(DROP), 수정(MODIFY)
- 형식 : alter table table_name
추가 : add((컬럼명1 자료형1), (컬럼명2 자료형2) ...);
삭제 : drop column ((컬럼명1 자료형1), (컬럼명2 자료형2) ...);
수정 : modify((컬럼명1 자료형1), (컬럼명2 자료형2) ...); - 컬럼명 추가 시 : 원하는 위치에 삽입 불가, 새로운 컬럼은 테이블 마지막에 추가
이미 이전에 추가한 행이 존재한다면 컬럼은 추가되지만 컬럼값은 null으로 입력 - 컬럼명 변경 형식 : alter table table_name
rename column 기존 컬럼명 to 새로운 컬럼명;
<emp_06 테이블에서 sal number(5) 컬럼 추가>
<emp_06 테에블에서 sal의 자료형 변경>
<emp_06 테이블의 sal 컬럼 삭제>
<emp_01 테이블에서 sal의 자료형 변경>
자료형 변경 - 레코드가 있을경우 : 축소 불가 / 확대 가능
<emp_01 테이블에서 sal 컬럼 삭제>
레코드의 유무에 상관없이 삭제가능
<emp_03 테이블에 mgr number(4) 추가>
- SET UNUSED : 사용을 논리적으로 제한 , 실제로 삭제하지 않음
- 사용 : 컬럼을 삭제하는동안(시간↑) 다른 사용자가 해당 컬럼을 사용하려고 하면 테이블이 사용되고 있기 때문에 다른 사용자는 해당 테이블 사용불가, 이럴 경우 작업이 LOCK 발생 → SET UNUSED(시간↓) 는 LOCK 발생하지 않음
<emp_03 테이블에서 sal 컬럼 set unused >
<emp_03 테이블의 ename컬럼명을 koread로 변경>
변경 후)
3. DROP TABLE
- 기존 테이블 제거
- 테이블 삭제, 무결성 제약 조건
삭제하고자 하는 테이블의 기본키나 고유키를 다른 테이블에서 참조해 사용하는 경우 삭제 불가
→ 삭제하고자 한다면 참조하는 테이블 제거 후 해당 테이블 삭제 - 형식 : drop table table_name
<test1 테이블 삭제>
삭제 전)
삭제)
삭제 후)
BIN$~ : 복구용 테이블
<test1 복구>
복구 후)
flashback table table_name to before drop : 복구용 테이블 삭제
<drop 후 테이블명을 모를 때>
show recyclebin : drop 후 휴지통에 있는 테이블명 조회 가능
<복구용 테이블 삭제>
삭제 후)
purge recyclebin : 복구용 테이블 모두 삭제
<emp_05 테이블 복구용 테이블 생성하지 않고 삭제>
삭제 후)
PURGE를 사용해 복구용 테이블 생성 없이 삭제 가능
4. TRUNCATE TABLE
- 테이블의 모든 레코드 삭제
- 형식 : truncate table table_name
<emp_02 테이블의 레코드 삭제>
<예제>
- 다중행 SUB Query-
<이름에 'T'를 포함하고 사원들과 같은 부서에서 근무하는 사원의 이름, 사원번호, 부서번호 출력>
방법1_like)
방법2_instr)
<평균급여보다 많고 이름에 'S'가 들어가는 사원과 동일한 부서에서 근무하는 사원의 이름, 급여, 부서번호 출력>
<영업사원의 최대급여보다 많이 받는 사원의 이름, 직급, 급여 출력/ 단, 영업사원은 제외>
방법1_다중행 SUB Query)
방법2_ 단일행 SUB Query)
<10번과 20번 부서의 근무하는 사원들의 평균 급여보다 많이 받는 사원의 이름, 급여, 부서번호 출력>
<단일행 SUB Querty/'WARD'와 동일한 job을 가진 사원의 이름, 직급 출력>
<'MANAGER'인 사원들이 받는 최소급여보다 많이 받는 사원들의 이름, 급여, 부서번호를 출력하되,
부서번호가 20번인 사원 제외>
방법1_다중행 SUB Query)
방법2_단일행 SUB Query)
- ROWNUM -
<emp테이블에서 최상위 소득자 3명의 이름, 급여 출력>
<'SALES'부서의 모든 사원의 이름, 급여 출력하되, 월급이 높은 사람이 먼저 출력되고 순번 추가>
- CREATE TABLE -
<30번 부서만 있는 emp_02 테이블 생성>
<부서번호가 30번인 사원 이름, 부서명, 근무지, 월급인 테이블 생성>
<월급이 1500이상인 사원의 이름, 월급, 입사일인 테이블 생성>
<dept테이블의 동일한 구조의 dept_01테이블을 생성>
<dept_01테이블에 dept레코드 삽입>
<테이블명 : emp_06
컬럼명 : empno number(4) / ename varchar(20) / job varchar(16) / deptno number(2) 생성>
<dept를 복사한 dept_05 생성해
1. tel varchar(30) 컬럼 추가
2. dname컬럼 크기를 varchar2 크기 35로 변경
3. loc 컬럼명을 '근무지'로 변경 >
'DB > ORACLE' 카테고리의 다른 글
220901_ORACLE_국비_DELETE/MERGE/DCL/TRANSACTION/무결성 제약 조건 (0) | 2022.09.01 |
---|---|
220831_ORACLE_국비_RENAME/DML/INSERT/UPDATE (0) | 2022.08.31 |
220829_ORACLE_국비_JOIN/SUB Query (0) | 2022.08.29 |
220826_ORACLE_국비_그룹함수/GROUP BY/HAVING/JOIN (0) | 2022.08.26 |
220825_ORACLE_국비_날짜함수/형 변환 함수/NVL/DECODE/CASE (0) | 2022.08.25 |