Backend/Oracle DB
[Oracle DB] 서브쿼리
howdyoon
2023. 3. 13. 23:14

서브쿼리
- SQL문 속 또 다른 SQL문
- 테이블내에서 다시 한번 쿼리문에 의해 행 조회 및 검색
SELECT 절 | 스칼라 서브쿼리 (Scalar Subquery) |
FROM 절 | 인라인 뷰 (Inline View) |
WHERE 절, HAVING 절 | 중첩 서브쿼리 (Nested Subquery) |
· 스칼라 서브쿼리(Scalar Subquery)
주로 SELECT 절에 위치하지만 컬럼이 올 수 있는 대부분 위치에 사용할 수 있음
컬럼 대신 사용되므로 반드시 하나의 값만을 반환해야 하며 그렇지 않은 경우 에러를 발생시킴
· 인라인 뷰(Inline View)
FROM 절 등 테이블명이 올 수 있는 위치에 사용 가능
· 중첩 서브쿼리(Nested Subquery)
WHERE 절과 HAVING 절에 사용 가능
중첩 서브쿼리는 메인 쿼리와의 관계에 따라 나눌 수 있음
비연관 서브쿼리 | 메인 쿼리와 관계를 맺고 있지 않음 (서브쿼리 내에 메인 쿼리의 컬럼이 존재하지 않음) |
연관 서브쿼리 | 메인 쿼리와 관계를 맺고 있음 (서브쿼리 내에 메인 쿼리의 컬럼 존재) |
--국어점수의 평균을 조회하시오
select kor from sungjuk order by kor desc;
select avg(kor) from sungjuk;
select round(avg(kor),0) from sungjuk; --66
select round(avg(kor),0) as avg_kor from sungjuk;
문1) 국어점수 평균(66)보다 잘한 국어 점수를 조회하시오
select uname, kor from sungjuk where kor>=66;
select uname, kor from sungjuk where kor>=(select round(avg(kor),0) from sungjuk);
문2) 서울지역의 국어점수 평균보다 잘한 지역, 이름, 국어점수를 조회하시오
--서울 지역의 국어점수 평균을 구하시오
select kor from sungjuk where addr='Seoul';
select avg(kor) from sungjuk where addr='Seoul'; --72.5
select round(avg(kor),0) from sungjuk where addr='Seoul'; --73
select addr, uname, kor from sungjuk where kor>=73;
select addr, uname, kor
from sungjuk
where kor>=(select round(avg(kor),0) from sungjuk where addr='Seoul');
문3) 서울지역의 국어점수 평균보다 잘한 국어점수가 다른 지역에 있는지 조회하시오
-- 문2) 결과값에서 서울지역을 제외하시오
select addr, kor, uname
from sungjuk
where kor>=73
and addr <> 'Seoul'; -- addr != 'Seoul' 동일
select addr, kor, uname
from sungjuk
where kor>=(select round(avg(kor),0) from sungjuk where addr='Seoul')
and addr <> 'Seoul'; -- addr != 'Seoul' 동일
문4) 국어점수의 최소값보다 이하 점수가 수학 또는 영어점수에 있는지 조회하시오
--국어 점수의 최소값
select min(kor) from sungjuk; --20
select uname, kor, eng, mat
from sungjuk
where mat<=20 or eng<=20;
select uname, kor, eng, mat
from sungjuk
where mat<=(select min(kor) from sungjuk)
or eng<=(select min(kor) from sungjuk);