MySQL 프로시저

  • 프로시저는 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다.
  • 프로시저는 다음과 같은 장점이 있다.

    1. 하나의 요청으로 여러 SQL문을 실행할 수 있다.(네트워크에 대한 부하를 줄일 수 있다.)
    2. 미리 구문 분석 및 내부 중간 코드로 변환을 끝내야 하므로 처리 시간이 줄어든다.
    3. 데이터베이스 트리거와 결합하여 복잡한 규칙에 의한 데이터의 참조무결성 유지가 가능하게 된다. 간단히 말하면 응용 프로그램 측 로직을 가지지 않고도 데이터베이스의 데이터 앞뒤가 맞게 될 수 있다.
    4. 보수성이 뛰어 나다.
  • 프로시저는 다음과 같은 단점이 있다.

    1. 코드 자산으로서의 재사용성이 나쁘다.
    2. 업무의 사양 변경 시 외부 응용 프로그램과 할께 프로시저의 정의를 변경할 필요가 있다.
 

MySQL 프로시저 목록 확인

mysql> show procedure status;
 

MySQL 프로시저 스크립트 확인방법

mysql> show create procedure 프로시저명;
 

MySQL 프로시저 정의

DROP PROCEDURE IF EXISTS procedure_name; -- 이미 프로시저가 정의 되어 있다면 삭제 
DELIMITER // --//대신 다른 문자로 대체 가능 
CREATE PROCEDURE procedure_name 
([ 
    [ IN | OUT ] parameter_name 
    { parameter_type | ARRAY OF parameter_type }, ... 
]) 
[ DECLARE variable_declaration;...[;] ] 
BEGIN 
    procedure_body_statement;...[;] 
END // 
DELIMITER ;
 
 
  • 예시 : 유저 정보 확인하는 프로시저
DROP PROCEDURE IF EXISTS search_user; 
DELIMITER // 
CREATE PROCEDURE search_user() 
BEGIN 
    SELECT USER,HOST FROM MYSQL.USER; 
END // 
DELIMITER ;
 
  • 예시 : 강의를 수강하는 학생 정수를 입력시 학점을 계산하는 프로시저
DROP TABLE IF EXISTS course; 
-- course 테이블 생성 
CREATE TABLE `course` ( 
    `course_num` int(11NOT NULL AUTO_INCREMENT COMMENT '수강번호'
    `course_student_num` int(11DEFAULT NULL COMMENT '학번'
    `course_class_num` int(11DEFAULT NULL COMMENT '강의번호'
    `course_mid` double DEFAULT NULL COMMENT '중간성적'
    `course_end` double DEFAULT NULL COMMENT '기말성적',
    `course_attendance` int(11DEFAULT NULL COMMENT '출석점수'
    `course_report` double DEFAULT NULL COMMENT '과제점수'
    `course_total` double DEFAULT NULL COMMENT '총점'
    `course_grade` varchar(2NOT NULL DEFAULT 'F'
    PRIMARY KEY (`course_num`) ) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='수강';
 
DROP PROCEDURE IF EXISTS calculate_grade; 
DELIMITER // 
CREATE PROCEDURE calculate_grade( 
    IN in_mid DOUBLE, 
    IN in_end DOUBLE, 
    IN in_att INT
    IN in_rep INT
    IN in_class_num INT
    IN in_student_num INT ) 
BEGIN 
    DECLARE total DOUBLE DEFAULT 0
    DECLARE grade VARCHAR(2); 
    SET total = in_mid + in_end + in_att + in_rep; 
    IF total >= 95 AND total <= 100 THEN 
        SET grade = 'A+'
    END IF
    IF total >=90 AND total < 95 THEN 
        SET grade = 'A'
    END IF
    IF total >=85 AND total < 90 THEN 
        SET grade = 'B+'
    END IF
    IF total >=80 AND total < 85 THEN 
        SET grade = 'B'
    END IF
    IF total >=75 AND total < 80 THEN 
        SET grade = 'C+'
    END IF
    IF total >=70 AND total < 75 THEN 
        SET grade = 'C'
    END IF
    IF total >=65 AND total < 70 THEN 
        SET grade = 'D+'
    END IF
    IF total >=60 AND total < 65 THEN 
        SET grade = 'D'
    END IF
    IF total >=0 AND total < 60 THEN 
        SET grade = 'F'
    END IF
 
    UPDATE university.course 
        SET 
            course_mid = in_mid, 
            course_end = in_end, 
            course_report = in_rep, 
            course_attendance = in_att, 
            course_total = total, 
            course_grade = grade 
        WHERE course_student_num = in_student_num AND course_class_num = in_class_num AND course_num >= 1
END // 
DELIMITER ;
 
 
 

프로시저 호출

CALL 프로시저명(매개변수들);
  • 예시 : 학번이 2019160160이고 수강 과목 번호가 1번인 데이터가 있다고 가정
CALL calculate_grade(40.0, 30.0, 9,9,1,2019160160); SELECT * FROM course;

프로시저 실행 전
프로시저 실행 후

용어 정리

DELIMITER

  • 프로시저나 트리거에서 사용된다.
  • 프로시저를 생성할 때 프로시저 안에 있는 쿼리들이 ;으로 인해 실행되면 안되기 때문에 이를 막기 위해 DELIMITER를 이용하여 DELIMITER를 이용하여 지정된 문자가 나타나기 전까지는 ;을 만나도 실행되지 않게 막아준다.

IN

  • 프로시저를 호출하기 위해 필요한 정보들로 함수의 매개변수(인자)에 해당한다.

DECLARE

  • 프로시저 내부에서 사용하는 변수를 선언할 때 사용한다.

SET

  • 변수의 값을 설정할 때 사용한다.

IF 조건식 THEN 실행문 ELSE 실행문 END IF;

  • if문에 해당하며 유의사항으로 else if문을 처리할 땐 다음과 같이 처리해야 한다.

IF total >= 95 AND total <= 100 THEN 
    SET grade = 'A+'
ELSE 
    IF total >= 90 THEN 
        SET grade = 'A'
    END IF
END IF;
 

MySQL 기본 명령어 정리

데이터베이스 접속

  • cmd 창에서

  • mysql -u 사용자명 -p

데이터베이스 리스트 확인

  • mysql> SHOW DATABASES;

데이터베이스 사용

  • mysql> USE 데이터베이스명;

테이블 리스트 확인

  • mysql> SHOW TABLES;

사용자 확인

  • mysql> USE mysql;
    mysql> SELECT user, host FROM user;

사용자 권한 확인

  • mysql> SHOW GRANTS FOR '아이디'@'%';

사용자 추가

  • mysql> CREATE USER '아이디'@localhost IDENTIFIED BY '비밀번호';

사용자 삭제

  • mysql> DELETE FROM USER WHERE USER='username';

MySQL 버전 확인

  • mysql> SHOW VARIABLES LIKE "%version%";

쿼리 결과 세로로 보기

  • cmd창에서 mysql을 접속할 때 -E 옵션을 이용하여 접속

  • mysql -E -u root -p

현재 상태 확인하기

  • mysql> STATUS;

테이블 정보 확인하기

  • mysql> EXPLAIN 테이블명;

SQL(Structed Query Language)

  • 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그램 언어
  • 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안

SQL 문법의 종류

1. 데이터 정의어 (DDL : Data Definition Language)

종류 역할
CREATE 데이터베이스, 테이블 등을 생성
ALTER 데이터베이스, 테이블을 수정
DROP 데이터베이스, 테이블을 삭제
TRUNCATE 테이블을 초기화

1.1 스키마 / 데이터베이스 정의

  • 정확한 의미의 스키마와 데이터베이스는 다르지만 MySQL에서는 같은것으로 봄

  • 스키마 생성 / 데이터베이스 생성

    • CREATE SCHEMA 스키마명; 
      CREATE DATABASE 데이터베이스명; 
  • 스키마 삭제 / 데이터베이스 삭제

    • DROP SCHEMA 스키마명; 
      DROP DATABASE 데이터베이스명; 

1.2 테이블 정의

  • 테이블 생성

    • CREATE TABLE 테이블명( 
       컬럼명1 데이터타입 [DEFAULT 형식], 
          컬럼명2 데이터타입 [DEFAULT 형식] 
      ); 
    • 제약조건

      • PRIMARY KEY : 기본키
        • 기본키 설정
        • PRIMARY KYE = UNIQUE KEY & NOT NULL
      • UNIQUE KEY : 고유키
        • NULL 가능
        • 중복된 값 불가
      • NOT NULL
        • NULL 값을 금지
      • CHECK
        • 입력할 수 있는 값의 범위 등을 제한
        • TRUE 또는 FALSE로 평가할 수 있는 논리식을 지정
        • MySQL에서 적용을 할 수 있지만 데이터의 무결성을 강요하지 않음 => 적용안됨E
      • FOREIGN KEY : 외래키
        • 테이블 간의 관계를 정의하기 위해 다른 테이블의 기본키를 외래키로 지정
        • 외래키 지정시 참조 무결성 제약 옵션 선택 가능
    • CREATE TABLE 테이블명( 
       컬럼명1 데이터타입 [DEFAULT 형식], 
          컬럼명2 데이터타입 [DEFAULT 형식], 
          UNIQUE INDEX 컬럼명_UNIQUE(컬럼명 ASC), 
          CONSTRAINT 테이블명_PK PRIMARY KEY(컬럼명), 
          CONSTRAINT 테이블명_FK FOREIGN KEY(컬럼명) REFERENCES 상대테이블명(기본키), 
          CONSTRAINT CHK_테이블명 CHECK (논리식) 
      ); 
    • CREATE TABLE TEST( 
      NO INT NOT NULL, 
         NO2 INT, 
         NO3 INT, 
         UNIQUE INDEX NO2_UNIQUE(NO2 ASC), 
         CONSTRAINT TEST_PK PRIMARY KEY(NO), 
         CONSTRAINT TEST_FK FOREIGN KEY(NO3) REFERENCES STUDENT(NUM), 
         CONSTRAINT CHK_TEST CHECK(NO>=1) 
      ); 
  • 테이블 수정

    • 컬럼 추가

    • ALTER TABLE 테이블명 
       ADD 컬럼명 데이터타입; 
    • 컬럼 삭제

    • ALTER TABLE 테이블명 
       DROP 컬럼명; 
    • 컬럼 수정

    • ALTER TABLE 테이블명 
       MODIFY 컬럼명 데이터타입; 
    • 컬럼명 수정

    • ALTER TABLE 테이블명 
       CHANGE 기존컬럼명 새컬럼명 데이터타입; 
    • 제약조건 추가

    • ALTER TABLE 테이블명 
       ADD CONSTRAINT 제약조건명 제약조건(컬럼명); 
    • 제약조건 삭제

    • ALTER TABLE 테이블명 
       DROP 제약조건명; 
  • 테이블 초기화

    • TRUNCATE TABLE 테이블명; 
    • 테이블의 모든 행을 지움

    • 테이블은 유지

  • 테이블 삭제

    • DROP TABLE 테이블명; 
    • DROPT은 테이블 자체를 삭제하고 TRUNCATE는 테이블은 유지하고 데이터들만 삭제

2. 데이터 조작어(DML : Data Manipulation Language)

종류 역할
SELECT 데이터를 조회
INSERT 데이터 삽입
UPDATE 데이터 수정
DELETE 데이터 삭제

3. 데이터 제어어(DCL : Data Control Language)

종류 역할
GRANT 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한 부여
REVOKE 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한을 박탈, 회수
COMMIT 트랜잭션의 작업이 정상적으로 완료되었음을 관리자에게 알려줌
ROLLBACK 트랜잭션의 작업이 비정상적으로 종료 되었을 때 원래의 상태로 복구

3.1 GRANT

  • 사용자에게 권한을 부여하는 명령어

  • 권한 허용

    • GRANT 명령어 ON 데이터베이스명.테이블 TO '아이디'@'localhost'; 
    • '아이디' 사용자에게 데이터베이스명.테이블에서 명령어를 사용할 수 있는 권한을 부여

    • GRANT ALL ON TEST.* TO 'test'@'localhost'; 
      
      • test 사용자에게 TEST 데이터베이스에 있는 모든 테이블의 모든 명령어를 사용할 수 있는 권한을 부여
      • 모든 권한 : SELECT, INSERT, UPDATE, DELETE, CREATE, DROP,REFERENCES, INDEX, ALTER, CREATE TMP TABLE, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE, EVENT TRIGGER
    • GRANT INSERT ON TEST.* TO 'test'@'localhost'; 
      • test 사용자에게 TEST 데이터베이스에 있는 INSERT 명령어를 사용할 수 있는 권한을 부여

3.2 REVOKE

  • 사용자에게 권한을 회수하는 명령어

  • 권한 회수

    • REVOKE 명령어 ON 데이터베이스명.테이블 FROM '아이디'@'localhost' 
    • '아이디' 사용자에게 데이터베이스명.테이블에서 명령어를 사용할 수 있는 권한을 회수

    • REVOKE ALL ON TEST.* FROM 'test'@'localhost'; 
      REVOKE INSERT ON TEST.* FROM 'test'@'localhost'; 

3.3 COMMIT

  • 작업한 결과를 물리적 디스크로 저장하고, 작업이 정상적으로 완료됨을 관리자에게 알려주는 명령어

  • COMMIT; 

3.4 ROLLBACK

  • 작업했던 내용을 원래의 상태로 복구하는 명령어

  • INSERT, UPDATE, DELETE와 같은 트랜잭션의 작업을 취소

  • COMMIT 명령어를 사용하기 이전의 상태만 ROLLBACK 가능

  • ROLLBACK; 

DELETE, TRUNCATE, DROP의 차이

명령어 특징
DELETE 데이터는 지워지지만 테이블 용량은 줄어 들지 않는다
원하는 데이터만 지울 수 있다  
잘못 삭제한 경우 되돌릴 수 있다  
TRUNCATE 삭제후 용량이 줄어든다
테이블은 삭제 되지 않고 데이터만 삭제된다  
삭제 후 되돌릴 수 없다  
DROP 테이블 전체를 삭제한다
공간, 객체를 삭제한다  
삭제 후 되돌릴 수 없다  

+ Recent posts