특성 | 설명 | 주요기법 |
---|---|---|
원자성 (Atomicity) | - 트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 하는 성질 - 트랜잭션의 연산 전체가 성공 또는 실패(All or Nothing) 되어야 하는 성질 | - Commit/Rollback - 회복성 보장 |
일관성 (Consistency) | - 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 하는 성질 | - 무결성 제약조건 - 동시성 제어 |
격리성=고립성 (Isolation) | - 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야 한다는 성질 | - Read Uncommitted - Read Commited - Repeatable Read - Serializable |
영속성 (Durability) | - 성공이 완료된 트랜잭션의 결과는 영속적으로 데이터베이스에 저장되어야 하는 성질 | - 회복 기법 |
[모두의 SQL] 트랜잭션의 상태 변화와 트랜잭션 제어어
명령어 | 핵심 | 설명 |
---|---|---|
COMMIT | 트랜잭션 확정 | 트랜잭션을 메모리에 영구적으로 저장하는 명령어 |
ROLLBACK | 트랜잭션 취소 | 트랜잭션 내역을 저장 무효화시키는 명령어 |
CHECKPOINT | 저장 시기 설정 | ROLLBACK을 위한 시점을 지정하는 명령어 |
병행 제어의 목적
병행 제어 미보장 시 문제점
병행 제어 기법 종류
기법 | 설명 |
---|---|
로킹 (Locking) | 하나의 트랜잭션을 실행하는 동안 특정 데이터 항목에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 상호배제 기능을 제공하는 기법 |
낙관적 검증 (Optimistic Validation) | 트랜잭션이 어떠한 검증도 수행하지 않고 일단 트랜잭션을 수행하고, 트랜잭션 종료 시 검증을 수행하여 데이터베이스에 반영하는 기법 |
타임 스탬프 순서 (Time Stamp Ordering) | 트랜잭션과 트랜잭션이 읽거나 갱신한 데이터에 대해 트랜잭션이 실행을 시작하기 전에 타임 스탬프를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법 |
다중버전 동시성 제어 (MVCC; Multi Version Concurrency Control) | 트랜잭션의 타임스탬프와 접근하려는 데이터의 타임스탭프를 비교하여 직렬가능성이 보장되는 적절한 버전을 선택하여 접근하도록 하는 기법 |
출처 : https://artist-developer.tistory.com/39
DDL 대상 | 설명 |
---|---|
도메인 (Domain) | - 하나의 속성이 가질 수 있는 원자값들의 집합 - 속성의 데이터 타입과 크기, 제약조건 등의 정보 |
스키마 (Schema) | - 데이터베이스의 구조, 제약조건 등의 정보를 담고 있는 기본적인 구조 |
테이블 (Table) | - 데이터 저장 공간 |
뷰 (View) | - 하나 이상의 물리 테이블에서 유도되는 가상의 테이블 |
인덱스 (Index) | - 검색을 빠르게 하기 위한 데이터 구조 |
스키마(Schema)
ⓐ 스키마의 구성
계층 | 설명 |
---|---|
외부 스키마 (External Schema) | - 사용자나 개발자의 관점에서 필요로 하는 데이터베이스의 논리적 구조 - 사용자 뷰를 나타냄 - 서브 스키마로 불림 |
개념 스키마 (Conceptual Schema) | - 데이터베이스의 전체적인 논리적 구조 - 전체적인 뷰를 나타냄 - 개체 간의 관계, 제약조건, 접근 권한, 무결성, 보안에 대해 정의 |
내부 스키마 (Internal Schema) | - 물리적 저장 장치의 관점에서 보는 데이터베이스 구조 - 실제로 데이터베이스에 저장될 레코드의 형식을 정의하고 저장 데이터 항목의 표현 방법, 내부 레코드의 물리적 순서 등을 표현 |
테이블(Table)
ⓐ 테이블의 개념
ⓑ 테이블의 용어
출처 : [Inpa Dev] [DB] 📚 테이블 용어 🕵️ 정리
계층 | 설명 |
---|---|
튜플(Tuple) / 행(Row) | - 테이블 내의 행을 의미하여 레코드(Record)라고도 함 - 튜플은 릴레이션(Realtion)에서 같은 값을 가질 수 없음 - 행의 개수를 카디널리티(Cardinality)라고 함 |
애트리뷰트(Attribute) / 열(Column) | - 테이블 내의 열을 의미 - 열의 개수를 차수(Degree)라고 함 |
식별자(Identifier) | - 여러 개의 집합체를 담고 있는 관계형 데이터베이스에서 각각의 구분할 수 있는 논리적인 집합 |
도메인(Domain) | - 하나의 애트리뷰트가 취할 수 있는 같은 타입의 원자값 들의 집합 |
뷰(View)
ⓐ 뷰의 개념
ⓑ 뷰의 특징
특징 | 설명 |
---|---|
논리적 데이터 독립성 제공 | 데이터베이스에 영향을 주지 않고 애플리케이션이 원하는 형태로 데이터에 접근 가능 |
데이터 조작 연산 간소화 | 애플리케이션이 원하는 형태의 논리적 구조를 형성하여 데이터 조작 연산을 간소화 예) 회원 테이블에서 우수 회원을 뷰로 생성하여 활용 |
보안 기능(접근제어) 제공 | 특정 필드만을 선택해 뷰를 생성할 경우 애플리케이션은 선택되지 않은 필드의 조회 및 접근 불가 |
뷰 변경 불가 | 뷰 정의는 ALTER 문을 이용하여 변경할 수 없음 (뷰는 CREATE 문을 사용하여 정의, 뷰를 제거할 때에는 DROP 문을 사용) |
ⓒ 뷰의 목적
인덱스(Index)
ⓐ 인덱스의 개념
ⓑ 인덱스의 특징
ⓒ 인덱스의 종류
유형 | 설명 |
---|---|
순서 인덱스 (Ordered Index) | - 데이터가 정렬된 순서로 생성되는 인덱스 - B-Tree 알고리즘 활용(오름차순/내림차순 지정가능) |
해시 인덱스 (Hash Index) | - 해시 함수에 의해 직접 데이터에 키 값으로 접근하는 인덱스 - 데이터 접근 비용이 균일, 튜플(Row) 양에 무관 |
비트맵 인덱스 (Bitmap Index) | - 각 컬럼에 적은 개수 값이 저장된 경우 선택하는 인덱스 - 수정 변경이 적을 경우 유용(생년월일, 상품번호 등) |
함수기반 인덱스 (Functional Index) | - 수식이나 함수를 적용하여 만든 인덱스 |
단일 인덱스 (Singled Index) | - 하나의 컬럼으로만 구성한 인덱스 - 주 사용 컬럼이 하나일 경우 사용 |
결합 인덱스 (Concatenated Index) | - 두 개 이상의 컬럼으로 구성한 인덱스 - WHERE 조건으로 사용하는 빈도가 높은 경우 사용 |
클러스터드 인덱스 (Clustered Index) | - 기본 키(PK) 기준으로 레코드를 묶어서 저장하는 인덱스 - 저장 데이터의 물리적 순서에 따라 인덱스가 생성 - 특정 범위 검색 시 유리함 |
구분 | DDL 명령어 | 설명 |
---|---|---|
생성 | CREATE | 데이터베이스 오브젝트 생성하는 명령어 |
수정 | ALTER | 데이터베이스 오브젝트 변경하는 명령어 |
삭제 | DROP TRUNCATE | 데이터베이스 오브젝트 삭제하는 명령어 데이터베이스 오브젝트 내용 삭제하는 명령어 |
CREATE TABLE
ⓐ CREATE TABLE 기본문법
CREATE TABLE 테이블명
(
컬럼명 데이터타입 [제약조건],
···
);
ⓑ CREATE TABLE 상세문법
CREATE TABLE 테이블명
(
컬럼명 데이터타입 PRIMARY KEY, -- 기본키 설정,
컬럼명 데이터타입 FOREIGN KEY REFERENCES 참조테이블(기본키), --외래키 설정
컬럼명 데이터타입 UNIQUE,
컬럼명 데이터타입 NOT NULL,
컬럼명 데이터타입 CHECH(조건식), --제약조건 설정
컬럼명 데이터타입 DEFAULT 값
);
ⓒ CREATE TABLE 예시
CREATE TABLE 사원
(
사번 VARCHAR(10) PRIMARY KEY,
업무 VARCHAR(20) FOREIGN KEY REFERENCES 부서(부서코드),
이름 VARCHAR(10) UNIQUE,
생년월일 CHAR(8) NOT NULL,
성별 CHAR(1) CHECK (성별 = 'M' OR 성별 = 'F'),
입사일 DATE DEFAULT SYSDATE -- SYSDATE는 현재시간/날짜
);
ⓓ CREATE TABLE 제약조건
제약조건 | 설명 |
---|---|
PRIMARY KEY | - 테이블의 기본 키를 정의 - 유일하게 테이블의 각 행을 식별 |
FOREIGN KEY | - 외래 키를 정의 - 참조 대상을 테이블(컬럼명)로 명시 - 열과 참조된 테이블의 열 사이의 외래 키 관계를 적용하고 설정 |
UNIQUE | - 테이블 내에서 얻은 유일한 값을 갖도록 하는 제약조건 |
NOT NULL | - 해당 컬럼은 NULL 값을 포함하지 않도록 하는 제약조건 |
CHECK | - 개발자가 정의하는 제약조건 - 참이어야 하는 조건을 지정 |
DEFAULT | - 데이터를 INSERT 할 때 해당 컬럼의 값을 넣지 않는 경우 기본값으로 설정해주는 제약조건 |
ALTER TABLE
ⓐ ALTER TABLE 컬럼 추가
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입 [제약조건];
ALTER TABLE 사원 ADD 전화번호 VARCHAR(11) UNIQUE;
→ 사원 테이블의 전화번호라는 컬럼에 대해 타입이 VARCHAR(11)이면서 UNIQUE 제약 조건을 걸도록 추가
ⓑ ALTER TABLE 컬럼 수정
ALTER TABLE 테이블명 MODIFY 컬럼명 데이터타입 [제약조건];
ALTER TABLE 사원 MODIFY 이름 VARCHAR(30) NOT NULL;
→ 사원 테이블의 이름이라는 컬럼에 대해 타입이 VARCHAR(30)이면서 NOT NULL 제약 조건을 걸도록 수정
ⓒ ALTER TABLE 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
ALTER TABLE 사원 DROP COLUMN 생년월일;
→ 사원 테이블에 생년월일이라는 컬럼 삭제
DROP TABLE
DROP TABLE 테이블명 [CASCADE | RESTRICT];
DROP TABLE 사원;
→ 사원 테이블 삭제
CASCADE와 RESTRICT의 경우 외래 키(FOREIGN KEY)가 걸려 있을 때 해당
옵션 | 설명 |
---|---|
CASCADE | 참조하는 테이블까지 연쇄적으로 제거하는 옵션 |
RESTRICT | 다른 테이블이 삭제할 테이블을 참조 중이면 제거하지 않는 옵션 |
TRUNCATE TABLE
TRUNCATE TABLE 테이블명;
TRUNCATE TABLE 사원;
→ 사원 테이블 내의 모든 데이터를 삭제
CREATE VIEW
CREATE VIEW 뷰이름 AS
조회쿼리;
CREATE VIEW 사원뷰 AS
SELECT 사번, 이름
FROM 사원
WHERE 성별 = 'M';
→ 사원 테이블에서 성별 값이 'M'을 가진 사번, 이름으로 생성된 사원뷰라는 이름의 뷰 생성
UNION
이나 ORDER BY
절을 사용할 수 없음UNION
: 집합연산자로 중복 행이 제거된 쿼리 결과 집합ORDER BY
: 속성값을 정렬하고자 할 때 사용CREATE OR REPLACE VIEW
CREATE OR REPLACE VIEW 뷰이름 AS
조회쿼리;
DROP VIEW
DROP VIEW 뷰이름;
CREATE INDEX
UNIQUE
는 생략 가능하고, 인덱스 걸린 컬럼에 중복 값을 허용하지 않음 CREATE [UNIQUE] INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2);
CREATE INDEX 사번인덱스 ON 사원(사번);
→ 사원 테이블의 사번 컬럼에 대해 사번인덱스라는 인덱스 명으로 인덱스 생성
ALTER INDEX
ALTER [UNIQUE] INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2);
ALTER INDEX 사번인덱스 ON 사원(사번);
→ 사원 테이블의 사번 컬럼에 대해 사번인덱스라는 인덱스 명으로 인덱스 수정
DROP INDEX
DROP INDEX 인덱스명;
유형 | 동작 | 설명 |
---|---|---|
SELECT | 조회 | 테이블 내 칼럼에 저장된 데이터를 조회 |
INSERT | 삽입 | 테이블 내 칼럼에 데이터를 추가 |
UPDATE | 갱신 | 테이블 내 칼럼에 저장된 데이터를 수정 |
DELETE | 삭제 | 테이블 내 칼럼에 저장된 데이터를 삭제 |
SELECT 명령어
AS
를 사용DISTINCT
: 중복된 속성 중 하나만HAVING
: GROUP BY
에 의해 분류한 후 그룹에 대한 조건 지정SELECT [ALL | DISTICT] 속성명1, 속성명2, ...
FROM 테이블명1, ...
[WHERE 조건]
[GROUP BY 속성명 1, ...]
[HAVING 그룹조건]
[ORDER BY 속성 [ASC | DESC] ];
ⓐ SELECT 절
[성적 테이블]
이름 | 과목 | 학점 |
---|---|---|
김철수 | C언어 | A |
한유리 | 자료구조 | A |
신짱구 | 자료구조 | A |
이훈이 | 알고리즘 | B |
SELECT DISTINCT 과목
FROM 성적
WHERE 학점 = 'A'
과목 |
---|
C언어 |
자료구조 |
SELECT COUNT(DISTINCT 과목)
FROM 성적;
DISTINCT 과목 |
---|
3 |
ⓑ WHERE 절
=
: 값이 같은 경우 조회<>, !=
: 값이 다른 경우 조회<, <=, >, >=
: 비교 연산에 해당하는 데이터 조회SELECT *
FROM PRODUCT
WHERE PRICE BETWEEN 50000 AND 80000;
-- = WHERE PRICE >=50000 AND PRICE <= 80000;
IN
, NOT IN
SELECT *
FROM PRODUCT
WHERE PRICE IN (40000, 50000, 80000);
%
: 0개 이상의 문자열과 일치[ ]
: 1개 문자와 일치[^]
: 1개 문자와 불일치_
: 특정 위치의 1개의 문자와 일치SELECT *
FROM PRODUCT
WHERE PRICE IN (40000, 50000, 80000);
IS NULL
, IS NOT NULL
SELECT *
FROM PRODUCT
WHERE PRICE IS NULL;
AND
, OR
, NOT
ⓒ GROUP BY
[급여 테이블]
이름 | 직책 | 부서 | 급여 |
---|---|---|---|
김철수 | 차장 | 마케팅 | 5000 |
한유리 | 차장 | 전산 | 4800 |
신짱구 | 사원 | 마케팅 | 2500 |
이훈이 | 사원 | 마케팅 | 2700 |
SELECT 직책, 부서, SUM(급여) AS 급여합계
FROM 급요
GROUP BY 직책, 부서
직책 | 부서 | 급여합계 |
---|---|---|
차장 | 마케팅 | 5000 |
차장 | 전산 | 4800 |
사원 | 마케팅 | 5200 |
SELECT COUNT(*)
FROM 급여;
COUNT(*) |
---|
4 |
ⓓ HAVING 절
SELECT 직책, 부서, SUM(급여) AS 급여합계
FROM 급요
GROUP BY 직책, 부서
HAVING 급여합계 >= 5000;
직책 | 부서 | 급여합계 |
---|---|---|
차장 | 마케팅 | 5000 |
사원 | 마케팅 | 5200 |
JOIN
책번호 | 책명 | 책번호 | 가격 | |
---|---|---|---|---|
111 | 운영체제 | 111 | 20000 | |
222 | 자료구조 | 222 | 25000 | |
555 | 컴퓨터구조 | 333 | 10000 | |
444 | 15000 |
ⓐ 내부 조인(Inner Join) : 공통 존재 컬럼의 값이 같은 경우 추출
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...
FROM 테이블1 A [INNER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT A.책번호, A.책명, B.가격
FROM 도서 A JOIN 도서가격 B
ON A.책번호 = B.책번호
책번호 | 책명 | 가격 |
---|---|---|
111 | 운영체제 | 20000 |
222 | 자료구조 | 25000 |
ⓑ 외부 조인(Outer Join)
1) 왼쪽 외부 조인 : 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터 추출
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...
FROM 테이블1 A LEFT [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A LEFT JOIN 도서가격 B
ON A.책번호 = B.책번호;
책번호 | 책명 | 책번호 | 가격 |
---|---|---|---|
111 | 운영체제 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
555 | 컴퓨터구조 | NULL | NULL |
2) 오른쪽 외부 조인 : 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터 추출
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...
FROM 테이블1 A RIGHT [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A RIGHT JOIN 도서가격 B
ON A.책번호 = B.책번호;
책번호 | 책명 | 책번호 | 가격 |
---|---|---|---|
111 | 운영체제 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
NULL | NULL | 333 | 10000 |
NULL | NULL | 444 | 15000 |
3) 완전 외부 조인 : 양쪽의 모든 데이터를 추출
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...
FROM 테이블1 A FULL [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A FULL JOIN 도서가격 B
ON A.책번호 = B.책번호;
책번호 | 책명 | 책번호 | 가격 |
---|---|---|---|
111 | 운영체제 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
NULL | NULL | 333 | 10000 |
NULL | NULL | 444 | 15000 |
555 | 컴퓨터구조 | NULL | NULL |
ⓒ 교차 조인(Cross Join) : 조인 조건이 없는 모든 데이터 조합을 추출 ⭐
SELECT 컬럼1, 컬럼2, ...,
FROM 테이블1 A CROSS JOIN 테이블2 B
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A CROSS JOIN 도서가격 B;
책번호 | 책명 | 책번호 | 가격 |
---|---|---|---|
111 | 운영체제 | 111 | 20000 |
111 | 운영체제 | 222 | 25000 |
111 | 운영체제 | 333 | 10000 |
111 | 운영체제 | 444 | 15000 |
222 | 자료구조 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
222 | 자료구조 | 333 | 10000 |
222 | 자료구조 | 444 | 25000 |
555 | 컴퓨터구조 | 111 | 20000 |
555 | 컴퓨터구조 | 222 | 25000 |
555 | 컴퓨터구조 | 333 | 10000 |
555 | 컴퓨터구조 | 444 | 25000 |
ⓓ 셀프 조인(Self Join) : 자기 자신에게 별칭을 지정한 후 다시 조인
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...
FROM 테이블1 A [INNER] JOIN 테이블1 B
ON 조인조건
[WHERE 검색조건];
[도서]
책번호 | 책명 | 선수과목_책번호 |
---|---|---|
111 | 운영체제 | 222 |
222 | 자료구조 | 555 |
555 | 컴퓨터구조 | NULL |
SELECT A.책번호, A.책명, B.책번호, B.책명
FROM 도서 A FULL JOIN 도서 B
ON A.선수과목_책번호 = B.책번호;
책번호 | 책명 | 책번호 | 책명 |
---|---|---|---|
111 | 운영체제 | 222 | 자료구조 |
222 | 자료구조 | 555 | 컴퓨터구조 |
서브쿼리(Sub-query)
ⓐ FROM 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격 A,
(SELECT 책번호
FROM 도서
WHERE 책명='자료구조') B
WHERE A.책번호 = B.책번호;
가격 |
---|
25000 |
ⓑ WHERE 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격 A,
WHERE 책번호 IN (SELECT 책번호
FROM 도서
WHERE 책명='자료구조');
가격 |
---|
25000 |
INSERT INTO 테이블명(속성명1, ...)
VALUES (데이터1, ...);
INSERT INTO 학생(학번, 성명, 학년, 수강과목)
VALUES (6677, '장길산', 3, '수학');
WHERE
절을 통해 어떤 조건이 만족할 경우에만 특정 컬럼의 값을 수정하는 용도로 자주 사용됨 UPDATE 테이블명
SET 속성명 = 데이터, ...
WHERE 조건;
UPDATE 학생
SET 주소='인천'
WHERE 이름='장길산';
DROP
명령과는 다름 DELETE FROM 테이블명
WHERE 조건;
DELETE FROM 학생
WHERE 이름='장길산';
유형 | 동작 | 설명 |
---|---|---|
GRANT | 사용 권한 부여 | 관리자(DBA)가 사용자에게 데이터베이스에 대한 권한을 부여하는 명령어 |
REVOKE | 사용 권한 취소 | 관리자(DBA)가 사용자에게 부여했던 권한을 회수하기 위한 명령어 |
GRANT 권한 ON 테이블 TO 사용자;
GRANT UPDATE ON 학생 TO 장길산;
→ 관리자가 사용자 장길산에게 '학생' 테이블에 대해 UPDATE 할 수 있는 권한 부여 REVOKE 권한 ON 테이블 FROM 사용자;
REVOKE UPDATE ON 학생 FROM 장길산;
→ 관리자가 사용자 장길산에게 '학생' 테이블에 대해 UPDATE 할 수 있는 권한 회수