서브쿼리

구름·2022년 12월 17일
0

SQL

목록 보기
5/7
post-thumbnail

(공부하면서 제일 어려웠던 부분)

❗ 서브쿼리 정의

: 하나의 SQL 문에 포함되어있는 또 다른 SQL

서브쿼리 사용시 주의사항

  1. 서브쿼리를 괄호로 감싸서 사용
  2. 서브쿼리는 단일행, 복수행 비교연산자 와 함께 사용이가능
  3. 서브쿼리 안에서는 order by를 사용하지 못함

서브쿼리가 들어갈 수 있는 곳

  • SELECT절
  • FROM 절
  • WHERE절
  • INSERT ~ VALUES
  • UPDATE 의 SET

SELECT절 서브쿼리

하나의 열 처럼 사용된다

FROM절 서브쿼리

: FROM절에 사용되는 서브쿼리는 하나의 테이블처럼 사용된다.

WHERE절 서브쿼리

: 가장 대표적인 서브쿼리 . 단일행, 복수행 둘 다 리턴이 가능
=> 서브쿼리를 끝낸 값들을 메인쿼리의 조건절을 통해 비교함

단일행 서브쿼리

  • 서브쿼리의 수행결과가 오직 하나의 ROW(행) 만을 반환
  • 이 하나의 결과를 가지고 메인쿼리는 비교연산자를 통해 쿼리를 수행함
    비교연산자는 단일행 비교연산자를 사용
    💡 단일행 비교 연산자: =,<.< = , > , > = , <>

[예제]

💡 서브쿼리의 결과값이 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서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건
  • IN
    : 서브쿼리의 결과값이 있다고 가정하는 것
    ✏️
    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은 서브쿼리의 모든 값이 메인쿼리의 값보다 작아야됨

profile
내가 보려고 하는 업데이트

0개의 댓글