안녕하세요. SQLER의 코난 김대우입니다. 
이번 강좌에서는, 10-3. T-SQL 프로그래밍 - 변수, 조건문(IF-ELSE), 반복문(WHILE), CASE 표현식을 진행 하겠습니다.


SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록

 

이번에 진행할 강좌는 T-SQL 프로그래밍 - 변수, 조건문, 반복문입니다.

 

 

 

TL;DR

T-SQL 프로그래밍의 핵심 기능인 변수 선언과 사용, 조건문(IF-ELSE), 반복문(WHILE), CASE 표현식에 대해 다룹니다. COALESCE 등을 사용해 NULL 값을 처리하는 방법도 진행합니다.


모든 프로그래밍 언어에서 제공하는 변수, 조건문과 반복문을 T-SQL에서도 사용할 수 있습니다. 그럼 바로 강좌를 진행합니다.

 

 

변수(Variable)

변수 선언 및 사용

변수는 이미 저장 프로시저와 커서 강좌에서 여러 번 예제를 통해 진행했습니다. 아래와 같은 패턴으로 변수를 선언하고 사용할 수 있습니다.

DECLARE @변수명 자료형
SET @변수명 = 값
SELECT @변수명


SQL 쿼리 예제

DECLARE @Variable INT;
SET @Variable = 10;
SELECT @Variable;

 

DECLARE 하면 변수가 생성되고, 생성한 변수에 값을 대입하려면 SET 구문을 사용하며, 변수를 조회하려면 SELECT 또는 PRINT를 사용합니다.

 

 

조건문(IF - ELSE)

분기를 수행하는 조건문을 SQL에서 사용합니다. 아래와 같이 비교 구문을 다양한 형태로 이용할 수 있습니다.


IF - ELSE 구문 정보

IF Boolean_expression
     { sql_statement | statement_block }
[ ELSE
     { sql_statement | statement_block } ]


예제를 먼저 수행해 보겠습니다. 오늘 요일 정보를 가져와 주말 / 주중 출력하는 예제입니다.

 

IF-ELSE 예제

IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
    SELECT N'주말'
ELSE
    SELECT N'주중'
GO

 

좀 더 일반적인 가격에 따라 다르게 정보를 출력하는 이런 예제도 있습니다.

Use AdventureWorks;
GO

-- 해당 제품 ListPrice를 가져와 무료가 아니면 10% 할인가를 표시
IF (SELECT ListPrice FROM Production.Product WHERE Name LIKE N'Road Bottle Cage') > 0
    BEGIN
        SELECT N'This product is Not Free'
        SELECT ListPrice * 0.9 AS DiscountPrice FROM Production.Product 
            WHERE Name LIKE N'Road Bottle Cage'
    END
ELSE
    BEGIN
        SELECT N'Free product'
    END
GO

 

주의하실 점으로 IF-ELSE 분기 루틴에서 2개 이상의 처리 구문이 들어가면 반드시 BEGIN - END로 블록을 지정해 단위별로 수행해야 합니다. BEGIN - END로 묶지 않으면, 에러 또는 첫 구문만 실행될 수 있습니다.

 

 

반복문(WHILE)

다음은 반복문, WHILE입니다. 먼저 구문 정보를 보고, 예제를 살펴보겠습니다.

WHILE 문 구문 정보

WHILE Boolean_expression { sql_statement | statement_block | BREAK | CONTINUE }


WHILE 반복문 예제

임시 테이블을 하나 생성하고, 100건의 데이터를 임시 테이블에 반복하면서 넣는 예제입니다.

-- 임시 테이블 생성
CREATE TABLE #tempDummy(
idx INT,
dummy_dt DATETIME DEFAULT(GETDATE()),
dummy_str NVARCHAR(39) DEFAULT(CONVERT(NVARCHAR(39), NEWID()))
);
GO

-- 100건 데이터를 WHILE 반복문을 이용해 임시 테이블로 삽입
SET NOCOUNT ON
DECLARE @Counter INT
SET @Counter = 0
WHILE (@Counter < 100)
BEGIN
    INSERT INTO #tempDummy(idx) VALUES(@Counter)
    SET @Counter = @Counter + 1
END;
GO

-- 완료 후 데이터 조회
SELECT * FROM #tempDummy;
GO

 

중간 아래 부분의 WHILE 구문에서 조건이 나옵니다. @Counter 변수 초기값은 0이고, 100 미만일 경우에만(TRUE 일 때) WHILE 블록을 실행합니다. 임시 테이블에  INSERT를 수행하고 @Counter 변수+1을 수행해 변수 값이 100이 될 때까지 반복하게 됩니다.
WHILE 루프 안에서 종료를 할 경우 BREAK를 실행하면 반복문이 종료되고, CONTINUE는 WHILE 루프를 다시 시작합니다.

 

 

CASE 표현식(Expression)

CASE 구문은 여러 항목 비교 시 구문을 단순화할 수 있고, SELECT 뿐만 아니라, UPDATE, DELETE, ORDER BY 등에서도 사용됩니다.

CASE 구문 정보

-- 단순(simple) CASE 표현식
CASE input_expression
     WHEN when_expression THEN result_expression [ ...n ]
     [ ELSE else_result_expression ]
END

-- 검색된(searched) CASE 표현식
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ] 
END

 

단순 CASE 예제

USE AdventureWorks;
GO

SELECT 
    CASE name
        WHEN N'Bikes' THEN N'자전거'
        WHEN N'Components' THEN N'자전거부품'
        WHEN N'Clothing' THEN N'자전거의류'
    ELSE
        N'액세서리'
    END AS CategoryKorean,
    ProductCategoryID, ModifiedDate
FROM Production.ProductCategory;
GO

 

검색된(searched) CASE 예제

CASE의 WHEN 비교 조건이 TRUE일 경우 THEN 블록을 수행합니다.

USE AdventureWorks;
GO

SELECT ProductNumber,
    Name,
    "Price Range" = CASE
        WHEN ListPrice = 0 THEN N'제작 부품 - 판매 안 함'
        WHEN ListPrice < 50 THEN N'$50 미만'
        WHEN ListPrice >= 50 AND ListPrice < 250 THEN N'$250 미만'
        WHEN ListPrice >= 250 AND ListPrice < 1000 THEN N'$1000 미만'
        ELSE N'$1000 이상'
        END
FROM Production.Product
ORDER BY ProductNumber;
GO

 

CASE 표현식을 잘 사용하면 IF-ELSE 중첩을 줄일 수 있고, 간결하게 SQL 구문을 생성할 수 있습니다. 또한, SELECT 절 뿐만 아니라, UPDATE, DELETE, WHERE, ORDER BY 절, SET 문, HAVING 절에서도 다양하게 사용할 수 있습니다. 

 

 

NULLIF 표현식

NULLIF 표현식은 두 값이 같을 경우 NULL을 리턴하는 표현식입니다. NULLIF는 결과셋에서 특정 값을 출력하고 싶지 않거나 치환하고 싶을 때 사용합니다.


NULLIF 표현식 구문 정보

NULLIF(expression1, expression2)


NULLIF 예제

USE AdventureWorks;
GO

-- “safetyStockLevel(안전 재고 평균)”이 특정 값이면 NULLIF로 NULL치환
SELECT Color, 
    AVG(SafetyStockLevel) AS AVG_StockLevel, 
    NULLIF(AVG(SafetyStockLevel), 4) AS NULLIF_AVGStockLevel
FROM Production.Product
WHERE Color IS NOT NULL
GROUP BY Color;

 

위의 예제는, 4일 경우 NULL로 치환합니다. 


NULLIF는 컬럼에 빈 문자열 ‘’과 NULL값이 혼재되어 있을 경우 유용합니다. 빈 문자열을 NULL로 치환해 COALESCE 표현식으로 다음 컬럼값이 나오도록 설정할 수 있습니다. 

DECLARE @str1 NVARCHAR(10) = N'';
DECLARE @str2 NVARCHAR(10) = N'컬럼2';
SELECT(COALESCE(NULLIF(@str1, ''), @str2));

 


COALESCE 표현식

COALESCE 표현식 구문 정보

COALESCE(expression1, expression2, ….. , expressionN)


NULL이 아닌 첫 번째 값을 표현식들로부터 검색합니다. 설명이 어렵지만, 예제를 확인하면 쉽습니다. 

 

COALESCE 예제

테이블을 아래와 같이 생성하고, 표현식 앞의 컬럼부터 NULL이 아닌 값을 찾아 리턴합니다. 

USE AdventureWorks;
GO

CREATE TABLE #SalaryYear
(
emp_name NVARCHAR(10),
year2023_salary INT,
year2022_salary INT,
year2021_salary INT
);
GO

INSERT #SalaryYear(emp_name, year2023_salary, year2022_salary, year2021_salary)
    VALUES(N'김대우', 3000, 2900, 2800),
        (N'김태리', 12000, 11000, 10000),
        (N'김우빈', NULL, 12000, 11000),
        (N'박서준', NULL, NULL, 13000),
        (N'박은빈', NULL, NULL, 14000);
GO

-- COALESCE를 이용해 최근 연봉 조회
SELECT emp_name, 
    COALESCE(year2023_salary, year2022_salary, year2021_salary) AS RecentSalary
FROM #SalaryYear;
GO

 

자 이렇게 간략히 T-SQL 프로그래밍 기능에 대해 살펴보았습니다.


변수선언, IF-ELSE, WHILE 구문은 자주 사용되는 패턴입니다. 이 외에도 여러 프로그래밍 기능과 표현식이 있으니 필요할 때 차근차근 살펴보시길 바랍니다.
 

 

SQL 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 38099
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20671
2294 SQL강좌: 12-1. 인덱스 생성과 관리 - 인덱스(Index) 소개 file 코난(김대우) 2023.08.18 123
2293 SQL강좌: 11-8. 관계형 데이터베이스 이해 - 데이터베이스 구현 코난(김대우) 2023.08.18 51
2292 SQL강좌: 11-7. 관계형 데이터베이스 이해 - 데이터베이스 물리적 설계 코난(김대우) 2023.08.18 63
2291 SQL강좌: 11-6. 관계형 데이터베이스 이해 - 데이터베이스 논리적 설계 코난(김대우) 2023.08.18 49
2290 SQL강좌: 11-5. 관계형 데이터베이스 이해 - 데이터베이스 설계 요구사항(Requirements) 분석과 개념적 설계 코난(김대우) 2023.08.18 55
2289 SQL강좌: 11-4. 관계형 데이터베이스 이해 - 데이터베이스 설계 목표와 고려사항 코난(김대우) 2023.08.18 48
2288 SQL강좌: 11-3. 관계형 데이터베이스 이해 - 데이터베이스 설계 단계 file 코난(김대우) 2023.08.18 51
2287 SQL강좌: 11-2. 관계형 데이터베이스 이해 - 데이터베이스 생명주기 file 코난(김대우) 2023.08.18 53
2286 SQL강좌: 11-1. 관계형 데이터베이스 이해 - 관계형 모델 코난(김대우) 2023.08.18 72
2285 SQL강좌: 10-4. T-SQL 프로그래밍 - 공통 테이블 식(CTE-Common Table Expression) 코난(김대우) 2023.08.18 99
» SQL강좌: 10-3. T-SQL 프로그래밍 - 변수, 조건문(IF-ELSE), 반복문(WHILE), CASE 표현식 코난(김대우) 2023.08.18 92
2283 SQL강좌: 10-2. T-SQL 프로그래밍 - 일괄처리(Batch) 코난(김대우) 2023.08.18 67
2282 SQL강좌: 10-1. T-SQL 프로그래밍 - 소개 코난(김대우) 2023.08.18 69
2281 SQL강좌: 9-3. 커서 - 현업에서 커서 사용 및 주의사항 코난(김대우) 2023.08.18 102
2280 SQL강좌: 9-2. 커서 - 커서 구문 코난(김대우) 2023.08.18 69
2279 SQL강좌: 9-1. 커서(CURSOR) - 커서 소개 코난(김대우) 2023.08.18 94
2278 SQL강좌: 8-7. 저장 프로시저 - 프로시저 캐시와 RECOMPILE 코난(김대우) 2023.08.18 84
2277 SQL강좌: 8-6. 저장 프로시저 - 종속성(Dependency) 확인 코난(김대우) 2023.08.18 101
2276 SQL강좌: 8-5. 저장 프로시저 - OUTPUT 파라미터 코난(김대우) 2023.08.18 89
2275 SQL강좌: 8-4. 저장 프로시저 - 동적 SQL(Dynamic SQL)과 SQL 주입(Injection) 공격 코난(김대우) 2023.08.18 121





XE Login