[DB] WHERE절 SUBQUERY: 연관

젠니·2023년 6월 4일
0

데이터베이스

목록 보기
21/21

15. WHERE절 연관 서브쿼리

서브쿼리에서 메인쿼리 테이블의 값을 참조한다.
이 경우, 메인쿼리 테이블의 튜플마다 서브쿼리가 실행된다.
-> 어떻게 보면 메인쿼리 튜플을 상수화시킨다고 보면 된다.

단일값

각 팀에서 제일 키가 큰 선수들을 검색하라.

SELECT 		TEAM_ID, PLAYER_NAME, HEIGHT
FROM 		PLAYER X
WHERE 		HEIGHT = (
                            SELECT 	MAX(HEIGHT)
                            FROM 	PLAYER Y
                            WHERE 	Y.TEAM_ID = X.TEAM_ID
)
ORDER BY 	TEAM_ID;

서브쿼리 안에서, 메인쿼리의 첫번째 튜플(X.TEAM_ID)이 고정되고, 그 튜플에 대해서 서브쿼리를 돌린다. Y.TEAM_ID = K02인 튜플을 선택한다. 선택된 서브쿼리의 튜플에 대해서 MAX 값을 구한다. 그게 메인쿼리의 HEIGHT 와 같다면 출력한다.

그 다음, 메인쿼리의 두번째 튜플의 TEAM_ID=K01이 고정되고, 서브쿼리에서 계산하고, 메인쿼리에서 해당 값을 출력한다.

다중값

브라질 혹은 러시아 출신 선수가 있는 팀을 검색하라.

SELECT 	TEAM_ID, TEAM_NAME
FROM 	TEAM T
WHERE 	TEAM_ID = ANY (
                        SELECT 	TEAM_ID
                        FROM 	PLAYER P
                        WHERE 	P.TEAM_ID = T.TEAM_ID AND
                        (P.NATION = '브라질' OR P.NATION = '러시아')
);

ANY를 사용해서 단일값을 다중값처럼 사용했다.

다중행

20120501부터 20120502 사이에 경기가 열렸던 경기장을 조회하라.

SELECT 	STADIUM_ID ID, STADIUM_NAME 경기장명
FROM 	STADIUM ST
WHERE 	EXISTS (
                  SELECT 1
                  FROM SCHEDULE SC
                  WHERE SC.STADIUM_ID = ST.STADIUM_ID AND
                  SC.SCHE_DATE BETWEEN '20120501' AND '20120502'
);

EXISTS는 항상 연관 서브쿼리에서만 사용되고, 조건을 만족하는 튜플이 여러개더라도 만족하는 1개 튜플만 찾으면 추가적인 검색을 하지 않는다.

포지션이 'GK'인 선수들을 검색하라.

SELECT 	TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
		BACK_NO 백넘버, HEIGHT 키
FROM 	PLAYER X
WHERE 	EXISTS (
                   SELECT *
                   FROM PLAYER Y
                   WHERE Y.PLAYER_ID = X.PLAYER_ID AND Y.POSITION = 'GK'
);

연관 서브쿼리와 조인의 차이

데이터를 최종 출력할 때 A에서도 뽑고 B에서도 몇개 뽑으면 조인을 사용한다.
반대로, 한쪽에서만 뽑으면 서브쿼리를 사용한다.

profile
젠니의 개발 라이푸우

0개의 댓글