데이터베이스 연구실.log

스칼라 서브쿼리

한 행에서 한 값만 돌려주는 스칼라 서브쿼리를 SELECT 절과 HAVING 절에 쓰는 방법과, 같은 테이블을 여러 번 읽는 스칼라 서브쿼리를 줄이는 실습의 SQLP 과제

스칼라 서브쿼리scalar subqueryHAVING 서브쿼리SELECT 절 서브쿼리

#핵심 요약

스칼라 서브쿼리는 딱 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 절

SQL Developer 또는 SQL*Plus조회만 함
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 절

SQL Developer 또는 SQL*Plus조회만 함
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 주관식으로 자주 나왔음

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal, (SELECT SUM(sal), MAX(sal), MIN(sal), COUNT(*) FROM emp)
  FROM emp;

결과 해석: 스칼라 서브쿼리가 값을 네 개 돌려주려 하므로 실행되지 않음

실습의 방법: 네 값을 하나의 문자열로 이어 한 값으로 만든 뒤 바깥에서 SUBSTR로 잘라냄

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal,
       (SELECT SUM(sal) || MAX(sal) || MIN(sal) || COUNT(*) FROM emp) 통계치
  FROM emp;

결과 해석:

설명: 실제 업무에서는 데이터가 계속 들어와 값의 길이가 바뀔 수 있으므로, RPAD로 각 값을 일정한 길이로 채운 뒤 이어 붙여야 항상 같은 자리에서 잘라낼 수 있음
이 과제는 수업 자료에서 이수자 평가 문제로도 쓰였음

#사용 조건과 주의사항

서브쿼리가 0행을 돌려줄 때와 2행 이상일 때의 동작은 확인 불가

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기