| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 스프링부트
- 디자인 패턴
- 프론트엔드
- node.js
- 자바스크립트
- BACK-END
- java
- 쿼리
- SQL
- 알고리즘
- 코드 테스트
- 자바
- MySQL
- web
- 오라클
- JavaScript
- oracle
- jsp
- 정리
- 데이터베이스
- spring
- jpa
- 스프링
- 프로그래머스
- 프런트엔드
- 백엔드
- 코드테스트
- Next.js
- 서버
- 미니정리
- Today
- Total
참치코더의 꿈 메모장
2021/08/04 Oracle - 서브쿼리 본문
서브쿼리
서브쿼리는 SQL문을 실행하는데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT문을
의미한다.
서브쿼리의 결과를 사용하여 기능을 수행하는 영역은 메인쿼리라고 부른다.
SELECT 조회할 열 -> 메인 쿼리
FROM 조회할 테이블
WHERE 조건식 (SELECT 조회할 열
FROM 조회할 테이블 -> 서브쿼리
WHERE 조건식)
서브쿼리의 특징
1. 서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 괄호( )로 묶어서 사용한다.
2. 특수한 몇몇 경우를 제외한 대부분의 서브쿼리에서는 ORDER BY절을 사용할 수 없다.
3. 서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 같은 개수로 지정해야 한다.
즉 메인쿼리의 비교 대상자가 하나라면 서브쿼리의 SELECT절 역시 같은 자료형인 열을 하나 지정해야 한다.
4. 서브쿼리에 있는 SELECT문의 결과 행 수는 함께 사용하는 메인쿼리의 연산자 종류와 호환 가능해야 한다.
메인쿼리에 사용한 연산자가 단 하나의 데이터로만 연산이 가능한 연산자라면 서브쿼리의 결과 행 수는
반드시 하나여야 한다.
단일행 서브쿼리
단일행 서브쿼리는 실행 결과가 단 하나의 행으로 나오는 서브쿼리를 뜻한다.
서브쿼리에서 출력되는 결과가 하나이므로 메인쿼리와 서브쿼리는 단일한 연산자를 사용하여 비교한다.
단일형 서브쿼리와 함수
서브쿼리에서 특정 함수를 사용한 결과 값이 하나일때 단일행 서브쿼리로서 사용가능하다.
다중행 서브쿼리와 함수
다중행 서브쿼리는 실행 결과 행이 여러 개로 나오는 서브쿼리를 가리킨다.
단일행 서브쿼리와 달리 서브쿼리 결과가 여러 개이므로 단일행 연산자는 사용할 수 없고 다중행 연산자를
사용해야 메인쿼리와 비교할 수 있다.
| 다중행 연산자 | 설명 |
| IN | 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true |
| ANY, SOME | 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true |
| ALL | 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true |
| EXISTS | 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) true |
* ANY, SOME 연산자는 서브쿼리가 반환한 여러 결과 값 중 메인쿼리와 조건식을 사용한 결과가 하나라도 true이면
메인쿼리 조건식을 true로 반환해 주는 연산자이다.
* EXISTS 연산자는 서브쿼리에 결과 값이 하나 이상 존재하면 조건식이 모두 true
존재하지 않으면 모두 false가 되는 연산자이다.
* EXISTS 연산자는 다른 다중행 연산자에 비해 그리 자주 사용하는 편은 아니지만,
특정 서브쿼리 결과 값의 존재 유무를 통해 메인쿼리의 데이터 노출여부를 결정해야 할때 간혹 사용한다.
비교할 열이 여러 개인 다중열 서브쿼리
다중열 서브쿼리는 서브쿼리의 SELECT절에 비교할 데이터를 여러 개 지정하는 방식이다.
메인쿼리에 비교할 열을 괄호로 묶어 명시하고 서브쿼리에서는 괄호로 묶은 데이터와 같은 자료형 데이터를
SELECT절에 명시하여 사용할 수 있다.
FROM절에서 사용하는 서브쿼리와 WITH절
FROM절에도 서브쿼리를 사용할 수 있다.
FROM절에서 사용하는 서브쿼리는 인라인뷰라고도 부른다.
인라인 뷰는 특정 테이블 전체 데이터가 아닌 SELECT문을 통해 일부 데이터를 먼저 추출해 온 후
별칭을 주어 사용할 수 있다.
이 방식은 FROM절에 직접 테이블을 명시하여 사용하기에는 테이블 내 데이터 규모가 너무 크거나
현재 작업에 불필요한 열이 너무 많아 일부 행과 열만 사용하고자 할 때 유용하다.
FROM절에 너무 많은 서브쿼리를 지정하면 가독성이나 성능이 떨어질 수 있기 때문에 경우에 따라
WITH절을 사용하기도 한다.
WITH절은 메인쿼리가 될 SELECT문 안에서 사용할 서브쿼리와 별칭을 먼저 지정한 후 메인쿼리에서 사용한다.
WITH
[별칭1] AS (SELECT문 1),
[별칭2] AS (SELECT문 2),
. . .
[별칭n] AS (SELECT문 n)
SELECT
FROM 별칭1, 별칭2, 별칭3
. . .
* WITH절은 여러 개의 서브쿼리가 몇 십, 몇 백 줄 이상 넘나드는 규모가 되었을 경우
실제 수행해야 하는 메인쿼리와 서브쿼리를 분류할 때 꽤 유용하게 사용할 수 있다.
SELECT절에 사용하는 서브쿼리
서브쿼리는 SELECT절에도 사용할 수 있다.
스칼라 서브쿼리라고 부르는 이 서브쿼리는 SELECT절에 하나의 열 영역으로서 결과를 출력할 수 있다.
SELECT절에 명시하는 서브쿼리는 반드시 하나의 결과만 반환하도록 작성해 주어야 한다.
'Oracle' 카테고리의 다른 글
| 2021/08/15 Oracle - 테이블에 있는 데이터 수정하기 (0) | 2021.08.15 |
|---|---|
| 2021/08/15 Oracle - 테이블에 데이터 추가하기 (0) | 2021.08.15 |
| 2021/08/03 Oracle - SQL_99 (ANSI) 표준 조인 (0) | 2021.08.03 |
| 2021/07/30 Oracle - 조인(등가조인, 자체조인, 외부조인) (0) | 2021.07.30 |
| 2021/07/25 Oracle - 그룹화와 관련된 여러 함수 (0) | 2021.07.25 |