
배고파요. 그치만 오늘 MariaDB 마지막 수업이니까, 버텨볼게영
가즈아아!!! 내일 캐비가니가여 룰루 좀 버텨봅시다.

: 자주 쓰는 SQL문들을 하나로 묶어서 이름 붙인 저장된 명령어 세트
예시) "라면 끓이는 방법"을 레시피로 저장해놓는 거임.
그리고 나중에 그냥 “라면 끓여줘!” 하고 부르면 자동으로 실행됨.
DELIMITER $$ -- 지금부터는 명령 끝을 $$로 구분하겠다고 선언하는 거야
CREATE PROCEDURE get_user_by_id(IN userId INT) -- get_user_by_id라는 이름의 스토어드 프로시저를 만든다는 뜻
BEGIN -- "이제 프로시저 안의 본격적인 SQL 시작!"
SELECT * FROM users WHERE id = userId; -- 입력받은 userId 값을 가진 사람을 users 테이블에서 찾아라!
END $$ --스토어드 프로시저 코드가 여기서 끝났어!
DELIMITER ; -- 다시 원래대로 문장 끝 표시를 ;로 돌려놓는 거야.
그럼 아래처럼 사용하면 됨.
CALL get_user_by_id(3);
: 프로시저를 생성하려면 CREATE PROCEDURE 구문을 사용.

CREATE PROCEDURE 프로시저이름 (IN 매개변수명 자료형)
BEGIN
-- 여기서 매개변수를 SQL문 안에 사용함
END;
예제)
DELIMITER $$
CREATE PROCEDURE get_user_by_id(IN userId INT)
BEGIN
SELECT * FROM users WHERE id = userId;
END $$
DELIMITER ;
CALL get_user_by_id(3);
| SQL 키워드 | 의미 |
|---|---|
IN | 외부에서 값을 "넣어주는" 매개변수 (제일 자주 씀) |
OUT | 프로시저가 실행된 결과를 "밖으로 보내주는" 매개변수 |
INOUT | 넣기도 하고, 바꾼 결과도 밖으로 주는 매개변수 |
예) IN: 내가 너한테 “라면 몇 개 끓여줘” 하고 숫자(3)를 보냄
예) OUT: 너는 결과를 계산해서 나한테 줘
예) INOUT: 내가 편지를 보내고, 너는 그걸 바꿔서 다시 줘
IF 조건식 THEN
실행 문장
ELSE
실행 문장
END IF
CASE
WHEN 조건식 1 THEN 실행 문장 1
WHEN 조건식 2 THEN 실행 문장 2
...
[ELSE 실행 문장]
END CASE;


: 트리거는 테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때 자동으로 작동되는 개체이다.
마치 도어벨에 센서를 설치해두고
누군가 문을 열면 자동으로 “삐빅!” 하고 알람이 울리는 것처럼,
트리거는 데이터가 바뀌면 미리 지정한 SQL이 자동 실행된다.
테이블에 삽입, 수정, 삭제 작업 후에 작동하는 트리거를 AFTER 트리거라 한다.
=> 문을 열고 나간 후 CCTV가 자동으로 녹화 시작 → 로그 기록, 백업
테이블에 삽입, 수정, 삭제 작업 전에 작동하는 트리거를 BEFORE 트리거라 한다.
=> 사람이 문 열기 전에 센서가 울려서 “이 문 닫혀 있어요!” 라고 막는 것 → 사전 검사, 값 조정
DELIMITER $$
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE|AFTER INSERT|UPDATE|DELETE ON 테이블명
FOR EACH ROW
BEGIN
-- SQL 프로그래밍 코드 작성
END $$
DELIMITER ;
CREATE TABLE product(
pcode INT AUTO_INCREMENT PRIMARY KEY, -- 상품 코드
pname VARCHAR(100), -- 상품 이름
brand VARCHAR(100), -- 브랜드 이름
price INT, -- 가격
stock INT DEFAULT 0 -- 재고
);
INSERT INTO product(pname, brand, price)
VALUES ('아이폰 15프로', '애플', 1200000);
INSERT INTO product(pname, brand, price)
VALUES ('갤럭시 S25', '삼성', 1300000);
SELECT * FROM product;
CREATE TABLE product_detail(
`dcode` INT AUTO_INCREMENT PRIMARY KEY, -- 입/출고 이력코드
`status` VARCHAR(2) CHECK(`status` IN ('입고', '출고')), -- 상태
`amount` INT, -- 수량
`pcode`INT REFERENCES product, -- 상품코드(외래 키)
`ddate` DATE DEFAULT CURDATE() -- 입/출고 일자
);
-- 1번 상품이 2025-06-30 날짜로 10개 입고
INSERT INTO product_detail (`status`, `amount`, `pcode`, `ddate`)
VALUES('입고', 10, 1, 2025-06-30);
-- 1번 상품의 재고 수량 변경
UPDATE product
SET stock = stock + 10
WHERE pcode = 1;
-- 1번 상품이 2025-06-30 날짜로 5개 출고
INSERT INTO product_detail (`status`, `amount`, `pcode`, `ddate`)
VALUES('출고', 5, 1, 2025-06-30);
-- 1번 상품의 재고 수량 변경
UPDATE product
SET stock = - 5
WHERE pcode = 1;
-- 2번 상품이 2025-06-30날짜로 20개 입고
INSERT INTO prduct_detalo `status`,`amount`, `pcode`
-- 2번 상품이 2025-07-01낼짜로 20개 입고
INNER INTO product_detail(`status`, `amount`, `pcode`, `ddate`)
VALUES ('입고', 20, 2, '202-07-01');
SELECT * FROM product;
INNER INTO product_detail(`status`, `amount`, `pcode`, `ddate`)
VALUES ('출고', 30, 2, '202-07-01');
-- 1번 상품이 오늘 날짜로 100개 입고
INNER INTO product_detail(`status`, `amount`, `pcode`)
VALUES ('출고', 100, 1);
DROP TRIGGER trg_product_stock;

분명 많이 잔 것 같은데, 왜 이렇게 피곤하징.
정리 진짜 잘하시는 것 같아요! 재미있어서 계속 보게 되네요 ㅎㅎ