본문 바로가기

SQLD 공부

SQLD 공부 3. SQL 활용 - 서브쿼리

1. 서브쿼리 

서브쿼리(Subquery)는 SQL 문 내에서 다른 SQL 문에 중첩되어 사용되는 쿼리입니다. 서브쿼리는 주로 데이터 검색의 복잡성을 줄이고, 쿼리의 가독성을 높이며, 단계별로 데이터를 처리하는 데 유용합니다. 서브쿼리에는 여러 종류가 있으며, 이를 사용하여 다양한 방법으로 데이터를 처리할 수 있습니다. 주요 서브쿼리의 종류는 다음과 같습니다:

### 1. 스칼라 서브쿼리(Scalar Subquery)
스칼라 서브쿼리는 단일 값(하나의 행과 하나의 열)을 반환하는 서브쿼리입니다. 일반적으로 SELECT 목록이나 WHERE 절에서 사용됩니다.

#### 예시:
```sql
SELECT emp_id, emp_name,
       (SELECT dept_name FROM departments WHERE departments.dept_id = employees.dept_id) AS dept_name
FROM employees;
```

### 2. 인라인 뷰(Inline View)
인라인 뷰는 FROM 절에 사용되는 서브쿼리로, 마치 테이블처럼 사용됩니다. 이를 통해 서브쿼리의 결과를 임시 테이블처럼 사용할 수 있습니다.

#### 예시:
```sql
SELECT emp_id, emp_name
FROM (SELECT emp_id, emp_name FROM employees WHERE dept_id = 10) AS hr_employees;
```

### 3. 다중 행 서브쿼리(Multi-row Subquery)
다중 행 서브쿼리는 여러 행을 반환하는 서브쿼리입니다. 주로 WHERE 절에서 IN, ANY, ALL 등의 연산자와 함께 사용됩니다.

#### 예시:
```sql
SELECT emp_name
FROM employees
WHERE dept_id IN (SELECT dept_id FROM departments WHERE location = 'New York');
```

### 4. 다중 열 서브쿼리(Multi-column Subquery)
다중 열 서브쿼리는 여러 열을 반환하는 서브쿼리입니다. 주로 WHERE 절에서 튜플 비교를 통해 사용됩니다.

#### 예시:
```sql
SELECT emp_name
FROM employees
WHERE (dept_id, job_id) IN (SELECT dept_id, job_id FROM job_assignments WHERE project = 'Alpha');
```

### 5. 상관 서브쿼리(Correlated Subquery)
상관 서브쿼리는 서브쿼리가 외부 쿼리의 컬럼을 참조하는 서브쿼리입니다. 각 외부 쿼리의 행에 대해 서브쿼리가 한 번씩 실행됩니다.

#### 예시:
```sql
SELECT emp_name
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE dept_id = e.dept_id);
```

### 6. EXISTS 서브쿼리
EXISTS 서브쿼리는 서브쿼리의 결과가 존재하는지 여부에 따라 TRUE 또는 FALSE를 반환합니다. 주로 EXISTS 또는 NOT EXISTS 연산자와 함께 사용됩니다.

#### 예시:
```sql
SELECT emp_name
FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.dept_id = e.dept_id AND d.location = 'New York');
```

### 서브쿼리 사용 시 고려 사항

1. **성능**: 서브쿼리는 종종 각각의 행에 대해 여러 번 실행될 수 있어 성능 저하를 초래할 수 있습니다. 따라서 필요한 경우 인덱스 최적화나 조인으로 대체하는 것이 좋습니다.
2. **가독성**: 서브쿼리를 사용하면 쿼리가 간결해질 수 있지만, 복잡한 서브쿼리는 가독성을 떨어뜨릴 수 있습니다. 이를 해결하기 위해 명확한 코딩 스타일과 주석을 사용하는 것이 좋습니다.
3. **유연성**: 서브쿼리는 다양한 상황에서 유연하게 사용될 수 있어 복잡한 데이터 검색 작업을 단순화하는 데 도움이 됩니다.

### 결론

서브쿼리는 SQL에서 데이터를 검색하고 조작하는 데 강력한 도구를 제공합니다. 각 종류의 서브쿼리는 특정 상황에 맞게 설계되어 있어, 이를 적절히 사용하면 데이터베이스 쿼리의 복잡성을 효과적으로 관리할 수 있습니다. 서브쿼리를 이해하고 활용하는 것은 데이터베이스 작업을 최적화하고, 복잡한 데이터 요구사항을 충족하는 데 매우 중요합니다.




'인라인 뷰(Inline View)
FROM 절에서 사용되는 서브쿼리를 인라인 뷰
(Inline View)라고 한다 서브쿼리의 결과가 마치 실행 시에 동적으로 생성된 테이블인 것처럼 사용할 수 있다. 인라인 뷰는 SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스에 해당 정보가 저장되지 않는다.