관계형 데이터베이스 - 2

랑아·2023년 3월 22일
0
post-thumbnail

관계형 데이터베이스

설계

Schema & Query Design

  • 스키마(Schema) : 데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명
    • 엔티티(Entity) : 사물의 구조나 상태, 동작 등을 모델로 표현하는 경우, 그 모델의 구성 요소
      • 필드(Field) : 엔티티의 특성을 설명, 행렬에서 열(column)에 해당
      • 레코드(Record) : 테이블에 저장된 항목, 행렬에서 행(row)에 해당

데이터베이스 설계

관계형 데이터베이스

구조화된 데이터는 하나의 테이블로 표현할 수 있다. 사전에 정의된 테이블은 relation이라고도 부르기 때문에, 테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database)라고 한다.

  • 관계형 데이터베이스 필수 키워드
    • 데이터(data) : 각 항목에 저장되는 값
    • 테이블(table 또는 relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적됨
    • 칼럼(column 또는 field) : 테이블의 한 열을 가리킴
    • 레코드(record 또는 tuple) : 테이블의 한 행에 저장된 데이터
    • 키(key) : 테이블의 각 레코드를 구분할 수 있는 값으로 각 레코드마다 고유한 값을 가지며 기본키(primary key)와 외래키(foreign key) 등이 있음

관계 종류

  • 테이블과 테이블 사이의 관계
    • 1:1 관계
      • 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우
    • 1:N 관계
      • 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우
    • N:N 관계
      • 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우
      • 스키마를 디자인할 때 Join 테이블을 만들어 관리
  • 테이블 스스로의 관계
    • 자기참조 관계(Self Referencing Relationship)
      • 테이블 내에서 관계가 필요한 경우

SQL More

SQL 내장함수

  • 집합연산 : 레코드를 조회하고 분류한 뒤, 특정 작업을 하는 연산
    • GROUP BY : 데이터를 조회할 때 그룹에서 묶어서 조회
      • HAVING : GROUP BY로 조회된 결과를 필터링
      • COUNT() : 레코드의 갯수를 헤아릴 때 사용
      • SUM() : 레코드의 합을 계산하는 함수
      • AVG() : 레코드의 평균값을 계산하는 함수
      • MAX(), MIN() : 레코드의 최대값과 최소값을 구하는 함수

SELECT 실행 순서

데이터를 조회하는 SELECT문은 정해진 순서대로 동작한다.

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • ORDER BY

데이터베이스 정규화

데이터베이스 정규화(Database Normalization)

데이터베이스 정규화는 데이터베이스의 설계와 연관되어 있다. 데이터베이스 설계가 결론적으로 데이터가 어떻게 저장될 지 구조를 정해주기 때문이다.

이를 위해서는 아래 부분들이 중요하다.

  • 데이터 중복(Data redundancy)
    데이터 중복은 실제 데이터의 동일한 복사본이나 부분적인 복사본을 뜻한다.
    물론 이런 중복성으로 데이터를 복구할 때에 더 수월할 수도 있겠지만 데이터베이스 내에서는 몇 가지 문제점들이 있다.
    - 일관된 자료 처리의 어려움
    - 저장 공간 낭비
    - 데이터 효율성 감소

  • 데이터 무결성(Data integrity)
    데이터 정규화는 데이터 무결성을 강화하기 위한 목적도 지닌다.
    데이터 무결성은 데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻한다.
    즉, 입력된 데이터가 오염되지 않고 입력된 그대로 데이터를 사용할 수 있다는 뜻이기도 하다.

  • 데이터 이상 현상(Anomaly)
    데이터 이상 현상은 데이터에서 기대한 것과 다른 이상 현상을 가리킨다.
    - 갱신 이상(update anomaly) : 동일한 데이터가 여러 행(레코드)에 걸쳐 있을 때에 어느 데이터를 갱신해야 하는지에 대한 논리적 일관성이 없어 발생
    - 삽입 이상(insertion anomaly) : 데이터 삽입을 못하는 경우를 가리킴
    - 삭제 이상(deletion anomaly) : 데이터의 특정 부분을 지울 때에 의도치 않게 다른 부분들도 함께 지워지는 이상 현상


SQL 종류

SQL에는 데이터를 조회하고 테이블을 만드는 등 다양한 문법이 있다. 그리고 쿼리문을 어떻게 작성하느냐에 따라, 그 기능이나 작업이 달라진다.

일반적으로 SQL 문법을 다음과 같이 분류한다.

  • Data Definition Language
  • Data Manipulation Language
  • Data Control Language
  • Data Query Language
  • Transaction Control Language

Data Definition Language(DDL)

DDL은 데이터를 정의할 때 사용하는 언어이다. 테이블을 만들 대 사용하는 CREATE나 테이블을 제거할 때 사용되는 DROP 등이 DDL에 해당한다. 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용한다.

Data Manipulation Language(DML)

DML은 데이터베이스에 데이터를 저장할 때 사용하는 언어이다. INSERT처럼 새로운 레코드를 추가할 때사용되는 문법을 포함해 데이터를 삭제하는 DELETE나 변경하는 UPDATE가 DML에 포함된다.

Data Control Language(DCL)

DCL은 데이터베이스에 대한 접근 권한과 관련된 문법이다. 어느 유저가 데이터베이스에 접근할 수 있는지 권한을 설정한다. 권한을 주는 GRANT나 권한을 가져가는 REVOKE 등이 DCL에 포함된다.

Data Query Language(DQL)

DQL은 정해진 스키마 내에서 쿼리할 수 있는 언어이다. SELECT가 DQL에 해당하며, 언어를 분류했지만, DQL을 DML의 일부분으로 취급하기도 한다.

Transaction Control Language(TCL)

TCL은 DML을 거친 데이터의 변경사항을 수정할 수 있다. COMMIT처럼 DML이 작업한 내용을 데이터베이스에 커밋하거나 ROLLBACK처럼 커밋했던 내용을 다시 롤백하는 문법이 있다.


SQL Advanced

CASE 사용하기

SQL에서도 프로그래밍 언어의 if 문과 같은 기능을 사용할 수 있다.
CASE를 사용하면, 특정 조건에 따라 다른 결과를 받을 수 있다.

  • CASE 예시
SELECT CASE
			WHEN CustomerId <= 25 THEN 'GROUP 1'
			WHEN CustomerId <= 50 THEN 'GROUP 2'
			ELSE 'GROUP 3'
		END
	FROM customers

SUBQUERY

쿼리문을 작성할 떄, 다른 쿼리문을 포함할 수 있따. 이 때, 포함되는 다른 쿼리문이 SUBQUERY(서브쿼리)이다.

서브쿼리는 실행되는 쿼리에 중첩으로 위치해 정보를 전달하며, 소괄호로 감싸야 한다.

서브쿼리의 결과는 개별 값이나 레코드 리스트이다. 그리고 서브쿼리의 결과를 하나의 컬럼으로 사용할 수 있다.

  • SUBQUERY 예시
SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customers WHERE CustomerId = 2)
FROM customers
WHERE CustomerId < 6
  • IN, NOT IN
    IN, NOT IN은 특정한 값이 서브쿼리에 있는지 또는 특정한 값을 제외한 값이 있는지 확인할 수 있다.
SELECT *
FROM customers
WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)
  • EXISTS
    EXISTS 또는 NOT 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
	)

0개의 댓글