[DQL] 서브쿼리

sesame·2021년 8월 11일
0

sql

목록 보기
6/24

서브쿼리

: 알려지지 않은 기준을 이용한 검색을 위해 사용

  • 하나의 SQL 문안에 포함되어 있는 또 다른 SQL 문
  • 서브 쿼리를 (괄호)로 감싸서 사용
  • 서브 쿼리는 단일행 또는 복수행 비교연산자와 함께 사용 가능
  • 서브 쿼리에서는 ORDER BY 사용 불가
  • SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT문의 VALUES절, UPDATE문의 SET 절에 사용 가능

비연관 서브쿼리

서브쿼리가 메인쿼리 칼럼을 가지고 있지 않는 형태
메인쿼리에서 값을 제공하기 위한 목적으로 주로 사용

연관 서브쿼리

서브쿼리가 메인쿼리칼럼을 가지고있는 형태
메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용

SELECT stuname, (SELECT mjname FROM major WHERE stno = st.stno) mjname
FROM student st;

📌메인 쿼리는 서브 쿼리의 칼럼 사용 불가


단일 행 서브쿼리

  • 서브 쿼리의 실행 결과가 항상 1개 행만 나오는 서브쿼리
  • 단일 행 비교 연산자와 함께 사용, 다중행 비교연산자도 사용가능

    🚨단일값을 만족하는 것을 찾을 때
    =, <, >, <=, >=, <>

--평균 가격보다 더 비싼 상품 조회
SELECT prono, price
FROM store
WHERE price >= (SELECT AVG(price) FROM store);

다중 행 서브쿼리

  • 서브 쿼리의 실행 결과가 여러 건인 서브쿼리
  • 다중 행 비교 연산자와 함께 사용, 단일행 비교연산자 사용 불가능

    🚨여러개의 값중 하나라도 만족할 때
    IN: 여러개의 값중 하나라도 만족할 때
    ALL : 모든 값 일치하면 반환
    ANY, SOME : 하나이상 만족되면 반환
    EXISTS : 존재하는 값 출력

//종류별 가격이 제일 높은 상품 출력
SELECT kname, pname, price
FROM product JOIN kind USING(kno)
WHERE price IN (SELECT MAX(price) FROM store GROUP BY kno);

//food종류의 가격 중 최소값보다 높은 가격인 상품들 출력
//ANY는 food 가격을 가진 가격중 하나만 만족해도 반환
SELECT kname, price
FROM store
WHERE price > ANY(SELECT price FROM store WHERE kname='food');

//food종류의 가격중 제일 높은 가격보다 높은 가격을 가진 상품들 출력
//ALL은 food 가격을 가진 가격을 모두 만족해야 반환 그래서 최대값
SELECT kname, price
FROM store
WHERE price > ALL(SELECT price FROM store WHERE kname='food');

다중 열(컬럼) 서브쿼리

  • 서브 쿼리의 실행 결과로 여러 칼럼을 반환
  • 메인 쿼리의 조건절에 여러 칼럼을 동시 비교
  • 서브 쿼리와 메인 쿼리에서 비교하고자 하는 칼럼 개수와 칼럼의 위치가 동일
//종류 번호가 5인 상품들의 종류번호와 가격을 묶어서 메인 쿼리로 전달
SELECT prono, pname, price, kno
FROM store
WHERE (kno, price) IN(     --두개 이상의 컬럼
		SELECT kno, price FROM store
        WHERE kno = 5);

스칼라 서브쿼리

SELECT문에서 쓰이는 단일행 서브쿼리

//종류 번호가 동일한 상품들의 평균 가격 출력
SELECT proname, kno, price, (SELECT TRUC(AVG(price))
							FROM store
                            WHERE kno = s.kno) AVGKNOPRICE
FROM store s;

FROM절 서브쿼리 - 인라인 뷰

-- 급여가 부서번호 20인 부서의 평균보다 높고
--사원을 관리하는 'MANAGER'로써 20부서에 속하지 않은 사원을 조회
SELECT e2.empno, e2.ename, e2.job, e2.sal, e2.deptno
FROM (SELECT empno FROM emp
	WHERE sal > (
				SELECT AVG(sal) FROM emp
				WHERE deptno = 20
				)
	) e1, emp e2
WHERE e1.empno = e2.empno
AND e2.mgr is NOT NULL
AND e2.deptno != 20;

ORDER BY절 서브쿼리

현재 조회한 컬럼이 아닌 다른 컬럼의 값으로 정렬하고 싶을 때 사용

SELECT stuno, stuname, mjname
FROM student st
ORDER BY (SELECT mjname FROM major
	  WHERE mjno = mjno) DESC;

0개의 댓글