서브쿼리(Subquery)

Subquery?

SQL 쿼리 내부에 포함된 쿼리로, 다른 쿼리의 일부로 사용되기 위한 쿼리.

주로 SELECT, FROM, WHERE 절에서 사용된다.

복잡한 데이터 조작이나 필터링을 가능하게 해준다.

 

중첩된 여러 개의 서브쿼리를 사용할 수 있고 비효율적인 작성 방식을 피할 수 있어 쿼리를 최적화할 수 있다.

다만 대량 데이터나 복잡한 쿼리에서 성능 문제가 발생할 수 있다.

 

단일행 서브쿼리(Single_Row Subquery) or 스칼라 서브쿼리(Scalar Subquery)

단일 행만을 반환하기 위한 서브쿼리(단일 값도 포함).

일반적으로 SELECT, WHERE에서 사용된다.

반환된 단일 값은 메인 쿼리의 비교연산자에서 사용되거나 출력 결과에 포함시킬 수 있다.

-- SELECT 절
SELECT EMPNO, ENAME, (SELECT GRADE FROM SALGRADE WHERE EMP.SAL BETWEEN LOWSAL AND HISAL) AS SAL
FROM EMP;

-- WHERE 절
SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE >= (SELECT MAX(HIREDATE) FROM EMP);

SELECT *
FROM EMP
WHERE EXTRACT(YEAR FROM HIREDATE) = (SELECT EXTRACT(YEAR FROM MIN(HIREDATE)) FROM EMP);

 

다중행 쿼리(Multy_Row Subquery)

여러 개의 행을 반환하기 위한 서브쿼리.

일반적으로 IN, ANY, ALL, EXISTS와 같은 연산자와 함께 사용된다. 또한 WHERE 절이나 FROM 절에서도 사용된다.

반환된 여러 행은 메인 쿼리의 조건과 비교해서 필터링하거나 결합시킬 수 있다.

 

-- IN 연산자
메인 쿼리의 조건식에서 다중행 서브쿼리를 사용하여 특정 값이 포한되어 있는지 확인할 수 있다.

-- EXISTS 연산자
메인 쿼리가 하위 집합 내에 결과가 있는지 확인하고 싶을 때 사용한다.

-- ALL, ANY 연산자
메인 쿼리의 열 값과 서브 쿼리의 결과 중 하나 이상 또는 모든 값을 비교한다.
WHERE column > ANY(subuery)

-- 비교 연산자와 함께 사용하는 경우
SELECT ENAME, SAL
FROM EMP E1
WHERE (E1.EMPNO, E1.DEPTNO) = (SELECT E2.ENAME, E2.SAL, FROM EMP E2 WHERE E2.DEPTNO = 123)

 

인라인 뷰(Inline View) FROM 절에서 사용되는 서브쿼리

  • 임시로 테이블 형태의 결과 집합을 생성하는 방법

복잡한 쿼리를 단순화하고 유지보수성 및 가독성을 높일 수 있다.

SELECT column1, column2, ...
FROM (Subquery) AS alias

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;

 

  • WITH 절

CTE(Common Table Expression)으로 명명된 임시 테이블 형태로 중복을 줄이는 데 도움이 된다.

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

 

'Backend > Datebase' 카테고리의 다른 글

MongoDB와 MySQL 차이  (0) 2024.01.23
재귀 쿼리  (0) 2023.12.16
AWS RDS : Cannot Connect to Database Server 오류  (0) 2023.11.23
식별 관계와 비식별 관계  (0) 2023.10.25
REST API(Representational State Transfer API)  (0) 2023.10.19