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;
가상 칼럼 (PSEUDO (수두 슈두) COLUMN)물리적 저장위치를 확인 가능인덱스-- ROWID 확인 SELECT ROWID, EMPLOYEE_ID, FIRST_NAME, LAST_NAME FROM EMPLOYEES; -- SELECT 문으로 ROWID 확인해볼 수 있는데 -- 확인하면 AAAR+IAAHAAAADOAAE 이런 형태로 조회됨. 그니까 당연히 ROWID 이용한 조회 불가능
빠른 조회를 지원하는 데이터베이스 객체ROWID를 가지고 있는지 알고 있음(PK)와 중복이 없는 칼럼(UNIQUE)은 자동으로 인덱스가 만들어짐-- 인덱스를 타는 조회 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_INDEXEDDBA_IND_COLUMNS, USER_IND_COLUMNS, ALL_IND_COLUMNSSELECT * 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는 이제 끝ㅌ.....!