반응형

[MariaDB] 마리아DB 스토어드 프로그램 - 커서 Cursor (MySQL)

 

스토어드 프로그램 종류는 4가지 입니다.

  1. 스토어드 프로시저 Stored Procedure
  2. 스토어드 함수 Stored Function
  3. 커서 Cursor
  4. 트리거 Trigger

 

이번 포스팅에서는 3번째인 커서(Cursor)에 대해 설명하겠습니다.

커서는 스토어드프로시저 내부에서 사용됩니다. 커서는 프로그래밍 언어의 파일처리 방법처럼 파일을 열고, 한 행씩 데이터를 처리합니다.

 

커서의 처리순서는 일반적으로 아래의 순서와 같이 처리됩니다.

  1. 커서의 선언 : DECLARE CURSOR
  2. 반복 조건 선언 : DECLARE CONTINUE HANDLER (더이상 읽을 행이 없을 경우에, 실행할 내용 설정)
  3. 커서 열기 : OPEN
  4. 커서에서 데이터 가져오기 : FETCH ( LOOP~END, LOOP문으로 반복 구간 지정 시작)
  5. 데이터 처리 (LOOP문으로 반복구간 지정 끝)
  6. 커서 닫기 : CLOSE

커서를 활용하여 프로시저에서 고객 평균 키 계산 예제

DROP PROCEDURE IF EXISTS cursorProc;	-- cursorProc 프로시저가 존재한다면 삭제
DELIMITER $$	-- 스토어드 프로그램 시작
CREATE PROCEDURE cursorProc()	- cursorProc 프로시저 생성
BEGIN	-- 프로시저 코드 시작
    DECLARE userHeight INT; -- 변수 userHeight INT형 선언. 고객의 키
    DECLARE cnt INT DEFAULT 0; -- 변수 cnt INT형 기본값 0으로 선언. 고객의 인원 수(=읽은 행의 수)
    DECLARE totalHeight INT DEFAULT 0; -- 변수 totlaHeight INT형 기본값 0으로 선언. 키의 합계

    DECLARE endOfRow BOOLEAN DEFAULT FALSE; -- 변수 endOfRow 선언. 행의 끝 여부(기본을 FALSE)

    DECLARE userCuror CURSOR FOR	-- 아래줄 셀렉트를 userCuror 커서로 선언
        SELECT height FROM userTBL;	-- userTBL 테이블에서 키만 선택해서 윗줄 userCuror에

    DECLARE CONTINUE HANDLER -- 행의 끝이면, SET endOfRow = TRUE (변수에 TRUE를 대입) 
        FOR NOT FOUND SET endOfRow = TRUE;

    OPEN userCuror;  -- 커서 열기

    cursor_loop: LOOP	-- 루프할 명칭: LOOP 시작
        FETCH  userCuror INTO userHeight; -- 11번 줄에서 선언한 userCuror(키)값을 userHeight 변수에 입력. 고객 키 1개를 대입

        IF endOfRow THEN -- 더이상 읽을 행이 없으면 Loop를 종료
            LEAVE cursor_loop;	-- 루프를 떠남
        END IF;

        SET cnt = cnt + 1;	-- cnt를 1증가
        SET totalHeight = totalHeight + userHeight;        	= totalHeight 변수에 합산
    END LOOP cursor_loop;	-- 루프 끝나고 cursor_loop 시작점으로 다시 올라감
    
    -- 고객 키의 평균을 출력한다.
    SELECT CONCAT('고객 키의 평균 ==> ', (totalHeight/cnt));

    CLOSE userCuror;  -- 커서 닫기
END $$	-- 프로시저 코드 끝
DELIMITER ;	-- 스토어드 프로그램 끝

CALL cursorProc();	-- 프로시저 cursorProc를 호출

 

고객 테이블의 구매 총액에 따라 구매등급 추가 예제

USE sqlDB;	-- sqlDB 사용
ALTER TABLE userTBL ADD grade VARCHAR(5);  -- 고객 등급 열 grade 추가


DROP PROCEDURE IF EXISTS gradeProc;	-- gradeProc 프로시저가 존재하면 삭제
DELIMITER $$
CREATE PROCEDURE gradeProc()
BEGIN
    DECLARE id VARCHAR(10); -- 변수 id VARCHAR(10). 사용자 아이디를 저장할 변수
    DECLARE hap BIGINT; -- 변수 hap BIGINT. 총 구매액을 저장할 변수
    DECLARE userGrade CHAR(5); -- 변수 userGrade CHAR(5). 고객 등급 변수
    
    DECLARE endOfRow BOOLEAN DEFAULT FALSE; 	-- 변수 endOfRow 기본값 FALSE로 선언.

    DECLARE userCuror CURSOR FOR-- 아래 셀렉트로 조회된 userid, sum값을 userCuror 커서로 선언
        SELECT U.userid, sum(price*amount)	-- userTBL의 userid, sum값을 윗줄 userCuror로
            FROM buyTBL B
                RIGHT OUTER JOIN userTBL U
                ON B.userid = U.userid
            GROUP BY U.userid, U.name ;

    DECLARE CONTINUE HANDLER 	-- 행의 끝까지 가서 더이상 찾을수 없을때.(NOT FOUND)
        FOR NOT FOUND SET endOfRow = TRUE;	-- 변수 endOfRow 값을 TRUE로 대입

    OPEN userCuror;  -- 커서 열기
    grade_loop: LOOP	-- 루프명 : LOOP 시작
        FETCH  userCuror INTO id, hap; -- 15행에서 선언한 userid, sum의 첫 행 값을 id, hap에 대입
        IF endOfRow THEN	-- 행이 끝나는 경우 endOfRow값이 트루가 됨
            LEAVE grade_loop;	-- 루프명 루프를 떠남
        END IF;

        CASE  	-- 케이스문
            WHEN (hap >= 1500) THEN SET userGrade = '최우수고객';	-- userCuror의 sum값에서 대입받은 hap값에 금액에 따라 userGrade 변수에 값을 대입
            WHEN (hap  >= 1000) THEN SET userGrade ='우수고객';
            WHEN (hap >= 1) THEN SET userGrade ='일반고객';
            ELSE SET userGrade ='유령고객';
         END CASE;

        UPDATE userTBL SET grade = userGrade WHERE userID = id;	-- userTBL의 테이블에서 id로 검색해서 위에서 선언한 userGrade값을 grade에 대입
    END LOOP grade_loop;	-- 루프 끝. 루프명(grade_loop) 시작점으로 이동

    CLOSE userCuror;  -- 커서 닫기
END $$
DELIMITER ;

CALL gradeProc();	-- gradeProc 프로시저 호출
SELECT * FROM userTBL;	-- userTBL 테이블 셀렉트하면 사용자의 등급이 추가되어 있음

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 스토어드 프로그램 - 스토어드 함수 Stored Function (MySQL)

 

스토어드 프로그램 종류는 4가지 입니다.

  1. 스토어드 프로시저 Stored Procedure
  2. 스토어드 함수 Stored Function
  3. 커서 Cursor
  4. 트리거 Trigger

 

이번 포스팅에서는 2번째인 스토어드 함수(Stored Function)에 대해 설명하겠습니다.

MariaDB에서는 다양한 내장함수를 제공합니다. 자세한 내용은 아래 포스팅에서 확인 가능합니다.

 

[MariaDB] 마리아DB SQL 쿼리 고급 - 내장 함수 (MySQL)

[MariaDB] 마리아DB SQL 쿼리 고급 - 내장 함수 (MySQL) 제어 흐름 함수 IF(수식, 참, 거짓) /* 수식이 참이면 2번째 값 출력, 수식이 거짓이면 3번째 값 출력 */ SELECT IF (100>200, '참이다', '거짓이다'); --..

reddb.tistory.com

그러나, MariaDB가 사용자가 원하는 모든 함수를 제공하지는 않습니다. 사용자마다 자기가 원하는 함수가 있을 수 있고 그런 함수는 직접 함수를 만들어서 사용 해야 합니다.

이렇게 사용자가 직접 만들어 쓰는 함수를 스토어드 함수(Stored Function)이라고 합니다.

 

스토어드 함수의 사용 예제

-- 스토어드 함수 예제
USE sqlDB;	-- sqlDB 사용 선언
DROP FUNCTION IF EXISTS userFunc;	-- suerFunc 함수가 존재하면 삭제
DELIMITER $$	-- 스토어드 프로그램 시작 선언
CREATE FUNCTION userFunc(value1 INT, value2 INT)	-- userFunc 함수를 생성. INT형 value1,2를 매개변수로 받음
    RETURNS INT	-- INT형을 반환 하기로 선언 (스토어드 함수는 RETURNS문으로 반환할 데이터 형식을 선언함)
BEGIN	-- 코드시작
    RETURN value1 + value2;	--RETURN문으로 하나의 값을 반환함. 매개변수(파라미터) value1,2를 더하여 반환
END $$	-- 코드 끝
DELIMITER ;	-- 스토어드 프로그램 끝

SELECT userFunc(100, 200);	-- 전달인자(아귀먼트) 100,200으로 userFunc 함수 호출

 

출생년도를 입력하면 나이가 출력되는 함수 예제

USE sqlDB;
DROP FUNCTION IF EXISTS getAgeFunc;
DELIMITER $$
CREATE FUNCTION getAgeFunc(bYear INT)	-- getAgreFunc 함수 생성. bYear 매개변수 INT형
    RETURNS INT	-- 리턴 데이터 형식 INT형
BEGIN
    DECLARE age INT;	-- 변수  age INT형 선언
    SET age = YEAR(CURDATE()) - bYear;	-- 변수 age에 지금년도에서 bYear 매개변수를 뺀 후 입력(나이계산)
    RETURN age;	-- age 값을 반환
END $$
DELIMITER ;

SELECT getAgeFunc(1979);	-- 1979값을 전달인자(아귀먼트)로 getAgeFunc 함수를 호출하여 나이를 계산

SELECT getAgeFunc(1979) INTO @age1979;	-- 1979값으로 함수를 호출하여 리턴받은 나이를 변수 @age1979에 입력(저장)
SELECT getAgeFunc(1997) INTO @age1997;	-- 1997값으로 함수를 호출하여 리턴받은 나이를 변수 @age1997에 입력(저장)
SELECT CONCAT('1997년과 1979년의 나이차 ==> ', (@age1979-@age1997));	-- 두변수의 차를 계산하여 CONCAT 출력

SELECT userID, name, getAgeFunc(birthYear) AS '만 나이' FROM userTBL;	-- 테이블 조회시 생년이 아닌 나이로 계산하여(함수이용) 출력

 

스토어드 함수 내용 확인

SHOW CREATE FUNCTION 함수명;

 

스토어드 함수 삭제

DROP FUNCTION 함수명;

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 스토어드 프로그램 - 스토어드 프로시저 Stored Procedure (MySQL)

 

스토어드 프로그램 종류는 4가지 입니다.

  1. 스토어드 프로시저 Stored Procedure
  2. 스토어드 함수 Stored Function
  3. 커서 Cursor
  4. 트리거 Trigger

이번 포스팅에서는 스토어드 프로시저(Stored Procedure)에 대해 설명하겠습니다.

스토어드 프로시저는 쿼리문의 집합으로 어떤 동작을 일괄 처리하기 위한 용도로 사용됩니다.

자주사용하는 쿼리가 있다면 매번 쿼리를 다 치는게 아니라 스토어드 프로시저로 만들어 모듈화 시킨 후 필요할 때마다 호출하여 사용하면 편리합니다.

 

스토어드 프로시저(Stored Procedure)의 장점도 4가지 입니다.

  1. DB의 성능을 향상시킬 수 있다.
  2. 유지관리가 간편하다
  3. 모듈식 프로그래밍이 가능하다
  4. 보안을 강화할 수 있다.

보안을 강화하는 방법은 사용자 별로 테이블에 접근권한을 주지 않고 스토어드 프로시저에만 접근권한을 줌으로써 테이블의 모든 정보를 사용자에게 노출하지 않고 프로시저에서 선택한 정보만 사용자에게 보여줄 수 있습니다.

 

스토어드 프로시저의 정의 형식 및 사용 예제

-- 스토어드 프로시저 형식
DELIMITER $$	--스토어드 프로그램 시작. 구분문자 $$ 선언. $$가 아니라 다른 문자로도 사용가능
CREATE PROCEDURE 스토어드프로시저이름(IN 또는 OUT 파라미터)	-- 파라미터를 받을때는 IN, 내보낼때는 OUT
BEGIN	--프로시저를 호출할때 실행 될 코드 시작위치
	......	--이 부분에 SQL 프로그램 코딩
END $$	--코딩 끝을 선언하고 구분문자 $$ 닫기
DELIMITER;	--최종적으로 스토어드프로시저 DELIMITER로 닫기

CALL 스토어드프로시저이름();	-- 필요할때 스토어드 프로시저 호출()



-- 스토어드 프로시저 예제
USE sqlDB;	-- DB사용
DROP PROCEDURE IF EXISTS userProc;	-- userProc가 있다면 삭제
DELIMITER $$	-- 스토어드 프로그램 시작. 구분문자 $$
CREATE PROCEDURE userProc()	--프로시저 userProc 생성
BEGIN	-- 코드 시작
    SELECT * FROM userTBL; -- 스토어드 프로시저 내용
END $$	-- 코드 끝. 구분문자 $$ 닫기
DELIMITER ;	-- 스토어드 프로그램 끝(닫기)

CALL userProc();	-- userProc 호출

 

매개변수가 있는 프로시저 사용 예제

USE sqlDB;	-- sqlDB사용
DROP PROCEDURE IF EXISTS userProc1;	-- userProc1이 존재하면 삭제
DELIMITER $$	-- 스토어드 프로그램 시작
CREATE PROCEDURE userProc1(IN userName VARCHAR(10))	-- userProc1 프로시저 생성, IN 입력매개변수명 데이터형식
BEGIN	-- 코딩 시작
  SELECT * FROM userTBL WHERE name = userName; 	-- 매개변수(파라미터, parameter) userName을 이용하여 넘어온 코딩
END $$	-- 코딩 끝
DELIMITER ;	--스토어드 프로그램 끝

CALL userProc1('김이름');	-- 전달인자(아귀먼트, argument) '김이름'을 넣어서 userProc1 호출

 

매개변수가 2개인 프로시저 사용 예제

DROP PROCEDURE IF EXISTS userProc2;	-- userProc2가 존재하면 삭제
DELIMITER $$	-- 스토어드 프로그램 시작
CREATE PROCEDURE userProc2(	--userProc2 프로시저 생성
    IN userBirth INT, 	-- 입력 매개변수(파라미터), 매개변수명 userBirth, INT 데이터형식
    IN userHeight INT	-- 입력 매개변수(파라미터), 매개변수명 userHeight, INT 데이터형식
)
BEGIN	--코드 시작
  SELECT * FROM userTBL 
    WHERE birthYear > userBirth AND height > userHeight;	-- 매개변수보다 크고 나이많은 user 선택
END $$	-- 코드 끝
DELIMITER ;	-- 스토어드 프로그램 끝

CALL userProc2(1970, 178);	-- 1970, 178 전달인자로 userProc2호출. 

 

출력매개변수 사용 예제

DROP PROCEDURE IF EXISTS userProc3;	
DELIMITER $$
CREATE PROCEDURE userProc3(
    IN txtValue CHAR(10),	-- 입력매개변수 IN, 매개변수명 txtValuer, 데이터형식 CHAR(10)
    OUT outValue INT	-- 출력매개변수 OUT, 매개변수명 outValue, 데이터형식 INT
)
BEGIN	-- 코딩시작
  INSERT INTO testTBL VALUES(NULL,txtValue);	-- 입력매개변수 txtValue를 이용하여 INSERT 쿼리실행
  SELECT MAX(id) INTO outValue FROM testTBL; 	-- testTBL테이블의 id값중 가장 높은 값을 출력매개변수 outValue에 집어 넣음
END $$
DELIMITER ;

CREATE TABLE IF NOT EXISTS testTBL(	-- 테이블이 존재하면 삭제하고 생성
    id INT AUTO_INCREMENT PRIMARY KEY, 	-- id 값은 INT로 자동증가. id는 생성 시 마다 1,2,3,4,... 로 증가
    txt CHAR(10)	-- txt는 not null을 안했기에 null값이 입력가능
);	-- 테이블을 프로시저보다 뒤에 생성할 수는 있지만 프로시저호출은 반드시 테이블 생성 후에 해야 함

CALL userProc3 ('테스트값', @myValue);	-- 전달인자(아귀먼트) '테스트값'을 txtValue로 보내고, outValue에 INTO(입력)된 id값을 @myValue 변수로 받음

SELECT CONCAT('현재 입력된 ID 값 ==>', @myValue);	-- @myValue 변수를 이용. INSERT시 AUTO_INCREMENT로 생성된 id값이 들어 있음

 

IF ELSE문을 활용한 스토어드 포르시저 예제

DROP PROCEDURE IF EXISTS ifelseProc;
DELIMITER $$
CREATE PROCEDURE ifelseProc(	-- ifelseProc 프로시저 생성
    IN userName VARCHAR(10)	--입력 매개변수 userNmae을 VARCHAR(10)형식으로 받음
)
BEGIN
    DECLARE bYear INT; -- 변수 bYear 선언
    SELECT birthYear into bYear FROM userTBL	-- userTBL테이블의 birthYear값을 bYear변수에 입력
        WHERE name = userName;	-- userTBL테이블의 name이 매개변수 userName과 같을 때
    IF (bYear >= 2000) THEN	-- IF시작. 만약 변수 bYear가 2000보다 크다면
            SELECT '21세기에 태어났습니다.';	-- 참일 경우 실행
    ELSE
            SELECT '20세기에 태어났습니다.';	-- 거짓일 경우 실행
    END IF;	--IF 종료
END $$
DELIMITER ;

CALL ifelseProc ('박이름');	-- 박이름을 전달인자(아귀먼트)로 ifelseProc 호출

 

CASE문을 활용한 스토어드 프로시저 예제

DROP PROCEDURE IF EXISTS caseProc;	-- caseProc 프로시저가 존재하면 삭제
DELIMITER $$
CREATE PROCEDURE caseProc(	-- 프로시저 caseProc 생성
    IN userName VARCHAR(10)	-- 입력매개변수 userName VARCHAR(10)
)
BEGIN
    DECLARE bYear INT; 	-- 변수 bYear INT 형식으로 선언
    DECLARE tti  CHAR(3);-- 변수 tti(띠) CAHR(3) 형식으로 선언
    SELECT birthYear INTO bYear FROM userTBL
        WHERE name = userName;
    CASE 	-- CASE문 시작
        WHEN ( bYear%12 = 0) THEN    SET tti = '원숭이';	-- 변수 bYear를 12로 나눈 나머지가 0일때(when), tti 변수에 원숭이 입력(SET)
        WHEN ( bYear%12 = 1) THEN    SET tti = '닭';
        WHEN ( bYear%12 = 2) THEN    SET tti = '개';
        WHEN ( bYear%12 = 3) THEN    SET tti = '돼지';
        WHEN ( bYear%12 = 4) THEN    SET tti = '쥐';
        WHEN ( bYear%12 = 5) THEN    SET tti = '소';
        WHEN ( bYear%12 = 6) THEN    SET tti = '호랑이';
        WHEN ( bYear%12 = 7) THEN    SET tti = '토끼';
        WHEN ( bYear%12 = 8) THEN    SET tti = '용';
        WHEN ( bYear%12 = 9) THEN    SET tti = '뱀';
        WHEN ( bYear%12 = 10) THEN    SET tti = '말';
        ELSE SET tti = '양';	-- 위에 WHEN에 없는 경우는 tti 변수를 '양'으로 SET
    END CASE;	-- CASE문 끝
    SELECT CONCAT(userName, '의 띠 ==>', tti);	-- (매개변수)userNAME의 띠 ==> (변수)tti 출력
END $$
DELIMITER ;

CALL caseProc ('강이름');	-- 강이름을 아귀먼트로 caseProc 호출

 

WHILE문을 활용한 스토어드 프로시저 예제

DROP TABLE IF EXISTS guguTBL;	
CREATE TABLE guguTBL (txt VARCHAR(100)); -- 구구단 저장용 테이블 생성

DROP PROCEDURE IF EXISTS whileProc;	-- whileProc 프로시저가 존재하면 삭제
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
    DECLARE str VARCHAR(100); -- 변수 srt 선언. 각 단을 문자열로 저장하기위한 변수
    DECLARE i INT; -- 변수 i 선언. 구구단 앞자리
    DECLARE k INT; -- 변수 k 선언. 구구단 뒷자리
    SET i = 2; -- 앞자리 변수i를 2로 입력하여 2단부터 계산
    
    WHILE (i < 10) DO  -- WHILE문 시작. i가 10보다 작다면 실행. 바깥 반복문. 2단~9단까지.
        SET str = ''; -- 변수 str 초기화. 각 단의 결과를 저장할 문자열 초기화
        SET k = 1; -- 변수 k는 1로 입력. 구구단 뒷자리는 항상 1부터 9까지.
        WHILE (k < 10) DO	-- WHILE문 시작. k가 1~9까지 돌아감(10보댜 작을때까지)
            SET str = CONCAT(str, '  ', i, 'x', k, '=', i*k); -- 문자열 만들기. i'x'k'='i*k
            SET k = k + 1; -- 뒷자리 변수 k 1증가
        END WHILE;	-- WHILE 시작위치로 돌아감 (뒷자리 k WHILE)
        SET i = i + 1; -- 앞자리 변수 I 1증가
        INSERT INTO guguTBL VALUES(str); -- 각 단의 결과 변수 str을 값으로 테이블에 입력(INSERT).
    END WHILE;	-- WHILE 시작위치르 돌아감 (앞자리 i WHILE)
END $$
DELIMITER ;

CALL whileProc();	-- 호출
SELECT * FROM guguTBL;	-- guguTBL 테이블 셀렉트. str값으로 입력된 테이블 데이터 SELECT 됨.

 

DECLARE HANDLER를 이용한 오류처리 스토어드 프로시저 예제

DROP PROCEDURE IF EXISTS errorProc;
DELIMITER $$
CREATE PROCEDURE errorProc()	-- erroProc 프로시저 생성
BEGIN
    DECLARE i INT; -- 변수 i 선언. 1씩 증가하는 값
    DECLARE hap INT; -- 변수 hap 선언. 합계 (정수형). 오버플로 발생시킬 예정.
    DECLARE saveHap INT; -- 변수 saveHap 선언. 합계 (정수형). 오버플로 직전의 값을 저장.

    DECLARE EXIT HANDLER FOR 1264 -- INT형 오버플로(에러 1264)가 발생하면 아래 BEGIN 수행
    BEGIN
        SELECT CONCAT('INT 오버플로 직전의 합계 --> ', saveHap);	--saveHap 출력
        SELECT CONCAT('1+2+3+4+...+',i ,'=오버플로');	--1씩 증가한값을 쌓았을때 최정적으로 더하게된 값이 i
    END;

    SET i = 1; -- i는 1부터 시작
    SET hap = 0; -- 합계를 누적

    WHILE (TRUE) DO  -- 무한 루프.
        SET saveHap = hap; -- 오버플로 직전의 합계를 저장
        SET hap = hap + i;  -- 오버플로가 나면 11, 12행을 수행함(DECLARE HANDLER)
        SET i = i + 1; 
    END WHILE;
END $$
DELIMITER ;

CALL errorProc();	-- errorProc 프로시저 호출

 

테이블 이름을 파라미터로 전달하는 방법 예제

DROP PROCEDURE IF EXISTS nameProc;
DELIMITER $$
CREATE PROCEDURE nameProc(
    IN tblName VARCHAR(20)	--입력매개변수(파리미터) tblName VARCHAR(20) 데이터형식
)
BEGIN	-- 코드시작
  SET @sqlQuery = CONCAT('SELECT * FROM ', tblName); 
  -- 변수 @sqlQuery에 CONCAT 내용 입력. CONCAT값은 매개변수 tblName을 이용한 SELCT문. FROM 뒤 공백 1개 주의.
  PREPARE myQuery FROM @sqlQuery;	-- 변수@sqlQuery를 'myQuery'에 준비시킴(PREPARE)
  EXECUTE myQuery;	-- 'myQuery' 실행
  DEALLOCATE PREPARE myQuery; 'myQuery' 준비를 해제시킴
END $$
DELIMITER ;

CALL nameProc ('userTBL');	-- userTBL값을 전달인자(아귀먼트)로 nameProc 프로시저 호출

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 테이블 - 뷰 view (MySQL)

 

뷰(view)는 일반 사용자 입장에서는 테이블과 동일하게 사용하는 개체입니다.

뷰는 select 문으로 만들어진 테이블로 생각하면 됩니다.

뷰는 기본적으로 읽기전용으로 많이 사용되지만 뷰를 통해서 원 테이블의 데이터를 수정할 수도 있습니다.

 

뷰의 장점으로는 보안에 도움이 된다는 점이 있습니다.

특정사용자에게 어떤 테이블의 모든 정보가 아닌 공개가능한 정보만을 뷰로 생성하여 제공할 수 있기 때문입니다.

그리고 복잡한 조인쿼리등을 단순화 시켜주기도 합니다.

매번 조인을 해서 검색하던 자료를 뷰로 한번 생성해 놓으면 그 후로는 그 뷰를 select로 조회하기만 하면 되기 때문입니다.

 

뷰 생성하기

USE DB명; -- 사용할 DB명
CREATE VIEW v_userbuyTBL	-- v_userbyTBL 뷰 생성 
AS
   SELECT U.userid AS 'USER ID', U.name AS 'USER NAME', B.prodName AS 'PRODUCT NAME', 
		U.addr, CONCAT(U.mobile1, U.mobile2) AS 'MOBILE PHONE'
      FROM userTBL U
	INNER JOIN buyTBL B	-- userTBL 과 buyTBL 내부조인
	 ON U.userid = B.userid;	-- userid로 조인

SELECT `USER ID`, `USER NAME` FROM v_userbuyTBL; -- 주의! 백틱을 사용한다. 만들어진 뷰에서 select

 

뷰 수정하기

ALTER VIEW v_userbuyTBL	-- v_userbuyTBL 뷰 수정
AS
   SELECT U.userid AS '사용자 아이디', U.name AS '이름', B.prodName AS '제품 이름', 
		U.addr, CONCAT(U.mobile1, U.mobile2)  AS '전화 번호'	-- as(별칭)을 한글로 수정
      FROM userTBL U
          INNER JOIN buyTBL B	-- 내부조인 (userTBL-buyTBL)
             ON U.userid = B.userid ;	-- userid를 기준으로

SELECT `이름`,`전화 번호` FROM v_userbuyTBL;	-- `(백틱)주의. 수정된 뷰를 select 

 

뷰 삭제하기

DROP VIEW 뷰이름;

 

뷰 정보확인

DESCRIBE 뷰이름;

 

뷰 소스코드확인

SHOW CREATE VIEW 뷰이름;

 

뷰로 원본 테이블 수정, 입력이 불가능한 경우

  1.  원본에 NOT NULL인 값이 뷰에 생성되어 있지 않다면 입력 불가능. 뷰를 통해 NOT NULL 열을 입력할 수 없음.
  2.  집계함수를 사용한 뷰(SUM값 등)
  3.  UNION ALL, JOIN 등을 사용한 뷰
  4.  DISTINCT, GROUP BY 등을 사용한 뷰

 

조건으로 만들어진 뷰에 INSERT하기 및 WITH CHECK OPTION

운동선수 테이블에서 180cm 이상인 선수만 뷰로 생성합니다.

CREATE VIEW v_height180	-- v_height180 뷰 생성
AS
	SELECT * FROM userTBL WHERE height >= 180 ;	-- userTBL(원테이블)에서 180 이상만 선택

SELECT * FROM v_height180 ;

 

이제 180cm 미만인 선수를 뷰에 인서트합니다.

INSERT INTO v_height180 VALUES('KBK', '김북강', 1990 , '경기', '010', '5555555', 177, '2022-01-01');	-- 177cm 선수입력

 

위와 같이 입력 시 입력은 되지만 뷰에서는 조회가 안되고 원본 테이블에서는 조회가 되는 상황이 발생합니다.

 

이를 방지하고자 조건으로 만들어진 뷰에 조건에 맞지 않는 데이터가 인서트 될 경우 에러를 만드는 방법이 "WITH CHECK OPTION" 입니다.

CREATE VIEW v_height180	-- v_height180 뷰 생성
AS
	SELECT * FROM userTBL WHERE height >= 180 	-- userTBL(원테이블)에서 180 이상만 선택
	WITH CHECK OPTION;	-- 인서트시 조건에 맞는지 체크하기

 

이 옵션을 추가해서 뷰를 생성 시 180cm 미만의 선수가 입력될 경우 에러가 발생합니다.

 

 

뷰가 참조하는 테이블 삭제 시

뷰가 참조하는 원본 테이블들을 삭제합니다.

DROP TABLE IF EXISTS 테이블명1, 테이블명2;	-- (테이블이 존재한다면) 테이블명1, 테이블명2 삭제

뷰를 조회 할 경우 에러가 납니다. 참조하는 테이블이 없기 때문에 조회 할 수 없다는 에러가 발생합니다.

 

뷰의 상태를 체크하는 명령어로 뷰가 참조하는 테이블이 없는 것을 확인 할 수 있습니다.

CHECK TABLE 뷰이름;

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 테이블 - 임시테이블, 테이블삭제, 테이블수정 (MySQL)

 

임시 테이블

임시테이블은 현재 접속한 세션내에서만 존재할 수 있는 테이블입니다. 세션이 닫히면 자동으로 삭제됩니다.

또한 임시 테이블은 생성한 클라이언트에서만 접근이 가능합니다.

임시테이블은 데이터베이스안의 기존의 테이블과 동일한 이름으로 생성할 수 있습니다.

동일한 이름의 임시테이블이 존재하는 동안에는 기존 테이블에는 접근이 불가능합니다.

 

임시테이블이 삭제되는 시점은 아래와 같습니다.

  1.  사용자가 DROP TABLE로 직접삭제
  2.  HeidiSQL을 종료 or 클라이언트 프로그램을 종료하면 삭제됨
  3.  MariaDB 서비스를 재시작하면 삭제됨

임시 테이블을 만드는 방법은 아래와 같습니다.

USE DB명;	-- DB사용

CREATE TEMPORARY TABLE  IF NOT EXISTS  임시테이블명 	-- 임시테이블(이 존재하면 삭제하고) 생성
(
	id INT, name CHAR(7)
);

DESCRIBE 임시테이블명;	-- 임시테이블 상세

INSERT INTO 임시테이블명 VALUES (1, 'This');	-- 임시테이블에 값 입력

SELECT * FROM 임시테이블명;	-- 임시테이블 조회

DROP TABLE 임시테이블명 ;	-- 임시테이블 삭제

 

 

테이블 삭제

테이블 삭제는 아래와 같이 간단한 명령어로 가능합니다.

DROP TABLE 테이블명 ;	-- 테이블 삭제

 

주의할 사항은 외래키 제약조건의 기준 테이블은 삭제할 수가 없습니다.

먼저, 왜래키가 생성된 외래키 테이블을 삭제해야만 합니다.

 

여러 테이블을 동시에 삭제하는 방법은 아래와 같습니다.

DROP TABLE 테이블1, 테이블2, 테이블3 ;	-- 테이블1~3 삭제

 

 

테이블 수정

테이블의 수정은 ALTER TABLE 문으로 사용합니다. 이미 생성되 테이블을 추가, 변경, 수정, 삭제 가능합니다.

 

열의 추가

USE DB명;	-- DB명 사용

ALTER TABLE userTBL	-- 테이블 수정
	ADD homepage VARCHAR(30)  -- 열추가(홈페이지)
		DEFAULT 'http://www.hanbit.co.kr' -- 디폴트값
		NULL; -- Null 허용함

열은 기본적으로 제일 뒤에 추가됩니다. 

순서를 지정하고 싶다면 제일 뒤에 'FIRST' 또는 'AFTER 열이름'을 지정하면 됩니다.

FIRST는 제일앞에 추가되고, AFTER 열이름은 열이름 다음에 추가됩니다.

 

열의 삭제

ALTER TABLE userTBL	-- 테이블 수정
	DROP COLUMN mobile1;	-- 모바일1 열을 삭제

만약 제약조건이 걸린 연을 삭제할 경우는 제약조건을 먼저 삭제한 후에 열을 삭제해야합니다.

 

열의 이름 및 데이터 형식 변경

ALTER TABLE userTBL	-- 테이블 수정
	CHANGE COLUMN name uName VARCHAR(20) NULL ;	-- name열 변경, 열이름을 uName으로, 데이터형식을 VARCHAR(20)으로, NULL허용으로 변경

제약조건이 걸려있는 열은 문제가 발생할 수 있습니다.

 

열의 제약 조건 추가 및 삭제

ALTER TABLE userTBL -- userTBL 테이블 변경 
	ADD CONSTRAINT PRIMARY KEY (userID); -- 추가 강제 기본키 (열이름)


ALTER TABLE userTBL	-- 테이블 수정
	DROP PRIMARY KEY; 	-- 기본키 제약조건 삭제

ALTER TABLE buyTBL
	DROP FOREIGN KEY FK_userTBL_buyTBL;	-- 외래키 제약조건 삭제

기본키를 삭제할 경우 기본키가 다른 테이블의 외래키와 연결되어 있다면 외래키를 먼저 삭제하고 기본키를 삭제해야 합니다.

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형