본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] DELETE │ VIEW

■DELETE■


1. 테이블에서 지정된 행(레코드)을 삭제하는 데 사용하는 구문

2. 형식 및 구조
제약조건 때문에 제대로 제거가 안될 수 있다는 것만 염두에 두고 넘어가자

--● EMPLOYEES 테이블에서 직원들의 정보를 삭제한다.
-- 단, 부서명이 'IT'인 경우로 한정한다

-- ※ 실제로는 EMPLOYEES 테이블의 데이터가(삭제하고자 하는 대상)
-- 다른 테이블(혹은 자기 자신 테이블)에 의해 참조당하고 있는 경우
-- 삭제되지 않을 수 있다는 사실을 염두해야 하며,,,
-- 그에 대한 이유도 알아야 한다.

-- IT 부서의 부서아이디 구하기
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE DEPARTMENT_NAME='IT'; --==>>60


SELECT FIRST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID =(SELECT DEPARTMENT_ID
                        FROM DEPARTMENTS
                        WHERE DEPARTMENT_NAME='IT') ;

/*
Alexander	60
Bruce	60
David	60
Valli	60
Diana	60


총 5행*/

DELETE
FROM EMPLOYEES
WHERE DEPARTMENT_ID =(SELECT DEPARTMENT_ID
                        FROM DEPARTMENTS
                        WHERE DEPARTMENT_NAME='IT') ;
/*
--==>> 에러발생
ORA-02292: integrity constraint (HR.DEPT_MGR_FK) violated - child record found*/

-- DEPARTMENTS 테이블에서 MANAGER_ID 를 참조하고 있기 때문이다. 

SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='DEPARTMENTS';
/*
HR	DEPT_NAME_NN	DEPARTMENTS	C	DEPARTMENT_NAME	"DEPARTMENT_NAME" IS NOT NULL	
HR	DEPT_ID_PK	DEPARTMENTS	P	DEPARTMENT_ID		
HR	DEPT_LOC_FK	DEPARTMENTS	R	LOCATION_ID		NO ACTION
HR	DEPT_MGR_FK	DEPARTMENTS	R	MANAGER_ID		NO ACTION
*/



SELECT *
FROM TAB;

------------------------------------------------------------------------------

--■VIEW■

-- 1. VIEW 란 이미 특정한 데이터베이스 내에 존재하는 
-- 하나 이상의 테이블에서 사용자가 얻기 원하는 데이터들만을
-- 정확하고 편하게 가져오기 위하여 사전에 원하는 컬럼들만 모아서
-- 만들어놓은 가상의 테이블로 편의성 및 보안에 목적이 있다.
(사용자에게 제한되는 영역만 보여줄 수 있고 사용자에게 뷰 접근 권한만 부여하면
전체 테이블을 보여주지 않아도 된다. 테이블이름과 컬럼이름 알 수가 없다. 
보여주고 싶은 형태로 보여줄 수 있다. 그 테이블에 직접 접근할 수 없고
인서트나 업데이트 할 수 없다.)
-- 가상의 테이블이란 뷰가 실제로 존재하는 테이블(객체)이 아니라
-- 하나 이상의 테이블에서 파생된 또 다른 정보를 볼 수 있는 방법이며
-- 그 정보를 추출해내는 SQL 문장이라고 볼 수 있다.

 

-- 형식 및 구조
CREATE [OR REPLACE ] VIEW 뷰이름
[(ALIAS[, ALIAS, ....])]
AS
서브쿼리(SUBQUERY)
[WITH CHECK OPTION]
[WITH READ ONLY];


-- ● 뷰 (VIEW) 생성
CREATE OR REPLACE VIEW VIEW_EMPLOYEES
AS
SELECT E.FIRST_NAME, E.LAST_NAME, D.DEPARTMENT_NAME, L.CITY, C.COUNTRY_NAME, R.REGION_NAME
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L, COUNTRIES C, REGIONS R
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+)
  AND D.LOCATION_ID = L.LOCATION_ID(+)
  AND L.COUNTRY_ID = C.COUNTRY_ID(+)
  AND C.REGION_ID = R.REGION_ID(+);
--==>>View VIEW_EMPLOYEES이(가) 생성되었습니다.  

  
  -- ● 뷰(VIEW) 구조 확인
DESC VIEW_EMPLOYEES;
/*
이름              널?       유형           
--------------- -------- ------------ 
FIRST_NAME               VARCHAR2(20) 
LAST_NAME       NOT NULL VARCHAR2(25) 
DEPARTMENT_NAME          VARCHAR2(30) 
CITY                     VARCHAR2(30) 
COUNTRY_NAME             VARCHAR2(40) 
REGION_NAME              VARCHAR2(25) 

*/





-- ● 뷰 소스 확인
SELECT VIEW_NAME, TEXT         --★ TEXT 기억하기
FROM USER_VIEWS                 --★ USER_VIEWS
WHERE VIEW_NAME = 'VIEW_EMPLOYEES';

/*
VIEW_EMPLOYEES	


"SELECT E.FIRST_NAME, E.LAST_NAME
     , D.DEPARTMENT_NAME, L.CITY
     , C.COUNTRY_NAME, R.REGION_NAME
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L, COUNTRIES C, REGIONS R
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+)
  AND D.LOCATION_ID = L.LOCATION_ID(+)
  AND L.COUNTRY_ID = C.COUNTRY_ID(+)
  AND C.REGION_ID = R.REGION_ID(+)"*/
  
  
  

 

VIEW 의 소스(생성할 때 작성했던 구문) 을 알기 위해서

SELECT TEXT

FROM USER_VIEWS

WHERE VIEW_NAME = 뷰이름;

해보면 알 수 있다.