서브 쿼리란?
SQL문 내부에서 SELECT 문을 사용하는 것을 의미한다.
아래와 같이 조건식에 새로운 SELECT문이 들어가는 형식
SELECT 조회할 열
FROM 조회할 테이블
WHERE 조건식 (SELECT 조회할 열
FROM 조회할 테이블
WHERE 조건식 )
예시) EMP테이블에서 'JONES' 보다 급여가 높은 사원의 이름을 불러오는 쿼리
SELECT ENAME
FROM EMP
WHERE SAL > ( SELECT SAL
FROM EMP
WHERE ENAME = 'JONES');
단일행 서브쿼리
실행 결과가 단 하나의 행으로 나오는 서브쿼리를 뜻한다.
위 예시가 단일행 서브쿼리이다.
다중행 서브쿼리
실행 결과가 여러 행인 서브 쿼리
IN, ANY, SOME, EXISTS 과 같은 연산자를 통해 활용할 수 있다.
IN
SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
부서별 최고 급여 중 동일한 급여를 사원 정보를 출력
ANY, SOME (동일함)
SELECT *
FROM EMP
WHERE SAL < ANY (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
ANY에 = 연산를 하면 IN과 똑같은 기능이다.
ANY는 서브쿼리의 값들 중 하나라도 일치하면 TRUE를 반환한다.
ALL
ANY, SOME과 달리 모든 결과가 조건에 만족할 경우 TRUE
SELECT *
FROM EMP
WHERE SAL < ALL (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
부서별 최대급여 중 제일 낮은 급여보다 낮은 급여를 받는 직원을 불러오는 것
EXISTS
IN 과 비슷하지만 IN은 일치하는 값만 불러오는 반면,
EXISTS는 일치하는 값이 하나라도 있으면 모두 불러온다는 차이점이 있다.
SELECT *
FROM EMP
WHERE EXISTS (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
다중열 서브쿼리
비교할 열이 여러 개인 경우
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
FROM 절 서브쿼리
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM (SELECT * FROM EMP WHERE DEPTNO = 10) E10,
(SELECT * FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;
테이블을 1개 행을 전부 가져와서 별칭을 붙여주는 방식 = 가독성이 떨어지는 문제가 발생
=> WITH 절 사용
WITH 절 서브쿼리
WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.NAME, D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;
SELECT 절 서브쿼리
"스칼라 서브쿼리" 라고도 부른다
SELECT EMPNO, ENAME, JOB, SAL,
(SELECT GRADE
FROM SALGRADE
WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE
FROM EMP E;
'데이터베이스 > Oracle' 카테고리의 다른 글
[Oracle] 계층형 쿼리 (2) | 2024.03.07 |
---|---|
[Oracle] docker oracle 설치 (0) | 2023.07.11 |
[Oracle] Trigger 연습 (0) | 2023.04.13 |
[Oracle] JOIN (0) | 2023.04.07 |
Oracle 설치 및 SCOTT 계정 활성화 (0) | 2023.04.06 |