서브쿼리에서 메인쿼리 테이블의 값을 참조한다.
이 경우, 메인쿼리 테이블의 튜플마다 서브쿼리가 실행된다.
-> 어떻게 보면 메인쿼리 튜플을 상수화시킨다고 보면 된다.
각 팀에서 제일 키가 큰 선수들을 검색하라.
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에서도 몇개 뽑으면 조인을 사용한다.
반대로, 한쪽에서만 뽑으면 서브쿼리를 사용한다.