본문 바로가기
개발자의 공부방/전공

정처기] 스칼라 서브쿼리에 대해서

by 쌈빡한 쥬니준 2021. 10. 1.
728x90
반응형

수제비 정보처리기사를 통해서 공부하는 중 정답에서 이상함을 느껴서 찾아보던 중 정리하면 괜찮을 것 같다 생각해서 아래와 같이 정리합니다.

 

해당 글을 작성하는 이유는 2회차 중에 단원종합문제에서 쿼리관련 문제때문입니다.

제 3판 2권 SQL응용, 7-80페이지의 16번 문제입니다.

 

문제 16)

FROM 절에서 도서는 A, 도서가격은 B로 별칭을 줌

SELECT 절에서 서브쿼리를 사용.

책명이 자료구조인 가격 중에서 가장 비싼 값을 도서가격 테이블에서 서브쿼리함.

...이하 생략..

 

책에 적힌 정답)

select
	(
	select 
		MAX(B.가격)
	from 도서 A
		where A.책번호 = B.책번호
	and 책명 = '자료구조'
	) as 가격
from 도서가격 B;

 

SQL 질문 ) 7-80 16번문제 책에 나온 정답이 맞는 건가요?

대한민국 모임의 시작, 네이버 카페

cafe.naver.com

위의 답글만 보시면 그냥 간단하게 아 이렇게 하는게 맞는거구나 라고 넘겨도 됩니다만...

혹시나 해서 약간의 설명을 적어봅니다.

 

정상적인 출력 정답)

SELECT
	(
	SELECT 
		MAX(B.가격)
	FROM 도서가격 B
		WHERE A.책번호 = B.책번호
	) AS 가격
FROM 도서 A
	WHERE A.책명 = '자료구조';

 

 

이제 왜 이렇게 해야는가에 설명해보겠습니다.

 

설명에 앞서 문제를 다시 확인해봅니다.

해당 문제의 목표는 가격이라는 하나의 값만을 원합니다.

SELECT 절안에 있는 서브쿼리 즉, 스칼라 서브쿼리를 해야합니다.

 

1. 첫번째 쿼리가 답이 안나오는 이유 (MySQL, ORACLE)

스칼라 서브쿼리는 서브쿼리가 처음 먼저 실행되고 난 후 그 결과 값을 갖고 메인쿼리가 동작하게 되는 원리입니다.

첫번째 쿼리 중 서브쿼리에서 where절에 B.책번호를 참조하고 있습니다. 하지만 도서 B의 책번호를 참조하려고 보니...

메인쿼리에 도서 B가 있기때문에 제대로된 값이 나오지 않은거였습니다.

 

2. 에러가 아닌 NULL이 나오는 이유는??

이 스칼라 서브쿼리는 특이한 점(특징)이 있는데요

 

1. 반드시 하나의 결과만을 리턴해야한다.

2. 일치하는 데이터가 없으면 NULL을 반환하게 된다.

3. 기본적으로 아우터조인이 적용되어 있다.

 

나열한 특징 중 OUTER JOIN과 NULL 리턴때문에 NULL 이라는 결과가 나오게 되는 것입니다.

 

이 말은 OUTER JOIN을 이용하면 두번째 정답과 같은 결과를 얻을 수 있는데요

해당 쿼리는 아래와 같습니다.

select
	max(가격) as 가격
from
	도서 A
left outer join 도서가격 B on
	A.책번호 = B.책번호;

 

그리고 여담이지만 실무에서는 NULL 보다는 숫자 등으로 반환해야 하는 경우가 있습니다.

MySQL 같은 경우에는 IFNULL 이라는 함수를 제공하는데 아래와 같이 쓸 수 있습니다.

SELECT
	IFNULL((
		SELECT 
			MAX(B.가격)
		FROM 도서가격 B
			WHERE A.책번호 = B.책번호
	), 0) AS 가격
FROM 도서 A
	WHERE A.책명 = '자료구조';

 

 

라고 카페에 글을 올림과 동시에 블로그에 정리해본다.

 

반응형

'개발자의 공부방 > 전공' 카테고리의 다른 글

정처기] 오답노트 1-1  (0) 2021.10.19
정처기] 후기  (0) 2021.10.16
정처기] 스칼라 서브쿼리에 대해서  (1) 2021.10.01
정처기] 3단원 정리  (0) 2021.09.29
정처기] 정리 중.  (0) 2021.09.27
정처기] 1단원  (0) 2021.09.24

댓글1