참고
2020-08-25-01)서브쿼리.sql
2020-08-26-01)서브쿼리예.sql
서브쿼리
- ★ 서브쿼리에서 중요한 점: 메인쿼리와 서브쿼리에 들어갈 내용 구별하는 것!
- 서브쿼리는 지문은 짧고, 코드는 길다. 분할해서 검산하고 실행하는게 중요
- ()안에 기술
서브쿼리 분류
1. 연관성 여부
연관성 없는 서브쿼리
- 메인쿼리와 서브쿼리에 사용된 테이블이 조인으로 연결되지 않은 서브쿼리
연관성 있는 서브쿼리
2. 형태별 분류
일반 서브쿼리 (SELECT)
인라인 서브쿼리 (FROM)
- 제일먼저실행됨, 독립적실행이가능해야함
- 첫번째로 실행되기때문에 다른 절의 도움을 받을 수 없음)
- SELECT,WHERE은 독립적이지 않아도됨, FROM절과 연계해서 실행될 수 있기때문
중첩 숴브쿼리 (WHERE)
3. 반환 값의 갯수에 따라
단일행/단일열
단일행/다중열
다중행/단일열
다중행/다중열
예시
1. 회원테이블에서 평균마일리지보다 많은 마일리지를 보유한 회원의 회원번호, 회원명, 직업, 마일리지를 조회하시오
- 1) 메인쿼리: 조회할 내용 - 회원의 회원번호, 회원명, 직업, 마일리지
- 2) 서브쿼리: 비교할 대상 - 평균마일리지
연관성 없는 서브쿼리 사용시
- 서브쿼리 실행결과:
- 전체 실행결과: 회원이 10만명이면 10만번 돌아감
인라인 서브쿼리 사용시
결과 같음
- 전체 실행결과:
2. 부서테이블에서 상위부서코드가 NULL인 부서에 소속된 사원수를 조회하시오
연관성 없는 서브쿼리: 거의 사용 안됨
- (메인) 사원테이블에서 사원수를 조회
- '=' 쓸 경우
- (서브) 상위부서코드가 NULL인 부서
- (결합)
- (결과)
3. 각 부서의 평균급여를 계산하고 각 부서에서 자기 부서의 평균급여보다 많은 급여를 지급받는 직원이 있는 부서코드와 부서명을 출력
연관성 있는 서브쿼리
- 메인쿼리와 서브쿼리에 사용된 테이블이 조인으로 연결된 서브쿼리
- (메인) 부서코드와 부서명을 출력
- (서브) 자기 부서의 평균급여보다 많은 급여를 지급받는 직원이 있는 부서의 부서코드
- (Subquery of Subquery) 자기 부서의 평균 급여
- (결합)
- (결과)
4. 장바구니 테이블에서 회원별 최고구매수량을 가진 자료의 회원번호, 장바구니번호, 상품번호, 구매수량을 조회하시오
연관성 있는 서브쿼리
- (메인) 회원번호, 장바구니번호, 상품번호, 구매수량을 조회
- (서브) 회원별 최고 구매수량
- (결합)
- (결과)
- 다른 품목을 같이 많이 산 경우 중복 출력되서 총 30행
5. 사원테이블의 사원급여를 아래 조건대로 변경하시오
- 조건
- 사원이 소속된 부서의 상위부서가 90번인 부서
- 상위부서 90에 속한 부서의 각 부서의 평균급여를 계산
- 상위부서 90에 속한 부서에 속한 사원의 급여를 자신의 부서 평균 급여로 변경
- (상위부서가 90번인 부서에 속한 사원)
- (UPDATE문에 필요: 상위부서가 90번인 부서에 속한 사원의 평균급여)
- (UPDATE로 결합)
- UPDATE의 WHERE절 매우 중요! 없으면 전체다 업데이트됨
- (검증)
6. 모든 거래처별 2005년 매입정보를 조회하시오.
인라인 서브쿼리: FROM절
- 출력은 거래처코드, 거래처명, 매입금액
- (메인쿼리)
- (서브쿼리)
- (결합)
- (결과)
- OUTER JOIN 잘 작동됨 (WHERE A.BUYER_ID = B.BID(+))
문제
1. 모든 2005년도 거래처별 매출금액을 조회하시오
- 출력은 거래처코드, 거래처명, 매출액
- (메인쿼리)
- (서브쿼리)
- (결합)
- (결과)