SQL의 모든 것/SQL의 실무

오라클 SELECT의 기초, WITH부터 서브쿼리까지

IT너드남 2024. 4. 18. 00:04
ORACLE 12g 기준 및 실무 영역으로 작성한 글임을 알려드립니다.

 

1. SELECT이란?

: DB에서 테이블을 조회하기 위한 가장 기본적인 DML(Data Manipulation Language)

SELECT * FROM TABLE;
  • 어떠한 테이블을 조회하고자 할 때 사용
  • '*'은 테이블의 컬럼을 의미하며, 전체를 조회하겠다는 의미이다.
  • FROM 뒤에는 조회할 테이블 및 쿼리를 기입한다.

2. WITH절의 SELECT

: WITH절은 성능 문제로 잘 사용하지 않았었다. 하지만 변수 역할로 사용되어, 쓰일 수 있으니 숙지하는 것이 좋다.

WITH AS 별칭 (SELECT COL1 FROM TABLE)
SELECT * FROM 별칭;

**WITH2번 이상 사용 시**
WITH AS 별칭 (SELECT COL1 FROM TABLE), AS 별칭2 (SELECT COL2 FROM TABLE2)
SELECT COL1 FROM 별칭 WHERE 별칭.KEY = 별칭2.KEY
  • WITH절을 사용할 때, 흔히 하는 실수가 2번 쓰일 때 WITH를 또 붙이는 것이다. 2번째 WITH절 부터는 콤마(,)로 분리해서 사용하고 WITH절이 끝나는 절에서는 무조건 SELECT 으로 선언된 WITH절을 사용하여야 한다.
  • 아래 코드는 실제로 실무에서 사용되었던 WITH절 예시이다. RCDB에서 변수처럼 선언한 후, 쿼리에서 RCDB라는 WITH절 컬럼을 변수처럼 사용하는 것이다.
SELECT * FROM ( WITH RCDB AS ( SELECT A.*
                	  	 ,A.SELM - A.CPM AS SLEM_CPM /* 매가금액 - 원가금액 */
                	  	 ,DECODE(A.SELM,0,0,ROUND((A.SLEM - A.CPM) / A.SELM, 4)) * 100 AS SLEM_CPM_RT
                               FROM (--이하 생략)

 

3. 서브쿼리의 SELECT

: 실무에서 가장 많이 사용되는 영역이다. 필자도 처음엔 스칼라, 인라인, 중첩 등 서브쿼리의 종류를 몰랐지만, 프로젝트가 진행되면서 점차 자연스럽게 숙달되었었다.

▶ 스칼라 서브쿼리

  • 아래 코드처럼 컬럼절에 사용되며, 반드시 하나의 값만을 반환해야 한다. 2개 이상의 값이 반환되면 에러로 반환된다.
SELECT COL1,
       (SELECT COL2 FROM TABLE2) AS SUB_COL,
       COL3
  FROM TABLE1;

 

▶ 인라인 뷰

  • 아래 코드처럼 FROM 절에서 테이블 대용으로 쓰이며, 반드시 KEY값끼리 JOIN 시켜주어야 한다. 본 예시는 INNER JOIN 이지만, 뒤에선 LEFT, RIGHT 등에 대한 다른 JOIN문도 다룰 것이다.
SELECT COL1
  FROM TALBE1 A,
	(SELECT COL2 FROM TABLE2) B
WHERE A.COL2 = B.COL2;

 

▶ 중첩 서브쿼리

  • SQLD와 같이 자격증 관련 공부를 하다 보면 복잡한 쿼리들이 나온다. 하지만 실제 실무 영역에서 쓰이는 쿼리에서 해당 내용들이 사용되는 경우는 드물다. 어떻게 JOIN을 구성할 지, 어떻게 SELECT을 구성할 지에 대한 성능적인 측면들을 더 고려한다.
  • 중첩 서브쿼리는 WHERE절이나 HAVING 절에서 조건절로 사용되는데, 필자가 수행했던 프로젝트에서는 거의 쓰이지 않았었다.
  • 아래 예시처럼 중첩 서브쿼리에 조건이 부합될 때, TABLE1에 대한 컬럼을 조회한다로 쓰일 수 있다.
SELECT *
  FROM TABLE1
 WHERE EXIST (SELECT 1 
    	 	 FROM TABLE2
             WHERE AMT > 0);

 

프로젝트를 진행하면서 수없이 구글링 하고, 배웠던 걸 짜내어 개발을 진행했지만, 끝나고 나니 가장 핵심적인 내용들이 보였었다. 사실 풀어서 쓴 내용들을 보더라도 이해가 잘 되지 않았을 뿐더러 내가 필요했던 건 어떤 "이론"이냐가 아니라 "어떻게" 쓰느냐 였다. 그래서 필자는 앞으로 실무에서 내가 썼던 내용을 기술할 생각이다.