SELECT와 WHERE의 스칼라 하위 쿼리
단일 값을 반환하는 하위 쿼리와 둘 이상의 행을 반환할 때 발생하는 오류를 알아봅니다.
SELECT와 WHERE의 스칼라 하위 쿼리은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관이 말하는 스칼라 하위 쿼리의 의미
스칼라 하위 쿼리는 정확히 한 행과 한 열을 반환하는 쿼리, 즉 하나의 값입니다. 하나의 값으로 결정되므로 SQL에서는 리터럴을 사용할 수 있는 거의 모든 곳에 이를 넣을 수 있습니다. SELECT, WHERE, HAVING, 심지어 ORDER BY에서도 사용할 수 있습니다.
- 면접관은 한 행, 한 열이라는 규칙을 알고 있는지 확인합니다.
- 고전적인 함정은 실수로 둘 이상의 행을 반환하는 하위 쿼리입니다.
이 정의를 명확하게 말할 수 있다면 첫 번째 관문은 이미 통과한 것입니다.
SELECT 목록의 스칼라 하위 쿼리
SELECT 목록에 스칼라 하위 쿼리를 넣으면 계산된 하나의 값을 모든 결과 행에 덧붙일 수 있습니다. 여기서는 각 직원 옆에 회사 전체의 평균 급여를 표시합니다.
하위 쿼리 (SELECT AVG(salary) FROM employees)가 실행되어 전체 테이블을 하나의 숫자로 축약하고, 그 숫자가 모든 행에 반복됩니다.
SELECT
name,
salary,
(SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;WHERE의 스칼라 하위 쿼리
같은 단일 값으로 필터를 적용할 수도 있습니다. 면접에서 매우 자주 나오는 질문은 회사 평균보다 많은 급여를 받는 모든 사람을 찾으십시오입니다.
하위 쿼리가 평균을 한 번 계산하면 외부 쿼리의 각 행이 그 값과 비교됩니다. 이는 NOT 상관 하위 쿼리입니다. 내부 쿼리가 외부 행에 의존하지 않으므로 한 번만 실행됩니다.
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);둘 이상의 행 오류
면접관이 여러분에게 예상하기를 바라는 오류입니다. 하위 쿼리를 = 또는 >와 함께 사용했는데 여러 행을 반환하면 실행 엔진에서 다음 오류가 발생합니다.
- Postgres: 식으로 사용된 하위 쿼리에서 둘 이상의 행이 반환되었습니다
- MySQL: 하위 쿼리가 1개보다 많은 행을 반환합니다
아래 쿼리는 5번 부서에 여러 직원이 있을 수 있기 때문에 실패합니다. 하위 쿼리가 스칼라가 아니기 때문입니다.
SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);하위 쿼리를 스칼라로 만들기
하나의 값을 보장하는 신뢰할 수 있는 방법은 두 가지입니다.
MAX,MIN,AVG와 같은 집계 함수를 사용하십시오.GROUP BY가 없는 집계 함수는 항상 한 행을 반환합니다.ORDER BY뒤에LIMIT 1(Postgres/MySQL) 또는FETCH FIRST 1 ROW ONLY를 사용하십시오.
아래의 수정된 버전은 5번 부서에서 급여가 가장 높은 한 사람의 급여를 요청합니다.
SELECT name
FROM employees
WHERE salary = (
SELECT MAX(salary) FROM employees WHERE dept_id = 5
);행이 없으면 NULL을 반환하는 스칼라 하위 쿼리
면접에서 알아 두어야 할 미묘한 점이 있습니다. 스칼라 하위 쿼리에서 일치하는 행이 0개이면 오류가 발생하지 않고 NULL을 반환합니다. 그 NULL은 비교 과정에 전파됩니다.
salary > NULL은 UNKNOWN으로 평가되므로 참이 아닙니다. 따라서 외부 쿼리는 어떤 행도 반환하지 않습니다. 이 경우 지원자들은 흔히 오류를 예상하지만, 올바른 답은 조용히 빈 결과가 나오는 것입니다.
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);실습 예제: 차이를 포함한 평균 초과 급여자
두 위치를 함께 살펴보겠습니다. 평균보다 높은 급여를 받는 직원과 그들이 평균보다 얼마나 더 받는지를 표시합니다. 같은 스칼라 하위 쿼리가 SELECT와 WHERE에 모두 나타납니다.
면접관은 하위 쿼리가 두 번 실행되는지 물을 수 있습니다. 논리적으로는 두 번 나타나지만, 좋은 최적화기는 비상관 하위 쿼리를 한 번만 평가한 뒤 그 결과를 재사용할 수 있습니다.
SELECT
name,
salary,
salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;ORDER BY의 스칼라 하위 쿼리
스칼라 하위 쿼리는 값일 뿐이므로 ORDER BY에서도 사용할 수 있습니다. 가장 깔끔한 방식은 드물지만, 면접관은 이것이 허용된다는 사실을 알고 있는지 확인하기 좋아합니다.
여기서는 조인하지 않고 다른 테이블에서 가져온 값, 즉 각 부서의 직원 수를 기준으로 부서를 정렬합니다.
SELECT d.dept_name
FROM departments d
ORDER BY (
SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;스칼라와 상관 하위 쿼리: 차이 알기
위의 ORDER BY 예제는 외부 쿼리의 d.id를 은밀하게 참조합니다. 따라서 외부 행마다 한 번씩 실행되는 상관 스칼라 하위 쿼리입니다.
면접관은 이 차이를 중요하게 봅니다.
- 비상관 스칼라 하위 쿼리: 자체적으로 완결되어 있으며 한 번 실행됩니다.
- 상관 스칼라 하위 쿼리: 외부 행을 참조하며 행마다 실행됩니다.
둘 다 여전히 스칼라, 즉 하나의 값이지만 성능은 크게 다릅니다.
스칼라 하위 쿼리를 사용하지 말아야 할 때
SELECT 목록의 상관 스칼라 하위 쿼리는 편리하지만 큰 테이블에서는 느릴 수 있습니다. 행마다 실행되기 때문입니다. 면접관은 다음과 같은 대안을 알고 있기를 기대합니다.
- 미리 집계한 파생 테이블에 대한
LEFT JOIN AVG(salary) OVER ()와 같은 윈도 함수
아래의 윈도 함수 형식은 별도의 하위 쿼리 탐색 없이 동일한 회사 평균 열을 생성합니다.
SELECT
name,
salary,
AVG(salary) OVER () AS company_avg
FROM employees;면접용 한마디
스칼라 하위 쿼리를 정의하라는 질문을 받으면 다음과 같이 답하십시오. "스칼라 하위 쿼리는 한 행과 한 열을 반환하므로 하나의 값처럼 동작하며 리터럴이 허용되는 곳 어디에서나 사용할 수 있습니다. 둘 이상의 행을 반환하면 실행 엔진에서 오류가 발생하고, 행을 반환하지 않으면 NULL이 됩니다."
이 한 문장에는 정의, 오류 상황, NULL 경계 사례라는 면접관이 확인하는 세 가지가 모두 담겨 있습니다.
빠른 확인
스칼라 하위 쿼리의 동작에 대한 이해를 확인해 보십시오.
복습
이제 스칼라 하위 쿼리를 완전히 이해하셨습니다.
- 정의: 한 행과 한 열을 반환하며 SELECT, WHERE, HAVING, ORDER BY에서 리터럴처럼 사용할 수 있습니다.
- 여러 행을 반환한 하위 쿼리를 = 또는 >와 함께 사용하면 오류가 발생합니다. 집계 함수나
LIMIT 1을 사용해 스칼라로 만드십시오. - 행이 0개이면 NULL이 반환되고, 필터에서는 이로 인해 행이 조용히 제외됩니다.
- 상관 스칼라 하위 쿼리는 행마다 실행됩니다. 성능이 중요할 때는 조인이나 윈도 함수를 우선 사용하십시오.
다음 주제는 FROM 절의 하위 쿼리입니다. 여기서는 결과가 하나의 가상 테이블 전체가 됩니다.
자주 묻는 질문
“SELECT와 WHERE의 스칼라 하위 쿼리” 강의는 무료인가요?
네 — “SELECT와 WHERE의 스칼라 하위 쿼리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“SELECT와 WHERE의 스칼라 하위 쿼리”에서 뭘 배우나요?
단일 값을 반환하는 하위 쿼리와 둘 이상의 행을 반환할 때 발생하는 오류를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“SELECT와 WHERE의 스칼라 하위 쿼리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- SELECT와 WHERE의 스칼라 하위 쿼리
- FROM 절의 하위 쿼리(파생 표)
- IN, ANY와 ALL 하위 쿼리
- EXISTS와 IN의 성능 비교