출처| https://www.youtube.com/watch?v=UVY0mfa4VP0&list=PLqTUMsvO70nk8WfCyU-IPmc85390CaSqM&index=1
https://cafe.naver.com/thisisMySQL
https://velog.io/@ong_hh/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B5%AC%EC%B6%95
DELIMITER $$
CREATE PROCEDURE 스토어드 프로시저이름()
BEGIN
이 부분에 SQL 프로그래밍 코딩...
END $$
DELIMITER ;
CALL 스토어드 프로시저이름();
DELIMITER $$~ END $$
이 부분은 스토어드 프로시저의 코딩할 부분을 묶어준다. END $$
가 나올 때까지를 스토어드 프로시저로 인식하게 된다.
다시 DELIMITER;
로 종료 문자를 세미콜론으로 변경해 놓아야한다. CALL 스토어드 프로시저이름();
은 CREATE PROCEDURE로 생성한 스토어드 프로시저를 호출한다.
IF<부울 표현식> THEN
SQL 문장들1..
ELSE
SQL 문장들2..
END IF;
DROP PROCEDURE IF EXISTS ifProc; -- 기존에 만든적이 있다면 삭제한다.
DELIMITER $$
CREATE PROCEDURE ifProc()
BEGIN
DECLARE var1 INT; -- var1 변수 선언
SET var1 = 100; -- 변수에 값 대입한다.
IF var1 = 100 THEN
SELECT '100입니다.';
ELSE
SELECT '100이 아닙니다.';
END IF;
END $$
DELIMITER ;
CALL ifProc();
DROP PROCEDURE IF EXISTS ifProc2;
USE employees;
DELIMITER $$
CREATE PROCEDURE ifProc2()
BEGIN
DECLARE hireDATE DATE; -- 입사일
DECLARE curDATE DATE; -- 오늘
DECLARE days INT; -- 근무한 일수
SELECT hire_date INTO hireDATE -- hire_date열의 결과를 hireDATE에 대입.
FROM employees.employees
WHERE emp_no = 10001;
SET curDATE = CURRENT_DATE(); -- 현재 날짜
SET days = DATEDIFF(curDATE, hireDATE); -- 날짜의 차이, 일 단위
IF (days/365) >= 5 THEN
SELECT CONCAT('입사한지', days,'일이나 지났습니다. 축하합니다!');
ELSE
SELECT '입사한지' + days + '일밖에 안됐네요. 열심히 일하세요.';
END IF;
END $$
DELIMITER ;
CALL ifProc2();
DROP PROCEDURE IF EXISTS caseProc;
DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
DECLARE point INT;
DECLARE credit CHAR(1);
SET point = 88;
CASE
WHEN point >= 90 THEN
SET credit = 'A';
WHEN point >= 80 THEN
SET credit = 'B';
WHEN point >= 70 THEN
SET credit = 'C';
WHEN point >= 60 THEN
SET credit = 'D';
ELSE
SET credit = 'F';
END CASE;
SELECT CONCAT('취득점수 ==>', point), CONCAT('학점==>' , credit);
END $$
DELIMITER ;
CALL caseProc()
USE sqldb;
SELECT userID, SUM(price*amount) AS '총구매액'
FROM buytbl
GROUP BY userID
ORDER BY SUM(price * amount ) DESC;
-- 조인 시키는 부분
SELECT B.userID, U.name, SUM(price * amount) AS '총구매액'
FROM buytbl B
INNER JOIN usertbl U -- INNER JOIN (교집합 개념) 둘 다 있어야 출력된다.
ON B.userID = U.userID
GROUP BY B.userID, U.name
ORDER BY SUM(price*amount) DESC;
SELECT B.userID, U.name, SUM(price * amount) AS '총구매액'
FROM buytbl B
RIGHT OUTER JOIN usertbl U -- 여기선 중심 테이블의 기준이 usertbl U가 되어 있는것들에 가지고 조회한다.
ON B.userID = U.userID
GROUP BY B.userID, U.name
ORDER BY SUM(price * amount) DESC;
SELECT U.userID , U.name, SUM(price * amount) AS '총구매액'
FROM buytbl B
RIGHT OUTER JOIN usertbl U -- 여기선 중심 테이블의 기준이 usertbl U가 되어 있는것들에 가지고 조회한다.
ON B.userID = U.userID
GROUP BY B.userID, U.name
ORDER BY SUM(price * amount) DESC;
SELECT U.userID, U.name, SUM(price * amount) AS '총 구매액',
CASE
WHEN(SUM (price * amount) >= 1500) THEN '최우수고객'
WHEN(SUM (price * amount) >= 1000) THEN '우수고객'
WHEN(SUM (price * amount) >= 1) THEN '일반고객'
ELSE '유령고객'
END AS '고객등급'
FROM buytbl B
RIGHT OUTER JOIN usertbl U
ON B.userID = U.userID
GROUP BY U.userID, U.name
ORDER BY SUM(price*amount) DESC;
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT;
DECLARE hap INT;
SET i = 1;
SET hap = 0;
WHILE (i <= 100) DO
SET hap = 100 + i;
SET i = i + 1;
END WHILE;
SELECT hap;
END $$
DELIMITER ;
CALL whileProc();
ITERATE - CONTINUE
LEAVE - break