본문 바로가기
  • hello world
DataBase

[DataBase] Subquery 서브쿼리 하위질의

by JJoajjoa 2023. 8. 31.

 

 

 

# 서브쿼리

SQL 쿼리 내부에 포함된 쿼리

다른 쿼리의 일부로 사용되기 위한 쿼리

주로 SELECT, FROM, WHERE 절에서 사용

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

 

중첩된 여러 개의 서브쿼리를 사용가능

비효율적인 작성방식 피할수 있음 → 쿼리 최적화

대량 데이터나 복잡쿼리에서는 성능문제가 발생할 수 있음

 


 

 

1. 단일행 서브쿼리 (Single-Row Subquery) || 스칼라 서브쿼리 (Scalar Subquery)

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

일반적으로 SELECT, WHERE 절에서 사용

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

 

- SELECT절

SELECT EMPNO, ENAME,

(SELECT GRADE FROM SALGRADE WHERE EMP.SAL BETWEEN LOSAL AND HISAL) AS SALL

FROM EMP;

 

- WHERE절

SELECT ENAME, HIREDATE

FROM EMP

WHERE HIREDATE >= (SELECT MAX(HIREDATE) FROM EMP);

 


 

2. 다중행 서브쿼리 (Multi-Row Subquery)

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

일반적으로 IN, ANY, ALL, EXISTS 와 같은 연산자와 함께 사용

일반적으로 WHERE, FROM 절에서 사용

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

 

 

- IN 연산자

메인 쿼리의 조건식에서 다중행 서브쿼리를 사용하여 특정 값이 포함되어 있는지 확인 가능 (T, F)

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

 

 

- EXISTS 연산자

메인 쿼리가 하위 집합 내에 결과가 있는지 확인하고 싶을 때 사용 (T, F)

>> 카운트 최고급여 최소한명이상

 

 

-  ANY, ALL 연산자

메인 쿼리에 열 값과 서브쿼리 결과 중 하나 이상(ANY) 또는 모든 값(ALL)을 비교

WHERE column > ANY(subquery)

 

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

 

 

- 비교연산자와 함께 사용하는 경우

SELECT ENAME, SAL

FROM EMP E1

WHERE (E1.EMPNO, E1.DEMPNO) = (SELECT E2.ENAME, E2.SAL FROM EMP E2 WHERE E2.DEMPNO = 123);

 


 

3. 인라인 뷰 (Inline View)

FROM절에서 사용

복잡한 쿼리를 단순화 할 수 있음

유지보수성, 가독성에 도움이 됨

 

 

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

SELECT column1, column2, ...

FROM (Subquery) alias

>> alias :  별명 (FROM절에서는 AS 안쓰고 한칸 띄움)

 

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 명명된 임시 테이블 형태로 중복을 줄이는데 도움이 됨

>> 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;

 

 

 

'DataBase' 카테고리의 다른 글

[DataBase] Transaction (Tx)  (0) 2023.09.01
[DataBase] SQL : DML (INSERT · UPDATE · DELETE)  (0) 2023.09.01
[OracleDB] SCOTT 계정 실습문제  (0) 2023.08.29
[DataBase] SQL : DML (SELECT)  (0) 2023.08.29
[OracleDB] Toad 설치  (0) 2023.08.29