■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 = 뷰이름;
해보면 알 수 있다.
'📚Study Note > ORACLE' 카테고리의 다른 글
[ ORACLE ] 반복문 3가지 │ LOOP │ WHILE LOOP │ FOR LOOP (0) | 2021.04.09 |
---|---|
[ ORACLE ] PL / SQL (0) | 2021.04.08 |
[ ORACLE ] UPDATE : 테이블에서 기존 데이터를 변경 + 업데이트 실수를 백업테이블로 다시 수정하기 (0) | 2021.04.07 |
[ ORACLE ] DEFAULT 표현식 (0) | 2021.04.07 |
[ ORACLE ] NOT NULL(NN:CK:C) (0) | 2021.04.07 |