본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[내일배움캠프 32일차 TIL] SQL - 서브쿼리(Subquery)

 

 

서브쿼리
한 쿼리 내에 포함된 또 하나의 쿼리

 

서브쿼리는 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다. 서브쿼리는 항상 괄호로 감싸서 표현된다.

서브쿼리는 복잡한 연산을 간소화하여 코드의 가독성을 올려주기도 하고, 데이터를 필터링 하기 위해 사용하기도 한다.

 

 

다음의 문제를 살펴보자

 

문제는 여기!

 

 

문제를 풀기 위해 음식 종류별로 가장 많은 즐겨찾기를 알아야 한다. 따라서 해당 부분을 서브 쿼리로 만들어서 조건에 넣어주는 방식으로 풀 것이다. 먼저 서브쿼리를 다음과 같이 구성할 수 있다

 

SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE

 

출력결과는 다음과 같다

 

 

이 서브 쿼리를 이용하여 조건을 준 후에 원하는 컬럼과 정렬을 하면 문제의 답을 얻을 수 있다.

코드는 다음과 같이 작성할 수 있다

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN
(SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC

 


 

 

서브쿼리의 장점

 

1. 쿼리를 구조화시켜 쿼리의 각 부분을 명확시 구분할 수 있게 해 준다

2. 복잡한 join이나 union과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다

3. 코드의 가독성을 올려준다

 

 

 

 

서브쿼리의 분류

 

단일 행 서브쿼리

- 서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때 쓰는 서브쿼리

- 서브쿼리의 결과 건수가 반드시 1건 이하여야 한다

 

다중 행 서브쿼리

- 서브쿼리의 결과가 2건 이상 반환된다면 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 한다

- 서브쿼리의 실행 결과가 여러 건이다.

 

다중 컬럼 서브쿼리

- 서브쿼리의 실행 결과로 여러 컬럼을 반환한다

- 메인쿼리의 조건절에 여러 칼럼을 동시에 비교할 수 있다

- 서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼의 개수와 컬럼의 위치가 동일해야 한다

 

연관 서브쿼리

- 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리

- 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용한다

 

비연관 서브쿼리

- 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태의 서브쿼리

- 메인쿼리에 값을 제공하기 위한 목적으로 주로 사용된다.

 

인라인 뷰; Inline View

- from 절에 나타는 서브쿼리

- 무조건 as 별칭을 지정해주어야 함

 

스칼라 서브쿼리; Scalar Subquery

- select 절에 나타는 서브쿼리

- 다른 테이블의 값을 가져올 때 사용

- 하나의 레코드만 리턴이 가능하며, 두 개 이상의 레코드는 리턴 할 수 없다

- 일치하는 데이터가 없더라도 null값을 리턴할 수 있다