DB/postgres

postgresql - dvdrental 실습(3)

@예민한 방구석여포 힘히힘 2021. 2. 25. 15:47
반응형

*패스트캠 퍼스~ 패스트캠 퍼스~ *

 

 

 

-----실습3
--flim 테이블을 한번만 scan 하여 동일한 결과 집합을 구하는 SQL을 작성하라.

 

SELECT film_id
	   ,title
	   ,rental_rate
	 FROM film
	 WHERE rental_rate >
	 (
	   SELECT avg(rental_rate)
	     FROM film
	  )
;

인라인뷰나 서브쿼리를 사용하여 작성하라는 의미인듯!

 

현재 여기 보면 from 에서 film을 여러번 읽음 -> 작업을 줄여줄 필요가 있음 . 굳이 같은 것 두번 읽지 않아도 되니까!

 

 

SELECT film_id
       ,title
       ,rental_rate
  from( 
       SELECT film_id
       		 ,title
       		 ,rental_rate
       		 ,avg(a.rental_rate) OVER () AS avg_rental_rate
  		FROM film a
  	  ) A
   WHERE rental_rate > avg_rental_rate
;

인라인뷰를 사용하여 작업해줌.

 

인라인뷰  from 절 다음에 한 덩어리 넣어준 것.

( ) 처리하고 뒤에 alias 별칭 붙여줘야함!

 

 

--위에껏을 from film으로 두 번 필름 테이블을 읽여 들였지만, 인라인뷰로 감싸니 한번만 읽어도 된다!
--인라인뷰 만들때 먼저 필요한 부분 한 덩어리 만든후에 그걸 ( ) 로 감싸고 위 아래로 main쿼리 작성하면 좀 쉬워진다!

 

 

 

 

 

--실습 4
--재고가 없는 영화를 구하고 있다. 어떻게 구할까?

 

--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;

제외하고 뽑아주는것.

집합 생각하면 편하다.  A-B

 

 

 

 

--NOT EXIST 문을 사용하여 재고 존재하는 집합은 FILM 집합에서 제외시킴.

 SELECT film_id, title
    FROM film a
    WHERE NOT EXISTS (
    	      SELECT *
    	      FROM inventory b, film c
    	      WHERE b.film_id =c.film_id
    	      AND a.film_id=c.film_id
    	      )
  ;

where를 붙여줘야함!! 

 

 

 SELECT film_id, title
    FROM film a
    WHERE NOT EXISTS (
    	      SELECT 1
    	      FROM inventory b
    	      WHERE 1=1
    	      AND a.film_id=b.film_id
    	      )
  ;

결과는 같다.

하지만 select 1과 where 1=1 을 제대로 이해 못했다....

 

조금 찾아보니, 

 

 

 

select 1 from ~

 

select 절에 1이 오는 것은 해당 테이블의 숫자만큼 1의 행을 만들어 내는 것!

(해당 테이블 행 갯수 N -> N개의 행 반환)

1은 TRUE의 의미.

값의 존재 유무를 파악할 때 사용!

WHERE 조건문과 함께 사용하면 해당조건을 만족할때 1을 반환

 

 

WHERE (NOT) EXISTS 안의 SELECT 문에서 사용된다는!

 

 

/// 아직 넘 어렵다 ㅜ 정확히 이해 안됬지만, 추후 더 정리할 내용있으면 내용 덧붙이기로!

 

'DB > postgres' 카테고리의 다른 글

postgresql - dvdrental 실습(6)  (0) 2021.03.11
postgresql - dvdrental 실습(5)  (0) 2021.03.10
postgresql - dvdrental 실습(4)  (0) 2021.03.09
postgresql - dvdrental 실습(3)  (0) 2021.02.25
postgresql - dvdrental 실습(2)  (0) 2021.02.24
postgresql - dvdrental 실습(1) (Roll-up)  (0) 2021.02.24
1 2 3 4 5 6 7 8