코다람쥐 2022. 4. 6. 20:12

1. 필요성

--연봉이 역대급으로 높은 선수 추출('rodrial01')
SELECT TOP 1 * 
FROM salaries
ORDER BY salary DESC

-- 추출된 값('rodrial01')을 이용해서 한 번더 SELECT 사용
SELECT *
FROM players
WHERE playerID = 'rodrial01'

SELECT로 추출한 정보를 활용하여 한 번 더 추출하려고 할 때, SELECT를 두 번 사용 해야하는 불편함이 있는데 SUBQUERY는 이 과정을 하나로 줄일 수 있다.

 

2. 단일행 사용

SELECT *
FROM players
WHERE playerID = (SELECT TOP 1 playerID FROM salaries ORDER BY salary DESC)

두 개중 하나의 SELECT를 WHERE조건 안에 집어 넣어서 한 번에 처리되게 하였다.

하지만 조건에 TOP 1이 있어서 하나의 값만 반환이 되었던반면에

TOP 20으로 고치면 여러 개의 값이 반환이 되어서 에러를 일으킨다.

 

3. 다중행 사용 ( IN )

SELECT *
FROM players
WHERE playerID IN (SELECT TOP 20 playerID FROM salaries ORDER BY salary DESC)

WHERE 안의 조건을 TOP 20으로 고쳐서 여러 개의 값이 반환되게 수정하였다.

이럴 때는 '='이 아니고 'IN'을 사용하면 각각의 반환값에 대해 중복값을 제거하여 데이터를 추출할 수 있다.

 

4. EXISTS, NOT EXISTS

-- 포스트 시즌 타격에 참여한 선수들 목록
SELECT *
FROM players
WHERE playerID IN (SELECT playerID FROM battingpost)

SELECT *
FROM players
WHERE EXISTS (SELECT playerID FROM battingpost WHERE battingpost.playerID = players.playerID)

위의 두 개의 SELECT문은 같은 결과를 출력한다.

EXISTS는 추출된 값이 존재하냐 안하냐를 따질 때 쓰인다.