Data/Oracle

[Oracle] 서브쿼리

100winone 2019. 11. 13. 11:35

학교에서 한창 SQL을 했을 때는 잘한다고 생각했는데 또 한동안 안쓰다보니 다 까먹었다...

쿼리는 항상 필요하니까 다시 공부를 해보도록 하자

 

SELECT ( SELECT ~ ) : 스칼라 서브쿼리

FROM  ( SELECT ~ ) : 인라인 뷰

WHERE 뒤에 ( SELECT ~ ) : 서브쿼리

 

서브쿼리를 사용시에는 ORDER BY를 쓰지 않는다!

순서는 메인쿼리의 마지막 문장에서 정렬해준다!

 

1. 단일 행 서브쿼리

Q. 달콤비스킷을 생산한 제조업체가 만든 제품들의 제품명과 단가를 검색해보자

 

SELECT 제품명, 단가
  FROM 제품
 WHERE 제조업체 = (SELECT 제조업체
                    FROM 제품
                   WHERE 제품명 = '달콤비스킷');

단일 행 서브쿼리는 반환 값이 하나일때만 '='을 사용해서 가능하다!

 

2. 다중 행 서브쿼리

-IN-

Q. chicken 고객이 주문한 제품의 제품명과 제조업체를 검색해보자

SELECT 제품명, 제조업체
  FROM 제품
 WHERE 제품번호 IN (SELECT 주문제품
                     FROM 주문
                    WHERE 주문고객 = 'chicken');

다중 행 서브쿼리는 반환되는 값이 다중 값일 때 IN을 서브쿼리에 이용한다.

chicken 고객이 주문한 제품이 p01, p04, p06일 때, 위 아래 쿼리문이 같은 의미가 되는 것이다.

SELECT 제품명, 제조업체
  FROM 제품
 WHERE 제품번호 IN ('p01', 'p04', 'p06')

 

-ALL-

Q. 대한식품이 제조한 모든 제품의 단가보다 비싼 제품의 제품명, 단가, 제조업체를 검색해보자

SELECT 제품명, 단가, 제조업체
  FROM 제품
 WHERE 단가 > ALL(SELECT 단가
 	            FROM 제품
                   WHERE 제조업체 = '대한식품');

-EXISTS-

Q. 2019년 3월 15일에 제품을 주문한 고객의 고객이름을 검색해보자

SELECT 고객이름
  FROM 고객
 WHERE EXISTS (SELECT *
                 FROM 주문
                WHERE 주문일자 = '2019-03-15'
                      AND 주문.주문고객 = 고객.고객아이디);

 

 

다중 행 부속 질의문 사용 가능 연산자

연산자 설명
IN 일치 하는 것이 있으면 검색조건이 참
NOT IN 일치 하는 것이 없으면 검색조건이 참
EXISTS 하나라도 존재하면 검색조건 참
NOT EXISTS 하나라도 존재하지 않으면 검색조건 참
ALL 비교 결과 모두 참인 검색조건 리턴(비교연산자와 사용)
ANY/SOME 비교 결과 하나라도 참인 검색조건 리턴(비교연산자와 사용)