-
[Oracle] 서브쿼리Data/Oracle 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 비교 결과 하나라도 참인 검색조건 리턴(비교연산자와 사용)