동적 SQL이란 뭘까? 에 대한 CHAT GPT의 답변

 

동적 SQL은 실행 시점에 동적으로 생성되는 SQL문을 의미합니다. 정적 SQL은 미리 작성된 SQL문을 사용하는 반면, 동적 SQL은 프로그램 실행 중에 필요에 따라 SQL문을 생성하고 실행합니다.

동적 SQL을 사용하면 프로그램이 실행될 때 조건에 따라 다른 SQL문을 생성할 수 있습니다. 이는 동적으로 데이터베이스 스키마를 조작하거나 쿼리의 조건을 동적으로 설정하는 등의 유연성을 제공합니다. 동적 SQL은 일반적으로 프로그램이 실행될 때 데이터베이스의 상태, 사용자의 입력 또는 다른 동적인 요소에 따라서 SQL문을 생성하고 실행하는데 사용됩니다.

동적 SQL을 구현하는 방법은 프로그래밍 언어나 데이터베이스 시스템에 따라 다를 수 있습니다. 예를 들어, 프로그래밍 언어에서는 문자열 연결 및 조건문을 사용하여 동적 SQL을 생성할 수 있습니다. 데이터베이스 시스템에서는 저장 프로시저나 사용자 정의 함수를 사용하여 동적 SQL을 생성하고 실행할 수 있습니다.

동적 SQL을 사용할 때 주의해야 할 점은 SQL 인젝션(SQL injection) 공격에 취약할 수 있다는 점입니다. 악의적인 사용자가 입력값에 악의적인 SQL 코드를 삽입하여 데이터베이스를 조작하거나 정보를 유출하는 등의 공격을 시도할 수 있습니다. 따라서 동적 SQL을 사용할 때는 반드시 입력값의 유효성을 확인하고 적절한 방어 메커니즘을 구현해야 합니다.

 

동적 SQL 사용 예시

  1. 검색 조건에 따른 동적 쿼리: 사용자로부터 받은 검색 조건에 따라 데이터베이스에서 결과를 조회하는 경우 동적 SQL을 사용할 수 있습니다. 예를 들어, 사용자가 웹 애플리케이션에서 특정 조건을 선택하면 해당 조건을 기반으로 동적으로 SQL문을 생성하여 데이터베이스에서 필요한 정보를 조회할 수 있습니다.
  2. 동적으로 테이블 생성 및 수정: 프로그램 실행 중에 새로운 테이블을 생성하거나 테이블 구조를 변경해야 할 경우 동적 SQL을 사용할 수 있습니다. 예를 들어, 사용자가 데이터베이스 애플리케이션을 통해 새로운 데이터베이스 테이블을 생성하고 해당 테이블에 필요한 컬럼을 동적으로 추가할 수 있습니다.
  3. 동적인 데이터 조작: 데이터베이스에서 동적으로 데이터를 삽입, 수정 또는 삭제해야 할 경우 동적 SQL을 사용할 수 있습니다. 예를 들어, 사용자가 웹 애플리케이션에서 입력한 데이터를 기반으로 동적으로 데이터를 삽입하거나 특정 조건에 맞는 데이터를 수정 또는 삭제할 수 있습니다.
  4. 동적인 정렬 및 필터링: 사용자가 웹 애플리케이션에서 원하는 정렬 기준이나 필터링 조건을 선택할 수 있게 하려면 동적 SQL을 사용할 수 있습니다. 예를 들어, 사용자가 특정 컬럼을 선택하여 오름차순이나 내림차순으로 데이터를 정렬하거나, 특정 조건에 맞는 데이터만 필터링하여 결과를 반환할 수 있습니다.

이러한 예시들은 동적 SQL의 활용 범위를 보여주는 일부 사례일 뿐입니다. 동적 SQL은 프로그램의 요구 사항에 따라 다양한 방식으로 활용될 수 있으며, 사용되는 프로그래밍 언어와 데이터베이스 시스템에 따라 구현 방식이 달라질 수 있습니다.

<1>

DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT;
    DECLARE hap INT;
    SET i = 1;                                       i는 1부터 시작
    SET hap = 0;                                 hap은 0부터 시작
    
    WHILE (i <= 100) DO                      i가 100보다 작거나 같으면, 그동안 계속 실행
        SET hap = hap + i;
        SET i = i + 1;
END WHILE;
    
    SELECT '1부터 100까지의 합 ==>', hap;
END $$
DELIMITER ;
CALL whileProc();

 

 

 

 

<2>

DROP PROCEDURE IF EXISTS whileProc2;
DELIMITER $$
CREATE PROCEDURE whileProc2()
BEGIN
DECLARE i INT;
    DECLARE hap INT;
    SET i = 1;
    SET hap = 0;
    
    myWhile:
    WHILE (i <= 100) DO
IF (i%4 = 0) THEN 
SET i = i + 1;

ITERATE myWhile;

END IF;

(만약 i 나누기 4가 0이면,  i 에 1을 더하고   myWhile 처음으로 돌아가서 다시 실행 ----> 4의 배수는 빼고 더하겠다. )
SET hap = hap+i;
IF (hap>1000) THEN
LEAVE myWhile;

END IF;

(만약 hap이 1000을 넘으면 myWhile 그만 실행하고 종료하겠다.)
        SET i = i+1;
END WHILE;
    
    SELECT '1부터 100까지의 합(4의 배수 제외), 1000 넘으면 종료 ==>', hap, i;
END $$
DELIMITER ;
CALL whileProc2();

 

양의 정수를 4의 배수 제외하고 더하다보면 51까지 더했을 때 1014로, 처음 1000을 넘는다.

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

 

point 88 점인 사람의 학점 = B

 

 

 

 

<2>

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 ; 

 

OUTER JOIN으로 buy 테이블에는 없지만 member테이블에는 있는 유령 고객들도 표시함.

<1> 

 

DROP PROCEDURE IF EXISTS ifProc2;
DELIMITER $$
CREATE PROCEDURE ifProc2()
BEGIN
  DECLARE myNum INT;
  SET myNum = 200;
  IF myNum = 100 THEN
SELECT '100입니다,';
  ELSE
SELECT '100이 아닙니다.';
  END IF;
END $$
DELIMITER ; 
CALL ifProc2();

 

결과: 200은 100이 아니다.

 

 

<2>

 

DROP PROCEDURE IF EXISTS ifProc3;
DELIMITER $$
CREATE PROCEDURE ifProc3()
BEGIN 
DECLARE debutDate DATE;
    DECLARE curDate DATE;
    DECLARE days INT;
    
    SELECT debut_date INTO debutDate
FROM market_db.member
        WHERE mem_id = 'APN';
        
SET curDATE = CURRENT_DATE();
    SET days = DATEDIFF(curDATE, debutDate);
    
    IF (days/365) >= 5 THEN
SELECT CONCAT('데뷔한지', days, '일이나 지났습니다. 핑순이들 축하합니다!');
ELSE 
SELECT '데뷔한지' + days + '일밖에 안 되었네요. 핑순이들 화이팅~' ; 
END IF;
END $$
DELIMITER ; 
CALL ifProc3();

 

2023.06.26 기준, 에이핑크 데뷔 4519일차

굵은 글씨는 SQL의 스토어드 프로시저이고

그 가운데 if문 넣는 연습을 했다. 

 

[SQL 기초 강의] 11강. SQL 프로그래밍(IF문, CASE문, WHILE문, 동적SQL) - YouTube

좋은 강의 감사드립니다.

+ Recent posts