2022.09.08
-- cmd mysql 실행 방법
/*
1. 환경변수 등록 : C:\Program Files\MySQL\MySQL Server 8.0\bin
2. 프롬프트 실행
> mysql -u 유저명 -p 비밀번호
> show databases;
> use database명;
*/
-- IF, CASE
SELECT GRADE,
CASE
WHEN GRADE = 1 THEN '아이언'
WHEN GRADE = 2 THEN '브론즈'
WHEN GRADE = 3 THEN '실버'
WHEN GRADE = 4 THEN '골드'
WHEN GRADE = 5 THEN '플래티넘'
END AS 등급
FROM SALGRADE;
-- CASE문을 IF로 변환?
SELECT GRADE,
IF(GRADE = 1, '아이언',
IF(GRADE = 2, '브론즈',
IF(GRADE = 3, '실버',
IF(GRADE = 4, '골드',
IF(GRADE = 5, '플래티넘', '없는등급'))))) AS 등급
FROM SALGRADE;
-- 생성 및 사용
DROP PROCEDURE IF EXISTS firstProc;
DELIMITER $CREATE PROCEDURE firstProc() BEGIN SELECT * FROM EMP; END $
DELIMITER ;
CALL firstProc();
-- ifProc
DROP PROCEDURE IF EXISTS ifProc;
DELIMITER $$
CREATE PROCEDURE ifProc()
BEGIN
DECLARE var1 INT; -- VAR1 로컬변수 선언
SET VAR1 = 20;
IF var1 = 10 THEN
SELECT '10이 맞습니다';
ELSEIF var1 = 20 THEN
SELECT '20이 맞습니다';
ELSE
SELECT '이외값';
END IF;
END $$
DELIMITER ;
CALL ifProc();
--
-- 직원번호 7369 직원의 입사일이 5년 넘었다면? --> '5년 이상' / '5년 미만'
DROP PROCEDURE IF EXISTS ifProc2;
DELIMITER $$
CREATE PROCEDURE ifProc2()
BEGIN
DECLARE hiredate DATE;
DECLARE day INT;
SELECT e.hiredate INTO hiredate
FROM emp e
WHERE empno = 7369;
SET day = DATEDIFF(CURRENT_DATE(), hiredate);
IF (day / 365) >= 5 THEN
SELECT '5년 이상';
ELSE
SELECT '5년 미만';
END IF;
END $$
DELIMITER ;
-- 출력값이 있는 프로시져(getLoc)
-- ? IN : EMPNO -> OUT : LOC
DROP PROCEDURE IF EXISTS getLoc;
DELIMITER $CREATE PROCEDURE getLoc(IN in_empno INT, OUT out_loc VARCHAR(20)) BEGIN SELECT D.LOC INTO out_loc FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.EMPNO = in_empno; END $
DELIMITER ;
CALL getLoc(7369, @out_loc);
SELECT @out_loc;
-- 사번으로 사원이름 검색하는 함수
SET GLOBAL log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS getName;
DELIMITER $$
CREATE FUNCTION getName(in_empno INT)
RETURNS VARCHAR(20)
BEGIN
DECLARE out_ename VARCHAR(20);
SELECT ename INTO out_ename
FROM emp
WHERE emp.empno = in_empno;
RETURN out_ename;
END $$
DELIMITER ;
SELECT getName(7369);
-- PROCEDURE VS FUNCTION
-- IN/OUT : O VS X
-- RETURNS/RETURN : X VS O
-- 트랜잭션 Transaction, TX
-- 더이상 쪼갤 수 없는 기능 단위
-- DB의 상태를 변경 시킬 수 있는 작업 단위
-- 하나의 트랜잭션의 예
-- 인출(돈이 줄어듬) SELECT, UPDATE -> 은행 검색 SELECT -> 계좌 체크 SELECT -> 입금(돈이 증가) SELECT, UPDATE
-- 게시글 : 작성 --> 메인페이지에서 내가 작성한 글 확인
-- SELECT -> INSERT -> SELECT
-- GIT COMMIT
-- 특징
-- 1. 원자성 : 하나의 트랜잭션의 결과가 모두 반영되거나 혹은 반영되지 않아야 한다!
-- 2. 일관성 : 결과가 동일한 결과를 출력할 수 있어야 한다!
-- 3. 영구성 : 결과가 DB에 영구적으로 남아야 한다!(COMMIT)
-- 4. 독립성 : 하나의 트랜잭션은 다른 트랜잭션에 영향을 주지 않는다!
-- COMMIT 확인
SHOW VARIABLES LIKE '%COMMIT%';
SET AUTOCOMMIT = 0;
-- 트랜잭션의 시작 ~ 종료 COMMIT --> @TRANSACTIONAL
START TRANSACTION;
SELECT *
FROM EMP01;
INSERT INTO EMP01 (EMPNO, ENAME, DEPTNO)
VALUES (9999, 'IT', 20);
SELECT *
FROM EMP01;
COMMIT;
ROLLBACK;