SUBQUERY란 SQL 명령문 안에 지정하는 하부 SELECT이다.
예를들어
SELECT * FROM players WHERE playerID = 'strevelun';
playerID가 strevelun인 것만 players 테이블에서 가져와서 모든 열 정보를 출력하는 코드인데, 저 부분을 하드코딩 하지 않고 유동적으로 조건에 맞는 데이터를 가져오게 할 경우 아래와 같이 작성할 수 있다.
SELECT *
FROM players
WHERE playerID = (SELECT TOP 1 playerID FROM salaries);
즉 괄호 안의 SELECT 문이 SUBQUERY인 것이고 salaries 테이블로부터 한 개의 playerID를 선택한 후 Results와 같이 하나의 playerID를 가져와서 대입해주는 것을 볼 수 있다.
여러 행을 가져온 경우 = 대신 IN을 써야한다.
이렇게 20개의 playerID 열만 담긴 행들을 가져와서 가져온 playerID를 players 테이블에서 찾은 다음 모든 열을 출력해주는 것을 볼 수 있다.
SUBQUERY는 WHERE에서 가장 많이 사용되지만 다른 부분에서도 사용 가능하다.
예를들어 INSERT에서도 사용할 수 있는데 salaries 테이블에서 가장 높은 연봉을 추출해낸 다음 ferland라는 사람에게 그 연봉을 설정해준다고 하자.
그러면 위와 같이 결과물을 확인할 수 있다.
강의에서 소개한 상관관계 서브쿼리는 EXISTS와 NOT EXISTS 두 가지.
EXISTS는 서브쿼리에서 조건을 만족하는 것이 존재할때 결과를 가져와서 뿌려주고, 그렇지 않으면 아무것도 출력해주지 않는다.
상관관계 서브쿼리란 메인쿼리(players)의 열 중 하나(players.playerID)가 서브쿼리의 조건(WHERE battingpost.playerID = players.playerID)에 이용되며, 서브쿼리의 결과는 메인쿼리로 반환되어 실행된다. 그래서 아래와 같이 서브쿼리만 실행하려고 하면 에러가 뜨는 것을 볼 수 있다.