본문 바로가기
💿DBMS/오라클

[20210609] 조인2, 서브쿼리, DML, TCL

by 캔 2021. 6. 9.

INNER JOIN: 조건에 맞는 항목만 출력된다.
OUTER JOIN: 조건에 맞지 않은 항목도 출력된다.

OUTER LEFT JOIN: 오른쪽 테이블의 칼럼이 왼쪽 테이블 칼럼 조건이 맞지 않아도 출력된다.
OUTER RIGHT JOIN: 왼쪽 테이블의 칼럼이 오른쪽 테이블 칼럼 조건이 맞지 않아도 출력된다.

서브쿼리

1. 쿼리문 안쪽의 쿼리문이다.
2. 반드시 ( )로 감싼다.
3. 서브쿼리 먼저 실행된다.
4. 서브쿼리만 가지고도 실행된다.
5. 서브쿼리의 결과가 바깥 쿼리의 인자(매개변수)로 사용된다.
6. 서브쿼리의 대부분은 조인문으로 만들 수 있다.
7. 서브쿼와 조인문은 병행되어서 사용할 수 있다.

SET 연산자: 두 개의 SELECT문들의 결과를 처리하는 방법
1.UNION: SELECT1의 결과를 구하고, SELECT2를 처리해서 두 결과를 하나로 합친다. 합친 결과는 첫 번째 필드를 기준으로 정렬하고, 중복된 레코드는 제거
2.UNION ALL: UNION과 달리 중복된 레코드를 제거 안 한다.
3.INTERSECT: SELECT1문을 처리할 때, 첫 번째 필드를 기준으로 정렬시키면서 결과-레코드 집합을 구하고, SELECT2문을 처리하고, 첫 번째 필드를 기준으로 정렬시키면서 결과-레코드 집합을 구한 후, 두 SELECT문의 정렬된 결과-레코드 집합으로부터 공통된 결과-레코드만 추출하여 표시.
4.MINUS: SELECT1문의 내용에서 SELECT2 내용 중 공통된 부분을 제거한 나머지 출력.
* UNION ALL을 제외하고 모두 SORT가 발생하므로, 메모리 소모가 많다.
* 두 SELECT문은 칼럼의 개수, 위치 유형 동일하다.
* ALIAS는 첫번째 SELECT에 기술하면 된다.
* 3개 이상의 SELECT문도 가능, 위에서 아래로 처리된다.
* ORDER BY는 맨 마지막에 기술
SET 연산자의 위치는 두 SELECT문 사이에 위치한다.

DML(Database Manipulaton Language, 데이터 조작 언어)

INSERT문
테이블에 레코드를 추가하는 구문
   예) INSERT INTO 테이블명(칼럼명1,..., 칼럼명N) VALUES(칼럼명1에 입력할 값, ... 칼럼명N에 입력할 값);
* 쓰기 위해서는 테이블 구조(칼럼 이름들과 입력 데이터 형, 제약조건 등)를 알고 있어야 한다.
* 칼럼명이 다르면 오류
* 칼럼의 데이터 형이 달라도 오류
* 테이블에 존재하는 칼럼 수를 초과하여 레코드를 입력할 수 없다.
* INSERT 문에 적은 칼럼명의 개수는 생략 가능하지만 생략할 경우 테이블의 모든 칼럼의 개수만큼 입력해야 한다.
* 문자는 작은따옴표(')로 감싸주고, 숫자는 그럴 필요가 없다.

UPDATE문
   예) UPDATE 테이블명 SET 칼럼명 = 값 WHERE 조건식
* WHERE 절 입력하지 않을 경우 모든 레코드를 변경하므로 주의해야 한다.

DELETE문
   예) DELETE FROM 테이블명 WHERE 조건식
* WHERE 절 입력하지 않을 경우 모든 레코드를 변경하므로 주의해야 한다.

 

TCL(Transaction Control Language, 트랜잭션 제어 언어)

COMMIT: DML 완료 후 변경 상태의 데이터로 유지하면서 트랙잭션 종료, 물리 디스크에 처리내용 기록한다.
* 직접 DB로 접속해서 DML 수행 후에는 트랙잭션을 명시적으로 종료해야 한다.
* 세션 사용자가 DML문을 실행하고 COMMIT, ROLLBACK을 하지 않고, 오라클 서버에서 비정상적으로 종료될 경우, 트랜잭션은 자동으로 ROLLBACK된다.
* 오라클서버는 트랜잭션을 시작하는 별도의 명령어가 없고, 접속한 세션에서 DML문이 하나가 처음 실행되면, 서버에서
자동으로 해당 세션의 트랜잭션을 관리하게 된다.
* 트랜잭션에 해당되는 것은 DML문, DDL문, DCL문이고 SELECT는 트랜잭션과 관계없다.

ROLLBACK: DML 완료 후 변경 전의 상태로 되돌리고 트랜잭션 종료한다.

SAVEPOINT: 특정 시점 이전에 수행한 작업을 나중에 복원할 수 있도록 어떤 작업까지 수행했는지에 대한 지점을 만드는 기능이다. 'SAVEPOINT 세이브포인트명;'과 같이 쓴다.

LOCK 기능: 여러 세션에서 하나의 ROW를 작업할 때 먼저 작업한 세션이 트랜잭션을 실행하지 않은 경우, 다른 세션에서 작업을 하지 못하게 LOCK을 걸어 놓는 개념이다. 트랜잭션이 완료되면 다른 세션에서 작업 가능해진다.
- SELECT문에서 [FOR UPDATE절] 사용
* SELECT문에 의하여 액세스되는 행에는 LOCK이 걸리지 않는다.
상황에 따라 SELECT문에 의해 액세스 되는 행에 LOCK을 걸어야
할 경우도 있다. 해당 세션의 사용자가 COMMIT, ROLLBACK문을
수행하지 전까지는 다른 세션의 사용자는 행을 변경할 수 없다.
    예) SELECT EMPNO, SAL, COMM, JOB
         FROM EMP
         WHERE DEPTNO = 30
         FOR UPDATE
         ORDER BY EMPNO;