ORACLE SQL

SUBQUERY

마이구미2 2021. 3. 1. 17:51

서브쿼리 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