본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Subquery; 서브쿼리, 하위 질의
다른 SQL 문 안에 괄호로 감싸 넣은 SELECT 문
  • 바깥 질의를 주 질의(main query), 안쪽을 부속 질의라 한다.
  • SELECT, FROM, WHERE, HAVING 절 어디에나 올 수 있다. 놓이는 자리에 따라 이름이 다르다.
위치 이름 쓰임
SELECT 절 스칼라 서브쿼리 행마다 값 하나를 만들어 컬럼처럼 쓴다
FROM 절 인라인 뷰 결과 집합을 임시 테이블처럼 쓴다
WHERE·HAVING 절 중첩 서브쿼리 조건을 만든다
구분 내용
비연관(non-correlated) 부속 질의가 바깥 질의의 컬럼을 쓰지 않는다. 한 번만 실행된다
연관(correlated) 부속 질의가 바깥 질의의 컬럼을 참조한다. 바깥의 행마다 실행된다
-- 연관 부속 질의: 부서별 최고 급여를 받는 사원
SELECT ename FROM Emp e1
 WHERE sal = (SELECT MAX(sal) FROM Emp e2 WHERE e1.deptno = e2.deptno);

`e2` 쪽 질의가 바깥의 `e1.deptno` 를 쓰므로 사원 한 명마다 다시 계산된다.

다중 행 연산자

편집 원본 편집

부속 질의가 행을 여러 개 돌려주면 `=` 로 비교할 수 없다. 다음을 쓴다.

연산자 뜻
IN 결과 중 하나와 같으면 참
ANY(SOME) 결과 중 어느 하나에 대해 참이면 참. `> ANY` 는 최솟값보다 크면 참
ALL 결과 전부에 대해 참이어야 참. `>= ALL` 은 최댓값 이상이면 참
EXISTS 결과가 한 행이라도 있으면 참

`>= ALL` 과 `= MAX(...)` 는 같은 결과를 낸다. 반면 `>= ANY` 는 최솟값 이상이기만 하면 참이므로 전혀 다른 결과가 나온다. 이 둘을 바꿔 놓은 지문이 자주 나온다.

  • 부속 질의는 반드시 괄호로 감싼다.
  • 부속 질의 안에서는 ORDER BY 를 쓰지 않는 것이 원칙이다(인라인 뷰와 TOP-N 은 예외).
  • 같은 결과를 조인으로도 쓸 수 있는 경우가 많다. 어느 쪽이 빠른지는
 옵티마이저가 정한다.