티스토리 뷰

1. 데이터베이스 언어의 특징

  • SQL
    • DBMS에 대한 강력한 작업 지시 기능을 제공
    • 인간의 언어와 매우 유사하고 간단, 명료
    • 비절차적(선언형) 언어, 필요한 데이터만 기술
  • 비절차적 언어 ( non-procedural language )
    • 목표만 명시하고 수행에 대한 절차는 기술하지 않음
    • 높은 가독성과 동작 순서에 대한 구체적 기술이 없어 오류가 상대적으로 적은 점이 장점
    • 프로그램의 성능 최적화, 디버깅, 오류 추적 및 복잡한 로직 구현이 한계
  • 저장 객체를 통해 SQL의 단점을 보완

2. 저장 객체의 이해

  • 저장 객체의 정의
    • SQL 문을 확장하여 절차적으로 처리하기 위한 기능을 제공하는 언어
    • SQL / PSM ( Persistent Stored Module ) 기반의 확장 언어
  • 저장 객체의 구조
-- 형식 정의 부분
CREATE PROCEDURE do_repeat (param1 INT)

-- 기능 정의 부분
BEGIN
	SET @x = 0;
	REPEAT
		SET @x = @x+1;
	UNTIL @x > param1
	END REPEAT;
END;

3. 저장 객체의 장단점

  • 저장 객체의 장점
    • 네트워크 전송 효율 향상
      • 오가는 데이터의 양을 줄일 수 있기에 클라이언트와 DBMS 사이에 트래픽 감소
    • 효율적 실행 속도 향상
      • 저장 객체는 컴파일되어 캐시에 저장
    • 모듈화
      • 대규모 작업의 시간 단축, 프로그램 크기의 축소
    • 보안성 향상
      • 사용자별, 작업 단위별로 권한 부여 가능
  • 저장 객체의 단점
    • 처리 성능 저하
      • 서버 메모리 사용량이 증가로 인한 성능 저하
    • 어려운 디버깅
      • 저장 객체를 위한 디버깅 환경 미지원

4. 저장 객체의 종류

  • 저장 프로시저
    • 자주 사용되거나 복잡한 과정을 거치는 SQL문을 저장하여 하나의 객체로 관리
  • 함수
    • 저장 프로시저의 유사, RETURN문을 통해 결과값을 반환하는 기능 제공
    • SELECT 문에 포함되어 실행
  • 트리거
    • 데이터 갱신 시 지정된 애플리케이션이 동작 또는 다른 테이블의 데이터를 변경
    • DBMS가 자동으로 반응하도록 만드는 역할 수행

5. 저장 프로시저의 이해

  • 저장 프로시저의 정의
    • 응용 작업 중 자주 사용되거나 다수의 SQL 문으로 구성되는 복잡한 과정이 저장된 객체
    • 데이터를 주고받는 여러 개의 SQL 문을 묶어서 단계별로 실행
  • 저장 프로시저의 특징
    • 함수와는 달리 이름을 이용하여 값을 반환하지 않음
    • 매개변수를 받아들이거나 반환
      • 프로시저 내에서 또 다른 프로시저 호출 가능
    • 실행과 관련된 제어값과 메시지를 반환

6. 저장 프로시저의 생성

  • 생성 구문형식
CREATE [DEFINER {사용자 | 현재사용자}]
	PROCEDURE 프로시저명 ([매개변수[, ...]])
BEGIN
	SQL문
	...
END
  • 매개변수 정의
    • 기본적으로 값이 주어지지 않으면 IN 타입으로 변수 생성
[IN | OUT | INOUT] 매개변수명 데이터 타입

7. 저장 프로시저의 활용 1

  • 저장 프로시저 생성
DELIMITER $$
CREATE PROCEDURE GetStudentByGender()
BEGIN
    SELECT 성별, COUNT(*) FROM 학생
    GROUP BY 성별;
END $$
DELIMITER;
  • 문장 구분자
    • DELIMITER는 개별 SQL 문 구분하는 구분자 정의
    • BEGIN-END 블럭 내에 SQL 문과 기능 정의 부분의 구분자 구별 필요\

8. 저장 프로시저의 호출

  • 호출 구문형식
CALL 저장 프로시저명([매개변수[, ...]]);
또는
CALL 저장 프로시저명([ ]);
  • 예시
    • CALL GetStudentByGender;

9. 저장 프로시저의 수정과 삭제

  • 저장 프로시저의 수정
    • ALTER PROCEDURE 명령을 사용
    • 보안 및 동작 방식에 대한 속성을 변경할 때만 사용
    • 다른 것을 수정하길 원하실때는 삭제 후 재생성
      • 모든 저장 객체 동일 ( 함수, 트리거도 동일 )
  • 저장 프로시저의 삭제
    • DROP PROCEDURE 프로시저명;
  • 예시
    • DROP PROCEDURE GetStudentByGender;

10. 매개변수의 사용

  • 매개변수의 역할
    • 외부로부터 주어지는 값이나 기본값을 매개변수를 통해 저장 프로시저로 전달
    • 저장 프로시저를 실행한 결과값을 반환
  • IN, OUT, INOUT 세 타입의 매개변수를 제공
    • IN : 기본 타입, 외부로부터 값을 전달
    • OUT : 반환값을 저장
    • INOUT : IN과 OUT의 목적으로 모두 사용

11. 매개변수의 활용

DELIMITER $$
CREATE PROCEDURE GetPhoneByStudentID(
    IN sid CHAR(13),
    OUT phone CHAR(15)) -- 전화번호를 저장한 phone OUT
BEGIN
    SELECT 전화번호 INTO phone FROM 학생 -- 전화번호를 phone에 저장
        WHERE 학생번호 = sid;
END $$
DELIMITER ;

CALL GetPhoneByStudentID('202034-596541', @phone); -- 매개변수 사용하여 전달
SELECT @phone;

12. 변수의 사용

  • 저장 객체에서 처리하는 응용 과정에서 발생하는 임시적인 값을 저장하고 재사용하는 기능 제공
    • 사용자 정의 변수
      • @ 시작
      • 별도의 선언 없이 사용
    • 로컬 변수
      • 저장 객체 내에서만 사용
      • DECLARE로 선언
  • 구문형식
    • DECLARE 변수명[, ...] 데이터 타입[(크기)] [DEFAULT 기본값];
    • 데이터 타입( 크기 ) : 변수가 가질 수 있는 데이터 타입과 크기를 지정
    • DEFAULT 기본값 : 변수가 선언될 때 초기값을 지정

13. 변수값 할당

  • 선언된 변수에 값을 저장( 할당 )하는 방법
    • SET 명령
DECLARE total_count INT DEFAULT 0;
SET total_count = 10;
  • SELECT INTO 문
    • 숫자 타입만 가능
    • SQL 문의 실행 결과를 특정 변수에 넣어준다는 의미
DECLARE total_student INT DEFAULT 0;
SELECT COUNT(*) INTO total_student FROM 학생;

14. 선택 구조 - IF

  • 주어진 조건이나 식의 값에 따라 SQL문의 실행 여부를 제어
  • 구문형식
IF 조건식 THEN
    SQL문
[ELSEIF 조건식 THEN
    SQL문]
[ELSE
    SQL문]
END IF;
  • 예시
DELIMITER $$
CREATE PROCEDURE GetGradeByCredit(
     IN sID CHAR(13), -- 학생번호
     OUT nGrade TINYINT) -- 학년
 BEGIN
     DECLARE nTotalCredit SMALLINT; -- 총 이수학점
     SELECT SUM(이수학점) INTO nTotalCredit FROM 전공
         WHERE 학생번호 = sID;
     IF nTotalCredit > 120 THEN
         SET nGrade = 4;
     ELSEIF (nTotalCredit > 80 AND nTotalCredit < 120) THEN
         SET nGrade = 3;
     ELSEIF (nTotalCredit > 40 AND nTotalCredit < 80) THEN
         SET nGrade = 2;
     ELSE
         SET nGrade = 1;
     END IF;
 END $$
 DELIMITER;

15. 선택 구조 - CASE

  • 다중 IF ELSE 문을 간편하게 사용하기 위한 명령어
CASE 변수
    WHEN 비교변숫값1 THEN SQL문
    [WHEN 비교변숫값2 THEN SQL문]
    ...
    [ELSE SQL문]
END CASE;
CASE
    WHEN 조건식1 THEN SQL문
    [WHEN 조건식2 THEN SQL문]
    ...
    [ELSE SQL문]
END CASE;

16. 반복 구조

  • MySQL은 특정 SQL문을 주어진 조건이 만족하는 동안 특정 구간을 반복시킬 수 있는 세 가지 구문을 제공
    • REPEAT
    • LOOP
    • WHILE
CREATE PROCEDURE GetFirstCourse(
    IN sCourseCode CHAR(5), OUT sPrerequisite CHAR(5))
BEGIN
    DECLARE sInputCourse CHAR(5);
    SET sInputCourse = sCourseCode;
pre: WHILE true DO -- while 시작
    SELECT 선수과목 INTO sPrerequisite FROM 과목
        WHERE 과목코드 = sCourseCode;
    IF sPrerequisite IS NOT NULL THEN
        SET sCourseCode = sPrerequisite;
        SET sPrerequisite = NULL;
    ELSE
        LEAVE pre; -- break;
    END IF;
END WHILE; -- while 끝
IF sCourseCode = sInputCourse THEN
    SET sPrerequisite NULL;
ELSE
    SET sPrerequisite = sCourseCode;
END IF;
END$$
  • 반복문 안에서 반복 작업을 제어하기 위해 LEAVEITERATE 문을 사용
    • LEAVE는 반복 종료 ( == break; )
    • ITERATE는 현재 반복 구간을 중단하고 조건을 재검사하여 반복 여부는 판별 ( == continue; )

17. 함수의 이해

  • DBMS는 문자열 함수, 숫자 함수, 날짜 함수, 집계 함수 등 많은 편리한 함수를 제공
  • 사용자가 프로그래밍 언어의 기능을 사용하여 직접 함수를 정의하는 사용자 정의 함수 기능을 제공
  • 별도 라인별로 적용되며, 결과값은 컬럼으로 나타난다.
  • 저장 프로시저와 함수의 차이
    • 저장 프로시저는 OUT 매개변수를 통해 결과를 반환, 함수는 RETURN문에 의해 특정 값을 반환
    • 저장 프로시저는 CALL 명령에 의해 실행되나, 함수는 SELECT문에 포함되어 실행(호출)

18. 함수의 생성

  • 구문형식
CREATE
    [DEFINER {사용자|현재사용자}]
    FUNCTION 함수명([매개변수[, ...]])
	    RETURNS 데이터 타입
	    [Characteristic]
BEGIN
    SQL문
END
  • 매개변수 : IN 타입의 매개변수만 사용 가능
  • Characteristic : SQL 문의 특성을 기술
    • NO SQL / READ SQL DATA / MODIFIES SQL DATA

19. 트리거의 이해

  • 데이터 변경 시 자동으로 지정된 애플리케이션이 동작하거나 다른 테이블의 데이터를 변경하도록 설계된 저장 프로시저의 특별한 형태
  • 트리거의 역할
    • 전체적인 데이터베이스의 무결성과 일관성을 유지하도록 동작
    • 조건에 따른 데이터 적합성 검사 가능
    • 연속적 트리거 실행 시 다른 데이터베이스나 서버에 대한 광범위한 참조 무결성 검사도 가능
  • 주의점
    • 실제 DBMS 내부에서 동작했을 때 어떤 트리거가 발동되었는지 유추하기 힘듦
    • 연쇄적인 트리거 발생은 때때로 DBMS의 실패상황을 야기할 수도 있음

20. 트리거의 종류

  • 트리거 이벤트와 트리거 시점으로 구분
    • 트리거 이벤트 : 자동으로 반응하는 SQL 문
    • 트리거 시점 : 트리거가 실행될 시점을 명시
트리거 이벤트 실행시점 기능
INSERT BEFORE 테이블에 데이터가 입력되기 전에 실행
INSERT AFTER 테이블에 데이터가 입력된 후에 실행
UPDATE BEFORE 테이블의 데이터가 수정되기 전에 실행
UPDATE AFTER 테이블의 데이터가 수정된 후에 실행
DELETE BEFORE 테이블의 데이터가 삭제되기 전에 실행
DELETE AFTER 테이블의 데이터가 삭제된 후에 실행

21. 트리거의 생성

  • 구문형식
CREATE TRIGGER 트리거이름
    트리거시점 트리거이벤트 ON 테이블이름
    FOR EACH ROW
BEGIN
    SQL문
END
  • 사용 예시
DELIMITER $$
CREATE TRIGGER before_과목_update
    BEFORE UPDATE ON 과목
    FOR EACH ROW
BEGIN
    IF NEW.학점 < 1 THEN
        SET NEW.학점 = 1;
    ELSEIF NEW.학점 > 3 THEN
        SET NEW.학점 = 3;
    END IF;
END $$
DELIMITER ;
  • OLD와 NEW 키워드
    • OLD : 해당 테이블에 변경이 가해지기 전의 레코드
    • NEW : 해당 테이블에 변경이 가해진 후의 레코드
728x90

'방송대 > 데이터베이스 시스템' 카테고리의 다른 글

11강. 인덱싱  (0) 2025.05.04
10강. 데이터 저장과 파일  (0) 2025.04.23
8강. 정규화  (0) 2025.04.07
7강. SQL(4)  (0) 2025.04.04
6강. SQL (3)  (0) 2025.03.24
댓글
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
최근에 올라온 글
Total
Today
Yesterday
공지사항