1차시 데이터베이스와 데이터 조회
1. 오라클에서 지원하는 데이터 타입의 종류
데이터 타입
의미
CHAR(size)
Size 크기의 고정 길이 문자 데이터 타입
최대크기: 2,000 바이트
최소크기: 1 바이트
VARCHAR2(size)
Size 크기의 가변 길이 문자 데이터 타입
최대크기: 4,000 바이트
최소크기: 1 바이트
NVARCHAR2(size)
국가별 문자 집합에 따른 size
크기의 문자 또는 바이트의 가변 길이 문자 데이터 타입
최대크기: 4,000 바이트
최소크기: 1 바이트
NUMBER(p,s)
정밀도(p)와 스케일(s)로 표현되는 숫자 데이터 타입
P : 1 ~ 38
S : -84 ~ 127
DATE
날짜 형식을 저장하기 위한 데이터 타입
ROWID
테이블 내 행의 고유 주소를 가지는 64진수 문자 타입
해당 6 바이트(제한된 ROWID) 또는 10 바이트(확장된 ROWID)
BLOB
대용량의 바이너리 데이터를 저장하기 위한 데이터 타입
최대크기: 4GB
CLOB
대용량의 텍스트 데이터를 저장하기 위한 데이터 타입
최대크기: 4GB
BFILE
대용량의 바이너리 데이터를 파일 형태로 저장하기 위한 데이터 타입
최대크기: 4GB
TIMESTAMP(n)
DATE 데이터 타입의 확장된 형태
n은 mile second 자리수로 최대 9자리까지 표현 가능
INTERVAL YEAR TO MONTH
년과 월을 이용하여 기간을 저장
INTERVAL DAY TO SECOND
일, 시, 분, 초를 이용하여 기간을 저장
두 날짜값의 정확한 차이를 표현하는데 유용
2. 오라클 데이터베이스를 설치하였으면 이를 사용하기 위해서 오라클에 접속을 시도해야 합니다. 데이터베이스 접속을 시도하면 오라클 데이터베이스를 사용할 수 있는 사용자인지를 검증하기 위해서 사용자 계정과 암호를 묻게 됩니다. 오라클을 설치하면 기본적으로 생성되는 계정이 있다고 하였습니다. 제공되는 계정은 시스템 권한을 가진 사용자인 DBA용 계정(SYS, SYSTEM)과 교육용 계정(HR) 두 가지로 나뉩니다.
데이터베이스 사용자는 오라클 계정(Account)이라는 용어와 같은 의미로 사용됩니다. 오라클을 설치하면 한 개 이상의 데이터베이스 권한을 갖는 디폴트(기본적인) 사용자가 존재합니다. 오라클에서 제공되는 사용자 계정은 다음과 같습니다.
SYS : 오라클 Super 사용자 계정이며 데이터베이스에서 발생하는 모든 문제들을 처리할 수 있는 권한을 가지고 있다.
SYSTEM : 오라클 데이터베이스를 유지보수 관리할 때 사용하는 사용자 계정이며, SYS 사용자와
차이점은 데이터베이스를 생성할 수 있는 권한이 없으면 불완전 복구를 할 수 없다.
HR : 처음 오라클을 사용하는 사용자의 실습을 위해 만들어 놓은 교육용 계정이다.
디폴트 사용자 중에서 SYS와 SYSTEM은 DBA 권한을 가진 사용자로서 다른 모든 시용 자에 대한 정보를 조회할 수 있습니다. DBA 권한을 가진 관리자는 사용자를 생성하거나 삭제,변경 등의 시스템 권한을 가지고 있습니다. DBA 관리자인 SYS 혹은 SYSTEM은 오라클을 처음 설치하자마자 디폴트로 생성되고 활성화 되어 있는 사용자 계정입니다.
3. IN 연산자
IN 연산자는 특정 칼럼의 값이 A, B, C 중에 하나라도 일치하면 참이 되는 연산자입니다.
column_name IN(A, B, C)
다음은 커미션이 300이거나 500이거나 1400인 사원을 검색하기 위해서 IN 연산자를 사용한 예입니다.
01:select * from employee
02: where commission in(300, 500, 1400);
EN0 ENAME JOB MANAGER HIREDATE SALARY COMMISSION
7499 ALLEN SALESMAN 7698 81/02/20 1600 300
7521 WARD SALESMAN 7698 81/02/22 1250 500
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400
2차시 SQL/PLUS와 다양한 함수
4. SQL*Plus 명령어를 SQL 문과 혼동하는 경우가 많은데, SQL 문은 데이터베이스에서 자료를 검색하고 수정하고 삭제하는 처리 등을 위한 데이터베이스 언어인 반면, SQL*Plus 명령어는 SQL 문을 실행시키고 그 결과를 볼 수 있도록 오라클에서 제공하는 툴입니다.
• SQL*PLUS : SQL 문을 대호(식으로 실행하기 위해서 사용자가 데이터베이스에 입력하고 SQL 문을 처리하여 그 결과를 받을 수 있도록 만든 툴입니다.
• SQL(Structured Query Language) : 테이블을 저장 단위로 생각하는 관계형 데이터베이스 (Relational DataBase: RDB)를 처리(저장, 수정. 삭제. 추출)하기 위해 미국표준협회(ANSI)에서 표준으로 채택한 언어입니다.
SQL*Plus 명령어의 실행은 한 줄을 기본으로 합니다. 그래서 문장의 끝을 알리는 종결문자가 필요 없습니다. 한 줄을 입력한 후에 [Enter] 키를 누르면 명령어 입력의 끝난 것으로 인식해서 실행됩니다. 만일 명령어가 길어져서 다음 줄까지 이어져야 하는 경우에는 연결문자인 ‘-’를 사용한 후에 엔터키를 눌러야만 이전 줄과 다음 줄이 이어집니다.
SQL 문은 종결문자인 세미콜론을 입력한 후 [Enter] 키를 눌려야만 실행합니다. 여러 줄에 명령어를 이어서 입력할 경우 따로 연결 문자가 필요 없습니다. [Enter] 키를 눌러도 명령어가 실행되지 않기 때문에 절 단위로 끊어서 여러 줄에 걸쳐서 명령어를 입력하다가 문장이 끝나는 시점에서 세미콜론을 입력합니다.
또한 SQL 문은 마지막 문장 한 개가 SQL 버퍼라 불리는 공간에 저장이 되지만 SQL*Plus 명령어는 버퍼에 저장이 되지 않는 차이가 있습니다.
SQL*Plus 명령어 중에서 자주 시용하는 명령어들은 다음과 같습니다.
명령어
기능
LIST
버퍼에 저장된 SQL 문의 편집 명령
RUN, @, /
SQL 문 또는 PL/SQL을 실행하는 명령
SAVE, GET, EDIT, SPOOL
스크립트 파일을 저장하는 명령
HOST, EXIT
데이터베이스 접속 및 종료
LINE, PAGE
검색 결과에 대한 보고서 형태의 출력 형식 설정
5. SPOOL
SPOOL 명령어는 SQL 문과 실행된 쿼리 결과를 파일로 기록하는 명령어로서 화면에 보이는 내용 전체를 갈무리해서 하나의 파일로 만듭니다.
SPOOL filename
SAVE 명령어가 SQL 문만을 저장하는데 비해 SPOOL 명령은 SQL 문의 실행 결과 화면이 갈무리되어 저장됩니다. SAVE 명령어의 기본 확장자는 .sql이지만 SPOOL 명령어의 기본 확장자는.LST 입니다.
SPOOL OFF는 SPOOL를 해제하기 위한 명령어입니다. SPOOL OFF 명령어는 화면 갈무리 작업을 중단하며 해제하기 전까지의 여러 SQL 문을 모두 저장합니다.
SPOOL OFF
SPOOL OFF를 하지 않고 오라클을 종료하게 되면 지금까지 갈무리한 내용이 저장되지 않고 사라지기 때문에 화면 갈무리 내용을 저장하기 위해서는 SPOOL OFF를 해주어야 합니다.
6. 문자 조작 함수의 종류
구분 설명
CONCAT 문자의 값을 연결한다.
SUBSTR 문자를 잘라 추출한다(한글 1Byte).
SUBSTRB 문자를 잘라 추출한다{한글 2Byte).
INSTR 특정 문자의 위치 값을 반환한다(한글 1Byte).
NSTRB 특정 문자의 위치 값을 반환한다(한글 2Byte).
LPAD, RPAD 입력 받은 문자열과 기호를 정렬하여 특정 길이의 문자열로 반환한다.
TRIM 잘라내고 남은 문자를 표시한다.
3차시 그룹함수와 테이블 조인
7. 그룹함수
그룹함수는 테이블의 전체 데이터에서 통계적인 결과를 구하기 위해서 행 집합에 적용하여 하나의 결과를 생산합니다. 그룹함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합,평균 등 하나의 결과를 구합니다.
구분 설명
SUM 그룹의 누적 합계를 반환합니다.
AVG 그룹의 평균을 반환합니다.
COUNT 그룹의 총 개수를 반환합니다.
MAX 그룹의 최대값을 반환합니다.
MIN 그룹의 최소값을 반환합니다.
8. NON-EQUI JOIN은 조인 조건에 특정 범위 내에 있는지를 조사하기 위해서 사용합니다. WHERE 절에 ‘<’,BETWEEN a AND b와 같이 조건이 아닌 연산자를 사용합니다.
사원 테이블과 급여 등급 테이블을 NON-EQUI JOIN하여 사원별로 급여 등급을 출력하는 예제를 작성해 보겠습니다.
우선 급여 등급 테이블(salgrade)을 살펴보면 다음과 같습니다.
01:select * from salgrade;
GRADE LOSAL HISAL
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
급여 등급 테이블(salgrade)은 급여에 대한 등급을 총 5등급으로 나누어 놓았습니다. 1등급은 급여가 700부터 1200,2등급은 12이부터 1400,3등급은 14이부터 2000,4등급은 2001부터 3000,5등급이면 30이부터 9999 사이입니다.
다음은 등급(salgrade) 테이블의 급여 등급을 기준으로 사원의 급여가 몇 등급인지 살펴보는 예제입니다.
01 : select ename, salary, grade
02 : from employee, salgrade
03 : where salary between losal and hisal;
위의 WHERE 절의 ‘salary between losal and hisal’을 ‘where salary 〉= losal and salary <= hisal’와 같이 표현해도 동일한 결과를 얻을 수 있습니다.
다음은 3개의 테이블을 조인하는 방법을 학습합니다.
사원의 이름과 소속된 부서의 이름과 급여가 몇 등급인지를 출력하려고 합니다. 이를 위해서는 총 3개의 테이블 즉,사원 테이블과 부서 테이블과 급여 등급 테이블을 조인해야 합니다.
3개의 테이블 조인하기
01:select e.ename, d.dname, e.salary, s.grade
02:from employee e, department d, salgrade s
03:where e.dno = d.dno
04:and salary between losal and hisal;
ENAME DNAME SALARY GRADE
KING ACCOUNTING 5000 5
FORD RESEARCH 3000 4
SCOTT RESEARCH 3000 4
ALLEN SALES 1600 3
MILLER ACCOUNTING 1300 2
SMITH RESEARCH 800 1
9. SELF JOIN은 하나의 테이블에 있는 칼럼끼리 연결해야 하는 조인이 필요한 경우 사용합니다. SELF JOIN이란 말 그대로 자기 자신과 조인을 맺는 것을 말합니다. 조인 대상 테이블이 자신 하나라는 것 외에는 EQUI JOIN과 동일합니다.
사원 테이블에는 manager 칼럼이 존재하는데 이 칼럼에는 각 사원의 담당 매니저의 사원 번호가 저장되어 있습니다. ‘SCOTT’란 사원의 매니저 이름을 검색하려면 ‘SCOTT’의 매니저 사원번호가 필요하고 사원번호로 사원이름을 조회해야 합니다. 그런데 ‘SCOTTY 매니저 사원번호와 사원번호로 사원이름을 조회하려는 테이블이 동일한 테이블이기 때문에 테이블의 별칭을 사용하여 SELF JOIN을 해야 합니다.
WHERE 절을 사용한 SELF JOIN
01: select employees.ename as “사원이름”, manager.ename as “직속상관이름”
02: from employee employees, employee manager
03: where employees.manager = manager.eno;
4차시 서브 쿼리와 테이블 생성/수정/제거
10. 다중 행 서브 쿼리
IN - 메인 쿼리의 비교 조건(‘=’ 연산자로 비교할 경우)이 서브 쿼리의 결과 중에서 하나라 도 일치하면 참입니다.
ANY, SOME - 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참입니다.
ALL - 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참입니다.
EXIST - 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참입니다.
11. 오라클에서는 DDL(데이터 정의어)을 제공합니다. DDL은 테이블의 구조 자체를 생성,수정, 제거하도록 하는 명령문 집합입니다. CREATE TABLE 문을 사용하여 데이터를 저장할 테이블을 생성합니다. 이 명령문 하나로 테이블에 대한 구조를 정의하고,데이터를 저장하기 위한 공간을 할당합니다.
테이블을 생성하기 위해서는 테이블명을 정의하고 테이블을 구성하는 칼럼의 데이터 타입과 무결성 제약 조건을 정의해야 합니다.
테이블명 및 칼럼명을 정의하기 위한 규칙은 다음과 같습니다.
(1) 문자(A-Z, a-z)로 시작해야 하며 30자 이내로 작성합니다.
(2) 문자(A-Z, a-z), 숫자(0-9), 특수문자 ($, #)만 사용 가능합니다.
(3) 대소문자 구별이 없습니다. 소문자로 저장하려면 작은따옴표로 묶어 주어야 합니다.
(4) 동일 사용자가 소유한 다른 객체의 이름과 중복되지 않아야 합니다.
테이블을 생성하기 위한 기본 형식은 다음과 같습니다.
CREATE TABLE [schema.] table
(column datatype [DEFAULT expression][column_constraint clause][•••]);
schema는 소유자의 이름으로,데이터베이스 사용자 계정과 같은 의미이고 table은 생성하고자 하는 테이블명이며 column은 테이블에 포함되는 칼럼명입니다. datatype은 칼럼에 대한 데이터 타입과 길이를 지정하고 DEFAULT expression은 데이터 입력시 값이 생략된 경우에 입력되는 기본 값입니다. column_constraint_clause은 칼럼에 대해 정의되는 무결성 제약 조건입니다.
12. TRUNCATE TABLE 문은 기존에 사용하던 테이블의 모든 로우를 제거합니다. 테이블의 구조는 그대로 유지하고,테이블의 데이터와 할당된 공간만 해제됩니다. 테이블에 생성된 제약 조건과 연관된 인덱스,뷰,동의어는 유지됩니다.
TRUNCATE TABLE table_name
테이블의 모든 데이터 제거하기
01 : truncate table dept_second;