[목차]
01. 데이터베이스 구성
1) 데이터베이스 스키마
👉🏻데이터베이스의 전체 구조- 스키마(Schema)
➡️ 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지 기본적인 구조를 정의한다.
➡️ 테이블의 속성과 자료 타입에 대한 정보를 가지고 있다.
- 스키마(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값을 찾을 때 : 연산자가 아닌 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