스칼라 서브쿼리

유영·2024년 10월 23일
0

MYSQL

목록 보기
21/26

스칼라 서브쿼리

select 절에서 사용하는 서브쿼리
scalar는 "한번에 한가지만 처리하는" 이라는 뜻을 가지고 있다.
즉 scalar 서브쿼리에서 나오는 결과는 "하나의 행"이어야 한다.

스칼라 값 : 일반적인 서브쿼리의 패턴에는 네종류가 있음
1. 하나의 값을 반환하는 패턴
SELECT MIN(열명) FROM 테이블명;
복수의 행이 반환되지만 열은 하나인 패턴
2. SELECT 열명 FROM 테이블명;
하나의 행이 반환되지만 열이 복수인 패턴
3. SELECT MIN(열명),MAX(열명) FROM 테이블명;
복수의 행, 복수의 열이 반환되는 패턴
4. SELECT 열1,열2 FROM 테이블명;
이중 하나의 값을 반환하는 패턴의 경우 이때의 값은 단일 값 혹은 스칼라 값이라고 불림

SELECT 구에서 하나의 열을 지정하고 그룹화를 하지 않은 경우
WHERE 조건으로 하나의 행만 검색한 경우
스칼라 값을 반환하는 서브쿼리는 =연산자로 비교할 수 있음
스칼라값을 반환하는 서브쿼리를 스칼라 서브쿼리라고 부르며, 스칼라 서브쿼리는 WHERE구에 사용할 수 있기 때문에 집계함수를 사용해 집계한 결과를 조건식으로 사용할 수 있음

순서 : 메인 쿼리 -> 서브 쿼리 순으로 동작

스칼라 서브쿼리 사용시 서브쿼리의 결과값이 같은 경우가 많거나,
매번 동일한 결과값을 반환한다면, 스칼라 서브쿼리의 캐싱 효과를 통해 성능을 높일 수 있으나,
서브쿼리에서 사용되는 조건의 종류가 많아지거나 혹은 조건 데이터가 지속적으로 바뀔 경우
캐싱의 효율성이 떨어지기 때문에 이전보다 성능이 떨어질 수 있습니다.

위 예시 쿼리는 매번 서브 쿼리가 수행될 때마다 s.business_number(pk)가 달라지기 때문에 성능이 좋지 않은 모습을 볼 수 있었는데요.

위와 같은 서브쿼리의 성능을 개선하기 위해 LEFT OUTER JOIN에 인라인 뷰를 포함 시킬 수 있습니다.

SELECT s.business_number, IFNULL(i.count,0)
FROM stores s
LFET OUTER JOIN (SELECT COUNT(*) count, business_number
				   FROM interest_store
				   GROUP BY business_number) i
ON s.business_number = i.business_number

SELECT절에 있던 서브쿼리의 구문을 LEFT OUTER JOIN으로 옮긴 모습을 볼 수 있는데,
각 업체마다 좋아요 count를 확인할 수 있어야했기 때문에 GROUP BY절을 사용했습니다.

0개의 댓글