카테고리 없음

43일차 복습

샤샤샤샤 2023. 1. 15. 10:46

sql에서 조건 넣기

 

프로시저

일련의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합이다.

 

형식:

1. DELIMITER $$ 를 통해 구문자를 $$ 로 설정한다. ;클론 쿼리 집합의 끝을 알려주는 구문자를 설정한 것이다.

2. CREATE PROCEDURE 프로시저 이름()    으로 빈 프로시저를 만든다. 

3. 쿼리 집합의 시작을 알리는 BEGIN과 END $$의 사이에 원하는 쿼리 집합체를 써 넣는다.

4. DELIMITER을 통해 구문자를 ;복구시킨다.

5. CALL 프로시저 이름(); 을 통해 실행시킨다.

DROP PROCEDURE IF EXISTS proc2; -- 만약 이미 proc2라는 프로시져가 존재하면 삭제
DELIMITER $$
CREATE PROCEDURE proc2()
BEGIN
	DECLARE myINT INT; -- 정수형변수 선언
	SET myINT = 200; -- 값을 대입
	IF myINT = 100 THEN  -- THEN ~ ELSE ~ END IF는 한쌍이다.
		SELECT '100입니다.';
	ELSE
		SELECT '100이 아닙니다.';
	END IF;
END $$
DELIMITER ;

CALL proc2();

여기서 then은 조건이 참일때, else는 조건이 거짓일때 뒷 쿼리를 실행하라는 의미다.

end if는 조건문이 끝났음을 알려주는 예약어다.

프로시져는 DELIMITER 내부가 하나의 뭉텅이이기 때문에 통째로 실행시켜야 선언이 된다. 

 

case문을 통한 조건넣기

형식:case 예약어를 쓴 뒤, when 절로 조건을 넣고, 조건의 끝에 then을 써서 조건이 만족할때 실행될 쿼리문을 쓰면 된다.else 예약어로 모든 조건이 false일때 실행될 쿼리문을 쓸 수 있으며, 마지막에 end case 예약어로 case의 사용 종료를 알려야 한다.

DELIMITER $$
CREATE PROCEDURE proc3()
BEGIN
	DECLARE point INT; -- int형식의 변수 point 선언
	DECLARE credit CHAR(1); -- char(1)의 변수 credit
	SET point = 88; --  delimiter 안이어서 @를 안씀.
	
	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 proc3();

 

select로 출력할 데이터를 고를때, case when문을 넣어서 가공한 데이터를 출력할수도 있다.

 

SELECT m.mem_id, m.mem_name, SUM(price*amount) "총구매액",
		CASE
			WHEN (SUM(price*amount) >= 1500) THEN "최우수고객"
			WHEN (SUM(price*amount) >= 1000) THEN "우수고객"
			WHEN (SUM(price*amount) >= 1) THEN "일반고객"
			ELSE '손님'
		END "회원등급" -- 별칭달기
	FROM buy b
		RIGHT OUTER JOIN member m
		ON b.mem_id = m.mem_id
	GROUP BY m.mem_id
	ORDER BY SUM(price*amount) DESC;

 

WHILE(조건) DO 문

다른 언어에서의 while와 똑같다. sql은 for문이 없는 대신 whle문을 통해 반복한다.

DROP PROCEDURE IF EXISTS proc4;
DELIMITER $$
CREATE PROCEDURE proc4()
BEGIN
	DECLARE i INT; DECLARE sum INT; -- i 변수 선언. sum 변수 선언.
	SET i = 1; SET sum = 0; -- i와 sum 초기화.
	WHILE (i<=100) DO  -- while do가 함께 쓰인다.
		SET sum = sum + i;
		SET i = i + 1;
	END WHILE;
	SELECT '1부터 100까지의 합 => ', sum;
END $$
DELIMITER ;

CALL proc4();

여기서 궁금증이 하나 생긴다. sum의 데이터 값은 while문을 돌려 얻어냈지만, '1부터 100까지의 합 => ' 의 데이터 값은 어디에서 나온 걸까?

아래 그림을 보면 알 수 있다.

'1부터 100까지의 합 => ' 은 select에서 만들어진 컬럼의 이름이며, 이때, 해당 열의 데이터 값은, 열의 이름과 동일하다.

 

동적 sql

쿼리문을 변수에 대입하여 실행시 동적으로  결과가 출력되는 sql을 실행하고자 할때 사용한다.

앞서 정리했던 변수를 limit문에 사용하는 방법과 유사하다.

 

1. PREPARE 변수명 from 쿼리문;  형태로 사용하고자 하는 쿼리문을 변수 형태로 저장한다.

2. EXCUTE 변수명; 형태로 실행한다. 만약 @변수가 존재한다면 EXCUTE 변수명 USING @변수; 형식을 통해 사용 가능하다.

3. DEALLOCATE PREPARE 변수명; 을 통해 SQL문 저장을 해제한다. 메모리를 절약할수 있다.

 

 

학원은 mariaDB로 실습하고, 집에 깔린 것은 mySQL이여서 ui가 약간 다르다.

기존에 집에 깔린 mysql이 무슨 문제인지 갑자기 서버와의 연결이 끊겨서 온갖 방법을 다 시도해보다 결국 싹다 삭제하고 재설치했다.