데이터베이스 정규화 Database Normalization
데이터베이스의 설계와 관련이 있는데 설계에 따라 데이터가 어떻게 저장될 지 그 구조를 결정하기 때문이다.
- Data Redundancy
- 데이터 중복(data redundancy)은 실제 데이터의 동일한 복사본이나 부분적인 복사본을 뜻함
- 이러한 중복으로 데이터를 복구할 때에 더 수월할 수 있지만 대체로 몇가지 문제점을 지님
- 일관된 자료 처리의 어려움
- 저장 공간 낭비
- 데이터 효율성 감소
- Data Integrity
- 데이터 정규화는 데이터 무결성을 강화하는 목적도 지님
- 데이터 무결성(data integrity)은 데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻함
입력된 데이터가 오염되지 않고, 입력된 그대로 데이터를 사용할 수 있다는 의미
- Anomaly
- 데이터 이상 현상(anomaly)은 기대한 데이터와 다른, 이상 현상을 가리킴
- 갱신 이상(update anomaly)
- 여러 행(레코드)에 걸쳐 동일한 데이터가 있을 때, 어떤 행을 갱신해야 하는지 논리적인 일관성이 없는 경우에 발생함
- 삽입 이상(insertion anomaly)
- 삭제 이상(deletion anomaly)
- 데이터의 특정 부분을 지울 때 의도치 않게 다른 부분도 함께 지우는 이상 현상
SQL 종류
SQL에는 데이터를 조회하고 테이블을 만드는 등 다양한 문법이 있는데 쿼리문을 어떻게 작성하느냐에 따라 그 기능이나 작업이 달라진다.
일반적인 분류
- Data Definition Language (DDL)
- 데이터를 정의할 때 사용하는 언어. 테이블을 만들 때 사용하는 CREATE나 테이블을 제거할 때 사용되는 DROP등이 DDL에 해당됨. 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용함
- Data Manipulation Language (DML)
- 데이터베이스에 데이터를 저장할 때 사용하는 언어. INSERT처럼 새로운 레코드를 추가할 때 사용되는 문법을 포함해 데이터를 삭제하는 DELETE나 변경하는 UPDATE도 포함됨
- Data Control Language (DCL)
- 데이터베이스에 대한 접근 권한과 관련된 문법. 어느 유저가 데이터베이스에 접근할 수 있는지 권한을 설정함. 권한을 주는 GRANT나 권한을 가져가는 REVOKE등이 포함됨
- Data Query Language (DQL)
- 정해진 스키마 내에서 쿼리할 수 있는 언어임. SELECT가 DQL에 해당함. 이렇게 언어를 분류했지만, DQL을 DML의 일부분으로 취급하기도 함
- Transaction Control Language (TCL)
- DML을 거친 데이터의 변경사항을 수정할 수 있음. COMMIT처럼 DML이 작업한 내용을 데이터베이스에 커밋하거나 ROLLBACK처럼 커밋했던 내용을 다시 롤백하는 문법이 있음
SQL 추가 문법
CASE
if문과 같은 기능, 특정 조건에 따라 다른 결과를 받을 수 있음
SELECT CASE
WHEN CustomerId <= 25 THEN 'GROUP1'
WHEN CustomerId <= 50 THEN 'GROUP2'
ELSE 'GROUP3'
FROM customers
CustomerId값에 따라 3개의 그룹으로 나뉜다.
SUBQUERY
쿼리문 안에 중첩으로 쿼리문을 작성하며 소괄호로 감싼다.
SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customoers WHERE CustomerID=2)
FROM customers
WHERE CustomerId<6
IN, NOT IN
특정한 값이 서브쿼리에 있는지 확인할 수 있음.
SELECT *
FROM customers
WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)
EXISTS
돌려받은 서브쿼리에 존재하는 레코드를 확인함. 조회하려는 레코드가 존재하면 TRUE, 없으면 FALSE를 리턴.
SELECT EmployeeId
FROM employees e
WHERE EXISTS (
SELECT 1
FROM customers c
WHERE c.SupportRepId = e.EmployeeId
)
ORDER BY EmployeeId
FROM
FROM에도 서브쿼리를 사용할 수 있음
SELECT *
FROM (
SELECT CustomerId
FROM customers
WHERE CustomerId < 10
)