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);