본문 바로가기
코딩/SQL

[MySQL] Subquery

by 미생22 2023. 3. 10.
728x90

1. Subquery

- 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다.

- 메인 쿼리가 서브쿼리를 포함하는 종속적인 관계이다

> 서브쿼리는 메인쿼리의 칼럼 사용 가능

> 메인쿼리는 서브쿼리의 칼럼 사용 불가

2. Subquery 사용 시 주의 사항

Subquery는 괄호로 묶어서 사용

단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능

subquery 에서는 order by를 사용X

3. Subquery 종류

스카라 서브쿼리 (Scalar Subquery) : select 절에 사용

인라인 뷰 (Inline View) : from 절에 사용

중첩 서브쿼리 (Nested Subquery) : where 절에 사용

4. Scalar Subquery

select 절에서 사용하는 서브쿼리, 결과는 하나의 column 이어야 한다.

select col1, (select col2 from table2 where condition)
from table1 where condition;

col1의 condition1과 col2의 condition2를 한번에 가져올 수 없는 상황인데 한번에 보고 싶을 때 주로 사용한다.

5. Inline View

From절에 사용하는 서브쿼리. 메인쿼리에서는 인라인뷰에서 조회한 col만 사용가능.

select a.column, b.column
from table1 a, (select col1, col2 from table2) b
where condition;

from에 subquery가 들어있는 경우 subquery를 하나의 테이블로 인식하고 그것을 view table이라고 한다. 즉 위의 문법에서 a 테이블과 b 테이블을 조인해서 가져오는 결과를 나타낸다.

> 예를 들어 한 col 별로 다른 col들의 조건을 보고 싶을 때 주로 사용한다.

경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회

6. Nested Subquery

Where절에서 사용하는 서브쿼리

- Single Row : 하나의 열을 검색하는 서브쿼리

- Multiple Row : 하나 이상의 열을 검색하는 서브쿼리

- Multiple Column : 하나 이상의 행을 검색하는 서브쿼리

 

6-1. Single Row

서브쿼리가 비교연산자 (=,>,>=,<>,!=,...)와 사용되는 경우, 서브쿼리의 검색결과는 한 개의 결과값을 가져야 한다. (두 개 이상인 경우 에러)

select col1 from table1
where col1=(where col2 from table2 where condition)
order by col1;

6-2. Multiple Row-IN

서브쿼리에 컬럼이 결과 중에 포함 될 때 사용. 즉  = 가 아닌 in을 사용.

in 대신 join을 사용해도 똑같은 결과!

select col11 from table1
where col IN (select col2 from table2 where condition)
order by col;

6-3. Multiple Row-Exists

서브쿼리결과에 값이 있으면 반환

select col1 from table1
where EXISTS (select col2 from table2 where condition)
order by col1;

예시)

6-4. Multiple Row-Any

서브쿼리 결과 중에 최소한 하나도 만족하면 (비교연산자 사용)

select col1 from table1
where col1=ANY (select col2 from table2 where condition)
order by col1;

예시)

6-5. Multiple Row-All

서브쿼리 결과를 모두 만족하면 (비교연산자 사용)

selec col1 from table1
where col1 = ALL (select col2 from table2 where condition)
order by col1;

7. Multi column subquery - 연관 서브쿼리

서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우

select col from table a
where (a.col1, a.col2, ...) in (select b.col1, b.col2, ... from table b where a.col = b.col)
order by col;

728x90