서브쿼리 SUBQUERY
하나의 SELECT문 안에 포함되어 있는 또 다른 SELECT문
특징
연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이면 괄호로 묶어서 사용
대부분의 서브쿼리에서 ORDER BY절 사용 불가(ORDER BY절은 메인쿼리의 마지막 문장에 위치함)
서브쿼리의 SELECT절에 명시한 컬럼은 메인쿼리의 비교 대상과 같은 자료형, 같은 개수로 지정해야 함
서브쿼리에 있는 SELECT문의 결과 행 수는 메인쿼리의 연산자 종류와 호환 가능해야 함
서브쿼리에서 사용 가능한 연산자
단일행 연산자: =, >, <, >=, <=, <>, !=, ^=
다중행 연산자: IN, ANY, SOME, ALL, EXISTS
다중행 연산자 | 설명 |
IN | 메인쿼리와 서브쿼리의 결과가 하나라도 일치하면 ture |
ANY, SOME | 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true |
ALL | 메인쿼리의 조건식을 모든 서브쿼리의 결과가 만족하면 true |
EXISTS | 서브쿼리의 결과가 존재하면 true |
서브쿼리가 사용 가능한 절
WHERE절, HAVING절, INSERT문의 INTO 절, UPDATE문의 SET절, SELECT|DELETE문의 FROM 절
WHERE절에 사용하는 서브쿼리
단일행 서브쿼리 SINGLE-ROW SUBQUERY
실행 결과가 단 하나의 행으로 나오는 서브쿼리
단일행 연산자를 사용하여 메인쿼리와 비교
테이블 전체가 하나의 그룹으로 적용될 경우, 결과값이 단 하나로 출력되기 때문에 그룹함수 사용 가능
SELECT *
FROM 테이블명
WHERE 컬럼명 단일행연산자 (
SELECT 컬럼명
FROM 테이블
WHERE 조건 );
다중행 서브쿼리 MULTIPLE-ROW SUBQUERY
실행 결과 행이 여러 개로 나오는 서브쿼리
다중행 연산자를 사용하여 메인쿼리와 비교
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 단일행연산자 다중행연산자(
SELECT 컬럼명
FROM 테이블
GROUP BY 그룹화할_컬럼명);
다중열 서브쿼리 MULTIPLE-COLUMN SUBQUERY
서브쿼리의 SELECT절에 비교할 데이터를 여러 개 지정
지정한 컬럼 전체를 동시에 비교
SELECT *
FROM 테이블명
WHERE (컬럼명1, 컬럼명2) 다중행연산자 (
SELECT 컬럼명1, 컬럼명2
FROM 테이블명
WHERE 조건
GROUP BY 그룹화할_컬럼명);
이 외 서브쿼리
FROM절에 사용하는 서브쿼리 : 인라인 뷰(inline view)
서브쿼리의 결과를 테이블처럼 사용한다는 의미(FROM절에 사용되는 서브쿼리가 하나의 테이블인 것처럼 동작)
SELECT문을 통해 일부 데이터를 먼저 추출한 후 별칭을 주어 사용
테이블 내 데이터 규모가 너무 크거나 현재 작업에 불필요한 데이터가 많아 일부 데이터만 사용하고자 할 때 유용
SELECT 컬럼명
FROM (
SELECT *
FROM 테이블명
WHERE 조건) 별칭명;
WITH절
FROM절에 너무 많은 서브쿼리를 지정할 시 가독성이나 성능 떨어질 수 있어 WITH절 사용
메인쿼리가 될 SELECT문 안에서 사용할 서브쿼리와 별칭을 먼저 지정한 후, 메인쿼리에서 사용
WITH
별칭명1 AS (SELECT문1),
별칭명2 AS (SELECT문2),
...
별칭명N AS (SELECT문N)
SELECT
FROM 별칭명1, 별칭명2, ... 별칭명N;
SELECT절에 사용하는 서브쿼리 : 스칼라 서브커리(scalar subquery)
SELECT절에 하나의 컬럼으로 결과 출력 가능
반드시 하나의 결과만 반환하도록 작성
SELECT 컬럼명1, (
SELECT 컬럼명2
FROM 테이블명1
WHERE 조건) AS 컬럼_별칭명,
컬럼명3
FROM 테이블명2 테이블_별칭명;
CREATE문에 사용하는 서브쿼리
테이블을 생성할 때 서브쿼리를 사용해 이미 존재하는 테이블에서 필요한 데이터만 복사해 테이블 생성
CREATE TABLE 새로운_테이블명(컬럼명1, 컬럼명2, ... , 컬럼명N) AS (
SELECT 컬럼명1, 컬럼명2, ... , 컬럼명N
FROM 테이블명
WHERE 조건);
'ORACLE SQL' 카테고리의 다른 글
ORACLE 사용자 관리 (0) | 2021.03.02 |
---|---|
트랜잭션 (0) | 2021.03.02 |
JOIN (0) | 2021.02.28 |
다중행 함수 & 데이터 그룹화 (0) | 2021.02.28 |
단일행 함수 (0) | 2021.02.26 |