1. 데이터베이스의 큰 그림
1) 데이터베이스와 DBMS
- 데이터베이스: 원하는 기능을 동작시키기 위해 마땅히 저장해야 하는 정보의 집합
- 데이터베이스 관리 시스템(DBMS): 데이터베이스를 관리하기 위한 프로그램
- 크게 관계형 데이터베이스 관리 시스템, NoSQL 데이터베이스 관리 시스템이 있음
- DBMS 클라이언트는 DBMS에서 쿼리를 보냄
2) SQL 종류
- 데이터베이스에 질의하기 위한 구조화된 언어를 말함
(1) DDL
- CREATE: 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 객체 생성
- ALTER: 데이터베이스 객체 갱신
- DROP: 데이터베이스 객체 삭제
- TRUNCATE: 테이블 구조를 유지한 채 모든 레코드 삭제
(2) DML
- SELECT: 테이블의 레코드 조회
- INSERT: 테이블에 레코드 삽입
- UPDATE: 테이블의 레코드 갱신
- DELETE: 테이블의 레코드 삭제
(3) DCL
- COMMIT: 데이터베이스에 작업 반영
- ROLLBACK: 작업 이전의 상태로 되돌림
- SAVEPOINT: 롤백 기준점 설정
(4) TCL
- GRANT: 사용자에게 권한 부여
- REVOKE: 사용자로부터 권한 회수
3) 데이터베이스를 이용하는 이유
- 데이터 일관성 및 무결성 제공이 가능함
- 불필요한 중복 저장을 피할 수 있음
- 데이터 변경시 연관 데이터 변경이 가능함
- 정교한 검색이 가능함
- 백업 및 복구가 가능함
4) 데이터베이스의 저장 단위와 트랜잭션
- 엔티티: 독립적으로 존재할 수 있는 객체
- 속성: 엔티티의 특성
- 엔티티 집합: 같은 속성을 공유하는 개별 엔티티
- 릴레이션: 2차원 테이블 형태의 엔티티 집합
- 컬렉션: NoSQL의 일종인 RDBMS에서 표현하는 엔티티 집합
- 레코드: 데이터베이스에 기록된 각각의 엔티티
- 필드: 데이터베이스에 저장된 엔티티 속성
- 스키마
- RDBMS와 NoSQL을 구분하는 주요 기준 중 하나
- 데이터베이스에 저장되는 레코드의 구조와 제약 조건을 정의
- RDBMS는 명확하나 NoSQL은 그렇지 않음
- 트랜잭션
- 데이터베이스와의 논리적 상호작용의 단위
- 초당 트랜잭션 지표로 데이터베이스의 작업 성능을 나타내기도 함
- 트랜잭션은 하나 이상의 쿼리를 포함할 수 있음
5) ACID
- 원자성: 하나의 트랜잭션 결과가 모두 성공하거나 실패하는 성질
- 일관성: 트랜잭션 전후로 데이터베이스가 일관된 상태를 유지하는 성질
- 격리성: 동시에 수행되는 여러 트랜잭션이 서로 간섭하지 않도록 보장하는 성질
- 지속성: 트랜잭션이 성공적으로 끝난 뒤 그 결과가 영구적으로 반영되는 성질
2. RDBMS의 기본
1) 필드 유형
(1) 숫자형
- TINYINT, SMALLIT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL
(2) 문자형
- CHAR, VARCHAR, BLOB, TEXT
(3) 날짜/시간형
- DATE, TIME, DATETIME, TIMESTAMP
(4) 기타
- ENUM, GEOMETRY, XML, JSON
2) 키
테이블 내 특정 레코드를 식별할 수 있는 필드의 집합
- 테이블의 각 레코드를 식별하는 용도로 사용
- 테이블 간 참조를 위해 사용
- 테이블 접근 속도를 높이기 위해 사용
(1) 기본 키
- 한 레코드를 식별하도록 선정되어 테이블당 하나만 존재할 수 있는 키
- 유일성과 최소성을 모두 만족함
- 여러 필드로 구성된 기본 키도 존재할 수 있음
- 중복 값이 없어야 하고 반드시 값이 존재해야 함
- 레코드를 구분하기 위한 최소한의 정보만으로 이루어져야 함
(2) 외래 키
- 다른 테이블의 기본 키를 참조하는 필드
- 테이블 간 참조 관계 형성 시 사용하는 키
(3) 후보 키
- 테이블의 한 레코드를 식별하기 위한 필드의 최소 집합
- 유일성과 최소성을 모두 만족하는 키
(4) 복합 키
(5) 슈퍼 키
- 레코드를 식별하기 위한 필드의 집합
- 유일성만 만족하고 최소성은 만족하지 않음
(6) 대체 키
- 기본 키가 아닌 후보 키
- 기본 키 선정 이후 남은 후보 키
3) 테이블 간 관계
- 일대일 대응 관계: 하나의 레코드가 다른 테이블의 레코드 하나에만 대응되는 경우
- 일대다 대응 관계: 하나의 레코드가 다른 테이블의 여러 레코드와 대응될 수 있는 경우
- 다대다 대응 관계: 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 대응되는 경우
4) 무결성 제약 조건
- 데이터베이스에 저장된 데이터의 일관성과 유효성을 유지하기 위해 지켜야 하는 조건
(1) 도메인 제약 조건
- 테이블이 가질 수 있는 필드 타입과 범위에 대한 규칙
- 각각의 필드 데이터는 원자 값을 가져야 함
- 지정된 필드 타입을 준수해야 함
- 값의 범위나 기본값이 지정되었을 경우 이를 따라야 함
(2) 키 제약 조건
- 레코드를 고유하게 식별할 수 있는 키
- 지정된 필드에 중복된 값이 존재해서는 안된다는 제약 조건
(3) 엔티티 무결성 제약 조건
- 기본 키로 지정한 필드는 고유한 값이어야 하며 NULL이 되어서는 안된다는 규칙
- 기본 키 제약 조건이라고도 부름
(4) 참조 무결성 제약 조건
- 외래 키를 통해 다른 테이블을 참조할 때 데이터의 일관성을 지키기 위한 제약 조건
- 외래 키는 참조하는 테이블의 기본 키와 같은 값일 갖거나 NULL값을 가져야 한다는 규칙
- 외래 키 제약 조건이라고도 부름
3. SQL
1) DDL: 데이터 정의 언어
(1) CREATE
- 데이터베이스, 테이블, 뷰, 인덱스, 그 외 사용자까지 데이터베이스에서 관리할 수 있는 다양한 대상을 정의함
(2) ALTER
- CREATE TABLE문을 통해 생성된 테이블에 새로운 필드 추가/수정/삭제할 수 있고 제약 조건 또한 새롭게 추가/수정/삭제가 가능함
(3) DROP
(4) TRUNCATE
- 테이블의 구조를 유지한 채로 테이블의 모든 레코드를 삭제
- 테이블 자체를 삭제하지는 않음
2) DML: 데이터 조작 언어
- 실행 순서: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
(1) INSERT
- 테이블에 새로운 레코드를 삽입하기 위해 사용
- 레코드 삽입 시 무결성 제약 조건을 어기지 않도록 주의
(2) UPDATE/DELETE
(3) SELECT
- 삽입된 레코드를 조회하는 명령
- 테이블 내 레코드를 정렬하거나 필터링해 조회하는 것도 가능
(4) GROUP BY
- 특정 필드를 기준으로 필드를 그룹화하기 우해 사용됨
(5) HAVING
- 그룹화된 레코드에 대한 조건식
- WHERE은 그룹화되기 전 레코드에 대한 조건식
(6) ORDER BY
- 특정 필드를 기준으로 데이터를 정렬
- 오름차순, 내림차순 정렬 가능
(7) LIMIT
3) TCL: 트랙잭션 제어 언어
(1) COMMIT
(2) ROLLBACK
(3) SAVEPOINT
4) DCL: 데이터 제어 언어
(1) GRANT
(2) REVOKE
4. 효율적 쿼리
1) 서브 쿼리와 조인
(1) 서브 쿼리
- 내부에 다른 SQL문이 포함된 SQL문
- 다른 SQL문 안에 있는 SELECT문
(2) 조인
- 2개의 테이블을 하나로 합치는 것
- INNER JOIN: A와 B의 교집합
- LEFT OUTER JOIN: A집합, 해당되지 않는 B집합은 NULL 표시
- RIGHT OUTER JOIN: B집합, 해당되지 않은 A집합은 NULL 표시
- FULL OUTER JOIN: A와 B의 합집합
(3) 뷰
- SELECT문의 결과로 만들어진 가상의 테이블
- SELECT문의 결과를 뷰로 생성한 뒤 해당 뷰에 다양한 SQL문 실행 가능
- 테이블에 대한 SQL문을 단순화하기 위해 사용
(4) 인덱스
- 검색 속도 향상을 목적으로 만드는 하나 이상의 테이블 필드에 대한 자료구조
- RDBMS의 성능을 향상시키는 가장 대중적인 방법
- 수많은 레코드를 조회하는 작업이 많아 대부분 활용됨
- SELECT 성능 향상은 가능하나 INSERT, UPDATE, DELETE에 대해서는 성능 향상을 가져오지 않거나 되려 성능을 떨어뜨림
- 데이터가 충분히 많은 데이블, 조회가 빈번히 이루어지는 테이블 필드에 효과적임
- 테이블 당 3개 이하의 인덱스가 적정한 인덱스 개수
- 클러스터형 인덱스
- 테이블당 하나씩 만들 수 있는 인덱스
- 기본 키
- 기본 키로 지정된 필드는 기본적으로 클러스터형 인덱스로 간주됨
- 기본 키로 지정된 필드가 없는 경우 NOT NULL 제약조건, UNIQUE 제약 조건이 있는 필드도 클러스터형 인덱스로 간주
- 세컨더리 인덱스
- 논클러스터형 인덱스라고도 함
- 테이블당 여러 개가 존재할 수 있지만 클러스터형 인덱스보다 느림