관계형 데이터베이스에서는 중복 데이터를 피하기 위해 데이터를 쪼개 여러 테이블로 나누어 저장한다. 단, 이렇게 저장할 경우에는 원하는 결과를 다시 도출하기 위해 여러 테이블을 조합해야 한다. 관계형 데이터베이스에서는 이를 위해 JOIN 연산자를 사용한다.
다음은 MySQL에서 지원하는 JOIN 연산이다.
교차 조인은 두 테이블의 카티션 프로덕트(곱집합)를 한 결과이다. 특별한 조건없이 테이블 A의 각 행과 테이블 B의 각 행을 다 조합한 결과이다.
교차 조인 예시
# Explicit Notation
SELECT * FROM employees CROSS JOIN dept_emp;
# Implicit Notaion
SELECT * FROM employees, dept_emp;
내부 조인은 가장 많이 사용되는 조인 구문 중에 하나이다. 내부 조인은 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;
내부 조인의 경우, 공통 컬럼명 기반으로 결과 집합을 생성한다.
SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.n = table2.n;
# table1의 모든 데이터와 table1과 table2의 n 컬럼이 매칭이 되는 모든 데이터를 나타낸다.
SELECT * FROM table1 RIGHT OUTER JOIN table2 ON table1.n = table2.n;
# table2의 모든 데이터와 table1의 n 컬럼이 매칭이 되는 모든 데이터를 나타낸다.
셀프 조인은 자기 자신과 조인하는 조인이다.
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;
안티 조인은 서브 쿼리 내에서 존재하지 않는 데이터만 추출하여 메인 쿼리에서 추출하는 조인이다.
세미 조인은 안티 조인과 반대로 서브 쿼리 내에서 존재하는 데이터만을 가지고 메인 쿼리에서 추출하는 방식이다.
트랜잭션은 데이터베이스 관리 시스템에서의 상호작용의 단위이다. 이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성, 일관성, 독립성, 영구성을 보장한다. 이 성질을 첫글자를 따 ACID라고 한다. 그러나, 실제로는 성능 향상을 위해 이런 특성들이 종종 완화되곤 한다. 어떤 시스템에서는 트랜잭션을 논리적 작업 단위로 부르기도 한다.
트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이며, 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다. 마지막으로 하나의 트랜잭션은 Commit되거나 Rollback된다.
앞서 트랜잭션의 성질에 4가지가 있다고 했다. 각각이 무슨 뜻인지 간략하게 알아보자면 다음과 같다.
하나의 트랜잭션은 반드시 Commit 되거나 Rollback 된다. 그렇다면 각각 Commit과 Rollback은 정확히 무엇을 의미할까.
먼저 Commit은 논리적 단위(트랜잭션)의 작업이 성공했을 때, 트랜잭션 관리자에게 알려주는 연산을 말한다.
다음으로 Rollback은 한개의 트랜잭션이 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 트랜잭션의 원자성을 구현하기 위해 여태까지 트랜잭션이 행한 모든 연산을 취소하는 연산이다. 즉, 해당 트랜잭션을 재시작하거나 폐기한다.