Day 06 - 26.09.30

서코딩·3일 전

SQL

목록 보기
6/7

0. 복습

제약조건
1) 기본키 : Primary Key (PK)
2) 외래키 : Foreign Key (FK)
3) NOT NULL
4) CHECK
5) DEFAULT
6) 복합키(조합키)

무결성

  • 데이터에 결함이 없는 상태

1) 무결성을 판단하는 3가지
(1) 정확성
(2) 일관성
(3) 유효성

2) 무결성의 3가지 종류
(1) 개체 무결성
(2) 참조 무결성
(3) 도메인 무결성

시퀀스(SEQUENCE)
: 순서대로 증가하는 고유한 숫자를 자동으로 만들어준느 데이터베이스 객체 (ORACLE 전용)
PK에 넣을 번호를 자동으로 생성할 때 주로 사용

1. 정규화

  • 삽입/수정/삭제의 이상현상을 제거하기 위한 작업
  • 데이터의 중복을 최소화하는데 목적이 있다
  • 6차 정규화까지 있으나 3차 정규화까지만 진행한다

1) 1차 정규화

  • 같은 성격과 내용의 컬럼이 연속적으로 나오는 경우
  • 하나의 컬럼에 여러 데이터를 넣는 경우
    ex)
상품명
==================
바지1, 바지2, 바지3

상품명1 상품명2 상품명3
======================
바지1   바지2   바지3

=> 조회 및 검사가 너무 힘들다
1차 정규화 진행

[1차 정규화]
: 행을 늘리면 된다

상품명
==================
바지1
바지2

2) 2차 정규화
: 복합키(조합키)로 구성되었을 경우에
복합키의 일부분에만 종속되는 속성(컬럼)이 있는 경우
ex)

과자 테이블

이름(PK)	맛(PK)		가격	제조사
=========================================
포카칩		기본맛		1600	오리온
포카칩		양파맛		1400	오리온
포테토칩		오리지널		1500	농심
포테토칩		양파맛 		1700	농심
  • 과자의 이름만 알아도 제조사를 알 수 있다
    => 2차 정규화 진행
과자 테이블

이름(PK, FK)	맛(PK)		가격	제조사
=========================================
포카칩			기본맛		1600	오리온
포카칩			양파맛		1400	오리온
포테토칩			오리지널		1500	농심
포테토칩			양파맛 		1700	농심

이름(PK)	제조사
====================
포카칩		오리온
포카칩		오리온
포테토칩		농심
포테토칩		농심

3) 3차 정규화
: PK가 아닌 컬럼이 다른 컬럼을 결정하는 경우
ex)

회원
번호pk	이름	시		구		동		우편번호
================================================
1		짱구	대전시	서구	둔산동	11111
2		홍길동	서울시	중랑구	중화동	22222
  • 우편번호가 시, 구, 동을 결정한다
    => 3차 정규화 진행

[3차 정규화]
ex)

회원테이블
회원
번호pk	이름	우편번호
========================
1		짱구	11111
2		홍길동	22222

주소테이블
우편번호PK	시		구		동		
==================================
11111		대전시	서구	둔산동
22222		서울시	중랑구	중화동

4) 데이터베이스에 정규화가 필요한 이유

  • 데이터베이스를 잘못 설계하면 불필요한 데이터 중복으로 인해 공간이 낭비됨
  • 이상 현상이 발생될 수 있음
학번PK	학생이름	전공	과목명PK	성적
========================================
1111	홍길동	컴공	프로그래밍	90
1111	홍길동	컴공	운영체제		89
2222	김철수	전자	전자학		77
3333	이유리	전자	논리회로		89
4444	박웅이	간호	간호학개론	100

5) 이상현상의 종류
(1) 삽입 이상
: 새로운 데이터를 삽입하기 위해 불필요한 데이터도 삽입해야하는 문제

  • 새로운 학생의 정보를 삽입하고 싶은데 아직 시험을 보지 않아서 과목명과 성적을 비워둬야 한다
  • 여기서 과목명은 학번과 조합키로 사용되기 때문에 NULL을 허용하지 않는다
  • 그러면 과목명에 '미정' 같은 불필요한 데이터를 넣어줘야 한다

(2) 갱신 이상
: 중복 행 중에서 일부만 변경하여 데이터가 불일치하기 되는 모순의 문제

  • '홍길동' 학생이 전자과로 전과를 하게 되어 전공 컬럼의 값을 바꿔줘야 한다
  • 여기서 홍길동의 전공을 전부 찾아 바꿔줘야 하는데 하나의 행만 전자과로 바꾼다면 홍길동은 컴공인지 전자과인지 알 수 없다

(3) 삭제 이상
: 행을 삭제했을 때 필요한 데이터도 같이 삭제되는 문제

  • '박웅이' 학생이 자퇴하여 삭제해야 하는데 간호학 학생이 박웅이 한명이라면 간호학과에 대한 정보가 같이 날아간다
    => 이런 이상 현상을 예방하기 위해 정규화를 진행한다
    정규화를 진행하기 위해 각 컬럼간의 관련성을 파악한다
    -> 이러한 관련성을 "함수적 종속성" 이라고 한다
    => 따라서 하나의 테이블에서는 반드시 하나의 함수적 종속성만 존재하도록 정규화를 한다

+) 함수적 종속성
y = 2x 라는 함수가 있을 때,
x가 무엇이냐에 따라 y가 결정된다.
x를 결정자, y를 종속자라고 한다 (x -> y)

  • 여기서 x값이 1일 때 y는 반드시 2가 나온다
    이렇게 x값에 대한 y값이 항상 하나인 경우를 함수적 종속이라 말한다
    ex) 생일을 알면 나이가 나온다
    나이 컬럼은 생일 컬럼에 함수적 종속이 된다

2. 조인(JOIN)

  • 여러개의 테이블을 사용하여, 새로운 테이블을 만드는 과정
  • 여러 테이블에 흩어져 있는 정보 중 사용자가 필요한 정보만 가져와서 '테이블'(가상 테이블) 처럼 만들고 결과를 보여주는 것
    => 두개 이상의 테이블을 하나로 합쳐서 관리하는 것
  • 정규화를 통해 테이블이 너무 많이 쪼개져 있으면 조회 작업이 불편하기 때문에 성능을 향상시키기 위해 JOIN을 통해 합친 후 사용한다

1) EQUI 조인(동등 조인, 등가 조인)

  • 2개의 테이블 간에 일치하는 것을 조인
  • WHERE절에서 "=" 로 2개 테이블을 연결함

2) INNER JOIN(내부 조인)

  • "ON" 문을 사용하여 테이블을 연결함
  • INNER JOIN절에서 연결할 테이블 이름 작성
  • ON절에서 조인 조건(연결 조건) 작성
  • JOIN으로 해도 됨 ! (일반적인 방법)

+) SQL 실행 순서
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

3) INTERSECT 연산(교집합 조회)
: 2개의 테이블에서 공통된 값을 조회

4) OUTER JOIN(외부 조인)

  • 2개의 테이블 간에 교집합(INNER JOIN) 조회
    한쪽 테이블에만 있는 데이터도 포함
  • ORACLE에서 "(+)="로 OUTER JOIN 가능

5) LEFT OUTER JOIN, RIGHT OUTER JOIN

  • LEFT OUTER JOIN : 교집합 + 왼쪽에만 있는 행도 포함

=> 오른쪽 테이블에서 없으면 NULL값

  • RIGHT OUTER JOIN : 교집합 + 오른쪽에만 있는 행도 포함
    => 왼쪽 테이블에서 없으면 NULL값

6) UNION을 사용한 합집합

(1) UNION

  • 2개의 테이블을 하나로 합치는 연산
  • 2개의 테이블의 컬럼 개수, 데이터 형식이 모두 일치해야함

(2) UNION ALL

  • 단순하게 합치기만 함

7) MINUS(차집합)

  • 2개 테이블에서 차집합을 조회
  • 먼저 쓴 SELECT문에는 있고, 뒤에 쓴 SELECT문에는 없는 집합을 조회

+) 여러 테이블(3개 이상) 조인

  • JOIN ~ ON 을 계속 이어붙이면 3개, 4개, 5개도 연결할 수 있다
    ex) 직원이 어느 도시(CITY)에 일하는지 알고 싶다
    그런데 사원 테이블에는 도시 정보가 없다.
    직원(EMPLOYEES) -> 부서(DEPARTMENTS) -> 지역(LOCATIONS) 순서로 이어붙여야 도시를 알 수 있다

+) 셀프 조인(SELF JOIN) : 한 테이블을 자기 자신과 조인

  • 하나의 테이블을 마치 두개의 테이블처럼 여겨서 자기 자신과 조인하는 것
  • 직원 테이블(EMPLOYEES)에는 MANAGER_ID(상사의 사원번호)가 들어가 있다
  • 상사도 결국 같은 직원 테이블 안의 한 사람이다
    그래서 직원 테이블을 두 번 불러서 조인하면 '사원' <-> '그 사원의 상사'를 연결할 수 있다
profile
서코딩 127 !

0개의 댓글