by 김정식 다중 열 서브쿼리 PAIRWISE NONPAIRWISE Multiple-Column Subquery 서브쿼리 Subquery [2002.08.30]
결과 값이 두 개 이상의 컬럼을 반환하는 Subquery이다
Subquery가 한 번 실행되면서 두 개 이상의 컬럼을 검색해서 주 쿼리로 넘겨 준다.
SELECT empno, sal, deptno
FROM emp
WHERE (sal, deptno) IN (SELECT sal, deptno
FROM emp
WHERE deptno = 30
AND comm is NOT NULL);
EMPNO SAL DEPTNO
---------- ---------- ----------
7521 1250 30
7654 1250 30
7844 1500 30
7499 1600 30
WHERE 절에서 두 개 이상의 서로 다른 Subquery가 사용되어서 결과 값을 주 쿼리로 넘겨 준다.
SELECT empno, sal, deptno
FROM emp
WHERE sal IN (SELECT sal
FROM emp
WHERE deptno = 30
AND comm is NOT NULL);
AND deptno IN (SELECT deptno
FROM emp
WHERE deptno = 30
AND comm is NOT NULL);
EMPNO SAL DEPTNO
---------- ---------- ----------
7521 1250 30
7654 1250 30
7844 1500 30
7499 1600 30
서브쿼리에서 NULL 값이 반환 되면 주 쿼리 에서는 어떠한 행도 반환되지 않는다.
- 강좌 URL : http://www.gurubee.net/lecture/1504
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.
제 짧은 이해력으로 질문드리면
고수님들께서 왜 교집합과 합집합에 대한 이야기가 나오는지 잘 모르겠네요
쌍비교는 서브쿼리에서 2개이상의 컬럼을 리턴받아 2개의 행 즉 쌍으로 비교하여 둘다 만족해야 출력될것이고
비쌍비교는 2개이상의 서브쿼리로 단일컬럼을 리턴받아 컬럼 and 컬럼 and 컬럼... 으로
결국에 여러 조건(컬럼and컬럼and...)를 다 만족해야만 해당 행들을 출력시키니
굳이 이야기하자면 둘다 교집합이라고 이야기 해야 맞을 것 같은데요
경재님의 답변이 사용설명이 맞는 것 같구요
1번과 2번쿼리는 같은 쿼리가 아닙니다. 다른 쿼리입니다.
예를 들어 서브쿼리의 결과가 (1, a) (2, b) 이렇게 2건이 나올 경우
1번 쿼리의 결과는 (1, a) (2, b) 가 나오구요.
2번 쿼리의 결과는 (1, a) (1, b) (2, a) (2, b) 가 나옵니다.
즉 원치 않는 결과 (1, b) (2, a) 가 포함되어 나오게 되는거구요.
1번의 의도를 가지고 2번처럼 작성하는 실수를 하시면 안되겠지요.
즉, 1번과 2번의 차이를 성능 관점에서 바라보는 것은 전혀 의미 없는 짓입니다.
성능 비교는 같은 결과를 내는 쿼리끼리 비교하는 거죠.
1, 2 번 쿼리는 그 논리적인 의미를 비교해야 합니다.
엄밀히 말하면 2번째는
mult-column subquery가 아니지 않나요?
같은조건 검색시 1번이 2번보다 쿼리를 덜 사용.
다른조건 검색시2번을 사용
틀린부분이 있다면 리플달아주시면 감사하겠습니다.