SQL Advanced Queries

서브쿼리 (Subqueries)

서브쿼리는 하나의 쿼리 내에서 다른 쿼리를 포함하는 것입니다. 서브쿼리는 주 쿼리의 SELECT, WHERE, FROM, HAVING 절 내에서 사용될 수 있으며, 복잡한 데이터 조회를 가능하게 합니다.

SELECT 절 내의 서브쿼리

서브쿼리를 SELECT 절에 사용하여 계산된 값을 조회할 수 있습니다.

예제: 서브쿼리를 이용한 총 급여 조회

SELECT Name, Salary, 
       (SELECT AVG(Salary) FROM Employees) AS AverageSalary
FROM Employees;

이 쿼리는 각 직원의 이름과 급여를 조회하며, 서브쿼리를 사용하여 전체 직원의 평균 급여를 함께 반환합니다.

WHERE 절 내의 서브쿼리

서브쿼리를 WHERE 절에 사용하여 조건에 맞는 데이터를 필터링할 수 있습니다.

예제: 특정 급여 이상의 직원 조회

SELECT Name, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);

이 쿼리는 Employees 테이블에서 급여가 전체 평균 급여보다 높은 직원의 이름과 급여를 조회합니다.

FROM 절 내의 서브쿼리

서브쿼리를 FROM 절에 사용하여 결과를 가상 테이블로 사용할 수 있습니다.

예제: 서브쿼리로 집계된 결과 조회

SELECT DepartmentID, AVG(Salary) AS AverageSalary
FROM (SELECT DepartmentID, Salary FROM Employees) AS SubQuery
GROUP BY DepartmentID;

이 쿼리는 서브쿼리를 사용하여 집계된 부서별 평균 급여를 조회합니다.

윈도우 함수 (Window Functions)

윈도우 함수는 결과 집합의 각 행에 대해 계산을 수행하며, 집계와 분석을 위한 강력한 도구입니다. OVER 절을 사용하여 윈도우 함수를 적용합니다.

ROW_NUMBER

ROW_NUMBER 함수는 결과 집합의 각 행에 대해 고유한 순번을 할당합니다.

예제: 순위별 직원 목록 조회

SELECT Name, Salary,
       ROW_NUMBER() OVER (ORDER BY Salary DESC) AS Rank
FROM Employees;

이 쿼리는 직원의 급여를 기준으로 내림차순 정렬하고, 각 직원에게 순위를 매깁니다.

RANK

RANK 함수는 결과 집합에서 동순위가 있을 경우, 같은 순위를 할당하고 다음 순위는 건너뛰어 지정합니다.

예제: 동순위를 가진 급여 목록 조회

SELECT Name, Salary,
       RANK() OVER (ORDER BY Salary DESC) AS SalaryRank
FROM Employees;

이 쿼리는 직원의 급여를 기준으로 내림차순 정렬하고, 동순위가 있을 경우 같은 순위를 부여합니다.

SUM

SUM 함수는 집계된 결과를 윈도우 함수와 함께 사용할 수 있습니다. 특정 범위의 합계를 계산할 수 있습니다.

예제: 급여의 누적 합계 계산

SELECT Name, Salary,
       SUM(Salary) OVER (ORDER BY Salary) AS CumulativeSalary
FROM Employees;

이 쿼리는 직원의 급여를 누적하여 각 직원의 급여와 해당 급여까지의 총합을 계산합니다.

복잡한 조인 (Complex Joins)

복잡한 조인은 두 개 이상의 테이블을 결합하여 보다 정교한 데이터를 조회하는 방법입니다. SELF JOIN, OUTER APPLY, CROSS APPLY와 같은 고급 조인 기법이 포함됩니다.

SELF JOIN

SELF JOIN은 같은 테이블을 두 번 이상 조인하여 자기 자신과 연결하는 것입니다. 일반적으로 자기 자신과의 관계를 조회하는 데 사용됩니다.

예제: 상사와 부하 직원 조회

SELECT e1.Name AS EmployeeName, e2.Name AS ManagerName
FROM Employees e1
INNER JOIN Employees e2 ON e1.ManagerID = e2.EmployeeID;

이 쿼리는 직원과 그 직원의 상사를 조회합니다. Employees 테이블을 두 번 조인하여 직원과 그들의 상사 정보를 반환합니다.

OUTER APPLY

OUTER APPLY는 각 행에 대해 오른쪽 테이블의 집합을 반환하는데 사용됩니다. 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다.

예제: 최신 주문을 포함한 고객 목록 조회

SELECT c.CustomerID, c.CustomerName, o.OrderID, o.OrderDate
FROM Customers c
OUTER APPLY (SELECT TOP 1 OrderID, OrderDate 
             FROM Orders 
             WHERE Orders.CustomerID = c.CustomerID 
             ORDER BY OrderDate DESC) o;

이 쿼리는 각 고객과 해당 고객의 최신 주문을 조회합니다. OUTER APPLY를 사용하여 최신 주문 정보를 반환합니다.

CROSS APPLY

CROSS APPLY는 각 행에 대해 오른쪽 테이블의 집합을 반환하며, 왼쪽 테이블의 각 행과 오른쪽 테이블의 집합을 결합합니다.

예제: 최근 3개의 주문을 포함한 고객 목록 조회

SELECT c.CustomerID, c.CustomerName, o.OrderID, o.OrderDate
FROM Customers c
CROSS APPLY (SELECT TOP 3 OrderID, OrderDate
             FROM Orders
             WHERE Orders.CustomerID = c.CustomerID
             ORDER BY OrderDate DESC) o;

이 쿼리는 각 고객의 최근 3개의 주문을 조회합니다. CROSS APPLY를 사용하여 각 고객에 대한 여러 주문 정보를 반환합니다.

기타 질의 기법 (Other Query Techniques)

UNION

UNION 연산자는 두 개 이상의 쿼리 결과를 결합합니다. 결과는 중복을 제거한 상태로 반환됩니다.

예제: 두 부서의 직원 목록 결합

SELECT Name FROM Employees WHERE DepartmentID = 1
UNION
SELECT Name FROM Employees WHERE DepartmentID = 2;

이 쿼리는 부서 1과 부서 2의 모든 직원 이름을 결합하여 반환합니다.

INTERSECT

INTERSECT 연산자는 두 쿼리 결과에서 공통된 행만을 반환합니다.

예제: 두 부서에 동시에 속하는 직원 목록 조회

SELECT Name FROM Employees WHERE DepartmentID = 1
INTERSECT
SELECT Name FROM Employees WHERE DepartmentID = 2;

이 쿼리는 부서 1과 부서 2 모두에 속하는 직원의 이름을 반환합니다.

EXCEPT

EXCEPT 연산자는 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과를 제외한 데이터를 반환합니다.

예제: 부서 1에 속하지만 부서 2에는 속하지 않는 직원 목록 조회

SELECT Name FROM Employees WHERE DepartmentID = 1
EXCEPT
SELECT Name FROM Employees WHERE DepartmentID = 2;

이 쿼리는 부서 1에 속하지만 부서 2에는 속하지 않는 직원의 이름을 반환합니다.

결론 (Conclusion)

SQL 고급 질의는 복잡한 데이터 분석 및 조작을 가능하게 하는 강력한 도구입니다. 서브쿼리, 윈도우 함수, 복잡한 조인, 기타 질의 기법을 통해 다양한 데이터 패턴을 분석하고, 복잡한 데이터 관계를 처리할 수 있습니다. 이러한 기법을 사용하면 데이터베이스에서 더 많은 통찰력을 얻고, 보다 정교한 보고서와 분석을 생성할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *