SQL 서브쿼리 사용 방법 (테이블 연결)

A 테이블에 있는 값과 B 테이블에 있는 값을 합쳐서 출력해야 하는 경우가 있습니다. 테이블을 연결해야 합니다. 이럴 때 쿼리 안에 또 다른 쿼리를 넣어서 SQL 구문을 만듭니다. 이를 서브쿼리라고 합니다.

서브쿼리란?

서브쿼리(subquery)는 다른 SQL 쿼리 내에서 실행되는 쿼리입니다. 주로 메인 쿼리 실행에 필요한 데이터를 제공하거나 복잡한 조건을 필터링하는 데 사용됩니다. 서브쿼리는 괄호로 둘러싸여 있습니다. select, from, where, insert, update 등 구문에서 모두 사용됩니다.

 

서브쿼리 사용 이유

1. 여러 단계를 거쳐야 하는 복잡한 데이터 조작을 수행할 수 있게 해줍니다. 예를 들어, 다른 테이블에서 가져온 결과를 기반으로 데이터를 선택하거나 수정할 때가 그렇습니다.

 

2. 다른 쿼리의 결과에 따라 데이터를 필터링하는데 사용될 수 있습니다. 특정 조건을 만족하는 행을 선택하거나, 특정 기준을 충족하는 그룹을 식별하는데 유용합니다.

 

3. 복잡한 쿼리를 더 이해하기 쉽고 관리하기 쉬운 부분으로 분리합니다.

 

서브쿼리 예시

아래의 테이블 구조에서 여러 가지 서브쿼리 예시를 확인해 보겠습니다.

  • departments
  • employees
  • salaries

 

departments
departments 테이블

 

employees 테이블
employees 테이블

 

salaries 테이블
salaries 테이블

 

예시 1) SELECT 문

select 문에서 서브쿼리는 한 행과 한 열만 반환해야 합니다.

 

각 직원의 평균 급여를 반환하는 쿼리는 아래와 같습니다.

SELECT EmployeeName, (SELECT AVG(Salary) FROM Salaries WHERE Salaries.EmployeeID = Employees.EmployeeID) AS AverageSalary
FROM Employees;

 

select 서브쿼리

 

위 쿼리에서 WHERE Salaries.EmployeeID = Employees.EmployeeID 구문은 Salaries 테이블과 Employees 테이블을 연결합니다. Salaries 테이블과 Employees 테이블에 공통적으로 존재하는 EmployeeID라는 식별값을 기준으로 직원의 급여를 가져오는 역할을 합니다. 이처럼 서브쿼리는 여러 테이블을 이어서 결과를 도출하고 싶을 때 유용하게 사용됩니다.

 

예시 2) FROM 문

FROM 문에서 서브쿼리는 일시적인 테이블을 생성하는 데 사용됩니다.

 

마찬가지로 각 직원의 평균 급여를 반환하는 쿼리입니다. 결과는 같지만 쿼리 구성이 다릅니다.

SELECT EmployeeName, AverageSalary
FROM Employees, (SELECT EmployeeID, AVG(Salary) AS AverageSalary FROM Salaries GROUP BY EmployeeID) AS EmpSalaries
WHERE Employees.EmployeeID = EmpSalaries.EmployeeID;

 

from 문 서브쿼리

 

예시 3) WHERE 문

WHERE 문에서의 서브쿼리는 특정 조건을 기반으로 데이터를 필터링하는 데 사용됩니다.

 

급여가 50000 이상인 직원의 이름을 반환하려면 아래와 같이 사용할 수 있습니다. Employees 테이블에는 급여 정보가 없고, Salaries 테이블에는 직원의 이름 정보가 없기 때문에 두 테이블을 연결해서 결과를 도출합니다.

SELECT EmployeeName
FROM Employees
WHERE EmployeeID IN (SELECT EmployeeID FROM Salaries WHERE Salary > 50000);

 

where 문 서브쿼리

 

예시 4) INSERT 문

급여가 100000 이상인 직원을 HighPaidEmployees 테이블에 따로 삽입하는 쿼리는 아래와 같습니다. Employees 테이블의 EmployeeID와 Salaries의 EmployeeID를 기준으로 연결했습니다.

INSERT INTO HighPaidEmployees (EmployeeID, EmployeeName)
SELECT EmployeeID, EmployeeName
FROM Employees
WHERE EmployeeID IN (SELECT EmployeeID FROM Salaries WHERE Salary > 100000);

 

insert 문 서브쿼리

 

예시 5) UPDATE 문

급여가 30000 미만인 직원들의 부서를 Sales로 변경하는 경우 아래의 쿼리를 사용할 수 있습니다.

UPDATE Employees
SET DepartmentID = (SELECT DepartmentID FROM Departments WHERE Name = 'Sales')
WHERE EmployeeID IN (SELECT EmployeeID FROM Salaries WHERE Salary < 30000);

 

update 서브쿼리

 

반응형

댓글

Designed by JB FACTORY