본문

160110P(일)

ORACLE Chpter4 - 관계대수와 SQL

 

관계 해석(relational calculus)

데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않는 선언적인 언어

 

관계 대수(relational alebra)

어떻게 질의를 수행할 것인가를 명시하는 절차적인 언어

릴레이션을 다루는 대표적인 이론적 방법

기존의 릴레이션들로부터 새로운 릴레이션을 생성

기본적인 연산자들의 집합으로 이루어진다.

 

중복된 투플을 가지고 있지 않은 릴레이션들에 적용되며 결과도 중복된 투플을 가지고 있지 않는다.

 

 

셀렉션 연산자

셀렉션 조건(selection condition)을 만족하는 투플들의 부분 집합을 생성

=, <, >, <=, >=, <>, AND, OR, NOT 등의 비교연산자와 부울연산자를 사용할 수 있다.

 

형식

σ<셀렉션 조건> (릴레이션)

 

ex)

σDNO=3 (EMPLOYEE)

 

프로젝션 연산자

릴레이션의 애트리뷰트들의 부분집합을 구한다.

중복된 투플들이 존재할 수 있으므로 중복 투플들을 제거하는 과정이 필요하다.

 

형식

π<애트리뷰트 리스트> (릴레이션)

 

ex)

πTITLE (EMPLOYEE)

 

집합 연산자

집합 연산자로 사용되는 두 릴레이션은 합집합 호환(union compatible)이어야 한다.

DB 내의 임의의 두 릴레이션이 합집합 호환인 경우는 드물며, 프로젝션과 셀렉션의 결과가 합집합 호환인 경우가 많다.

 

조건

1. 두 릴레이션의 애트리뷰트 수가 같아야 한다.

2. 대응되는 애트리뷰트의 도메인이 같아야 한다.

 

합집합 연산자

R ∪ S

R 또는 S에 속한 투플이거나 R과 S에 모두 속한 투플들로 이루어진 릴레이션

중복된 투플은 제외한다.

 

교집합 연산자

R ∩ S

R과 S에 모두 속한 투플들로 이루어진 릴레이션

 

차집합 연산자

R - S

R에는 속하지만 S에는 속하지 않는 투플들로 이루어진 릴레이션

 

카티션 곱 연산자

R × S

 

ex)

EMPLOYEE

EMPNO

=======

2106

3426

3011

 

DEPARTMENT

DEPTNO

========

1

2

 

EMPLOYEE × DEPARTMENT

EMPNO | DEPTNO

=================

2106            1

2106            2

3426            1

3426            2

3011            1

3011            2

 

관계대수의 완전성(relationally complete)

임의의 질의어가 적어도 필수적인 관계 대수 연사자들만큼의 표현력을 갖고 있는 것

 

셀렉션, 프로젝션, 합집합, 차집합, 카티션 곱은 필수적인 연산자

다른 연산자는 필수 연산자를 두 개이상 조합하여 표현 가능

 

조인 연산자

두 개의 릴레이션으로부터 연관된 투플들을 결합

조인연산자 = 셀렉션(카티션곱)

 

세타조인(θ-join) & 동등조인(equijoin)

R과 S가 합집합 호환일 필요는 없다

 

θ는 =, <>, <=, <, >=. > 중에 하나 이다.

동등은 = 이다.

 

형식

R ▷◁ R.attribute=S.attribute S

 

자연조인(natural join)

동등 조인의 결과 릴레이션에서 중복된 애트리뷰트 중 조인 애트리뷰트를 한개 제외한 것

가장 자주 사용된다.

대부분의 질의는 셀렉션, 프로젝션, 자연조인으로 해결 가능

 

형식

R * R.attribute, S.attribute S

 

외부조인(outer join)

상대 릴레이션에서 대응되는 투플을 갖지 못하는 투플이나 조인 애트리뷰트에 널값이 들어있는 투플들을 다루기 위해서 조인 연산을 확장한 것

 

1. 왼쪽 외부조인(left outer join)

R 외부조인 S

R의 모든 투플들을 결과에 포함

S에 관련된 투플이 없으면 NULL값으로 채운다.

 

2. 오른쪽 외부조인(right outer join)

R 외부조인 S

S의 모든 투플들을 결과에 포함

R에 관련된 투플이 없으면 NULL값으로 채운다.

 

3. 완전 외부조인(full outer join)

R과 S의 모든 투플들을 결과에 포함

역시 없는 부분은 NULL값으로 채운다.

 

세미조인(semijoin)

 

디비전 연산자

R ÷ S

S에 속하는 모든 투블 u에 대하여 투플 tu가 R에 존재하는 투플 t들의 집합

즉, S를 완벽하게 가지고 있는 투플을 추출

 

관계 대수의 한계

복잡한 계산 불가

집단함수(aggregate function)을 지원하지 않는다.

ex) SUM, COUNT, AVG, MAX, MIN 등

정렬 불가

DB 수정 불가

프로젝션시 중복 투플 나타내는것이 불가능

 

이런 단점은 SQL로 모두 커버 가능하다.

 

SQL(Structured Query Language)

복잡한 질의를 자연어로 표현하면 정확한 표현인지 입증하기 어려우므로 구조적인 질의어 필요

자연어에 가까운 구문을 사용하여 질의를 표현 가능

 

비절차적 언어(선언적 언어)

원하는 데이터만 명시하고 처리하는 방법은 명시 불가능

관계적으로 완전하고 릴레이션을 정렬하고 중복된 투플들을 허용 가능

 

관계대수는 절차적언어이며 검색 연산만 제공한다.

 

1. 대화식 SQL(interative SQL)

최종 사용자들이 사용하는 언어

 

2. 내포된 SQL(embedded SQL)

고급 프로그래밍 언어인 호스트언어 내에 SQL을 포함하여 사용

 

데이터 검색

데이터 조작

데이터 정의

트랜잭션 제어

데이터 제어

 

데이터 정의어

CREATE

DOMAIN

TABLE

VIEW

INDEX

 

ALTER

TABLE

 

DROP

DOMAIN

TABLE

VIEW

INDEX

 

스키마의 생성과 제거

스키마

특정 사용자의 데이터베이스 응용에 속하는 릴레이션, 도메인, 제약조건, 뷰, 권한 등을 그룹화한 것

권한을 받지 않는한 다른 사용자의 스키마에 속한 데이터를 볼 수 없다.

 

스키마 내에 릴레이션 생성 가능

CREATE SCHEMA 스키마_이름 AUTHORIZATION 계정_이름;

 

스키마가 비어있지 않으면 DBMS가 DROP SCHEMA문을 거절한다.

DROP SCHEMA BY 스키마_이름;

 

릴레이션 정의

CREATE TABLE DEPARTMENT

(DEPTNO NUMBER NOT NULL,

DEPTNAME CHAR(10),

FLOOR NUMBER,

PRIMARY KEY(DEPTNO));

 

CREATE TABLE EMPLOYEE

(EMPNO NUMBER NOTNULL,

EMPNAME CHAR(10),

TITLE CHAR(10),

MANAGER NUMBER,

SALARY NUMBER,

DNO NUMBER,

PRIMARY KEY(EMPNO),

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO));

 

EMPLOYEE의 DNO가 DEPARTMENT의 DEPTNO를 외래키로 참조하고 있으므로 EMPLOYEE를 먼저 정의하면 실패한다.

 

오라클의 데이터 타입

INTEGER, INT

정수형

 

NUMBER(n, s)

소수점을 포함한 n개의 숫자에서 소수 아래 숫자가 s개인 십진수

 

CHAR(n), CHARACTER(n)

n바이트 문자열. n을 생략하면 1

 

VARCHAR(n), VARCHAR2(n), CHARACTER VARYING(n)

최대 n바이트까지의 가변 길이 문자열

 

BIT(n), BIT VARYING(n)

n개의 비트열 또는 최대 n개까지의 가변 비트열

 

DATE

날짜형, 날짜와 시간을 저장

 

BINARY_FLOAT

32비트에 실수를 저장

 

BINARY_DOUBLE

64비트에 실수를 저장

 

BLOB Binary Large

OBject로써 멀티미디어 데이터 등을 저장

 

테이블 제거

다른 릴레이션이나 뷰에서 참조되지 않는 릴레이션들만 제거 가능

삭제하려면 ALTER TABLE문을 사용하여 참조 부분을 제거해야 한다.

 

DROP TABLE DEPARTMENT;

 

ALTER TABLE

애트리뷰트 추가나 제거

추가된 애트리뷰트는 마지막 애트리뷰트로 된다.

새로 추가되는 애트리뷰트에 대해서 기존의 투플들은 NULL값을 갖는다.

 

ALTER TABLE 릴레이션_이름 ADD 애트리뷰트_이름 CHAR(13);

 

인덱스 생성

하나이상의 애트리뷰트에 대해서 인덱스를 생성한다.

인덱스의 디폴트는 오름차순이다.

 

CREATE INDEX 인덱스_이름 ON 릴레이션_이름(애트리뷰트);

DROP INDEX 릴레이션_이름.인덱스_이름;

 

제약조건

NOT NULL

애트리뷰트는 기본으로 널값을 가질 수 있기 때문에 중요하다.

 

UNIQUE

동일한 애트리뷰트 값을 갖는 투플이 두 개 이상 존재하지 않도록 보장한다.

오라클은 UNIQUE절이 명시된 애트리뷰트에 자동적으로 인덱스를 생성

 

DEFAULT

널 값 대신에 특정 값을 디폴트 값으로 지정할 수 있다.

 

CHECK

애트리뷰트가 가질 수 있는 값들의 범위를 지정

 

기본키 제약조건

엔티티 무결선 제약조건에 의하여 NULL값을 가지지 않아야 한다.

기본키는 자동적으로 인덱스가 형성된다.

 

참조 무결성 제약조건

참조되는 애트리뷰트는 동일한 데이터 타입을 가지면서 UNIQUE 또는 기본키로 정의되어 있어야 한다.

 

참조 무결성 제약조건을 위배하는 연산은 삭제와 수정이다.

 

CASCADE

외래키가 참조하는 기본키에 변경이 일어나서 참조 무결성 제약조건이 위배되면 참조하는 릴레이션에도 변경이 전파

 

ON DELETE

DELETE에 대해서는 아래 4개의 동작을 다 쓸 수 있다.

UPDATE 는 NO ACTION만 쓸 수 있다.

 

ON DELETE NO ACTION = RESTRICT

외래키가 참조하는 기본키가 포함된 투플을 삭제하려 할때 참조하고 있는 투플이 참조하는 릴레이션에 존재하면 삭제연산 거절

 

ON DELETE CASCADE

기본키의 값이 삭제되면 이를 참조하는 모든 투플들도 연쇄 삭제

 

ON DELETE SET NULL

기본키의 값이 삭제되면 이를 참조하는 모든 투플에 NULL을 삽입

 

ON DELETE SET DEFAULT

기본키의 값이 삭제되면 이를 참조하는 모든 투플에 기본값 삽입

 

CREATE TABLE EMPLOYEE

(EMPNO NUMBER NOT NULL,

EMPNAME CHAR(10) UNIQUE,

TITLE CHAR(10) DEFAULT '사원',

MANAGER NUMBER,

SALARY NUMBER CHECK (SALARY < 6000000),

DNO NUMBER CHECK (DNO IN (1, 2, 3, 4)) DEFAULT 1,

PRIMARY KEY(EMPNO),

FOREIGN KEY(MANAGER) REFERENCES EMPLYEE(EMPNO),

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO) ON DELETE CASCADE);

 

무결성 제약조건의 추가 및 삭제

릴레이션 생성 뒤에서 제약조건을 추가하거나 삭제할 수 있다.

 

ALTER TABLE 릴레이션_이름 ADD CONSTRAINT 제약조건_이름

PRIMARY KEY (애트리뷰트_이름);

 

ALTER TABLE 릴레이션_이름 DROP CONSTRAINT 제약조건_이름;

 

기본 키 제약조건이 삭제되면 연관된 인덱스도 삭제된다.

외래키 제약조건이 삭제되면 인덱스는 남아있는다.

 

SELECT문

정보의 검색을 담당하며 관계대수의 셀렉션, 프로젝션, 조인, 카티션 곱 등을 결합한 것

 

형식

SELECT [DISTINCT]애트리뷰트(들)

FROM 릴레이션(들)

WHERE 조건

[중첩질의]

GROUP BY 애트리뷰트(들)

HAVING 조건

ORDER BY 애트리뷰트(들) [ASC|DESC];

 

SELECT절

질의 결과에 포함하려는 애트리뷰트들의 리스트 열거

질의 결과에서 중복을 제거하지는 않는다.

DISTINCT절을 사용했을 때, 중복을 제거한다.

 

FROM절

질의에서 필요로 하는 릴레이션들의 리스트 열거

WHERE절에 나오는 애트리뷰트의 릴레이션도 포함해야 한다.

 

WHERE절

결과 릴레이션의 투플들이 만족시켜야 할 조건들

=, <>, <. <=. >. >=

AND, OR, NOT

IN, NOT IN, ANY(SOME), ALL

 

GROUP BY절

조건에 명시된 동일한 값을 갖는 투플들을 한 그룹으로 묶는다.

 

HAVING

투플들의 그룹이 만족해야 하는 조건

 

ORDER BY

투플들의 정렬 순서 지정

생략하면 기본키의 순서나 투플들이 검색된 순서를 따른다.

 

ex)

SELECT *

FROM DEPARTMENT;

 

SELECT DEPTNO, DEPTNAME

FROM DEPARTMENT;

 

SELECT DISTINCT TITLE

FROM EMPLOYEE;

 

SELECT *

FROM EMPLOYEE

WHERE DNO = 2;

 

문자열비교

wild문자

% : 0 개 이상의 문자열과 대치

_ : 1개의 문자와 대치

 

wild문자가 문자열의 앞부분에 오면 인덱스를 사용하지 못하고 모든 투플들을 하나씩 읽어야 한다.

 

SELECT EMPNAME, TITME, DNO

FROM EMPLOYEE

WHERE EMPNAME LIKE '이%';

 

SELECT EMPNAME, TITME, DNO

FROM EMPLOYEE

WHERE EMPNAME NOT LIKE '이%';

 

범위를 사용한 검색

경계값도 포함한다.

 

SELECT EMPNAME, TITLE, SALARY

FROM EMPLOYEE

WHERE SALARY BETWEEN 3000000 AND 4500000;

 

리스트를 사용한 검색

WHERE DNO IN (1, 2, 3)

WHERE DNO NOT IN (1, 2, 3)

 

산술 연산자

SELECT EMPNAME, SALARY, SALARY * 1.1 AS NEWSALARY

FROM EMPLOYEE

WHERE TITLE = '과장';

 

NULL값

COUNT를 제외한 집단 함수들은 NULL을 무시한다.

DNO = NULL(X)

NULL > 300(X)

NULL <> 300(X)

 

SELECT EMPNO, EMPNAME

FROM EMPLOYEE

WHERE DNO IS NULL;

 

SELECT EMPNO, EMPNAME

FROM EMPLOYEE

WHERE DNO IS NOT NULL;

 

ORDER BY절

디폴트는 ASC다.

널도 정렬에 표시되며 오름차순에서는 가장 마지막에 나타나고, 내림차순에서는 가장 앞에 나타난다.

여러개의 애트리뷰트로 정렬도 가능하다.

 

집단 함수

집단함수는 SELECT, HAVING절에만 나타날 수 있다.

COUNT, MIN, MAX : 숫자형, 비숫자형 가능

SUM, AVG : 숫자형만 사용가능

 

COUNT(*)를 제외하고 NULL을 제외한 후 남아있는 값에 대해서 구한다.

COUNT(애트리뷰트)는 NULL을 제외한다.

 

SELECT AVG(SALARY)AS AVGSAL, MAX(SALARY)AS MAXSAL

FROM EMPLOYEE;

 

GROUP BY절

GROUP BY에 사용되는 애트리뷰트는 집단함수에 사용되지 않았어야 한다.

그룹에 대해서 하나의 튜플로 리턴된다.

 

SELECT절에 집단함수가 포함되어있고 GROUP BY절이 없는 경우는 SELECT절에 집단함수가 아닌 애트리뷰트가 나타날 수 없다.

 

잘못된 쿼리문

SELECT EMPNO, AVG(SALARY)

FROM EMPLOYEE;

 

SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSAL

FROM EMPLOYEE

GROUP BY DNO;

 

HAVING절

그룹함수에 대한 조건들 제시

어떤 조건을 만족하는 그룹들에 대해서만 집단 함수를 적용

HAVING절에 나타나는 애트리뷰트는 반드시 GROUP BY절에 나타나거나 집단 함수에 포함되어야 한다.

그룹들을 걸러낸다.

 

HAVING을 사용하지만 GROUP BY를 생략하면 WHERE을 만족하는 투플들의 집합을 하나의 그룹으로 취급

추가적인 WHERE같이 동작

 

SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSAL

FROM EMPLOYEE

GROUP BY DNO

HAVING AVG(SALARY) >= 2500000;

 

집합연산

합집합 호환성을 가져야 한다.

UNION ALL(합집합)을 제외하고 결과가 ASC로 정렬된다.

UNION ALL을 제외하고 중복 투플이 자동적으로 삭제된다.

 

(SELECT DNO

FROM EMPLOYEE

WHERE EMPNAME = '김창섭)

UNION

(SELECT DEPTNO

FROM DEPARTMENT

WHERE DEPTNAME = '개발');

 

조인

FROM 절에 n개의 릴레이션을 명시하면 조인 조건은 n-1개가 필요하다.

조인조건을 생략하거나 틀리게 명시하면 카티션곱이 생성된다.

 

SELECT EMPNAME, DEPTNAME

FROM EMPLOYEE AS E, DEPARTMENT AS D

WHERE E.DNO = D.DEPTNO;

 

자체조인(self join)

동일한 릴레이션 안에서 조인하는 것

별칭을 따로 지정해야 한다.

 

SELECT E.EMPNAME, M.EMPNAME

FROM EMPLOYEE E, EMPLOYEE M

WHERE E.MANAGER = E.EMPNO;

 

중첩질의(nested query)

부질의(subquery)라고도 하며 한개의 애트리뷰트로 이루어진 릴레이션이 반환될 때는 IN, ANY(SOME), ALL, EXISTS가 사용되고 여러 애트리뷰트로 이루어진 릴레이션이 반환되면 EXISTS를 사용한다.

중첩질의는 외부질의보다 먼저 실행된다.

 

1. 한 개의 스칼라 값이 반환되는 경우

하나의 값처럼 사용하며 중첩질의의 SELECT절에 사용된 데이터 타입과 외부질의의 WHERE절에 사용된 데이터 타입이 같아야 한다.

 

2. 한개의 애트리뷰트로 이루어진 릴레이션 반환

WHERE절에서 IN, ANY(SOME), ALL, EXISTS가 사용

 

IN

한 애트리뷰트가 값들의 집합에 속하는가 테스트

 

ANY

애트리뷰트가 값들의 집합에 속하는 하나 이상의 값들과 어떤 관계를 갖는가 테스트

 

ALL

애트리뷰트가 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가 테스트

 

EXISTS

빈 릴레이션인지 여부를 검사

빈 릴레이션이 아니면 참, 빈 릴레이션이면 거짓

여러 애트리뷰트가 반환되는 경우에도 사용된다.

 

상관 중첩 질의(correlated nested query)

외부 질의에 선언된 릴레이션의 일부 애트리뷰트를 중첩질의에서 참조

 

SELECT EMPNAME, DNO, SALARY

FROM EMPLOYEE E

WHERE SALARY >

(SELECT AVG(SALARY)

FROM EMPLOYEE

WHERE DNO = E.DNO);

 

DCL

INSERT문

기존의 릴레이션에 투플을 삽입

참조되는 릴레이션에 삽입은 무결성을 위배하지 않지만, 참조하는 릴레이션에 투플이 삽입되는 경우 참조 무결성 제약조건 위배가 발생

 

1. 한번에 한 투플 삽입

INSERT INTO 릴레이션(애트리뷰트1, ..., 애트리뷰트n)

VALUES (값1, ..., 값n)

 

입력하지 않은값은 NULL

문자나 날짜형은 ' '로 감싼다.

 

INSERT INTO DEPARTMENT

VALUES (5, '연구', '');

 

2. 한번에 여러개의 투플 삽입

VALUES절이 없다.

 

INSERT INT HIGH_SALARY(ENAME, TITLE, SAL)

SELECT EMPNAME, TITLE, SALARY

FROM EMPLOYEE

WHERE SALARY >= 3000000;

 

DELETE문

한개 이상의 투플들을 삭제

참조되는 릴레이션에 삽입은 참조 무결성을 위배할 수 있지만, 참조하는 릴레이션에 투플이 삭제되는 경우 참조 무결성 제약조건 위배가 발생하지 않는다.

 

DELETE FROM DEPARTMENT

WHERE DEPTNO = 4;

 

UPDATE문

투플들의 애트리뷰트 값을 수정한다.

수정된 애트리뷰트가 기본키나 외래키에 속하면 DELETE 처럼 문제가 발생할 수 있다.

 

UPDATE EMPLOYEE

SET DNO = 3, SALARY = SALARY * 1.05

WHERE EMPNO = 2106;

 

트리거(trigger)

무결성을 보장하기 위해서 테이블 정의시에 스키마에 무결성을 정의하는 것과는 별개로 DB 무결성을 시행하는 메커니즘

제약조건이 성능이 더 좋다.

주장(assertion)보다 절차적이다.

 

데이터베이스가 갱신 될 때마다 DBMS가 자동적으로 수행하는 사용자 정의 프로시저이다.

이벤트-조건-동작(ECA) 규칙이라고도 한다.

조건이 참이되면 동작하고 아니면 동작 수행을 하지 않는다.

능동 데이터베이스(active database)의 중요한 특징

 

형식

CREATE TRIGGER 트리거_이름

이벤트

조건

동작

 

CREATE TRIGGER 트리거_이름

AFTER INSERT OR DELETE OR UPDATE ON 릴레이션 

WHEN 조건

BEGIN SQL문(들) END

 

CREATE TRIGGER RAISE_SALARY

AFTER INSERT ON EMPLOYEE

REFERENCEING NEW AS newEmployee

FOR EACH ROW

WHEN (newEmployee < 1500000)

UPDATE EMPLOYEE

SET newEmployee.SALARY = SALARY * 1.1

WHERE EMPNO = newEmployee.EMPNO;

 

트리거를 과도하게 사용하면 복잡한 상호 의존성 야기

트리거 연쇄 발생 가능

 

주장(assertion)

조건을 위배할 가능성이 있는 각 갱신문마다 검사된다.

대부분의 상용 DBMS가 지원하지 않는다.

 

트리거는 제약조건을 위반했을 때 수행할 동작 명시

주장은 제약조건을 위반하는 연산이 수행되지 않도록 하는것

 

CREATE ASSERTION 이름

CHECK 조건;

 

트리거보다 좀더 일반적인 무결성 제약조건

주장이 복잡하면 상당한 오버헤드 초래

 

CREATE ASSERTION Enrollstudentintegrity

CHECK (NOT EXISTS

(SELECT *

FROM ENROLL

WHERE STNO NOT IN

(SELECT STNO

FROM STUDENT)));

 

'낡은 서랍장 > ORACLE' 카테고리의 다른 글

160111P(월)  (0) 2016.01.11
160108P(금)  (0) 2016.01.08
160105P(화)  (0) 2016.01.05
151220P(일)  (0) 2016.01.02
151227P(일)  (0) 2015.12.27

공유

댓글