ebson

오라클 SQL - SUBQUERY 본문

DATABASE STUDY

오라클 SQL - SUBQUERY

ebson 2022. 8. 28. 13:32

1. 개념

  • 쿼리 안에 또 다른 쿼리가 있는 경우임
  • 외형적으로는 한 SELECT문 안에 다른 SELECT문이 있는 경우임
  • WHERE절, FROM절 또는 SELECT절의 컬럼 리스트에 서브쿼리를 사용할 수 있음
  • WHERE절에 SELECT문을 사용하면 서브쿼리라고 함
  • FROM절에 서브쿼리를 사용하는 것을 인라인 뷰라고 함
  • SELECT절에 서브쿼리를 사용하는 것을 스칼라 서브쿼리라고 함
  • 서브쿼리 밖에 있는 SELECT문을 메인쿼리라고 함
  • 반환하는 행 수가 한 개인 것을 단일 행 서브쿼리라고 함. 단일 행 서브쿼리는 비교 연산자(=, <, <=, >=, <>)를 사용함
  • 반환하는 행 수가 여러개인 것을 다중 행 서브쿼리라고 함. 다중 행 서브쿼리는 in, any, all, exist를 사용함
  • SELECT절에 사용되는 스칼라 서브쿼리는 반드시 한 행과 한 컬럼만 반환함. 여러 행이 반환되면 오류가 발생함
  • 서브쿼리의 결과가 여러 컬럼인 것을 다중 열 서브쿼리라고 함
  • 서브쿼리 내에 메인쿼리의 컬럼이 사용된 것을 연관 서브쿼리라고 함
  • 서브쿼리에는 ORDER BY를 사용할 수 없음

 

 

2. 사용이유

  • 기본 문법만으로 복잡한 쿼리를 보다 가독성이 좋게  작성함
  • 조인할 때는 조인 대상 레코드 수를 최대한 줄이는 것이 중요하므로 옵티마이저가 제대로 판단하지 못하는 경우 사용자가 직접 연산 순서를 명시해 주면 성능적으로 이점을 얻을 수 있음
  • 알려지지 않은 기준으로 검색할 때 용이함

 

 

3. 장단점

3.1. 장점

  • 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있음
  • 복잡한 JOIN이나 UNION 같은 동작을 수행할 수 있는 다른 방법을 제공함
  • JOIN, UNION보다 가독성이 좋음
  • 비영속적인 생존기간이 SQL구문 실행 중으로 한정됨

 

3.2. 단점

  • JOIN에 비해 쿼리 속도를 저하시킬 수 있음
  • 비기능적인 관점에서 테이블에 비해 성능이 떨어지는 경향이 있음.
  • 서브쿼리가 데이터의 실체를 저장하고 있지 않아서 여러가지 성능적 문제가 발생함
  • 서브쿼리는 매번 SELECT문이 실행되므로 내용이 복잡할 수록 비용이 큼
  • 서브쿼리의 결과 데이터 양이 크면 연산 결과를 저장소에 쓰는 I/O비용이 발생함
  • 서브쿼리의 결과 집합에는 인덱스나 제약조건이 없어서 최적화가 불가능함
  •  

 

 

4.사용방법

4.1. SELECT절

 

SELECT T1.C1, (SELECT AVG(T2.C1) FROM TEMP2 T2) 

FROM TEMP T1;

 

4.2. FROM절

 

SELECT T1.C1, T2.C1, T2.C2

FROM TEMP1 T1, (SELECT C1, C2 FROM TEMP2) T2

WHERE T1.C1 = T2.C1 ;

  • 인라인 뷰라고 하며 동적으로 생성된 테이블인 것처럼 사용함
  • 메인 쿼리가 실행될 때만 일시적으로 생성되는 동적인  VIEW이기 때문에 데이터베이스에 저장되지 않음
  • 뷰 생성의 장점 : 테이블의 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않음. 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성함, 숨기고 싶은 정보가 존재하는 경우 뷰를 생성할 때 해당 컬럼을 제외할 수 있음

 

4.3. WHERE절

4.3.1. 단일행 서브쿼리

 

SELECT C1, C2, C3

FROM TEMP1

WHERE C1 <= (SELECT AVG(C1) FROM TEMP2 WHERE C2 = ‘3’)

ORDER BY C1, C2, C3

 

4.3.2. 다중행 서브쿼리

 

SELECT C1, C2, C3

FROM TEMP1

WHERE C1 IN (SELECT C1 FROM TEMP2 WHERE C2 = ‘3’)

IN, ALL, ANY, EXIST 등의 연산자와 함께 사용함

 

4.3.3. 다중 칼럼 서브쿼리

 

SELECT C1, C2, C3

FROM TEMP1

WHERE (C1, C2) IN (SELECT C1, C2 FROM TEMP2 WHERE C2 = ‘3’)

ORDER BY C1, C2, C3

 

서브쿼리의 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에 비교됨

 

4.3.4. 연관 서브쿼리

 

SELECT T1.C1, T1.C2, T1.C3

FROM TEMP1 T1

WHERE (T1.C1, T1.C2) IN (SELECT T2.C1, T2.C2 FROM TEMP2 T2 WHERE T2.C2 = T1.C2)

ORDER BY T1.C1, T1.C2, T1.C3;

  • 서브쿼리 내에 메인쿼리 컬럼을 사용함

 

 

4.4.HAVING절

 

SELECT T1.C1, T2.C1, T2.C2

FROM TEMP1 T1, TEMP2 T2

WHERE T1.C1 = T2.C1

GROUP BY T1.C1, T2.C1, T2.C2

HAVING AVG(T1.C1) < (SELECT AVG(C1) FROM T2)

 

 

4.5. ORDER BY 절

 

SELECT * FROM TEMP1 T1 ORDER BY C1

SELECT * FROM TEMP2 T2

ORDER BY (SELECT C1 FROM Y1 WHERE T1.C2 = T2.C2)

 

 

4.6. INSERT문의 VALUES절

 

INSERT INTO TEMP1 (C1, C2, C3)

VALUES((SELECT C1 FROM TEMP2), (SELECT C2 FROM TEMP2), (SELECT C3 FROM TEMP2));

 

 

4.7. UPDATE 문의 SET 절

 

UPDATE TEMP T1

SET T1.C1 = (SELECT T2.C1 FROM TEMP2 T2 WHERE T2.C1 = T1.C1)



 

참고 출처

http://www.tcpschool.com/mysql/mysql_multipleTable_subquery 

https://project-notwork.tistory.com/38 

https://dkkim2318.tistory.com/56 

 

'DATABASE STUDY' 카테고리의 다른 글

오라클 SEQUENCE  (0) 2022.08.28
오라클 PL/SQL옵티마이저  (0) 2022.08.28
오라클 SQL - JOIN  (1) 2022.08.28
마리아DB에서 오라클 PIVOT 기능 사용하기  (0) 2022.08.28
오라클DB와 마리아DB 문법 차이점 정리  (0) 2022.08.28
Comments