: 알려지지 않은 기준을 이용한 검색을 위해 사용
서브쿼리가 메인쿼리 칼럼을 가지고 있지 않는 형태
메인쿼리에서 값을 제공하기 위한 목적으로 주로 사용
서브쿼리가 메인쿼리칼럼을 가지고있는 형태
메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용
SELECT stuname, (SELECT mjname FROM major WHERE stno = st.stno) mjname
FROM student st;
📌메인 쿼리는 서브 쿼리의 칼럼 사용 불가
🚨단일값을 만족하는 것을 찾을 때
=, <, >, <=, >=, <>
--평균 가격보다 더 비싼 상품 조회
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;
-- 급여가 부서번호 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;
현재 조회한 컬럼이 아닌 다른 컬럼의 값으로 정렬하고 싶을 때 사용
SELECT stuno, stuname, mjname
FROM student st
ORDER BY (SELECT mjname FROM major
WHERE mjno = mjno) DESC;