데이터베이스 - SQL 프로그래밍

지환·2023년 8월 25일
0

Mysql

목록 보기
8/17
post-thumbnail

출처| 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

SQL 프로그래밍

DELIMITER $$
CREATE PROCEDURE 스토어드 프로시저이름()
BEGIN 

		이 부분에 SQL 프로그래밍 코딩...


END $$
DELIMITER ;
CALL 스토어드 프로시저이름();
  1. DELIMITER $$~ END $$ 이 부분은 스토어드 프로시저의 코딩할 부분을 묶어준다. END $$가 나올 때까지를 스토어드 프로시저로 인식하게 된다.

  2. 다시 DELIMITER;로 종료 문자를 세미콜론으로 변경해 놓아야한다. CALL 스토어드 프로시저이름();은 CREATE PROCEDURE로 생성한 스토어드 프로시저를 호출한다.

IF~ELSE

IF<부울 표현식> THEN 
		SQL 문장들1..
ELSE 
		SQL 문장들2..
        
END IF;

예시1

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();

예시2


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();

case

case 예시1

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()
        

case 예시2

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;

WHILE 문

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, LEAVE문

ITERATE - CONTINUE
LEAVE - break

profile
아는만큼보인다.

0개의 댓글