[230710] 집합, 재귀쿼리, 인덱스, 뷰 (DAY 9) - 구디아카데미후기 IT국비지원 민경태 강사님

MJ·2023년 7월 11일

수업 TIL🐣💚

목록 보기
9/68

🔸집합

  • 2개 이상의 테이블을 한 번에 조회하는 방식 중 하나
  • 모든 SELECT 절의 칼럼 순서와 타입이 일치해야 함
  • 집합 연산자
    • UNION : 합집합, 중복 값은 한 번만 조회
    • UNION ALL : 합집합, 중복 값도 그대로 조회
    • INTERSECT : 교집합, 중복 값은 한 번만 조회
    • MINUS : 차집합, 첫 번째 SELECT 결과에서 두 번째 SELECT 결과 뺌
  • 형식
SELECT 칼럼1, 칼럼2, ...
  FROM 테이블1
 집합연산자
SELECT 칼럼1, 칼럼2, ...
  FROM 테이블2
[ORDER BY 정렬] -- 정렬은 두 SELECT문 마지막에

🔻합집합

-- 중복을 제거한 합집합
SELECT 1,2
  FROM DUAL
 UNION
SELECT 1,2
  FROM DUAL;
-- 중복을 그대로 조회하는 합집합
SELECT 1,2
  FROM DUAL
 UNION ALL 
SELECT 1,2
  FROM DUAL;

🔻교집합

-- 사원 테이블과 부서 테이블에 모두 존재하는 부서번호 조회
-- (사원들이 근무중인 부서번호만 조회하는 문제)
SELECT DEPARTMENT_ID
  FROM DEPARTMENTS
INTERSECT
SELECT DEPARTMENT_ID
  FROM EMPLOYEES;
-- 조인으로 풀면 내부조인

🔻차집합

-- 부서테이블에 존재하지만 사원 테이블에 존재하지 않는 부서번호 조회
SELECT DEPARTMENT_ID
  FROM DEPARTMENTS
 MINUS
SELECT DEPARTMENT_ID
  FROM EMPLOYEES;

🔸재귀쿼리

-- 활용1. WITH문과 재귀 쿼리
WITH MY_SUBQUERY(N, TOTAL) AS (     -- N, TOTAL은 MY_SUBQUERY의 칼럼을 의미한다.
    SELECT 1, 1                     -- N=1, TOTAL=1을 의미하는 초기화 서브쿼리
      FROM DUAL
     UNION ALL
    SELECT N + 1, TOTAL + (N + 1)   -- N = N + 1, TOTAL = TOTAL + (N + 1) 방식으로 반복해서 처리되는 부분
      FROM MY_SUBQUERY
     WHERE N < 10
)
SELECT N, TOTAL FROM MY_SUBQUERY;
-- 활용2. WITH문과 재귀 쿼리를 활용한 사원의 레벨 표시하기
-- MANAGER가 몇 명인가에 따른 LVL 표시하기
-- MANAGER가 0명이다 : LVL = 1
-- MANAGER가 1명이다 : LVL = 2
WITH MY_SUBQUERY(LVL, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID) AS (
    -- 초기값(LVL = 1)을 지정하는 서브쿼리
    SELECT 1, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID
      FROM EMPLOYEES
     WHERE MANAGER_ID IS NULL
     UNION ALL
    -- 반복해서 호출되는 서브쿼리
    SELECT M.LVL + 1 AS LVL, E.EMPLOYEE_ID, E.FIRST_NAME, E.LAST_NAME, E.MANAGER_ID
      FROM EMPLOYEES E INNER JOIN MY_SUBQUERY M
        ON E.MANAGER_ID = M.EMPLOYEE_ID
)
SELECT LVL, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID
  FROM MY_SUBQUERY;

🔸인덱스

🔻ROWID

  • 오라클에서 제공하는 가상 칼럼 (PSEUDO (수두 슈두) COLUMN)
  • 어떤 행이 어디에 저장되어 있는지 알고 있는 칼럼
  • 실제 저장된 물리적 저장위치를 확인 가능
  • ROWID를 이용한 조회법은 오라클에서 가장 빠른 조회 방법이지만 실무에서 사용하는 것은 불가능, 대신 사용하는 것이 인덱스
-- ROWID 확인
SELECT ROWID, EMPLOYEE_ID, FIRST_NAME, LAST_NAME
  FROM EMPLOYEES; 
 -- SELECT 문으로 ROWID 확인해볼 수 있는데 
 -- 확인하면 AAAR+IAAHAAAADOAAE 이런 형태로 조회됨. 그니까 당연히 ROWID 이용한 조회 불가능

🔻INDEX

  1. 빠른 조회를 지원하는 데이터베이스 객체
  2. 어떤 데이터가 어떤 ROWID를 가지고 있는지 알고 있음
  3. 기본키(PK)와 중복이 없는 칼럼(UNIQUE)은 자동으로 인덱스가 만들어짐
  4. 데이터의 삽입/수정/삭제 시 인덱스도 함께 갱신해야 하기 때문에 인덱스가 많으면 전체 성능이 떨어질 수 있음
-- 인덱스를 타는 조회
SELECT *
  FROM EMPLOYEES
 WHERE EMPLOYEE_ID ='150'; -- 빠른 조회 가능
-- 인덱스를 안 타는 조회 (인덱스 칼럼 그대로 사용하지 않고 함수 적용해서 사용하면 인덱스 타지 않음.)
--(가능하면 칼럼(왼쪽) 건들지 말고 함수는 뒤로)
SELECT *
  FROM EMPLOYEES
 WHERE TO_CHAR(EMPLOYEES)='150';

인덱스 정보가 저장된 데이터 사전

데이터 사전
1. 특정 데이터의 정보를 담고 있는 객체
2. 시스템 카탈로그, 메타 데이터라고 함
3. 계정 유형별로 관리
    1) DBA_ : 가장 많은 정보 담고 있음, USER는 DBA 권한 없어서 조회못함
    2) USER_ : 유저가 가지고 있는 것
    3) ALL_ : 유저가 접근할 수 있는 것
  • 인덱스 정보가 저장되어 있는 데이터 사전(이미 만들어진 테이블)
    • DBA_INDEXES, USER_INDEXES, ALL_INDEXED
  • 인덱스가 설정된 칼럼 정보가 저장되어 있는 데이터 사전
    • DBA_IND_COLUMNS, USER_IND_COLUMNS, ALL_IND_COLUMNS
SELECT * FROM USER_IND_COLUMNS; 
-- 어느 테이블 어느 칼럼에 인덱스가 주어져있는지 명확하게 확인 가능
SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME='EMPLOYEES'; 
-- EMPLOYEES 테이블의 인덱스만 확인

인덱스 생성, 삭제

-- 부서 테이블(DEPARTMENTS)의 부서명(DEPARTMENT_NAME) 칼럼에 인덱스(INDEX DEPT_NAME_IX) 설정하기
CREATE INDEX DEPT_NAME_IX
    ON DEPARTMENTS(DEPARTMENT_NAME);    
-- 인덱스 DEPT_NAME_IX 삭제하기
DROP INDEX DEPT_NAME_IX;

🔸뷰

  • 테이블이나 다른 뷰를 이용해서 만든 가상 테이블.
  • 데이터가 아닌 쿼리문만을 저장.
  • 자주 사용하고 복잡한 쿼리문을 뷰로 만들어 두면 쉽게 호출해서 사용 가능 (성능 이점은 없음)
-- 뷰 생성
CREATE VIEW V_EMP AS  (
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, E.LAST_NAME, E.JOB_ID, D.DEPARTMENT_ID, D.DEPARTMENT_NAME, D.LOCATION_ID
  FROM DEPARTMENTS D INNER JOIN EMPLOYEES E
    ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
    );
-- 뷰 조회. 사원번호, 사원명, 부서번호, 부서명, 지역번호, 도로명 주소를 조회
SELECT V.EMPLOYEE_ID, V.FIRST_NAME, V.LAST_NAME, V.DEPARTMENT_ID, V.DEPARTMENT_NAME, L.LOCATION_ID, L.STREET_ADDRESS
  FROM LOCATIONS L INNER JOIN V_EMP V
    ON L.LOCATION_ID = V.LOCATION_ID; 
    -- 뷰 이용한 두 개 조인이지만 사실은 세 개(E,D,L) 조인이랑 같은 결과
-- 뷰 삭제
DROP VIEW V_EMP;


🟢 구디아카데미후기 IT국비지원 민경태 강사님 수업 9일차! 🟢
9일만에 DB 진도가 다 끝났다... 진자 대박이다. 학교다닐때 (대충 듣긴 했지만) 한 학기동안
수업들어도 뭔 소리지 싶었는데 이제 좀 알것 같은 느낌. 근데 그게 9일만에 끝나다니 😲
방심하지말고 복습도 열심히 하고 싶은데... 하\겟지? 이젠 자바 시작이라 할 게 많아질 것 같아서ㅋㅋㅋ 암튼 DB는 이제 끝ㅌ.....!

0개의 댓글