[SQL] : Subquery (1) / Subquery, Scalar Subquery,

김대현·2024년 6월 13일

(1) Subquery
(2) Scalar Subquery

(1) Subquery

  • Subquery는 하나의 SQL 쿼리문 안에 포함되어 있는 또 다른 SQL 쿼리문을 말한다. 메인쿼리가 서브쿼리를 포함하는 종속적인 관계로 서브쿼리는 복잡한 데이터 검색이나 특정 조건에 맞는 데이터를 추출할 때 사용된다.

  • 서브쿼리는 메인쿼리의 칼럼 사용이 가능하다. 서브쿼리는 메인쿼리 내의 쿼리에서 실행되며 메인쿼리의 칼럼을 참조하여 조건을 설정하거나 연산을 수행할 수 있다.

  • 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다. 메인쿼리는 서브쿼리의 내부에서 정의된 칼럼이나 값을 직접 참조할 수 없다는 것이다.

  • Subquery 는 메인쿼리 내에서 괄호로 묶어서 사용해야 하며 단일 행 혹은 복수 행 비교 연산자와 함께 사용이 가능하다.

  • subquery에서는 값을 정렬하는 order by를 사용할 수 없다.

  • Subquery의 종류로는 Scalar Subquery, 인라인 뷰(Inline View), 중첩 서브쿼리 (Nested Subquery) 가 있다.



(2) Scalar 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)
profile
데이터 분석 스쿨 블로그 입니다.

0개의 댓글