반응형
상관 중첩 질의 (Correlated Nested Query)
- 중첩 질의에서 하위 질의의 WHERE 절에 있는 레코드 검색 조건에 주질의에서 선언된 테이블의 컬럼을 참조하는 경우 상관 중첩 질의라고 함!
아래 예제를 통해 이해해보겠습니다.
<예시 테이블 구조>
- 사원 테이블: EMPLOYEE(Fname, Minit, Lname, SSN, Bdate, Address, Sex, Salary, Super_ssn, Dno)
- 부양 가족 테이블: DEPENDENT(Essn, Dependent_name, Sex, Bdate, Relationship)
아래 쿼리는 부양 가족 (dependent)과 성별이 같은 근로자의 ssn을 조회하는 쿼리입니다.
단일 질의는 join문을 활용하여 조회했습니다.
-- 단일 질의
SELECT ssn
FROM employee AS e
INNER JOIN dependent AS d
ON e.ssn = d.ssn
WHERE e.sex = d.sex
;
위 쿼리는 다음과 같이 상관 중첩 질의 형식으로도 같은 결과를 조회할 수 있습니다.
-- 상관 중첩 질의
SELECT ssn
FROM employee AS e
WHERE ssn IN ( SELECT essn
FROM dependent AS d
WHERE e.sex = d.sex )
;
비상관 중첩 질의에서 하위 질의는 한번 수행되지만, 상관 중첩 질의에서 하위 질의는 여러번 수행되는 것을 확인할 수 있습니다.
존재 연산자 (EXISTS, NOT EXISTS)와 상관 중첩 질의
기본적으로 존재 연산자는 다음 역할을 수행합니다.
- EXISTS 연산자 (함수) : 상관 중첩 질의에서 하위 질의의 결과가 공집합 (empty_set) 인지를 검사
- EXISTS(Q): 하위 질의 Q의 결과에 적어도 한 개 이상의 레코드가 존재하면 참을 반환
위에서 예시를 들었던 상관 중첩 질의를 다시 한 번 살펴보겠습니다.
-- 상관 중첩 질의
SELECT ssn
FROM employee AS e
WHERE ssn IN ( SELECT essn
FROM dependent AS d
WHERE e.sex = d.sex )
;
해당 질의를 EXISTS 연산자와 상관 중첩 질의를 활용해서 SQL을 작성해보면..
-- 상관 중첩 질의 + EXISTS 연산자
SELECT ssn
FROM EMPLOYEE AS e
WHERE EXISTS(
SELECT *
FROM dependent AS d
WHERE e.ssn = d.essn AND
e.sex = d.sex
)
;
EXISTS는 참 혹은 거짓을 반환하므로 하위 질의에서 반환해야 하는 컬럼명을 명시하는 것이 무의미한 경우가 대부분이다. 따라서 관례적으로 *를 사용함을 알아두면 좋습니다.
추가로 위에서 활용한 IN 연산자와 상관 중첩 질의의 연산량이 EXISTS 연산자와 상관 중첩 질의의 연산량보다 훨씬 더 큽니다.
True가 있으면 탐색을 멈추는 EXISTS와 다르게 IN은 끝까지 탐색을 진행합니다.
반응형
'SQL' 카테고리의 다른 글
[SQL] 프로그래머스 특정 물고기를 잡은 총 수 구하기 - 조인 & 상관중첩질의 (0) | 2024.03.25 |
---|---|
[SQL] 검색 - 목록 검색 연산자와 중첩 질의 Nested Query (2) (0) | 2024.03.20 |
[SQL] 검색 - 비교 연산자와 중첩 질의 Nested Query (1) (0) | 2024.03.20 |
[SQL] 조건에 부합하는 중고거래 댓글 조회 (프로그래머스) (0) | 2024.03.18 |