안녕하세요. 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 표현식 -- 검색된(searched) CASE 표현식 |
단순 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 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.