[SQL] 6. SubQuery
2021.02.22 update by 슬픈앙마류
SubQuery 정의
상위 query를 해결하기 위한 nested query
- 상기 예제에서 “Scott의 급여”를 알 수 있다면 “Scott 보다 많은 급여를 받는 사람”을 알 수 있다.
“Scott보다 급여를 많이 받는 사람은?” 이 main query이며 “Scott의 급여는 얼마인가?”는 SubQuery에 해당
1. SubQuery의 사용
- WHERE 절에 있는 SubQuery는 먼저 실행
- SubQuery의 결과는 Main query의 조건 절을 만족
1) SubQuery를 사용할 수 있는 절
- WHERE 절
- HAVING 절
- FROM 절
2) SubQuery의 사용 지침
- 괄호로 묶는다.
- operator의 우측에 위치
- ORDER BY 절을 삽입하지 않음(Oracle 8 버전 이하)
2. Main query의 조건 절
SubQuery의 결과와 조건절의 피연산자가 적절한 연산이 될 수 있도록 연산자와 피연산자를 정해준다.
“Scott 보다 급여를 많이 받는 사람은?” 이 Main query이므로 급여를 비교해서 조건 절을 완성할 수 있다.
SubQuery의 결과 값은 3000이고 Main query의 조건 절에서 ‘급여가 3000보다 많다’라는 것을 명시하면 된다.
1) SubQuery의 유형에 따라 연산자의 선택에 주의할 필요가 있다.
- Single-row Subquery : 결과 값이 상기 예제와 같이 하나의 행으로 출력 ( 연산자: =, >, >=, <, <=, <> )
- Multi-row Subquery : 결과 값이 여러 행으로 출력 ( 연산자: IN, ANY, ALL )
3. HAVING 절의 SubQuery
그룹 함수를 사용할 경우 HAVING 절을 이용해서 SubQuery를 사용
- 아래 예제는 평균 급여가 manager 보다 많은 job을 출력
SubQuery에서 manager의 평균 급여를 구하고 HAVING 절에서 조건을 비교한 후 job 별로 그룹을 묶어 출력
4. Multi-row SubQuery
SubQuery의 결과 값이 2개 이상인 경우를 생각해보자.
각 job 별 최소 급여를 받는 직원을 구하는 예가 여기에 해당된다.
Multi-row SubQuery의 경우는 반환하는 결과 값이 2개 이상이므로 일반 비교 연산자를 사용할 수 없다.
SubQuery에서 반환되는 5개의 job 별 최소 급여 중에서 사원들의 급여와 동일한 값을 찾으면 job 별 최소 급여를 받는 직원을 알 수 있다. 여러 개의 값 중에서 일치하는 값을 찾는 비교 연산자는 ‘IN’을 사용한다.
5. IN Operator 주의사항
아래 두 예제를 비교하여 살펴보자
- 첫 번째 예제는 SubQuery에서 manager 들을 뽑은 다음 그들의 이름을 출력하는 SQL 문이다.
- 두 번째 예제는 manager를 제외한 나머지 사원들의 이름을 출력하기 위해서 작성된 SQL 문이다.
- 두 번째 SQL 문의 결과는 manager를 제외한 나머지 사원들이 예상되나 선택된 row는 없다.
그 이유는 mgr column 중에서 null을 포함하고 있는 값이 있기 때문에 원하는 결과를 얻기 위해서는 null 값을 대치하는 NVL 함수를 사용해야 한다. (NOT IN 연산자는!=ALL과 동치)
- 두 번째 예제는 아래처럼 수정하여야 원하는 결과가 출력된다.
6. FROM 절의 SubQuery
FROM 절에서 새로운 view를 만들고 alias를 부여
상기 예제는 각 부서의 평균 급여보다 많은 급여를 받는 사원들을 구하는 SQL 문이다.
FROM 절에 SELECT 문을 사용해서 괄호로 묶은 다음 alias를 부여한다.
생성된 view는 하나의 독립적인 테이블처럼 사용되며 이러한 view를 Inline view라고 한다.
“파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음"
[SQL] 3. Function
2021.02.19 update by 슬픈앙마류 기본적인 문법에 대해서 어는 정도 이해하셨을 것으로 생각합니다. 이번 게시물은 함수의 활용입니다. [SQL] 온라인에서 SQL 실행 TEST하기 2021.02.16 update by 슬픈앙마류 S
nindo.tistory.com
[SQL] 4. Joins
2021.02.22 update by 슬픈앙마류 Join의 활용 - 두 개 이상의 Table, View, 혹은 Materialized View를 조합해서 하는 Query - Join 조건은 Where 절에서 작성하며, 서로 다른 테이블에서 두 개의 column을 비교 -..
nindo.tistory.com
[SQL] 5. Aggregate Function
2021.02.22 update by 슬픈앙마류 Aggregate Function(집계 함수) - 그룹 함수 혹은 집계함수라고도 한다. - 일반적인 함수와는 달리 여러 행을 그룹 단위로 하나의 행으로 결과를 출력한다. 1. 기본적인 사용
nindo.tistory.com
[SQL] 온라인에서 SQL 실행 TEST하기
2021.02.16 update by 슬픈앙마류 SQL 공부를 하고자 하여도 DB 설치나 개발 환경이 여의치 않아 시작조차 못하시는 분들을 위해 온라인에서 무료로 SQL 실행을 지원하는 사이트가 있으니 포기하지 마시
nindo.tistory.com