4.2 SQL 개요
비절차적 언어(선언적 언어) - 자신이 원하는 바(what)만 명시
대화식 SQL / 내포된 SQL (C, 코볼)
구성요소 : 데이터 검색, 조작어(삽입, 삭제, 수정) , 정의어, 트랜잭션 제어, 제어어
4.3 데이터 정의어와 무결성 제약조건
데이터 정의어 종류
CREATE DOMAIN / TABLE / VIEW / INDEX
ALTER TABLE
DROP DOMAIN / TABLE / VIEW / INDEX
스키마 생성&제거
CREATE SCHEMA my_db AUTHORIZATION kim; // 권한부여
DROP SCHEMA my_db RESTRICT; // 제약조건
DROP SCHEMA my_db CASCADE; // 스키마 객체 삭제
릴레이션 정의 예시
CREATE TABLE employee
(EMPNO NUMBER NOT NULL,
EMPNAME CHAR(10) UNIQUE,
TITLE CHAR(10) DEFAULT '사원',
MANAGER NUMBER,
SALARY NUMBER CHECK (SALARY < 600000),
DNO NUMBER CHECK (DNO IN (1,2,3,4,5,6)) DEFAULT 1,
PRIMARY KEY(EMPNO),
FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),
FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)
ON DELETE CASCADE); // 어떤 tuple 삭제하면 관련 다른 tuple 자동삭제
무결성 제약조건의 추가 및 삭제
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT_PK PRIMARY KEY(STNO);
ALTER TABLE STUDENT DROP CONSTRAINT STUDENT_PK;
그룹화 + HAVING 절
SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSAL
FROM EMPLOYEE
GROUP BY DNO
HAVING AVG(SALARY) >= 2500000;
SELECT TITLE, MIN(SALARY), MAX(SALARY)
FROM EMPLOYEE
GROUP BY TITLE
HAVING MAX(SALARY) >= 100000000;
삽입, 삭제, 수정
INSERT INTO HIGH_SALARY(ENAME, TITLE, SAL)
SELECT EMPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000;
DELETE FROM DEPARTMENT
WHERE DEPTNO = 4;
UPDATE EMPLOYEE
SET DNO=3, SALARY = SALARY*1.05
WHERE EMPNO=2106;
4.6 트리거(trigger)와 주장(assertion)
트리거(trigger)
- 제약조건을 위반했을 때 수행할 동작 명시
- 명시된 데이터베이스 갱신이 될 때마다 DBMS가 자동적으로 수행하는 문
- 이벤트-조건-동작(ECA) 규칙
- 이벤트 : 트리거 활성화시키는 사건
- 조건 : 트리거 활성화되었을 때 수행되는 테스트
- 동작 : 트리거 활성화 후 조건 참일 때 수행되는 문
-- 새로운 사원 입사할 때마다 급여 1500000 미만일 경우 급여 10% 인상
CREATE TRIGGER RAISE_SALARY
AFTER INSERT ON EMPLOYEE
REFERENCING NEW AS newEmployee
FOR EACH ROW
WHEN (newEmployee.SALARY <1500000)
UPDATE EMPLOYEE
SET newEmployee.SALARY = SALARY*1.1
WHERE EMPNO = newEmployee.EMPNO;
주장(assertion)
- 제약조건을 위반하는 연산이 수행되지 않도록 함
-- STUDENT 릴레이션에 없는 학생의 학번이 ENROLL 릴레이션에 나타나는 것을 허용 X
CREATE ASSERTION EnrollStudentIntegrity
CHECK (NOT EXISTS
(SELECT *
FROM ENROLL
WHERE STNO NOT IN
(SELECT STNO FROM STUDENT)));
4.7 내포된 SQL
호스트 언어(C, C++, JAVA)에 포함되는 SQL문
호스트 변수 선언
EXEC SQL BEGIN DECLARE SECTION;
int no;
varchar title[10];
EXEC SQL END DECLARE SECTION;
정적 / 동적 SQL
// 정적 : C 프로그램에 내포된 완전한 SQL문
EXEC SQL SELECT title INTO :TITLE
FROM EMPLOYEE WHERE empno = :no;
// 동적 : 불완전한 SQL문
strcpy(hostVarSTmtDyn, "UPDATE staff SET salary = salary+1000 WHERE dept=:v");
EXEC SQL PREPARE StmtDyn FROM :hostVarSTmtDyn;
EXEC SQL PREPARE StmtDyn USING :dept;
불일치 문제 : 집합 위주의 방식으로 처리하는 SQL문에서 불일치 문제 발생 -> 커서 사용
// 정적인 커서
EXEC SQL BEGIN DECLARE SECTION;
char name[] = "가나다";
char title[10];
EXEC SQL END DECLARE SECTION;
EXEC SQL
DECLARE title_cursor CURSOR FOR
SELECT title FROM employee WHERE empname = :name;
EXEC SQL OPEN title_cursor;
EXEC SQL FETCH title_cursor INTO :title;
WHENEVER : 자동적인 에러 검사와 에러 처리
- WHENEVER <조건><동작>
- <조건> : NOT FOUND / SQLERROR / SQLWARNING
- <동작> : CONTINUE / DO{function call | CONTINUE | BREAK}; / STOP
반응형
'COMPUTER SCIENCE > DATABASE' 카테고리의 다른 글
[SQL] 1. 데이터베이스 시스템 (0) | 2019.04.24 |
---|---|
[SQL] 3. 관계 대수 (0) | 2019.03.30 |
[SQL] 2. 관계 데이터 모델과 제약조건 (0) | 2019.03.30 |