스칼라 서브쿼리
한 행에서 한 값만 돌려주는 스칼라 서브쿼리를 SELECT 절과 HAVING 절에 쓰는 방법과, 같은 테이블을 여러 번 읽는 스칼라 서브쿼리를 줄이는 실습의 SQLP 과제
#핵심 요약
스칼라 서브쿼리는 딱 1개의 값만 돌려줄 수 있음
공식 문서 표현으로는 한 행에서 한 컬럼 값을 돌려주는 서브쿼리이고, 식(expression)으로 쓸 수 있음
SELECT 절, HAVING 절, ORDER BY 절에 쓸 수 있음
SELECT ename, sal, (SELECT SUM(sal) FROM emp) 토탈월급 FROM emp처럼 각 행 옆에 전체 집계를 붙일 수 있음
값을 두 개 이상 돌려주는 스칼라 서브쿼리는 실행되지 않음
#개념과 동작 원리
"Scalar subqueries, which return a single column value from a single row, are a valid form of expression."
실습에서는 SELECT 문의 절별로 서브쿼리 이름을 정리했음
| 절 | 서브쿼리 |
|---|---|
SELECT |
scalar subquery |
FROM |
inline view |
WHERE |
subquery |
GROUP BY |
쓸 수 없음 |
HAVING |
scalar subquery |
ORDER BY |
scalar subquery |
#필수 명령어 또는 SQL
#HAVING 절
SELECT job, SUM(sal)
FROM emp
GROUP BY job
HAVING SUM(sal) > (SELECT SUM(sal) FROM emp WHERE job = 'SALESMAN');
SELECT job, COUNT(*)
FROM emp
GROUP BY job
HAVING COUNT(*) > (SELECT COUNT(*) FROM emp WHERE job = 'ANALYST');결과 해석: 첫 문장은 SALESMAN 월급 합계보다 합계가 큰 직업, 둘째는 ANALYST 인원보다 인원이 많은 직업임
#SELECT 절
SELECT ename, sal,
(SELECT SUM(sal) FROM emp) 토탈월급,
(SELECT MAX(sal) FROM emp) 최대월급,
(SELECT MIN(sal) FROM emp) 최소월급,
(SELECT COUNT(*) FROM emp) 인원수
FROM emp;결과 해석:
설명: 이 문장은 emp를 다섯 번 읽음
두 번만 읽도록 고치는 문제가 SQLP 주관식으로 자주 나왔음
SELECT ename, sal, (SELECT SUM(sal), MAX(sal), MIN(sal), COUNT(*) FROM emp)
FROM emp;결과 해석: 스칼라 서브쿼리가 값을 네 개 돌려주려 하므로 실행되지 않음
실습의 방법: 네 값을 하나의 문자열로 이어 한 값으로 만든 뒤 바깥에서 SUBSTR로 잘라냄
SELECT ename, sal,
(SELECT SUM(sal) || MAX(sal) || MIN(sal) || COUNT(*) FROM emp) 통계치
FROM emp;결과 해석:
설명: 실제 업무에서는 데이터가 계속 들어와 값의 길이가 바뀔 수 있으므로, RPAD로 각 값을 일정한 길이로 채운 뒤 이어 붙여야 항상 같은 자리에서 잘라낼 수 있음
이 과제는 수업 자료에서 이수자 평가 문제로도 쓰였음
#사용 조건과 주의사항
서브쿼리가 0행을 돌려줄 때와 2행 이상일 때의 동작은 확인 불가