부속 질의
IT 위키
더 많은 작업
- 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 은 예외).
- 같은 결과를 조인으로도 쓸 수 있는 경우가 많다. 어느 쪽이 빠른지는
옵티마이저가 정한다.