1. 서브쿼리와 공통 테이블 표현식 (CTE)
서브쿼리
서브쿼리는 SQL 쿼리 내에 포함된 또 다른 쿼리를 의미합니다. 주로 데이터 필터링이나 조건 설정을 위해 사용되며, 복잡한 데이터를 단순화하는 데 유용합니다. 서브쿼리는 여러 유형으로 나뉘며, 주요 유형으로는 스칼라 서브쿼리, 다중 행 서브쿼리, 상관 서브쿼리가 있습니다.
- 스칼라 서브쿼리: 단일 값을 반환합니다.
- 다중 행 서브쿼리: 여러 행을 반환하며 IN 연산자와 함께 사용됩니다.
- 상관 서브쿼리: 메인 쿼리의 값을 참조하여 실행됩니다.
예시: 평균 급여보다 높은 급여를 받는 직원 조회
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
위 예제는 내부 서브쿼리를 통해 평균 급여를 계산하고, 이를 기준으로 외부 쿼리에서 필터링합니다. 이는 데이터 필터링 작업을 간단하면서도 강력하게 처리할 수 있도록 해줍니다.
서브쿼리는 복잡한 데이터를 처리하는 데 있어서 필수적인 도구로, 특히 중첩된 데이터를 효율적으로 조회하는 데 강점을 보입니다. 다양한 시나리오에 맞는 서브쿼리를 작성해 보는 연습이 필요합니다.
공통 테이블 표현식 (CTE)
CTE는 임시 결과 집합을 생성하여 여러 번 참조하거나 복잡한 논리를 단순화할 때 유용합니다. 특히 재귀적 쿼리 작성 시 큰 이점을 제공합니다. 재귀 CTE를 사용하면 계층적 데이터 구조를 쉽게 처리할 수 있습니다. CTE는 쿼리를 읽기 쉽고 관리하기 쉽게 만들어주며, 코드의 재사용성을 높이는 데 큰 역할을 합니다.
예시: 직원과 매니저 관계 조회
WITH EmployeeHierarchy AS (
SELECT employee_id, name, manager_id
FROM employees
)
SELECT e.name AS EmployeeName, m.name AS ManagerName
FROM EmployeeHierarchy e
LEFT JOIN EmployeeHierarchy m ON e.manager_id = m.employee_id;
이 예제에서는 EmployeeHierarchy
라는 CTE를 정의하여 데이터를 정리한 후, 이를 활용하여 직원과 매니저의 관계를 출력합니다. 복잡한 계층 구조를 효율적으로 분석할 수 있습니다.
또한, CTE는 긴 쿼리를 작은 조각으로 나누어 처리하기 때문에 가독성을 크게 향상시킵니다. 이를 통해 코드의 유지보수가 쉬워지고, 데이터 분석에 필요한 논리를 더 직관적으로 표현할 수 있습니다.
2. 윈도우 함수
윈도우 함수는 데이터 집계와 분석 작업을 지원하며, 특정 행이 속한 "윈도우" 내에서 계산을 수행합니다. 이 기능은 그룹별 집계 이상의 작업을 가능하게 하며, 순위 계산, 이동 평균, 누적 합계 등을 손쉽게 처리할 수 있습니다. 데이터를 한 번에 처리하면서도 각 행에 대한 개별 분석을 가능하게 하여, 더 깊이 있는 분석을 수행할 수 있습니다.
기본 구문
SELECT column1,
SUM(column2) OVER (PARTITION BY column3 ORDER BY column4) AS window_sum
FROM table_name;
이 구문을 통해 각 행에 대해 지정된 "윈도우" 내에서 원하는 계산을 수행할 수 있습니다. PARTITION BY
는 데이터를 그룹화하는 기준을 제공하며, ORDER BY
는 각 그룹 내에서 데이터를 정렬합니다.
실용적인 예제
순위 매기기
학생 성적 데이터를 기반으로 순위를 매깁니다.
SELECT 이름, 점수, RANK() OVER (ORDER BY 점수 DESC) AS 순위
FROM 성적테이블;
위 쿼리는 순위가 동일한 점수에 대해 동일한 순위를 부여합니다. 이를 통해 성적을 공정하게 비교할 수 있습니다. 이와 같은 순위 계산은 경쟁 기반 평가에서 매우 유용합니다.
이동 평균 계산
최근 3개월 판매량의 이동 평균을 계산합니다.
SELECT 날짜, 판매량,
AVG(판매량) OVER (ORDER BY 날짜 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 이동_평균
FROM 판매기록;
ROWS BETWEEN
절을 사용하면 지정된 범위 내에서 평균값을 계산할 수 있습니다. 이는 시계열 데이터를 분석할 때 특히 유용하며, 비즈니스 의사 결정에서 과거 데이터를 기반으로 한 미래 예측에 활용됩니다.
누적 합계
월별 판매 데이터의 누적 합계를 구합니다.
SELECT 월, 총판매액,
SUM(총판매액) OVER (ORDER BY 월) AS 누적_합계
FROM 월별판매;
누적 합계는 비즈니스 성과를 월별로 분석할 때 강력한 도구입니다. 이를 통해 데이터의 전체적인 추세를 파악할 수 있으며, 특정 시점에서의 성과를 비교할 수 있습니다.
3. 집계 및 집합 연산자
집계 함수
집계 함수는 데이터를 요약하는 데 사용되며, 그룹화된 데이터에 대해 통계를 제공합니다. 데이터베이스의 구조화된 정보를 빠르게 분석할 수 있습니다. 집계 함수는 대량의 데이터를 간결하게 요약할 수 있는 강력한 도구로, 데이터베이스 관리와 비즈니스 인텔리전스에 필수적입니다.
예시: 부서별 직원 수와 평균 급여 계산
SELECT 부서, COUNT(*) AS 직원수, AVG(급여) AS 평균급여
FROM 직원
GROUP BY 부서;
이 예제는 각 부서의 인적 자원 정보를 요약하여 효율적으로 관리할 수 있게 합니다. 이를 통해 부서별 리소스 배분을 최적화할 수 있습니다.
집합 연산자
집합 연산자는 SELECT 결과를 결합하여 새로운 결과를 만듭니다. 데이터 통합 및 분석에서 필수적인 역할을 합니다. 이 연산자들은 서로 다른 테이블 간의 데이터를 결합하거나 비교하는 데 특히 유용합니다.
- UNION: 두 결과를 합칩니다 (중복 제거).
SELECT 이름 FROM 고객A UNION SELECT 이름 FROM 고객B;
- INTERSECT: 공통된 데이터를 반환합니다.
SELECT 이름 FROM 고객A INTERSECT SELECT 이름 FROM 고객B;
- EXCEPT: 첫 번째 결과에서 두 번째 결과를 제외합니다.
이러한 연산자는 여러 데이터 소스를 통합하여 비즈니스 인사이트를 도출하는 데 도움을 줍니다. 이를 통해 데이터의 관계를 분석하고, 중복되거나 누락된 데이터를 손쉽게 처리할 수 있습니다.SELECT 이름 FROM 고객A EXCEPT SELECT 이름 FROM 고객B;
4. 동적 SQL 및 매개변수화 쿼리
동적 SQL
실행 시간에 생성되는 SQL로, 유연성이 높지만 보안에 주의가 필요합니다. 동적 SQL은 복잡한 조건을 다룰 때 적합하며, 애플리케이션에서 자주 사용됩니다. 동적 SQL을 사용하면 데이터 구조나 쿼리 조건이 유동적인 경우에도 쉽게 대응할 수 있습니다.
예시: 동적으로 부서별 직원 조회
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM Employees WHERE DepartmentId = ' + CAST(@DeptId AS NVARCHAR(10));
EXEC sp_executesql @sql;
위 예제는 사용자 입력값을 기반으로 SQL 쿼리를 동적으로 생성하여 실행합니다. 하지만 보안 위험을 줄이기 위해 매개변수화된 동적 SQL을 사용하는 것이 권장됩니다.
매개변수화 쿼리
SQL 인젝션을 방지하고 성능을 향상시키는 안전한 쿼리 작성 방법입니다. 이를 통해 코드와 데이터 간 경계를 명확히 하여 보안을 강화할 수 있습니다. 매개변수화 쿼리는 데이터베이스 애플리케이션의 안전성과 신뢰성을 높이는 핵심 기술입니다.
예시: 매개변수를 사용한 직원 조회
DECLARE @DeptId INT;
SET @DeptId = 1;
SELECT *
FROM Employees
WHERE DepartmentId = @DeptId;
매개변수화 쿼리는 데이터베이스 내에서 동일한 쿼리 실행 계획을 재사용하므로 성능 또한 향상됩니다.
결론
고급 SQL 쿼리 기능은 데이터베이스 분석 및 처리에서 중요한 역할을 합니다. 서브쿼리와 CTE는 복잡한 데이터 논리를 단순화하고, 윈도우 함수는 고급 분석 작업을 지원하며, 집계 및 집합 연산자는 데이터를 요약 및 결합하는 데 유용합니다. 마지막으로, 동적 SQL과 매개변수화 쿼리는 유연성과 보안을 제공합니다.
이러한 기능을 적절히 활용하면 더 효율적이고 가독성 높은 SQL 코드를 작성할 수 있습니다. 다양한 예제를 통해 연습하고 실무에서 적용하며, 데이터베이스의 강력한 가능성을 탐구해 보세요. 데이터 중심 의사 결정을 지원하는 데 있어 SQL의 역할은 점점 더 중요해지고 있으며, 이를 완벽히 이해하는 것은 현대 비즈니스 환경에서 필수적입니다!
'데이타베이스 > SqlServer' 카테고리의 다른 글
데이터베이스 설계: 효율성, 성능, 데이터 무결성의 균형 (0) | 2025.01.25 |
---|---|
SQL Server 성능 최적화: 인덱스, 실행 계획, 쿼리 모니터링, 잠금 문제 해결 (0) | 2025.01.24 |
SQL Server 프로그래밍: 저장 프로시저, 트리거, 사용자 정의 함수 통합 가이드 (0) | 2025.01.24 |
SQL Server 관리의 모든 것: 에이전트, 유지 관리 계획, 모니터링 및 튜닝 (0) | 2025.01.24 |
SQL Server의 고가용성과 복제: 로그 전달, 데이터베이스 미러링, 클러스터링 및 복제 (0) | 2025.01.24 |