(1) Subquery
(2) Scalar Subquery
Subquery는 하나의 SQL 쿼리문 안에 포함되어 있는 또 다른 SQL 쿼리문을 말한다. 메인쿼리가 서브쿼리를 포함하는 종속적인 관계로 서브쿼리는 복잡한 데이터 검색이나 특정 조건에 맞는 데이터를 추출할 때 사용된다.
서브쿼리는 메인쿼리의 칼럼 사용이 가능하다. 서브쿼리는 메인쿼리 내의 쿼리에서 실행되며 메인쿼리의 칼럼을 참조하여 조건을 설정하거나 연산을 수행할 수 있다.
메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다. 메인쿼리는 서브쿼리의 내부에서 정의된 칼럼이나 값을 직접 참조할 수 없다는 것이다.
Subquery 는 메인쿼리 내에서 괄호로 묶어서 사용해야 하며 단일 행 혹은 복수 행 비교 연산자와 함께 사용이 가능하다.
subquery에서는 값을 정렬하는 order by를 사용할 수 없다.
Subquery의 종류로는 Scalar Subquery, 인라인 뷰(Inline View), 중첩 서브쿼리 (Nested Subquery) 가 있다.
스칼라 서브쿼리(Scalar Subquery)는 SQL에서 사용되는 서브쿼리의 한 종류로, 단일 값(스칼라 값)을 반환하는 서브쿼리이다. 스칼라 서브쿼리는 일반적으로 SELECT, WHERE, HAVING 등 다양한 SQL 구문 내에서 사용될 수 있고, 하나의 값만 반환되므로 결과가 하나의 Column 이어야만 하는 단일 값이 필요한 곳에 삽입될 수 있다.
기본적으로는 스카라 서브쿼리 (Scalar Subquery)는 SELECT 절에 많이 사용한다.
# 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회
mysql> SELECT case_number,
(SELECT AVG(case_number)
FROM crime_status
WHERE crime_type LIKE '강도' AND status_type LIKE '검거') avg
FROM crime_status
WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거';
메인쿼리 : 서울은평경찰서의 강도 검거 건수
#서울은평경찰서의 강도 검거 건수 SELECT case_number, ... FROM crime_status WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거';
SELECT case_number, ...:crime_status테이블에서case_number열을 선택한다.
FROM crime_status: 데이터를 조회할 테이블은crime_status이다.
WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거':case_number열에서 아래의 조건들을 만족하는 값을 모두 가진 행을 선택해 조회한다.police_station이 '은평'인 행crime_type이 '강도'인 행status_type이 '검거'인 행
서브쿼리 : 서울시 경찰서 전체의 평균 강도 검거 건수
#서울시 경찰서 전체의 평균 강도 검거 건수 (SELECT AVG(case_number) FROM crime_status WHERE crime_type LIKE '강도' AND status_type LIKE '검거') avg
>
- `SELECT AVG(case_number)`: `crime_status` 테이블에서 `case_number` 열의 평균 값을 계산한다.
<br>
- `FROM crime_status`: 데이터를 조회할 테이블은 `crime_status` 이다.
> <br>
- `WHERE crime_type LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거'`: `case_number` 열에서 아래의 조건들을 만족하는 값을 모두 가진 행을 선택해 조회한 후 해당하는 행들 의 값을 모아 `case_number` 열의 평균을 구한다.
- `crime_type`이 '강도'인 행
- `status_type`이 '검거'인 행
<br>
**출력 결과**
```sql
# 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회
mysql> SELECT case_number,
(SELECT AVG(case_number)
FROM crime_status
WHERE crime_type LIKE '강도' AND status_type LIKE '검거') avg
FROM crime_status
WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거';
+-------------+-------+
| case_number | avg |
+-------------+-------+
| 1 | 4.1935|
+-------------+-------+
1 row in set (0.02 sec)