MySQL
요약 노트 (2022년 1월 ~ 2022년 3월까지 공부했던 내용 정리)
혼자 공부하는 SQL책과 한빛미디어에서 제공하는 유튜브 강의로 공부함
DELIMITER
: 구분자_proc
(procedure의 의미)를 붙임IN
또는 OUT
매개변수: 입력 또는 출력 매개변수CREATE PROCEDURE
: 스토어드 프로시저를 만드는 것으로 실행(호출)한 것은 아님DELIMITER $$
CREATE PROCEDURE 스토어드_프로시저_이름(IN 또는 OUT 매개변수)
BEGIN
이 부분에 SQL 프로그래밍을 코드를 작성
END $$
DELIMITER ;
CALL 스토어드_프로시저_이름();
USE 데이터베이스_이름; -- 데이터베이스 사용
DROP PROCEDURE IF EXISTS 스토어드_프로시저_이름; -- 해당 이름의 스토어드 프로시저가 있다면 삭제
DELIMITER $$
CREATE PROCEDURE 스토어드_프로시저_이름(IN 또는 OUT 매개변수)
BEGIN
이 부분에 SQL 프로그래밍을 코드를 작성
END $$
DELIMITER ; -- 스토어드 프로시저 만들기
CALL 스토어드_프로시저_이름(); -- 스토어드 프로시저 호출
DROP PROCEDURE 스토어드_프로시저_이름;
IN 입력_매개변수_이름 데이터_형식
CALL 프로시저_이름(전달_값);
OUT 출력_매개변수_이름 데이터_형식
CALL 프로시저_이름(@변수명);
SELECT @변수명;
YEAR(날짜)
: 연MONTH(날짜)
: 월DAY(날짜)
: 일CURDATE()
함수 : 현재 날짜SELECT YEAR(CURDATE()), MONTH(CURDATE()), DAY(CURDATE());
PREPARE
문과 EXECUTE
문을 사용함PREPARE
EXECUTE
DEALLOCATE PREPARE
스토어드 함수: MySQL에서 제공하는 내장 함수 외에 직접 함수를 만드는 기능을 제공
스토어드 함수의 사용
SET GLOBAL log_bin_trust_function_creators = 1;
스토어드 함수의 형식
RETURNS
문: 반환할 값의 데이터 형식을 지정RETURN
문: 하나의 값을 반환입력 매개변수
이기 때문에 IN
을 붙이지 않음SELECT
문SELECT
를 사용할 수 없음DELIMITER $$
CREATE FUNCTION 스토어드_함수_이름(매개변수)
RETURNS 반환형식
BEGIN
이 부분에 프로그래밍 코딩
RETURN 반환값;
END $$
DELIMITER ;
SELECT 스토어드_함수_이름();
스토어드 함수의 내용 확인
SHOW CREATE FUNCTION 함수_이름;
스토어드 함수의 삭제
DROP FUNCTION 스토어드_함수_이름;
DEFAULT
문: 초기값을 설정하기DECLARE 변수명 데이터형식 (DEFAULT 숫자);
endOfRow
: 행의 끝을 파악하기DECLARE endOfRow BOOLEAN DEFAULT FALSE;
SELECT
문임DECLARE 커서_이름 CURSOR FOR
SELECT 열_이름 FROM 테이블_이름;
DECLARE CONTINUE HANDLER
: 반복 조건을 준비하는 예약어FOR NOT FOUND
: 더 이상 행이 없을 때 이어진 문장을 수행함 (행이 끝나면 endOfRow에 TRUE를 대입함)DECLARE CONTINUE HANDLER
FOR NOT FOUND SET endOfRow = TRUE;
OPEN 커서_이름;
cursor_loop
: 반복할 부분의 이름을 지정한 것cursor_loop: LOOP
이 부분을 반복
END LOOP cursor_loop;
LEAVE
: 반복할 이름을 빠져나감FETCH
: 한 행씩 읽어오는 것cursor_loop: LOOP
FETCH 커서_이름 INTO 변수; -- 한 행씩 읽어오기
IF endOfRow THEN
LEAVE cursor_loop;
END IF; -- 행의 끝에 다다르면 반복하는 부분을 빠져나감
SET 변수; -- 변수의 누적
END LOOP cursor_loop;
CLOSE 커서_이름;
트리거: 테이블에 INSERT
, UPDATE
, DELETE
작업이 발생하면 실행되는 코드
트리거의 기본 작동
트리거는 테이블에서 DML
문 (INSERT
, UPDATE
, DELETE
등)의 이벤트가 발생할 때 작동함
테이블에 미리 부착되는 프로그램 코드: AFTER 트리거
, BEFORE 트리거
트리거는 IN
, OUT
매개변수를 사용할 수 없음
1) 테이블 만들기
USE 데이터베이스_이름;
CREATE TABLE IF NOT EXISTS 테이블_이름(열_이름1 데이터형식, 열_이름2 데이터형식, ...)
INSERT INTO 테이블_이름 VALUES(데이터, 데이터, ...);
2) 테이블에 트리거를 부착하기
DROP TRIGGER IF EXISTS 트리거_이름;
DELIMITER $$
CREATE TRIGGER 트리거_이름
AFTER DELETE -- 삭제(DELETE) 후에 작동하도록 지정
ON 테이블_이름 -- 트리거를 부착할 테이블
FOR EACH ROW
BEGIN
트리거 실행 시 작동되는 코드들
END $$
DELIMITER ;
3) INSERT
문, UPDATE
문, DELETE
문
SET @msg = '';
INSERT INTO 테이블_이름 VALUES(데이터, 데이터, ...); -- 삽입
SELECT @msg;
UPDATE 테이블_이름 SET 열_이름=데이터 WHERE 조건; -- 수정
SELECT @msg;
DELETE FROM 테이블_이름 WHERE 조건; -- 삭제(DELETE)에 트리거 작동
SELECT @msg;
트리거 활용: 테이블에 입력/수정/삭제되는 정보를 백업하는 용도로 활용
INSERT
, UPDATE
, DELETE
작업이 일어나는 경우, 변경되기 전의 데이터를 저장할 테이블AFTER INSERT
: INSERT 트리거
는 테이블에서 INSERT
문의 이벤트가 발생될 때만 작동AFTER UPDATE
: UPDATE 트리거
는 테이블에서 UPDATE
문의 이벤트가 발생될 때만 작동AFTER DELETE
: DELETE 트리거
는 테이블에서 DELETE
문의 이벤트가 발생될 때만 작동테이블의 모든 행 데이터 삭제: DELETE
와 TRUNCATE TABLE
문
DELETE 트리거
는 오직 DELETE
문에만 작동하기 때문에 TRUNCATE TABLE
로 삭제 시에는 트리거가 작동하지 않음DELETE FROM 테이블_이름;
TRUNCATE TABLE 테이블_이름;
트리거가 사용하는 임시 테이블
INSERT
, UPDATE
, DELETE
작업이 수행되면 임시로 사용되는 시스템 테이블: NEW 테이블
과 OLD 테이블
OLD 테이블
에, 새로운 데이터는 NEW 테이블
에 잠깐 저장됨NEW 테이블
: INSERT(새 값) 형태로 실행되면 작동OLD 테이블
: DELETE(예전 값) 형태로 실행되면 작동NEW 테이블
과 OLD 테이블
모두 사용: UPDATE(새 값, 예전 값) 형태로 실행되면 작동우재남. (2021). 혼자 공부하는 SQL. 한빛미디어. p330-p368.