SQL 심화
View 에 대한 개념 및 활용
External level - External Schema (외부 스키마)
링크
- 사용자가 보는 view level
- 사용자에게 view의 형태로 필요한 정보만 보여주는 단계
- 각 사용자들이 개별 요구 사항에 따라 다른 view를 정의해서 데이터를 볼 수 있다.
- 데이터베이스 하나에 여러 개의 외부 스키마 가능
- 개념스키마와 논리적 데이터 독립성
View의 목적
- 어떤 경우에 모든 사용자가 전체 논리적 모델 (데이터베이스에 저장된 모든 실제 테이블)을 보는 건 문제가 될 수 있음
- 필요한 데이터만 특정 사용자들에게 유출할 필요가 있을 때 사용
- employ 테이블에서 아이디, 이름, 부서 조회 가능하게 하지만 salary 정보를 숨기고 싶을 때
- 질의문 작성을 쉽게 만들어 준다.
- Group by 나 aggregation function 등을 미리 정의
- 데이터 종속성 제거
- 응용프로그램은 뷰를 통해 접근함으로써 테이블 스키마 변화에 신경 쓸 필요가 없다.
View 정의
CREATE VIEW <view_name> [(<column_name_list>) as <query expression>
- 다른 view를 이용한 query로 view 생성 가능
- Column list 가 생략된 경우 query 문의 겨로가 relation의 컬럼 리스트로 view 컬럼이 지정됨
- 스키마 변화에 신경 쓸 필요가 없다
Example
CREATE VIEW public_employee_information AS SELECT ID, name, dept_name FROM employee;
CREATE VIEW department_total_salary (dept_name, total_salary) AS SELECT dept_name, sum(salary) FROM employee GROUP BY dept_name;
다른 view를 사용하는 예제
질의 처리에서 view가 query expression 으로 대체되는 로직
View 에 대한 삽입, 수정, 삭제 연산 가능
- 기본 테이블에 대한 연산으로 변경되어 실행
- Example
CREATE VIEW public_employee_information AS SELECT ID, name, dept_name FROM employee;
INSERT INTO public_employee_information values('10101', 'Green','Sales');
-> (‘10101’, ‘Green’, ‘Sales’, null) 이 employee 테이블에 대한 insert 로 변환
- Updatable View 가 되기 위한 조건
- 베이스 테이블이 하나인 경우 (JOIN 인 경우 불가능)
- Select clause에 컬럼 이름만 있는 경우 (Aggregation 함수나 DISTINCT 있는 경우 불가능)
- Group by 나 having 이 없는 경우
- Where 절이 있는 경우
Materialized View
- View 에 대한 expression의 결과가 persistence 테이블 형태로 저장되는 뷰
- View 에 대한 계산이 복잡한 경우 (여러 테이블들에 대한 조인, aggregation) 쿼리 결과를 테이블에 미리 계산해서 저장해 view에 대한 쿼리 성능을 높임
Materialized view maintenance
- View에서 사용되는 베이스 테이블들이 업데이트가 있을 때 Materialized view 도 업데이트 해주는 방법
- 많은 DBMS 들은 on-demand mode/ real-time mode (제한된 경우) 로 refresh 방법을 제공한다.
Drop View
- syntax :
DROP VIEW <view_name>
- View만 삭제하고 베이스 테이블들은 영향을 받지 않는다.
트랜잭션 SQL
Transaction
- 논리적인 작업의 단위 : LUW, Logical Units of Work
- Transaction은 read, write, delete, update 등의 연산들로 구성되나 한 Transaction 단위로 일관성이 보장된다. -> All or Nothing
Atomicity 원자성
- Transaction 을 구성하는 연사들이 모두 실행이 되거나 또는 하나도 실행되지 않거는다
- 연산이 실패하면 이미 실행된 연산들로 바뀌었던 부분들이 다시 원 상태로 바뀐다 (Rollback)
Consistency 일관성
- Transaction 이 실행된 후에도 일관성이 있는 데이터베이스 상태로 유지하는 것을 의미
- 무결성 제약 조건으로 정의된 일관성 조건이 있다면 transaction의 구성하는 연산 중 조건을 어길 경우 트랜젝션은 실패된다.
Isolation 격리성
- 트랜잭션 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하고 다른 트랜잭션들이 트랜잭션안의 중간 연산을 볼 수 있다는 걸 의미한다.
Durablity 지속성
- 성공적으로 수행된 트랜젝션은 영원히 반영되어야 함을 의미
- 시스템이 장애가 발생했더라도 성공적으로 수행된 트랜잭션 결과는 데이터베이스에 반영되어 있음을 보장
- 전형적으로 트랝잭션은 업데이트에 대한 로그로 적고 로그가 저장된 후에 트랜잭션이 커밋으로 간주
- 장애 이후 로그 데이터를 가지고 데이터베이스 재구성 가능
트랜잭션 모드
- Autocommit mode : default
- statement가 시작할 때 트랜젝션이 내부적으로 시작하고 statement가 끝날 때 마다 commit이 자동으로 실행된다.
- session level로 mode를 변경 가능
- SET AUTOCOMMIT = OFF
- JDBC : connection.setAutoCommit(False)
- Explicit mode
- START TRANSACTION; -> Transaction 을 시작
- COMMIT; -> 트랜젝션의 커밋에서 변경 내용을 데이터베이스에 저장하는 statement
- ROLLBACK; -> 트랜젝션의 연산들로 변경된 내용을 취소하는 statement
- Transaction Isolation level
- SET TRANSACTIOn statement 로 transaction isolation level로 바꿀 수 있다.
- Isolation level
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ : MySQL Default
- SERIALIZABLE
- example
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE:
- 성능 향상을 위해 DBMS 는 isolation level을 조절하는 기능을 제공한다
- 레벨이 낮을 수록 데이터 무결성이 유지되지만 비용이 높아지고 동시성이 떨어진다
- Read Uncommitted
- 트랜잭션이 처리중에 아직 커밋되지 않은 데이터를 다른 트랜젝션이 읽는 걸 허용
- 데이터 일관성을 유지할 수 없다
- Read Committed
- 커밋이 이루어진 데이터만 접근해서 읽을 수 있다.
- 한 트랜잭션안에서 같은 조회가 다른 결과를 리턴 할 수 있다.
- Repeatble Read
- 트랜잭션 안에서의 같은 조회는 항상 동일한 결과가 리턴 하는 걸로 보장한다.
- Phantom Read 발생
- Serializable
무결성 제약 조건
Integrity Constraints (무결성 제약 조건) in CREATE TABLE
- not null
- 컬럼 값으로 null 을 허용하지 않을 때 지정
- name char(10) NOT NULL -> 고객 이름 컬럼으로 사이즈 10 이내, 필수 입력사항
- primary key
- 테이블에서 튜플 (row)을 찾는 기본 키
- unique + not null
- 만약 같은 값이 이미 테이블에 존재하거나 null 을 입력하려고 하면 insert 실패
- Unique
- Primary key 와 같이 튜플에 유일성을 체크하는 대체키 (candidate key) 를 지정한다. 이건 null 허용
- Check (p) p : predicate
참조 무결성 (Referential Integrity)
- 관계 데이터베이스 관계 모델에서 2개의 관련 있던 테이블 간의 일관성 (데이터 무결성)
- 참조 무결성을 정의하기 위해 foreign key (외래키)을 지정하는데 foreign key 에 포함 되는 컬럼은 참조하는 부모 테이블의 primary key 또는 candidate key 이어야 한다
- Syntax
FOREIGN KEY (<column_names>) REFERENCES <parent_table_name> (<column_names>) [ON DELETE reference_option] [ON UPDATE reference_option]
- 마지막 부분 2개 다 DELETE가 아니라 UPDATE 임
SQL DCL 접근
권한관리
- Authentication & Authorization
- Authentication : DBMS 에 보안 유지를 위해 계정을 가진 사용자가 접속할 수 있게 해주는 접근 제어 (Access Control)
CREATE USER <user_name> IDENTIFIED BY 'password'
- Authorization : 접속한 사용자의 사용 범위와 권한을 정의 하는 것
- 사용권한
- 데이터베이스의 모든 객체는 해당 객체를 생성한 사용자만 사용 권한을 가진다
- 권한부여
- 여러 사용자가 공유해서 사용할 목적으로 다른 상죵자들에게 자신의 객체에 대한 권한을 부여 할 수 있다.
- Privilege 의 종류
- SELECT
- INSERT
- UPDATE
- DELETE
- REFERENCES
REVOKE
Role
참고
최대 1 분 소요
재귀 문제
2 분 소요
탐욕법 Greedy 문제
최대 1 분 소요
둘만의 암호 문제
최대 1 분 소요
해시 문제
댓글남기기