본문 바로가기
DataBase

[postgreSQL] ANY 연산자, ALL 연산자,EXISTS 연산자

by 바까 2021. 9. 15.
반응형
--6)ANY 연산자
--값을 서브 쿼리에 의해 반환된 값 집합과 비교한다. ANY 연산자는 서브쿼리의 값이 어떠한 값이라도
--만족을 하면 조건이 성립된다.

SELECT TITLE, LENGTH
FROM FILM F 
WHERE LENGTH >= ANY					--영화 분류별 사영시간이 가장 긴 영화의 제목 
(									--및 상영시간을 구함.
	SELECT MAX(LENGTH)				--영화 분류별 상영시간이 가장 긴 상영시간을 구함
	FROM FILM A, FILM_CATEGORY B 
	WHERE A.FILM_ID = B.FILM_ID
	GROUP BY B.CATEGORY_ID
);

--ANY가 없다면?SQL에러가 발생한다.
--이경우에 서브쿼리의 반환되는 집합은 단 한건이어야 한다.

SELECT TITLE, LENGTH
FROM FILM F 
WHERE LENGTH >= 			
(									
	SELECT MAX(LENGTH)				
	FROM FILM A, FILM_CATEGORY B 
	WHERE A.FILM_ID = B.FILM_ID
	GROUP BY B.CATEGORY_ID
);

--=ANY의 사용(IN과 동일)

SELECT TITLE, LENGTH
FROM FILM F 
WHERE LENGTH = ANY					--영화 분류별 싱영시간이 가장 긴 영화의 제목 
(									--및 상영시간을 구함.
	SELECT MAX(LENGTH)				--영화 분류별 상영시간이 가장 긴 상영시간을 구함
	FROM FILM A, FILM_CATEGORY B 
	WHERE A.FILM_ID = B.FILM_ID
	GROUP BY B.CATEGORY_ID
);

SELECT TITLE, LENGTH
FROM FILM F 
WHERE LENGTH IN						--영화 분류별 상영시간이 가장 긴 영화의 제목 
(									--및 상영시간을 구함.
	SELECT MAX(LENGTH)				--영화 분류별 상영시간이 가장 긴 상영시간을 구함
	FROM FILM A, FILM_CATEGORY B 
	WHERE A.FILM_ID = B.FILM_ID
	GROUP BY B.CATEGORY_ID
);

 

--7)ALL 연산자
--값을 서브 쿼리에 의해 반환된 값 집합과 비교한다. 
--서브쿼리의 모든 값이 만족을 해야만 조건이 성립된다.

SELECT TITLE, LENGTH
FROM FILM F 
WHERE LENGTH >= ALL					--영화 분류별 상영시간이 가장 긴 영화의 모든 상영시간	
(									--보다 크거나 같아야만 조건 성립
	SELECT MAX(LENGTH)				--영화 분류별 상영시간이 가장 긴 상영시간을 구함
	FROM FILM A, FILM_CATEGORY B 
	WHERE A.FILM_ID = B.FILM_ID
	GROUP BY B.CATEGORY_ID
);--상영시간이 가장 긴 영화는 185인 것을 알 수 있다.

SELECT ROUND(AVG(LENGTH),2)		--영화 상영 길이의 평균 값
FROM FILM F GROUP BY RATING;	--평가 기준으로

SELECT FILM_ID, TITLE, LENGTH
FROM FILM F 
WHERE LENGTH > ALL 				--평가기준 평균값들보다
(								--상영시간이 긴 영화정보 출력
	SELECT ROUND(AVG(LENGTH),2)
	FROM FILM 
	GROUP BY RATING 
)
ORDER BY LENGTH ;
--7)EXISTS 연산자
--서브쿼리 내에 집합이 존재하는지 존재여부만을 판단한다.
--존재 여부만을 판단하므로 연산 시 부하가 줄어든다
--정말 많이 사용. 중요중요중요

SELECT FIRST_NAME, LAST_NAME
FROM CUSTOMER C 							--고객중에서
WHERE 
EXISTS (									--지불내역이
	SELECT 1								--여기서 1은 TRUE값인듯
	FROM PAYMENT P 
	WHERE P.CUSTOMER_ID = C.CUSTOMER_ID
	AND P.AMOUNT >11						--11달러 추가한 고객이있는지
	)
ORDER BY FIRST_NAME, LAST_NAME ;
--해당 집합이 존재하기만 하면 더이상 연산을 멈추므로 성능상 유리함

--NOT EXISTS연산자
SELECT FIRST_NAME, LAST_NAME
FROM CUSTOMER C 							--고객중에서
WHERE 
NOT EXISTS (								--지불내역이
	SELECT 1
	FROM PAYMENT P 
	WHERE P.CUSTOMER_ID = C.CUSTOMER_ID
	AND P.AMOUNT >11						--11달러 추가한적이 없는
	)
ORDER BY FIRST_NAME, LAST_NAME ;
반응형

댓글