멋쟁이v의 개발일지

[DB] 데이터베이스 구성, 제약조건, 테이블 JOIN 본문

0년차/DB

[DB] 데이터베이스 구성, 제약조건, 테이블 JOIN

멋쟁이v 2023. 5. 28. 17:24
728x90
320x100

[목차]


01. 데이터베이스 구성

  • 1) 데이터베이스 스키마
    👉🏻
    데이터베이스의 전체 구조

    • 스키마(Schema)

      ➡️ 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지 기본적인 구조를 정의한다.

      ➡️ 테이블의 속성과 자료 타입에 대한 정보를 가지고 있다.

  • 2) 데이터베이스 인스턴스
    👉🏻
    데이터베이스를 구성하는 릴레이션 인스턴스의 모음

    • 인스턴스

      ➡️ 스키마를 정의하고, 정의한 스키마에 따라서 실제로 테이블에 저장되는 데이터의 집합이다.

  • 3) 릴레이션
    👉🏻
    종류
    • 어트리뷰트
    • Degree
    • 식별자(키)
    • 튜플
    • 카디널리티
    • 도메인 : 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값들의 집합

    특징

    • 릴레이션은 중복된 튜플을 가질 수 없다.
    • 릴레이션은 튜플을 식별하기 위해 KEY를 설정하여 유니크하게 식별 가능하다.
    • 릴레이션에서 튜플의 순서는 중요하지 않다. → 정렬 기준이 다양하기 때문에
    • 하나의 릴레이션에서 어트리뷰트의 이름은 중복될 수 없다.
    • 하나의 릴레이션에서 어트리뷰트의 순서는 중요하지 않다.
    • 어트리뷰트는 원자값(Atomic)을 가져야 한다.

  • 4) 도메인 정의하기
    👉🏻
    하나의 어트리뷰트(속성)가 가질 수 있는 같은 타입의 원자값의 집합

    ➡️ 어트리뷰트 : 하나의 릴레이션에서 맡은 역할에 대한 이름을 부여하는 것.

    ➡️ 튜플은 각 어트리뷰트의 값으로 이루어진 행(row, list)이며, 값이 Null일 수 있다. 단, 주소 입력 시, 필수 입력 값이 아니라면 Null 허용. NOT NULL이면, Null 값 작성 불가능.

    ➡️ 애트리뷰트 리스트 작성 방법

    • 테이블_이름(속성)

    ➡️ Null 의미

    • 값이 존재하지 않는다.
    • 값이 존재하지만 아직 그 값을 알지 못한다.

02. RDBMS 제약 조건

  • 1) KEY
    👉🏻
    키는 릴레이션에서 튜플들을 유일하게 구별하는 속성 또는 속성들의 집합을 의미한다.

    데이터베이스에서 조건을 만족하는 튜플을 찾거나, 순서대로 정렬할 때, 튜플을 서로 구분할 수 있는 기준이 되는 어트리뷰트를 말한다.

    ➡️ 종류

    👉🏻
    기본 키(primary key)
    • 후보키들 중에서 기본적으로 사용하기 위해 선택한 키.
    • 중복된 값을 가질 수 없다.
    • 하나의 릴레이션에서 특정 튜플을 구별할 수 있는 유일한 속성.

    후보 키(Candidate key)

    • 릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별할 수 있는 키. 즉, 기본 키로 사용할 수 있는 속성들.
    • 유일성 + 최소성을 동시에 만족하는 속성 또는 속성들의 집합.

    대체 키(Alternate key)

    • 후보 키가 둘 이상일 때, 기본 키로 선택되지 못한 후보 키를 대체 키라고 한다.

    슈퍼 키(Super key)

    • 유일성은 만족하지만 최소성은 만족하지 않는 속성 또는 속성들의 집합.

    외래 키(Foreign key)

    • 다른 릴레이션의 기본 키를 참조하는 속성 또는 속성들의 집합
    • 참조되는 릴레이션의 기본 키와 대응돼서 릴레이션 간 참조 관계를 표현하는 중요한 도구.

    ➡️ Key의 개념

    👉🏻
    슈퍼 키
    • 릴레이션에서 튜플을 유니크하게 식별할 수 있는 하나 또는 속성들의 집합
    • 릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만, 최소성은 만족하지 않는다.

    ➡️ 학생(학번, 이름, 주소, 연락처, 주민번호)

    • {학번} {주민번호} {학번+이름} {주민번호 + 이름} {..}

    후보 키

    • 기본 키로 사용할 수 있는 속성들의 최소 집합.
    • 유일성 : 하나의 키 값으로 하나의 튜플만 유일하게 식별해야 한다.
    • 최소성 : 모든 레코드들을 유일하게 식별하는데 꼭 필요한 속성으로만 구성해야 한다.

    ➡️ {학번} {주민번호} {학번+주민번호}

    기본 키

    • 후보 키에서 선정된 키
    • 하나의 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성
    • NULL값을 가질 수 없다.

    대체 키

    • PK가 아닌 후보 키
    • 후보 키가 둘 이상일 때, 기본 키로 선택 받지 못한 나머지 후보 키
    • 예시) {학번, 주민번호} → 학번(PK), 주민번호(대체 키)

    외래 키

    • 다른 릴레이션의 기본 키를 참조하는 속성
    • 다른 릴레이션의 기본 키를 참조하여 테이블 간 관계를 표현한다.

  • 2) 제약조건
    💡
    RDBMS에서 릴레이션들이 항상 지켜야 하는 사항

    ➡️ implicit constraints(내포, 포함된 제약 조건)

    👉🏻
    릴레이션 자체가 가지고 있는 제약 조건

    릴레이션은 중복된 튜플을 가질 수 없다.

    릴레이션은 같은 이름의 애트리뷰트를 가질 수 없다.

    ➡️ 무결성 제약 조건(Integrity)

    👉🏻
    무결성
    • 데이터의 결함이 없는 상태
    • 일관성과 정확성을 가지고 구축된 데이터베이스가 계속해서 무결성을 유지하려면 데이터의 삽입, 삭제, 수정 시 데이터의 제약 조건 준수 여부를 확인해야 한다.

    종류

    • 도메인 무결성 제약 조건
      • 애트리뷰트의 값은 정의된 도메인에 속한 값이어야 한다.
      • NOT NULL이 아닐 경우, null 값은 허용한다.
    • 개체 무결성 제약 조건
      • 기본 키 제약이라고 한다.
      • 기본 키를 구성하는 속성은 중복 값을 가질 수 없고, NULL값을 가질 수 없다.
      • 유니크하게 식별 불가능

    ➡️ 참조 무결성 제약 조건

    👉🏻
    외래 키의 값은 NULL이거나, 참조 릴레이션의 기본 키 값과 동일해야 한다. 단, NULL을 입력하면 NULL 허용일 경우(Null value constraint)

    외래 키는 참조하고 있는 테이블의 기본 키에 없는 값을 외래 키로 가질 수 없다.

    ➡️ key constraints

    👉🏻
    서로 다른 튜플들은 같은 값의 키를 가질 수 없다.

    ➡️ Null value constraint

    👉🏻
    애트리뷰트가 NOT NULL이라고 명시되어 있다면 NULL값을 가질 수 없다.

    ➡️ CHECK 제약 조건(MySQL 8.0.16)

    👉🏻
    애트리뷰트에 들어갈 수 있는 값을 제한한다.

    숫자 비교, 문자 비교 가능

    입력되는 값이 CHECK 조건과 맞지 않으면 에러가 발생한다.

    • 구문 : 컬럼명 데이터 타입 CHECK(컬럼명 조건)

03. 테이블 JOIN

💡
두 개 이상의 테이블을 묶어서 하나의 결과 집합으로 만드는 것.

  • JOIN은 관련 있는 두 개 이상의 테이블을 결합하여 여러 테이블에 나눠져 있는 데이터들을 한번에 가져오기 위한 방법
  • 두 테이블을 JOIN하려면, 테이블이 1:N 관계로 연결되어야 한다.
    • 기본 키와 외래 키 관계로 연결되어 있어야 한다.
  • 종류

    ➡️ INNER JOIN

    👉🏻
    교집합
    • 두 테이블이 공통적으로 가지고 있는 값.
    • 구문

      SELECT

      *

      FROM

      table_a AS a

      INNER JOIN

      table_b AS b

      ON

      a.key = b.key

      WHERE 조건;

    • ON : 작성 하지 않으면, 데이터가 섞여버린다.

      기준 컬럼을 잡고 조회해야 한다.

    ➡️ OUTER JOIN

    👉🏻
    LEFT OUTER JOIN : 왼쪽 테이블을 기준으로 정렬

    RIGHT OUTER JOIN : 오른쪽 테이블을 기준으로 정렬

    • OUTER 생략 가능

    ➡️ CROSS JOIN

    👉🏻
    두 테이블의 곱집합

    A 테이블에 행이 10개, B 테이블에 12개가 있을 때, JOIN 시 120개 출력

    ➡️ NATURAL JOIN

    ➡️ SELF JOIN : 계층형 구조

  • 예제
    -- Continent가 Europe인 도시와 Continent를 조회
    SELECT
    	c.Name AS '도시 이름',
    	ct.Continent
    FROM
    	city AS c
    	INNER JOIN
    	country AS ct
    	ON
    	c.CountryCode = ct.Code
    WHERE
    	ct.Continent = 'Europe';

    ➡️ 조회할 컬럼명 작성 시, 두 테이블에 전부 동일한 이름의 컬럼이 존재한다면, 명확하게 테이블명 작성 후 , 컬럼 이름을 작성해준다.

    -- Continent가 Asia인 인구수 합계
    SELECT
    	SUM(c.Population) AS '인구수'
    FROM
    	city AS c
    	INNER JOIN
    	country AS ct
    	ON
    	c.CountryCode = ct.Code
    WHERE
    	ct.Continent = 'Asia';

    ➡️ 조인 시 테이블 확인(ERD) → 연관 관계 확인, 키 컬럼 확인(매칭 가능한 키)

    -- country table의 continent 별로 city의 인구수의 평균을 구하시오.
    -- 단, 소수점 아래는 버림하고, 정수만 구하시오.
    SELECT
    	ct.Continent,
    	FLOOR(AVG(c.Population)) AS '인구수 평균'
    FROM
    	city AS c
    	INNER JOIN
    	country AS ct
    	ON
    	c.CountryCode = ct.Code
    GROUP BY ct.Continent;

    ➡️ 조회할 컬럼명 작성 시, 두 테이블에 전부 동일한 이름의 컬럼이 존재한다면, 명확하게 테이블명 작성 후, 컬럼 이름을 작성해준다.

    -- 로그인 기간이 2월인, 회원의 아이디, 이메일, 로그인 기록을 조회하시오. ( + id 중복 제거)
    SELECT
    	m.m_id,
    	m.m_email,
    	l.login_date
    FROM
    	tb_member AS m
    	INNER JOIN
    	tb_login AS l
    	ON
    	m.m_id = l.login_id
    WHERE
    	l.login_date BETWEEN '2023-02-01' AND LAST_DAY('2023-02-01')
    	-- MONTH(l.login_date) = 2;
    	-- l.login_date >= '2023-02-01' AND l.login_date <= LAST_DAY('2023-02-01')
    GROUP BY m.m_id;

04. NULL값 처리

💡
NULL은 =, <, > 연산자를 사용할 수 없다.
  • 확인방법
    👉🏻
    NULL값을 찾을 때 : 연산자가 아닌 IS NULL을 사용한다.

    NULL이 아닌 값을 찾을 때 : IS NOT NULL

  • 예제
    -- 회원 중 로그인 하지 않은 회원의 아이디, 이메일, 로그인 기록을 조회
    SELECT
    	m.m_id,
    	m.m_email,
    	l.login_date
    FROM
    	tb_login AS l
    	RIGHT OUTER JOIN
    	tb_member AS m
    	ON
    	m.m_id = l.login_id
    WHERE
    	l.login_date IS NULL;

    ➡️ 기준테이블을 잡고, RIGHT 조인을 사용하여 tb_member 테이블에 tb_login 테이블을 붙여 tb_login의 로그인 날짜가 NULL인 컬럼명을 조회한다.

    -- 등급이 없는 회원의 아이디, 이름, 레벨 이름을 조회
    SELECT
    	m.m_id,
    	m.m_name,
    	ml.level_name
    FROM
    	tb_member AS m
    	LEFT JOIN
    	tb_member_level AS ml
    	ON
    	m.m_level = ml.level_num
    WHERE
    	m.m_level IS NULL;

    ➡️ tb_member 를 기준테이블로 잡고, tb_member_level 테이블을 붙여 tb_member 테이블에 등급 컬럼이 NULL인 회원을 조회한다.


tag : #데이터베이스 #DB #릴레이션 #스키마 #도메인 #제약조건 #JOIN #NULL값


Uploaded by N2T

728x90
320x100
Comments