본문 바로가기
DBMS/Oracle

[SELECT] SUBQUERY

by 로햐 2021. 11. 11.

Ⅰ. SUBQUERY의 기초

SUBQUERY란? : 메인 쿼리를 보조하는 쿼리. SELECT 절에서는 사용할 수 없다.

 

단일행 서브쿼리 : 서브쿼리의 결과값이 1행 * 1열 : 일반 비교 연산 가능

--전체 학생의 수학 점수 평균 보다 수학 점수가 높은 학생의 이름
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>(SELECT AVG(MATH) FROM STUDENT);

다중행 서브쿼리 : 서브쿼리의 결과값이 N행 * 1열 : IN/NOT IN, 비교연산자 + ANY/ALL

--운동부의 영어 점수와 동일한 수학 점수를 가진 사람
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH IN (SELECT ENGLISH FROM STUDENT WHERE CLUB='운동부');

--운동부의 어느 수학 점수보다(가장 작은 점수보다)는 수학 점수가 높은 학생의 이름
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>ANY(SELECT MATH FROM STUDENT WHERE CLUB='운동부');

--운동부의 모든 수학 점수보다(가장 큰 점수보다)도 수학 점수가 높은 학생의 이름
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>ALL(SELECT MATH FROM STUDENT WHERE CLUB='운동부');

다중열 서브쿼리 : 서브쿼리의 결과값이 1행 * N열 : 순서쌍

SELECT STUDENT_NAME
FROM STUDENT
WHERE (MATH, SCIENCE) = (SELECT MATH, SCIENCE              
                               FROM STUDENT
                               WHERE STUDENT_NAME='NABI');

다중행 다중열 서브쿼리 : 서브쿼리의 결과값이 N행 * N열

SELECT STUDENT_NAME, MATH, SCIENCE
FROM STUDENT
WHERE (CLUB, MATH) IN (('봉사부', 70), ('운동부', 80),
                      ('영화감상부', 90), ('미술부', 100));

 

Ⅱ. INLINE-VIEW

 

INLINE-VIEW SUBQUERY : FROM절에 서브쿼리를 사용하여 가상의 VIEW를 테이블로 사용한다.

VIEW의 특성상 컬럼명이 산술연산, 그룹함수인 경우는 메인쿼리에서 조회가 불가능하므로, 해당 부분에 별칭을 붙여 조회한다.

SELECT STUDENT_NAME
FROM (SELECT STUDENT_NAME, ENGLISH FROM STUDENT WHERE MATH > 80)
WHERE ENGLISH > 80;

ROWNUM : 행을 1부터 N번까지 순서를 매기는 방법

SELECT ROWNUM, STUDENT_NAME, MATH
FROM (SELECT STUDENT_NAME, MATH
      FROM STUDENT
      ORDER BY MATH)
WHERE ROWNUM <= 10;

RANK()는 조회와 동시에 명시한 조건으로 랭크를 매겨 출력. SELECT에서만 사용할 수 있다. 

RANK() OVER( ... ) : 특정 컬럼값의 순위를 매기는 방법. 공동 순위가 있다면 다음은 건너뛴다.

DENSE_RANK() OVER( ... ) : 공동 순위가 있어도 다음 순위가 존재.

SELECT STUDENT_NAME, RANK() OVER(ORDER BY MATH DESC) AS 등수
FROM STUDENT;

SELECT *
FROM (SELECT STUDENT_NAME, RANK() OVER(ORDER BY MATH DESC) AS 등수
FROM STUDENT)
WHERE 등수<5;--공동 3위라면 4위 존재하지 않음

SELECT *
FROM (SELECT STUDENT_NAME, DENSE_RANK() OVER(ORDER BY MATH DESC) AS 등수
FROM STUDENT)
WHERE 등수<5;--공동 3위라도 4위 존재

'DBMS > Oracle' 카테고리의 다른 글

[DML, TCL] 데이터 조작과 반영  (0) 2021.11.14
[DDL, DCL] 객체의 구조 설정과 권한  (0) 2021.11.11
[SELECT] JOIN과 집합연산자  (0) 2021.11.08
[SELECT] 기초와 함수  (0) 2021.11.07
DBMS 기초  (0) 2021.11.07