인프런에서 강의도 듣고 스터디 신청시 30% 할인 쿠폰을 통해 강의도 수강하고 ~ 스터디도 참여할 수 있습니다. 카일스쿨님의 인프런 빅쿼리 SQL 스터디 4주차에서 학습한 내용을 바탕으로 재구성했습니다.
혹시 SQL에서 SELECT, FROM문법 말고 절차적 언어에 대해 들어보셨나요?
🙋♀️ 처음 SQL 문법이나 이론을 공부하면
SELECT, FROM, WHERE 절 등등 추출하기 위한 문법들은
많이 접하셨을텐데요 !
오늘은 절차적 언어에 대해 설명드리겠습니다.
먼저, SQL에서 주로 분류되는 언어들의 종류를 살펴보겠습니다.
📌 1. SQL의 주요 분류
- DDL (Data Definition Language):
데이터 정의 언어로, 데이터베이스의 구조(스키마)를 정의하거나 수정하는 데 사용됩니다.
예: CREATE, ALTER, DROP - DML (Data Manipulation Language):
데이터 조작 언어로, 데이터의 조회, 삽입, 수정, 삭제와 같은 작업을 수행합니다.
예: SELECT, INSERT, UPDATE, DELETE - DCL (Data Control Language):
데이터 제어 언어로, 데이터베이스에 대한 접근 권한과 관련된 명령을 관리합니다.
예: GRANT, REVOKE - TCL (Transaction Control Language):
트랜잭션 제어 언어로, 데이터 조작 작업의 일관성을 보장하는 데 사용됩니다.
예: COMMIT, ROLLBACK, SAVEPOINT
그렇다면, 절차적 언어와 SQL의 언어는 어떤 관계일까요?
✅ 2. 절차적 언어의 특징과 SQL 분류와의 관계
절차적 언어는 위의 분류에서 명확히 독립된 한 영역으로 구분되지는 않습니다. 하지만 절차적 언어는 DML과 밀접한 관련이 있습니다.
- DML과의 관계:
절차적 언어는 데이터 조회 및 변경(SELECT, UPDATE, DELETE 등)을 수행하기 위해 DML 명령어를 기반으로 작업을 수행합니다.
WHILE condition DO
EXECUTE IMMEDIATE 'UPDATE table_name SET column_name = value WHERE condition';
END WHILE;
- DDL과의 관계:
절차적 언어 내에서 DDL 명령어도 동적으로 실행 가능합니다. 예를 들어, EXECUTE IMMEDIATE를 사용해 테이블을 생성하거나 삭제할 수 있습니다.
EXECUTE IMMEDIATE 'CREATE TABLE new_table (id INT64, name STRING)';
- TCL과의 관계:
트랜잭션 내에서 절차적 언어를 활용해 복잡한 작업 흐름을 제어하거나 COMMIT과 ROLLBACK을 수행할 수 있습니다.
BEGIN TRANSACTION;
EXECUTE IMMEDIATE 'INSERT INTO table_name VALUES (1, "example")';
ROLLBACK; -- 트랜잭션 롤백
END TRANSACTION;
- DCL과의 관계:
DCL은 데이터 접근 권한과 관련된 명령어로, 절차적 언어와 직접적인 연관은 적습니다. 다만, EXECUTE IMMEDIATE로 권한 부여 또는 회수를 동적으로 실행할 수 있습니다.
EXECUTE IMMEDIATE 'GRANT SELECT ON table_name TO user_name';
✅ 3. 절차적 언어는 독립적인 확장 기능
절차적 언어는 SQL 자체의 확장 개념으로, DML을 기반으로 동작하며, 필요에 따라 DDL, DCL, TCL 명령어를 실행할 수 있는 "메타 레벨" 기능이라고 할 수 있습니다.
쉽게 말해, 절차적 언어는 "SQL의 각 기능을 조합하고 흐름 제어를 추가한 고급 기능"으로 보는 것이 적절합니다.
📜 4. 절차적 언어를 SQL의 분류와 함께 요약
SQL 분류 주요 역할 및 절차적 언어의 활용 관계
DDL | 데이터 정의 (테이블 생성/삭제 등) | EXECUTE IMMEDIATE로 동적 DDL 실행 가능 |
DML | 데이터 조작 (삽입, 삭제, 수정, 조회) | 변수 선언, 반복문, 조건문으로 DML 활용 |
DCL | 권한 제어 (접근 허가/제거) | EXECUTE IMMEDIATE로 동적 DCL 실행 가능 |
TCL | 트랜잭션 제어 (COMMIT, ROLLBACK 등) | 절차적 언어로 복잡한 트랜잭션 제어 가능 |
❗️ 5. 절차적 언어의 종류
5.1 변수 선언 (DECLARE, SET)
SQL에서 변수는 데이터를 임시 저장하고 동적으로 작업을 수행할 때 유용합니다.
- DECLARE를 사용해 변수의 타입과 기본값을 선언합니다.
- SET을 사용해 변수에 값을 할당할 수 있습니다.
예시 코드:
DECLARE total_count INT64; SET total_count = 0;
5.2 조건문 (IF, WHILE)
조건문을 사용하면 특정 조건에서만 코드를 실행하거나, 반복문과 결합하여 동작을 반복적으로 수행할 수 있습니다.
- IF: 조건에 따라 실행 경로를 결정합니다.
- WHILE: 특정 조건이 충족될 때까지 반복적으로 실행합니다.
예시 코드:
DECLARE i INT64; SET i = 0; WHILE i < 10 DO SET i = i + 1; END WHILE;
5.3 동적 쿼리 실행 (EXECUTE IMMEDIATE)
EXECUTE IMMEDIATE는 동적으로 SQL 쿼리를 실행할 수 있는 기능으로, 쿼리 결과를 변수에 저장하거나 사용자 지정 작업에 활용됩니다.
DECLARE dynamic_query STRING; SET dynamic_query = 'SELECT COUNT(*) FROM `project.dataset.table`';
EXECUTE IMMEDIATE dynamic_query INTO total_count;
5.4 오류 처리 (RAISE)
BigQuery 절차적 언어에서는 RAISE를 통해 오류를 명시적으로 발생시킬 수 있습니다. 이 기능은 예외 상황을 관리하는 데 유용합니다.
예시 코드 :
DECLARE current_value INT64;
SET current_value = -5; -- 테스트를 위해 음수 값 설정
-- 값이 음수일 경우 오류를 발생시킴
IF current_value < 0 THEN
RAISE USING MESSAGE = '값이 음수일 수 없습니다: ' || CAST(current_value AS STRING);
END IF;
-- 값이 유효한 경우 처리 계속
SELECT '유효한 값입니다: ' || CAST(current_value AS STRING) AS message;
오류 처리 구문은 사용해 본 적 없지만, Python의 try, except 구문과 유사한 역할인 것 같네요 -!
이외, 🙌 더 자세한 내용은 카일스쿨님 블로그 및 인프런 Bigquery(SQL) 활용편 강의에서 만나볼 수 있습니다.
데비즈 인스타그램 : @dataviz_easy (스스로 성장하는 모습을 기록하며 정보도 공유하려고 합니당-!)
데비즈 이메일 : dataviz.easy@gmail.com