SQL 정리 - (2)

집합 연산자와 서브쿼리

  • 집합 연산자
    • union all 중복되는 값 같이 보여줌
    • intersect는 inner join과 효과가 같음
    • except a집합 - b집합
  • 서브 쿼리
    • 서브쿼리
    • 인라인뷰(from절에 들어간거)
    • any
    • all
    • exists

  • union all

SELECT *

FROM SALES2007_1

UNION ALL

SELECT *

FROM SALES2007_2

ORDER BY AMOUNT DESC;


  • except

–전체영화에서 SELECT FILM_ID , TITLE

FROM FILM

EXCEPT –재고가 존재하는 영화를 뺀다

SELECT DISTINCT INVENTORY.FILM_ID , TITLE

FROM INVENTORY

INNER JOIN FILM ON FILM.FILM_ID = INVENTORY.FILM_ID

ORDER BY TITLE; –결과집합 은 재고가 존재하지 않는 영화다.


  • 서브쿼리

SELECT FILM_ID , TITLE , RENTAL_RATE

FROM FILM

WHERE RENTAL_RATE > (

SELECT

AVG (RENTAL_RATE)

FROM FILM );

  • 인라인뷰

SELECT A.FILM_ID , A.TITLE , A.RENTAL_RATE

FROM FILM A , (

SELECT

AVG(RENTAL_RATE) AS AVG_RENTAL_RATE

FROM FILM ) B

WHERE A.RENTAL_RATE > B.AVG_RENTAL_RATE ;


  • any

SELECT TITLE, LENGTH

FROM FILM

WHERE LENGTH = ANY (

SELECT MAX(LENGTH)

FROM FILM A

, FILM_CATEGORY B

WHERE A.FILM_ID = B.FILM_ID

GROUP BY B.CATEGORY_ID );


  • exists 해당 집합이 존재하기만 하면 더이상 연산을 멈추므로 성능상 유리함.

SELECT FIRST_NAME , LAST_NAME

FROM CUSTOMER C

WHERE

EXISTS ( SELECT *

FROM PAYMENT P

WHERE P.CUSTOMER_ID = C.CUSTOMER_ID

AND P.AMOUNT > 11 )

ORDER BY FIRST_NAME, LAST_NAME;


  • group by 안하고 사용할려면 분석함수 사용

SELECT A.FILM_ID, A.TITLE, A.RENTAL_RATE

FROM (

SELECT A.FILM_ID, A.TITLE, A.RENTAL_RATE, AVG(A.RENTAL_RATE) OVER() AS AVG_RENTAL_RATE

FROM FILM A ) A

WHERE A.RENTAL_RATE > A.AVG_RENTAL_RATE;

  • Referneces

    • 패스트캠퍼스 sql강의

Comments