IN과 ANY와 ALL 비교
값 집합과 비교합니다.
IN과 ANY와 ALL 비교은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
IN, ANY, ALL이란 무엇인가요?
SQL 쿼리를 작성할 때는 하나의 값을 값의 집합과 비교해야 하는 경우가 많습니다. SQL에서는 이를 위해 IN, ANY, ALL이라는 세 가지 강력한 연산자를 제공합니다.
세 연산자는 모두 값 목록을 반환하는 서브쿼리와 함께 사용할 수 있습니다. 서로 비슷해 보이지만 동작 방식은 다르므로, 올바른 연산자를 선택하면 쿼리를 더욱 표현력 있고 효율적으로 작성할 수 있습니다.
IN 연산자
IN 연산자는 값이 목록 또는 서브쿼리 결과에 있는 어떤 값과든 일치하는지 확인합니다. 세 연산자 중 가장 단순합니다.
아래 예시는 영업, HR 또는 엔지니어링 부서에서 근무하는 직원을 조회합니다.
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');서브쿼리와 함께 사용하는 IN
IN은 서브쿼리와 함께 사용할 때 특히 강력합니다. 직접 지정한 목록 대신 다른 테이블에서 비교할 값을 바로 가져올 수 있습니다.
여기서는 예산이 100,000을 초과하는 부서에 속한 모든 직원을 찾습니다.
SELECT name, department
FROM employees
WHERE department IN (
SELECT dept_name
FROM departments
WHERE budget > 100000
);ANY 연산자
ANY(SOME이라고도 씁니다)는 =, >, <, >=, <=와 같은 비교 연산자를 사용하여 값을 서브쿼리가 반환한 각 값과 비교합니다.
서브쿼리 결과의 값 중 하나 이상에 대해 비교가 참이면 조건은 참입니다.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'HR'
);= ANY는 IN과 같습니다
알아 두어야 할 중요한 동치 관계가 있습니다. = ANY (subquery)는 IN (subquery)와 논리적으로 동일합니다. 두 표현 모두 값이 서브쿼리 결과 중 하나 이상과 일치하면 참을 반환합니다.
다음 두 쿼리는 같은 결과를 만듭니다.
-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');
-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');ALL 연산자
ALL은 값을 서브쿼리 결과의 모든 값과 비교합니다. 반환된 모든 값에 대해 비교가 성립할 때만 조건이 참입니다.
이 예시는 인턴 등급의 모든 급여보다 높은 급여를 받는 직원을 찾습니다. 즉, 가장 높은 급여를 받는 인턴보다도 더 많이 버는 직원입니다.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE job_grade = 'Intern'
);ANY와 ALL 비교
핵심적인 차이는 다음과 같습니다. ANY는 하나 이상의 값에 대해 조건이 참이어야 하지만, ALL은 모든 값에 대해 조건이 참이어야 합니다.
다음과 같이 생각해 보세요. ANY는 모든 비교에 OR를 적용한 것과 같고, ALL은 모든 비교에 AND를 적용한 것과 같습니다.
-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');
-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');NOT IN과 <> ALL 비교
= ANY가 IN에 대응하는 것처럼 <> ALL은 NOT IN과 같습니다. 두 표현 모두 값이 서브쿼리의 어떤 값과도 일치하지 않을 때만 참을 반환합니다.
하지만 주의해야 합니다. 서브쿼리가 NULL을 하나라도 반환하면 SQL의 3값 논리로 인해 NOT IN은 행을 전혀 반환하지 않습니다.
-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');
-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');NOT IN에서 발생하는 NULL 문제
중요한 함정이 하나 있습니다. NOT IN과 함께 사용하는 서브쿼리가 NULL을 반환하면 전체 NOT IN 조건이 모든 행에 대해 UNKNOWN으로 평가되어 빈 결과 집합을 반환합니다.
이를 피하려면 서브쿼리에서 NULL을 제외하거나, NULL을 안전하게 처리하는 NOT EXISTS를 대신 사용하세요.
-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);
-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL
);실전 예시: 고소득 직원 찾기
세 연산자를 현실적인 상황에 적용한 예를 살펴보겠습니다. employees 테이블에 name, department, salary 열이 있다고 하겠습니다.
어떤 하나의 부서의 평균 급여보다 많이 받는 직원을 찾으려고 합니다. 즉, 하나 이상의 부서 평균보다 높은 급여를 받는 직원입니다.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT AVG(salary)
FROM employees
GROUP BY department
)
ORDER BY salary DESC;어떤 연산자를 사용해야 할까요?
세 연산자 중 무엇을 선택할지 빠르게 판단하는 기준은 다음과 같습니다.
- IN — 정적 목록이 있거나 서브쿼리와 단순 동등 비교가 필요할 때 사용합니다.
- = ANY — IN과 같지만
>,<와 같은 다른 비교 연산자도 사용할 수 있습니다. - ALL — 조건이 모든 값에 대해 성립해야 할 때 사용합니다(예: MAX를 사용하지 않고 최댓값보다 큰 경우).
- NOT IN — 편리하지만 NULL에 주의해야 합니다. 서브쿼리에 NULL이 포함될 수 있다면
NOT EXISTS를 우선 사용하세요.
빠른 확인
IN, ANY, ALL에 대해 이해한 내용을 확인해 보세요.
학습 내용 정리
이 레슨에서는 IN, ANY, ALL을 사용하여 값 집합과 비교하는 방법을 배웠습니다.
핵심 내용:
IN은 포함 여부를 확인합니다. 값이 목록 또는 서브쿼리의 어떤 항목과든 일치하면 참입니다.= ANY는IN과 같습니다.> ANY와 같이 다른 연산자를 사용하면 하나 이상의 값에 대해 조건이 참일 때 참이 됩니다.ALL은 서브쿼리가 반환한 모든 값에 대해 조건이 성립해야 한다는 뜻입니다.- 서브쿼리에 NULL이 포함되면
NOT IN은 아무 행도 반환하지 않습니다. 항상 이 상황에 대비하세요. - NULL이 있을 수 있을 때는
NOT IN보다 더 안전한 대안으로NOT EXISTS를 사용하세요.
자주 묻는 질문
“IN과 ANY와 ALL 비교” 강의는 무료인가요?
네 — “IN과 ANY와 ALL 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“IN과 ANY와 ALL 비교”에서 뭘 배우나요?
값 집합과 비교합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“IN과 ANY와 ALL 비교” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 상관 서브쿼리
- EXISTS와 NOT EXISTS
- IN과 ANY와 ALL 비교
- EXISTS와 JOIN 성능 비교