ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 비교 결과 하나라도 참인 검색조건 리턴(비교연산자와 사용)

     

Designed by Tistory.