- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Refactoring
- LEVEL 2
- 배포
- mongodb
- TIL
- TWIL
- MariaDB
- 코어 자바스크립트
- java
- 오늘도 개발자가 안된다고 말했다
- TMIL
- 리팩터링 2판
- 코딩테스트
- LEVEL 1
- CSS
- Git
- 에러핸들링
- Err-Handling
- LEVEL1
- react
- 면접을 위한 cs 전공지식 노트
- typescript
- 아고라스테이츠
- Docker
- sql
- CRUD
- 프로그래머스
- First Project
- javascript
- 알고리즘
성장에 목마른 코린이
[DB] ADVANCED (서브쿼리, SQL 종류, DB 정규화) 본문
데이터베이스 정규화 (Database Normalization)
데이터베이스 정규화는 데이터베이스의 설계와 관련 있습니다.
데이터베이스 설계에 따라 데이터가 어떻게 저장될지 그 구조를 결정하기 때문입니다.
이를 위해서는 크게 다음 부분들이 중요합니다.
- Data redundancy
- Data integrity
- Anomaly
Data Redundancy (데이터 중복)
실제 데이터의 동일한 복사본이나, 부분적인 복사본을 뜻합니다.
물론 이러한 중복으로 데이터를 복구할 때에 더 수월할 수도 있지만, 대체로 데이터베이스 내에서는 몇 가지 문제점을 지닙니다.
- 일관된 자료 처리의 어려움
- 저장 공간 낭비
- 데이터 효율성 감소
Data Integrity (데이터 무결성)
데이터 정규화는 데이터 무결성을 강화하는 목적도 지닙니다.
데이터 무결성은 데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻합니다.
다시 말해 입력된 데이터가 오염되지 않고, 입력된 그대로 데이터를 사용할 수 있다는 뜻입니다.
Anomaly (데이터 이상 현상)
기대한 데이터와 다른, 이상 현상을 가리킵니다.
다음과 같은 3가지 현상이 있습니다:
다음과 같은 테이블이 존재하고, 두개의 레코드가 동일한 사람일 때, 519번을 갱신하는 경우 어떤 행의 데이터를 갱신해야하는지 알 수 없습니다.
- 갱신 이상(update anomaly)
- 여러 행(레코드)에 걸쳐 동일한 데이터가 있을 때, 어떤 행을 갱신해야하는지 논리적 일관성이 없는 경우에 발생합니다.
수업을 NULL 값으로 지정하지 않는 이상, 데이터를 추가하지 못합니다.
- 삽입 이상(insertion anomaly)
- 데이터를 삽입하지 못하는 경우를 가리킵니다.
한 수업 데이터를 삭제하려면, 레코드 전체가 사라집니다.
- 삭제 이상(deletion anomaly)
- 데이터의 특정 부분을 지울 때 의도치 않게 다른 부분도 함께 지우는, 이상 현상입니다.
SQL 종류
일반적으로 SQL 문법을 다음과 같이 분류합니다.
1. Data Definition Language(DDL) (CREATE, DROP)
데이터를 정의할 때 사용하는 언어입니다.
데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용합니다.
2. Data Manipulation Language(DML) (INSERT, DELETE, UPDATE)
데이터베이스에 데이터를 저장할 때 사용하는 언어입니다.
3. Data Control Language(DCL) (GRANT, REVOKE)
데이터베이스에 대한 접근 권한과 관련된 문법입니다.
어느 유저가 데이터베이스에 접근할 수 있는지 권한을 설정합니다.
4. Data Query Language(DQL) (SELECT)
정해진 스키마 내에서 쿼리할 수 있는 언어입니다.
이렇게 언어를 분류했지만, DQL을 DML의 일부분으로 취급하기도 합니다.
5. Transaction Control Language(TCL) (COMMIT, ROLLBACK)
DML을 거친 데이터의 변경사항을 수정할 수 있습니다.
SQL Advanced
데이터베이스에 대해 더욱 깊이 공부하기 위해 필요한 자료입니다. SQL 언어의 더욱 많은 문법을 설명합니다.
CASE 사용하기
SQL에서도 프로그래밍 언어의 if 문과 같은 기능을 사용할 수 있습니다.
CASE 를 사용하면, 특정 조건에 따라 다른 결과를 받을 수 있습니다.
실제 SQL 예시를 보면 다음과 같습니다.
SELECT CASE
WHEN CustomerId <= 25 THEN 'GROUP 1'
WHEN CustomerId <= 50 THEN 'GROUP 2'
ELSE 'GROUP 3'
END
FROM customers
이 쿼리문은 CustomerId 필드값에 따라 3개의 그룹('GROUP 1', 'GROUP 2', 'GROUP 3')으로 나뉩니다. CustomerId 필드값이 25 이하인 경우에는 'GROUP 1', 26부터 50 사이인 경우에는 'GROUP 2', 51 이상은 'GROUP 3' 으로 분류합니다.
SUBQUERY
쿼리문을 작성할 때, 다른 쿼리문을 포함할 수 있을때 포함되는 다른 쿼리문을 SUBQUERY(서브쿼리)라고 합니다.
서브쿼리는 실행되는 쿼리에 중첩으로 위치해, 정보를 전달합니다.
서브쿼리는 소괄호로 감싸야 합니다.
서브쿼리의 결과는 개별 값이나 레코드 리스트입니다. 그리고 서브쿼리의 결과를 하나의 칼럼으로 사용할 수 있습니다.
SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customers WHERE CustomerId = 2)
FROM customers
WHERE CustomerId < 6
IN, NOT IN
IN은 특정한 값이 서브쿼리에 있는지 확인할 수 있습니다.
// customers 테이블에서 'CustomerId'의 값이 서브쿼리에서 돌려받는 값에 속한 결과들만 조회하고 있습니다.
SELECT *
FROM customers
WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)
서브쿼리에서는 'CustomerId' 가 10 이하인 데이터를 돌려주기 때문에, 최종 조회된 데이터의 'CustomerId'도 10 이하입니다.
만약 IN 대신 NOT IN 을 사용한다면, 서브쿼리에서 조회된 10 미만을 제외한(10을 초과하는) 레코드를 조회합니다.
EXISTS
EXISTS 또는 NOT EXISTS는 돌려받은 서브쿼리에 존재하는 레코드를 확인합니다.
만약 조회하려는 레코드가 존재한다면 참(TRUE)을, 그렇지 않은 경우에는 거짓(FALSE)을 리턴합니다.
// 다음 쿼리문은 employees 테이블에서부터 'EmployeeId' 필드를 조회합니다.
// 이때 서브쿼리로 customers 테이블의 'SupportRepId' 필드값과
// employees 테이블의 'EmployeeId' 필드값을 비교해 일치하는 레코드들을 가져옵니다.
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
'데이터베이스' 카테고리의 다른 글
[DB] Docker 로 MySQL/MariaDB 세팅 (0) | 2022.11.30 |
---|---|
[DB] 생성, 기본 문법 (CREATE, SHOW, DESC, DROP, ALTER) (0) | 2022.04.09 |
[DB] SQL 내장함수 (0) | 2022.04.09 |
[DB] 헷갈리는 DB 조작 (INSERT, UPDATE, JOIN) (0) | 2022.04.09 |
[DB] DB 조작 (SELECT, WHERE, LIKE, IN, ORDER BY) (0) | 2022.04.09 |