(공부하면서 제일 어려웠던 부분)
: 하나의 SQL 문에 포함되어있는 또 다른 SQL
하나의 열 처럼 사용된다
: FROM절에 사용되는 서브쿼리는 하나의 테이블처럼 사용된다.
: 가장 대표적인 서브쿼리 . 단일행, 복수행 둘 다 리턴이 가능
=> 서브쿼리를 끝낸 값들을 메인쿼리의 조건절을 통해 비교함
💡 서브쿼리의 결과값이 2건이상인 경우 오류 발생 !
✏️
SELECT C1,C2,C3
FROM T1
WHERE C1 = (SELECT C1 FROM T2 WHERE C2 ='3')
⇒ 오류 발생, C2=3의 조건의 결과가 C1에서 2개가 이상인 경우 오류가 발생
: 서브쿼리의 결과가 2건 이상 반환 될 수 있다면, 반드시 시 IN,ALL,ANY,SOME 과 함께 사용
다중행 연산자 | 설명 |
---|---|
IN | 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미 |
ALL | 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건 |
ANY | 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건 |
EXISTS | 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건 |
SELECT C1,C2,C3
FROM T1
WHERE (C1,C2) IN ( SELECT C1,C2 FROM T2 WHERE C2='3')
=> C2 가 3인 C1,C2컬럼에서 나온 값과 WHERE 절에 쓴 값이 동일한 경우 출력 select ename 사원번호, eno 사원번호
from employee
where salary in (
select min(salary)from employee
group by dno
);
⏩ salary의 최소 값을 dno 로 별로 분류 한 값이 주 서브쿼리의 where절의 조건으로 들어가는 의미
⏩서브쿼리를 사용한 이유-> min(salary)의 값이 단일 행 값이라 주 서브쿼리에 사용하면 ename , eno 사용할 수 없어서
✏️ 참고: GROUP BY절은 명시된 컬럼을 그룹화 시켜주지만 나머지는 그룹화를 시켜주지 않기 때문에 집계함수를 사용하거나 그룹핑 대상으로 컬럼을 SELECT절과 GROUP BY절에 명시해 주어야 한다.
group by 절 사용시, 그룹바이에서 이용한 컬럼외에 select문에 사용불가. ❗
ALL
메인쿼리의 비교조건이 서브쿼리의 검색결과와 모든 값이 일치한다
=> 무슨 의미 ..?
메인쿼리의 결과값 과 서브쿼리 결과 값을 비교
메인쿼리 < ALL ( 서브쿼리 ) : 서브쿼리의 결과와 비교하여 최소값 반환.
메인쿼리 > ALL ( 서브쿼리 ) : 서브쿼리의 결과와 비교하여 최대값 반환.
✏️ 직급이 SALESMAN가 아니면서 직급이 SALESMAN인 사원보다 급여가 적은 사원을 모두 출력하는 예입니다.
select eno, ename, job, salary
from employee
where salary < all ( select salary
from employee
where job='SALESMAN')
and job <> 'SALESMAN';
⏩ where 절 : 서브쿼리 salesman의 월급과 비교한 결과 값들 중, 최소값 보다 더 작은 값만 출력
단, 직업은 salesman이 아니다. ⏩ <> 사용
ANY : 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건
- main < any : 서브쿼리의 결과와 비교해, 메인쿼리의 데이터 중 한개라도 서브쿼리 결과보다 작다면 최소값 반환
main > any : 서브쿼리의 결과와 비교해, 메인쿼리의 데이터 중 한개라도 서브쿼리결과 보다 크다면, 최대값 반환
[✏️ 예제 ]
select ename, salary
from employee
where salary < any (select salary from employee where job = 'SALESMAN')
and job <> 'SALESMAN';
=> 서브쿼리의 값 보다 메인쿼리의 값이 하나라도 작다면 출력 (큰건 출력 ㄴ)
all을 쓰면 안되는 이유: all은 서브쿼리의 모든 값이 메인쿼리의 값보다 작아야됨