서브쿼리

Lee kyu min·2024년 2월 26일

SQL

목록 보기
8/11

서브쿼리

  • SQL문 내부에서 사용하는 SELECT문
  • 서브쿼리는 ( )로 묶어서 사용
SELECT 조회할 열
FROM 조회할 테이블
WHERE 조건식 ( SELECT 조회할 열
				FROM 조회할 테이블
                WHERE 조건식)
  • 서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 개수로 지정

1. 단일행 서브쿼리

  • 실행 결과가 단 하나의 행으로 나오는 서브쿼리
  • 연산자( >, >=, <=, <, =, !=)
    EX)
SELECT *
FROM EMP
WHERE HIREDATE < (SELECT HIREDATE
					FROM EMP
                    WHERE ENAME = 'SCOTT');

2. 다중행 서브쿼리

  • 실행 결과 행이 여러개로 나오는 서브쿼리
  • 연산자

1) IN : 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치하면 TRUE

2) ANY, SOME : 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 TRUE

3) ALL : 메인쿼리의 조건식을 서브쿼리의 결과가 모두 만족하면 TRUE

4) EXISTS : 서브쿼리의 결과가 존재하면(행이 1개 이상) TRUE

ex)

SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
				FROM EMP
                GROUP BY DEPTNO);

3. 다중열 서브쿼리

  • 서브쿼리의 SELECT절에 비교할 데이터를 여러개 지정하는 방식
    ex)
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
						FROM EMP
                        GROUP BY DEPTNO);

4. FROM절에 사용하는 서브쿼리

  • FROM절에도 서브쿼리를 쓸 수 있다.(인라인 뷰라고 한다)
    (다만 가독성을 위해 WITH절을 사용하기도 한다.)

1) 일반 FROM절 서브쿼리 ex)

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;

2) WITH절 서브쿼리

WITH
[별칭1] AS (SELECT문 1),
[별칭2] AS (SELECT문 2),
...
SELECT
FROM 별칭1, 별칭2, ...

ex)

WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.DEPTNO, D.DNAME, D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;

5. SELECT절 서브쿼리(스칼라 서브쿼리)

  • 반드시 하나의 결과만 반환하도록 작성해야 한다.
    ex)
SELECT EMPNO, ENAME, JOB, SAL
		(SELECT GRADE
        FROM SALGRADE
        WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE,
        DEPTNO,
        (SELECT DNAME
        FROM DEPT
        WHERE E.DEPTNO = DEPT.DEPTNO) AS DNAME
FROM EMP E;

0개의 댓글