Join & Transaction

유웅조·2020년 1월 13일
0

관계형 데이터베이스에서는 중복 데이터를 피하기 위해 데이터를 쪼개 여러 테이블로 나누어 저장한다. 단, 이렇게 저장할 경우에는 원하는 결과를 다시 도출하기 위해 여러 테이블을 조합해야 한다. 관계형 데이터베이스에서는 이를 위해 JOIN 연산자를 사용한다.

다음은 MySQL에서 지원하는 JOIN 연산이다.

  • Inner Join
    • Cross Join - Cartesin Join
    • Equal Join
    • Non-Equal Join
    • Natural Join
  • Outer Join
    • Full Outer Join
    • Left Outer Join
    • Right Outer Join
  • Self Join
  • Anti Join
  • Semi Join

Cross Join - Cartesin Product

교차 조인은 두 테이블의 카티션 프로덕트(곱집합)를 한 결과이다. 특별한 조건없이 테이블 A의 각 행과 테이블 B의 각 행을 다 조합한 결과이다.

교차 조인 예시

# Explicit Notation
SELECT * FROM employees CROSS JOIN dept_emp;
# Implicit Notaion
SELECT * FROM employees, dept_emp;

Inner Join

내부 조인은 가장 많이 사용되는 조인 구문 중에 하나이다. 내부 조인은 2개의 테이블의 컬럼을 합쳐 새로운 테이블을 생성한다.

# Explicit Notation
SELECT * FROM employees INNER JOIN dept_emp ON employees.emp_no = dept_emp.emp_no;
# Implicit Notation
SELECT * FROM employees, dept_emp WHERE employees.emp_no = dept_emp.emp_no;

Outer Join

내부 조인의 경우, 공통 컬럼명 기반으로 결과 집합을 생성한다.

  1. Left Outer Join
  • 왼쪽 외부 조인은 테이블 A의 모든 데이터와 테이블 B와 매칭이 되는 레코드를 포함한다.
    SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.n = table2.n;
    # table1의 모든 데이터와 table1과 table2의 n 컬럼이 매칭이 되는 모든 데이터를 나타낸다. 
  1. Right Outer Join
  • 오른쪽 외부 조인은 테이블 B의 모든 데이터와 테이블 A와 매칭이 되는 레코드를 포함한다.
    SELECT * FROM table1 RIGHT OUTER JOIN table2 ON table1.n = table2.n;
    # table2의 모든 데이터와 table1의 n 컬럼이 매칭이 되는 모든 데이터를 나타낸다. 

Self Join

셀프 조인은 자기 자신과 조인하는 조인이다.

SELECT A.first_name AS EmployeeName1, B.first_name AS EmployeeName2, A.dept_no
FROM employees AS A, employees AS B
WHERE A.emp_no <> B.emp_no
AND A.dept_no = B.dept_no;

Anti Join

안티 조인은 서브 쿼리 내에서 존재하지 않는 데이터만 추출하여 메인 쿼리에서 추출하는 조인이다.

Semi Join

세미 조인은 안티 조인과 반대로 서브 쿼리 내에서 존재하는 데이터만을 가지고 메인 쿼리에서 추출하는 방식이다.

Transaction

Transaction(트랜잭션이란...?)

트랜잭션은 데이터베이스 관리 시스템에서의 상호작용의 단위이다. 이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성, 일관성, 독립성, 영구성을 보장한다. 이 성질을 첫글자를 따 ACID라고 한다. 그러나, 실제로는 성능 향상을 위해 이런 특성들이 종종 완화되곤 한다. 어떤 시스템에서는 트랜잭션을 논리적 작업 단위로 부르기도 한다.
트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이며, 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다. 마지막으로 하나의 트랜잭션은 Commit되거나 Rollback된다.

앞서 트랜잭션의 성질에 4가지가 있다고 했다. 각각이 무슨 뜻인지 간략하게 알아보자면 다음과 같다.

  1. Atomicity 원자성
  • 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
  1. Consistency 일관성
  • 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터 베이스 상태로 변환한다.
  • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.
  1. Isolation 독립성
  • 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.
  • 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
  1. Durability 영구성
  • 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.

하나의 트랜잭션은 반드시 Commit 되거나 Rollback 된다. 그렇다면 각각 Commit과 Rollback은 정확히 무엇을 의미할까.

먼저 Commit은 논리적 단위(트랜잭션)의 작업이 성공했을 때, 트랜잭션 관리자에게 알려주는 연산을 말한다.

다음으로 Rollback은 한개의 트랜잭션이 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 트랜잭션의 원자성을 구현하기 위해 여태까지 트랜잭션이 행한 모든 연산을 취소하는 연산이다. 즉, 해당 트랜잭션을 재시작하거나 폐기한다.

ps. 다음의 명령은 자동 Commit되기 때문에 Rollback할 수 없다.
  • DROP DATABASE
  • DROP TABLE
  • DROP
  • ALTER TABLE

0개의 댓글