본문 바로가기
스터디/Oracle

[Oracle/오라클] 서브쿼리

by 홍장 2021. 4. 18.

- 서브쿼리를 괄호로 묶어야 함

- 일반적인 서브쿼리(Top-N 분석 제외) 에서는 ORDER BY절 X - FROM 절에서만 ORDER BY 가능

- 단일 비교 연산자(=, >, < 등)와 복수 행 연산자(IN, ANY, ALL)를 사용

SELECT O 조회
FROM O 테이블
WHERE O 조건
GROUP BY 사용 불가  
HAVING O 그룹
ORDER BY O 정렬
UPDATE 문 SET O  
INSERT 문 INTO O  

 

1) JONES 보다 급여가 많은 직원은? 
select * from emp;

SELECT * FROM
    emp
WHERE
    sal > (SELECT sal FROM emp WHERE ename = 'JONES');

2) K02팀 평균 키보다 큰 선수는 몇 명인가? 

select count(*)
	from player
where height >
	(select avg(height) from player where team_id ='K02');

 

3) K02팀 평균 키보다 평균 키가 큰 팀의 정보 조회

SELECT team_id, round(AVG(height), 2) team_h
FROM player 
GROUP BY team_id
HAVING AVG(height) > (SELECT AVG(height) FROM player WHERE team_id ='K02');

 

 

WHERE에서 조건이 다수 일경우 사용하는 것과 동일한 방식
ex) where empno in ('0205456', '0405456', '0205456', ...)

 

player 선수중에서 박동우 선수와 포지션이 같은 선수는?
(박동우는 동명이인으로 포지션이 2개 출력됨, TC, GK)
SELECT player_name, height, POSITION
FROM player
WHERE POSITION IN (SELECT POSITION FROM player WHERE player_name='박동우');
ANY - 서브쿼리 결과 최소 한개만 만족하면 조회 = 최소값(MIN) 보다 큰 결과 조회
SELECT player_name, team_id, height
FROM player
WHERE position <> 'FW'
AND height > any (SELECT height FROM player WHERE position='FW');
SELECT player_name, team_id, height
FROM player
WHERE position <> 'FW'
AND height > (SELECT min(height) FROM player WHERE position='FW');
ALL - 서브쿼리 결과 모두 만족 = 최대값(MAX) 보다 큰 결과 조회
SELECT player_name, team_id, height
FROM player
WHERE position <> 'FW'
AND height > ALL (SELECT height FROM player WHERE position='FW');
SELECT player_name, team_id, height
FROM player
WHERE position <> 'FW'
AND height > (SELECT max(height) FROM player WHERE position='FW');

 

서브쿼리 AND 다중 조건 조회
SELECT team_id, player_name, POSITION, height
FROM player
WHERE team_id IN (SELECT team_id FROM player
WHERE player_name IN ('샤샤', '이운재'))
AND POSITION IN (SELECT POSITION FROM player
WHERE player_name IN ('샤샤', '이운재'));

 

서브쿼리 조건은 team_id > K02, K08, and position > FW, GK 총 4개가 된다

SELECT TEAM_ID, PLAYER_NAME, POSITION, HEIGHT
FROM PLAYER
WHERE (TEAM_ID, POSITION) IN 
(SELECT TEAM_ID, POSITION FROM PLAYER WHERE PLAYER_NAME IN ('샤샤', '이운재'));

서브쿼리  SELECT 칼럼 두개(TEAM_ID, POSITION)가 모두 만족하는 값을 조건으로 조회,(서브쿼리 실행)

단, 메인쿼리 WHERE 절과 서브쿼리 SELECT 절의 칼럼 순서는 동일해야 한다.