《스토어드 프로시저(Stored Procedure)란?》
MySQL에서 프로그래밍 기능이 필요할 때 사용하는 데이터베이스 개체이다.
SQL문법의 함수(Function)와 유사하지만 SQL함수와는 차이가 있다.
- 함수(Function) : 클라이언트에서 처리, 리턴값 필수, 리턴값 하나만 반환가능
- 프로시저(Procedure) : 서버로 보내서 처리, 리턴값 선택, 리턴값 여러개 반환가능
프로시저 같은 경우 실행, 처리를 할 때 주로 사용되고, 함수는 간단한 계산이나 수치 결과를 나타낼 때 주로 사용
👀 스토어드 프로시저의 장점정리!
1. 하나의 요청으로 여러 SQL문을 실행하는 것이 가능하다.
2. 쿼리를 처리할 때 네트워크의 부하를 줄여 실행시간을 줄일 수 있다.
- 스토어드 프로시저 프레임
DELIMITER $$
CREATE PROCEDURE < 스토어드 프로시저 이름() >
BEGIN
< SQL프로그래밍 코드 부분 >
END $$
DELIMITER ;
CALL < 스토어드 프로시저 이름() > ;
《IF문과 WHILE문》
IF와 WHILE 모두 조건식의 참 거짓을 판별하고 그 결과에 따라 출력한다.
IF와 WHILE의 차이점
- IF는 조건식을 한 번 수행하면 종료된다.
- WHILE은 BREAK에 걸릴 때 까지 무한히 반복된다.
- IF문 프레임
BEGIN
-------------------------------------------
IF < 조건식 > THEN
SQL문장들
END IF;
-------------------------------------------
END $$
만약 수행할 문장이 하나라면 ----로 감싸져 있는 부분 외의 문장은 생략해도 좋다.
- WHILE 프레임
BEGIN
-------------------------------------------
WHILE < 조건식 > DO
SQL문장들
END WHILE;
-------------------------------------------
END $$
WHILE도 마찬가지로 만약 수행할 문장이 하나라면 ----로 감싸져 있는 부분 외의 문장은 생략해도 좋다.
- if문의 자세한 내용은 예제를 통해서 알아보자
예제에서 사용할 member 테이블이다.
< member >
열이름에 대한 설명
< 상황가정! >
이번에 에이핑크 소속사의 주식을 왕창 사서 대주주가 되었다. 기념으로 에이핑크에게 격려문자를 보내려고 한다.
데뷔한지 5년 이상이 되었다면 ' 데뷔한지 ~일이나 지났습니다. 축하합니다! ', 아직 5년 미만이라면 ' 데뷔한지 ~일밖에 안되었네요. 화이팅~ ' 이라고 출력되는 코드를 작성해보자.
# 는 주석으로 코드를 이해하는 데 필요한 내용을 적어두었다.
else는 if문의 조건에서 False값을 반환하는 데이터들에 적용된다.
결과값은 아래와 같다.
데뷔한지 4442일이나 지났습니다. 축하합니다! |
- while문의 자세한 내용은 예제를 통해서 알아보자
1) 간단히 정수 1~100까지 더한 합을 구하는 프로그램을 작성해보자.
2) 1~100까지의 정수중 4의 배수를 제외한 값들의 합을 구하고, 합이 1000을 넘으면 종료하는 프로그램을 작성해보자.
iterate를 만나면 다시 반복문으로 돌아간다.
leave를 만나면 반복문을 빠져나간다.
myWhile같이 label을 지정할 때는 꼭 콜론(:) 을 사용해야한다. 세미콜론(;)과 혼용하지 말자.
결과값은 아래와 같다.
1부터 100까지의 합(4의 배수 제외), 1000 넘으면 종료 ==> | 1014 |
《CASE문》
CASE 문은 조건이 2가지 이상일 경우 사용하는 명령어이다.
IF 문은 참 또는 거짓 두 가지만 존재하기 때문에 2중 분기라는 용어를 사용한다. 하지만 CASE 문은조건이 2가지 이상일 때 사용하므로 다중 분기라고 부른다.
CASE 프레임
CASE
WHEN 조건1 THEN
SQL문장1
WHEN 조건2 THEN
SQL문장들2
WHEN조건3 THEN
SQL문장들3
ELSE
SQL문장들4
END CASE;
- CASE문의 자세한 내용은 예제를 통해서 알아보자
1) 시험성적이 88점인 학생이 있다. 시험점수에 대한 등급은 90이상이면 A, 80이상이면 B, 70점 이상이면 C, 60점 이하면 D, 그 이하는 F를 주려고 한다. 이 학생의 등급을 매길 프로그램을 작성해보자.
결과값은 아래와 같다.
취득점수==>88 | 학점==>B |
2) 각각의 mem_id와 mem_name에 해당하는 고객의 총구매액을 구하고, 이에 따른 고객 등급을 매겨보자.
예제에서 사용할 member 테이블과 buy 테이블이다.
< member >
< buy >
num | mem_id | prod_name | group_name | price | amount |
1 | BLK | 지갑 | NULL | 30 | 2 |
2 | BLK | 맥북프로 | 디지털 | 1000 | 1 |
3 | APN | 아이폰 | 디지털 | 200 | 1 |
4 | MMU | 아이폰 | 디지털 | 200 | 5 |
5 | BLK | 청바지 | 패션 | 50 | 3 |
6 | MMU | 에어팟 | 디지털 | 80 | 10 |
7 | GRL | 혼공SQL | 서적 | 15 | 5 |
8 | APN | 혼공SQL | 서적 | 15 | 2 |
9 | APN | 청바지 | 패션 | 50 | 1 |
10 | MMU | 지갑 | NULL | 30 | 1 |
11 | APN | 혼공SQL | 서적 | 15 | 1 |
12 | MMU | 지갑 | NULL | 30 | 4 |
<열이름에 대한 설명>
num | 구매번호 |
prod_name | 구매한 제품명 |
price | 제품가격 |
amount | 구매제품 수량 |
나머지 열이름에 대한 정보는 member테이블과 동일하다.
결과값은 아래와 같다.
mem_id | mem_name | 총구매액 | 회원등급 |
MMU | 마마무 | 1950 | 최우수고객 |
BLK | 블랙핑크 | 1210 | 우수고객 |
APN | 에이핑크 | 295 | 일반고객 |
GRL | 소녀시대 | 75 | 일반고객 |
ITZ | 잇지 | NULL | 유령고객 |
OMY | 오마이걸 | NULL | 유령고객 |
RED | 레드벨벳 | NULL | 유령고객 |
SPC | 우주소녀 | NULL | 유령고객 |
TWC | 트와이스 | NULL | 유령고객 |
WMN | 여자친구 | NULL | 유령고객 |
《동적 SQL》
SQL을 고정시키지 않고 동적으로 사용한다는 것이다.
이게 무슨 말인지 나도 꽤나 생각해봤다..🙄
SQL은 내용이 고정되어 있는 경우가 대부분이지만 상황에 따라 내용 변경이 필요할 때 동적 SQL을 사용하면 변경되는 내용을 실시간으로 적용시켜 사용할 수 있다. 이런면에서 동적 SQL이라고 부르는 것 같다.
< 동적 SQL에서는! >
PREPARE는 SQL 문을 실행하지는 않고 미리 준비만 해놓는 역할을 한다.
EXECUTE는 준비한 SQL 문을 실행한다.
모든 것을 실행 후에는 DEALLOCATE PREPARE로 문장을 해제해주는 것이 바람직하다.
- CASE문의 자세한 내용은 예제를 통해서 알아보자
EXECUTE로 @CurDate에 해당하는 내용을 INSERT INTO gate_table VALUES(NULL,?)의 ?자리에 넣어준다.
id자리를 NULL로 둔 것은 저 자리가 AUTO_INCREMENT이기 때문에 설정하지 않아도 실행시킬 때마다 1씩 추가된 값으로 생성되기 때문이다.
id | entry_time |
1 | 2023-04-10 03:48:10 |
하나를 선언해두면 실시간으로 기록이 가능하다는 장점이 있어서 출입로그로도 많이 사용하고 있다는 것을 알아두자.
- set @변수명 : 변수의 값 : 변수의 선언 및 값 대입
- prepare ~ from : SQL 구문을 선언 하는 부분
- execute ~ using : 미리 선언된 구문을 실행 하는 부분
혹시 이 내용들이 기억나지 않는다면 아래 링크를 참고하자
MySQL의 데이터 형식과 형태 변환 (tistory.com)
MySQL의 데이터 형식과 형태 변환
# prepare와 execute - set @변수명 : 변수의 값 : 변수의 선언 및 값 대입 - select @ 변수명 : 변수의 값 출력 - prepare ~ from : SQL 구문을 선언 하는 부분 SQL 구문 안에는 특별한 제약은 없으나 다중으로 Prepar
alfo514.tistory.com
'SQL' 카테고리의 다른 글
가상의 테이블: 뷰(생성, 수정, 삭제) (0) | 2023.05.01 |
---|---|
SQL 테이블 제약조건(기본키, 외래키, 고유키) (1) | 2023.04.30 |
두 테이블을 묶는 JOIN(INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN) (0) | 2023.03.27 |
MySQL의 데이터 형식과 형태 변환 (0) | 2023.03.27 |
MySQL의 데이터 형식(정수형, 문자형, 실수형, 날짜형) (0) | 2023.03.27 |