데이터베이스 완벽 이해하기

정다운·2025년 7월 10일

완벽 이해하기

목록 보기
3/5
post-thumbnail

멋쟁이 사자처럼 13기 강의를 진행하며 만든 자료를 블로그에 공유합니다.

🗂️ 데이터베이스란?

📌 데이터

관찰의 결과로 나타난 정량적인 실제 값

📌 정보

데이터에 의미를 부여한 것

📌 데이터베이스

조직에 필요한 정보를 얻기 위해 논리적으로 연관된 데이터를 모아 구조적으로 통합해 놓은 것

예시)

에베레스트산의 높이 → 데이터

에베레스트산의 지리적 특성 → 정보

⚙️ 데이터베이스 시스템

✅ DBMS

데이터를 저장하고 관리하는 소프트웨어

(ex. MySQL, Oracle, MariaDB)

→ 엑셀처럼 보일 수 있지만 훨씬 더 체계적

✅ 데이터베이스

실제 데이터가 저장되는 하드디스크의 구조

→ 여러 개의 테이블로 구성, DBMS가 관리

🧊 비유:

DB는 냉장고 안 음식

DBMS는 냉장고 문 여닫는 사람

✅ 데이터 모델

데이터를 어떻게 구조화하고 표현할지를 정해주는 설계도

⇒ 부모 자식 관계처럼 위계 구조로 표현

⇒ 하나의 데이터가 여러 부모와 연결될 수 있는 그래프 구조

⇒ 데이터를 객체 단위로 저장

⇒ 데이터를 테이블(행과 열) 형태로 저장하고 테이블 간에 공통 키로 연결하여 관리

⇒ 가장 널리 쓰이는 모델

🧠 용어의 이해

📌 릴레이션(Relation)

행과 열로 구성된 테이블, 실제 데이터를 담고 있는 테이블

🔹 스키마 + 인스턴스로 구성

  • 릴레이션의 특징
    1. 속성은 단일 값을 가짐
    2. 속성을 서로 다른 이름을 가짐
    3. 한 속성의 값은 모두 같은 도메인 값을 가짐 (도메인 : 속성이 가질 수 있는 값의 집합)
    4. 속성의 순서는 상관없음
    5. 릴레이션 내의 중복된 투플은 허용하지 않음
    6. 투플의 순서는 상관없음

📌 주요 용어

  • 스키마: 테이블을 만들기 위한 설계도, 틀
  • 인스턴스: 실제 저장된 데이터 집합
  • 속성(열): 하나의 항목
  • 투플(행): 하나의 데이터 묶음

스키마: 쿠키 틀
인스턴스: 쿠키 완성품
속성: 쿠키의 맛, 모양, 재료
튜플: 개별 쿠키 하나

🔑 키 (Key)

테이블에서 각 행(투플)을 유일하게 식별하거나

테이블 간 관계를 만들기 위해 사용하는 속성(열)을 의미함


✅ 키의 두 가지 성질

  • 유일성: 하나의 키 값으로 한 행(투플)을 유일하게 식별할 수 있어야 함
  • 최소성: 키를 구성하는 속성 중 꼭 필요한 최소한의 속성만 사용해야 함

📌 키의 종류

🔹 슈퍼키 (Super Key)

  • 행을 유일하게 식별할 수 있는 모든 후보 속성의 조합
  • 예: 주민번호, 주문번호, (id + 이름)
  • id + 이름이 유일하더라도 id만으로도 유일하다면 후보키 아님

🔹 후보키 (Candidate Key)

  • 슈퍼키 중 불필요한 속성을 제거한 최소 키
  • 예: 주민번호, 이메일, id

🔹 기본키 (Primary Key, PK)

  • 후보키 중 대표로 선택된 키
  • 후보키가 하나라면 → 그게 기본키
  • 여러 개라면 → 릴레이션 특성에 따라 선택

💡 테이블 정의 시, 기본키는 밑줄로 표현하기도 함

예시)
student (이름, 학번, 학과, 성별, 나이, 핸드폰)

  • 슈퍼키: 학번, 핸드폰, (이름 + 학번) …
  • 후보키: 학번, 핸드폰
  • 기본키: 학번

🔹 대체키 (Alternate Key)

  • 기본키로 선택되지 않은 나머지 후보키

🔹 대리키 (Surrogate Key)

  • 실제 데이터와 관계없는 인공적인 식별자
  • 예: 학번, 회원번호 (개인정보 유출 방지를 위해 주민번호 대신 사용)

🔹 외래키 (Foreign Key, FK)

  • 다른 테이블의 기본키를 참조하여 테이블 간 관계를 설정
  • 외래키는 보통 자식 테이블에서 부모 테이블의 기본키를 가리킴

주문 테이블의 기본키 : 주문번호

주문 테이블의 외래키 :

  • 고객번호 (고객 테이블 참조)
  • 도서번호 (도서 테이블 참조)

🔗 테이블의 관계


1️⃣ 1 : 1 (일대일 관계)

  • 하나의 데이터 ↔ 하나의 데이터만 연결됨
  • ex) 각 전화번호는 단 하나의 사용자와만 연결됨

2️⃣ 1 : N (일대다 관계)

  • 하나의 데이터가 다른 테이블의 여러 데이터와 연결됨
  • ex) 한 명은 여러개의 전화번호를 가질 수 있지만 여러 사람이 동일한 전화번호를 가질 수는 없음

3️⃣ M : N (다대다 관계)

  • 여러 데이터가 서로 여러 개와 연결됨
  • ex) 한 명이 여러개의 패키지를 이용할 수도, 한개의 패키지를 여러명이 이용할 수도 있음

4️⃣ 자기참조 관계 (Self-Join)

하나의 테이블 내에서 관계를 표현

ex) 특정 서비스의 회원가입 시 추천인 id를 입력하는 기능

자기 자신을 외래키로 참조해야 함 (ex. member.recommender_id → member.id)


🧾 기본 SQL 문법

관계형 데이터베이스에서 데이터를 조회, 삽입, 수정, 삭제할 때 사용하는 기본 SQL 문법


🔍 SELECT (조회)

SELECT 컬럼명 FROM 테이블명;
  • 테이블에서 특정 컬럼을 조회
    • 를 사용하면 모든 컬럼 조회

🧩 WHERE (조건 조회)


SELECT 컬럼명 FROM 테이블명 WHERE 조건;
  • 조건이 참인 데이터만 조회

🔃 ORDER BY (정렬)

SELECT 컬럼명 FROM 테이블명 WHERE 조건 ORDER BY 컬럼명 ASC;
SELECT 컬럼명 FROM 테이블명 WHERE 조건 ORDER BY 컬럼명 DESC;
  • 불러오는 데이터를 정렬
  • ASC : 오름차순 (기본값)
  • DESC : 내림차순

➕ INSERT (데이터 삽입)

INSERT INTO 테이블명 (칼럼명1, 칼럼명2, 칼럼명3) VALUES (1,2,3)
INSERT INTO 테이블명 VALUES (1,2,3)
  • 입력 순서가 중요 (컬럼 순서와 값 순서 일치해야 함)

🛠 UPDATE (데이터 수정)

UPDATE 테이블명 SET 칼럼명 = 변경할 값                  //데이터의 모든 값을 변경
UPDATE 테이블명 SET 칼럼명 = 변경할 값 WHERE 조건       //조건에 해당하는 데이터만 변경
  • 특정 행만 수정할 때는 반드시 where 조건 포함!

❌ DELETE (데이터 삭제)

DELETE FROM 테이블명                  //데이터의 모든 값을 삭제
DELETE FROM 테이블명 WHERE 조건       //조건에 해당하는 데이터만 삭제
  • where 없이 DELETE를 쓰면 전체 데이터가 삭제되므로 주의!

더 공부해보기!!


!!실습!!

MySql 설치

https://code-angie.tistory.com/158

https://velog.io/@cyseok123/MySQL-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%8B%A4%ED%96%89-for-Mac

모두 설치 완료해 오셨죵~?

MySql 접속

  • Mysql 접속 후 하단의 localhost:3306 DB서버 버튼 누르기

  • 설치할 때 작성한 비밀번호 입력

  • Navigator : 어떤 데이터베이스(스키마)들이 있는지, Quary : 쿼리문 작성하는 곳, Output : 요청에 대한 답변 또는 실행 과정의 로그 메시지들

데이터베이스 생성

  • 데이터베이스를 생성해야함 데이터베이스 → 테이블 → colum과 row들

  • 데이터베이스 이름은 LikeLion, charset은 utf8, Collation은 데이터베이스 안에 들어있는 문자열등을 정렬하는 순서 utf8_genenal_ci

  • 원하는 데이터베이스 클릭 후 SQL 아이콘 클릭

테이블 생성

USE LikeLion; -- 사용할 데이터베이스 선택

CREATE TABLE teams (
		id INTEGER PRIMARY KEY,  -- 팀(파트) 고유 ID, 기본키, 정수값
    name VARCHAR(50) NOT NULL  -- 팀(파트) 이름 (Backend, Frontend, AI), 글자로 최대 50자, null값 안됨
);

CREATE TABLE users (
		id INTEGER AUTO_INCREMENT PRIMARY KEY,  -- 사용자 고유 ID, 자동으로 1씩 증가, 기본키
    name VARCHAR(50) NOT NULL,  -- 사용자 이름, 글자로 최대 50자, null값 안됨
    part_id INTEGER,  -- 소속된 파트 ID teams 테이블의 id 참조, 정수값
    FOREIGN KEY (part_id) REFERENCES teams(id)  -- 외래키 : part_id는 teams 테이블의 id와 연결
);

→ 외래키를 통해 users.part_id는 반드시 teams.id에 존재하는 값만 가질 수 있다

→ teams 테이블의 id가 부모 키, users.part_id가 자식 키

→ 이를 통해 part_id에 존재하지 않는 팀 id를 입력하면 오류

  • 쿼리문 작성 후 번개 아이콘 클릭, 새로고침하면 테이블을 확인할 수 있다

데이터 입력

USE LikeLion;

INSERT INTO teams (id, name) VALUES
(1, 'Backend'),
(2, 'Frontend'),
(3, 'AI');
  • users 테이블에서 part_id를 참조 해야 하기 때문에 먼저 팀 정보부터 입력

USE LikeLion;

INSERT INTO users (name, part_id) VALUES
('다운', 1),
('준영', 1),
('하윤', 2),
('현승', 2),
('현민', 3),
('규빈', 3);
  • users 데이터 입력
  • 여기서 users에 id 값을 채워넣지 않아도 되는 이유 : AUTO_INCREMENT로 자동으로 1부터 순서대로 증가시켜 채워준다

조회

  • 전체 컬럼 조회를 하기 위해 *를 사용
SELECT * FROM teams;  -- teams 테이블 조회

SELECT * FROM users;  -- users 테이블 조회

  • 특정 컬럼만 조회하고 싶거나 조건을 걸어서 조회하고 싶다면 아까 배운 sql문법에 따라 시도해 보아요~

수정, 삭제

수정

  • 아이디가 n인 사용자(다운)의 팀을 AI(3번)으로 변경
USE LikeLion;

UPDATE users
SET part_id = 3
WHERE id = (위 테이블을 보고 이름 다운의 id값을 넣어주세용..);
  • 다시 조회
SELECT * FROM users;

삭제

  • 삭제 전 조건이 맞는 행이 있는지 먼저 확인하는 습관이 좋음
SELECT * FROM users WHERE id = (위 테이블을 보고 이름 다운의 id값을 넣어주세용..);

DELETE FROM users 
WHERE id = (위 테이블을 보고 이름 다운의 id값을 넣어주세용..);
SELECT * FROM users; -- 조회

🔗 JOIN

두 개 이상의 테이블을 공통된 컬럼을 기준으로 연결하여 데이터를 조회할 때 사용

🔸 INNER JOIN (내부 조인)

  • 내부조인 → 교집합
  • 기준 테이블과 JOIN 테이블의 중복된 값을 보여줌
  • 두 테이블에 모두 지정한 열의 데이터가 있어야함
  • 가장 자주 사용되는 JOIN

🔹 LEFT (OUTER) JOIN

  • 부분집합
  • 공통 부분과 왼쪽 테이블 데이터 (왼쪽에 있는 테이블 모두 보여줌)
  • 연결된 데이터가 없으면 NULL로 표시

🔸 RIGHT (OUTER) JOIN

  • 부분집합
  • 공통 부분과 오른쪽 테이블 데이터 (오른쪽에 있는 테이블 모두 보여줌)
  • 기준 테이블에 연결된 값이 없으면 NULL로 표시

🔸 FULL OUTER JOIN

  • 외부조인 → 합집합
  • A, B 테이블 데이터 모두를 보여줌
  • 연결되지 않은 값은 NULL로 표시

INNER JOIN 실습

  • 실습을 위해 어떤 팀과도 연결되지 않은 사용자를 추가
INSERT INTO users (name, part_id)
VALUES ('멋사', NULL);
  • 조회

  • INNER JOIN으로 쿼리를 작성
SELECT
	users.name AS 사용자명,  -- AS로 열 이름을 사용자명으로 바꿔서 표시 
  teams.name AS 소속팀
FROM  -- 기준이 되는 메인 테이블 지정
	users
JOIN  -- teams테이블과 연결
	teams
ON  
-- 어떤 열을 기준으로 연결할지 설정, users의 part_id와 teams의 id가 일치할 때만 데이터를 합침
	users.part_id = teams.id;

⇒ 사용자 이름과 소속 팀 이름을 각각 다른 테이블에서 가져와서 한 화면에 보여주는 join 예제

⇒ JOIN을 통해 관계형 데이터베이스의 연결된 구조를 직접 조회할 수 있다

⇒ JOIN 전에는 팀이 없는 ‘멋사’ 가 테이블에 표시, JOIN 후에는 조건에 맞는 데이터가 없기 때문에 ‘멋사’가 테이블에 표시되지 않음

🗺️ ERD (Entity Relationship Diagram)

ERD는 Entity(개체), Relationship(관계), Attribute(속성) 간의

구조를 그림으로 시각화한 데이터베이스 설계 도구

ERD의 핵심 3요소

🧱 1. Entity (개체)

  • 엔티티는 정의 가능한 사물 또는 개념을 의미
  • 데이터베이스의 테이블이 엔티티로 표현됨
  • 예 : 사용자, 게시글, 상품

🔗 2. Relationship (관계)

  • 개체 사이의 연관성을 나타내는 개념
  • ERD에서는 선으로 두 개체를 연결
  • 1:1 관계, 1:N 관계, N:M 관계

📌 3. Attribute (속성)

  • 하나의 엔티티가 가지는 정보 요소
  • 데이터베이스에서는 컬럼으로 표현
  • 예 : id, name, email

💡 정리

ERD는 개체(Entity)가 어떤 속성(Attribute)을 가지고,

다른 개체와 어떤 관계(Relationship)를 맺는지

시각적으로 표현해주는 설계 도구

ERD CLOUD 실습

ERDCloud

  • 사이트에 접속 후 사용 버튼 클릭

  • 회원가입 창에서 로그인 해주기

  • 로그인 후 제목 작성 후 만들기

  • ERD 설정을 해주기 위해 톱니바퀴 클릭

  • 디스플레이 항목에 모두 체크해주기 참고로 검은색 사각형에 하얀 테두리가 체크가 된 상태!!

ERD 다이어그램 그리기

  • 왼쪽 메뉴바에 엔티티 추가 버튼 누르고 빈 영역에 클릭하면 엔티티 생성

  • 키 생성 버튼과 필드 생성 버튼을 한번씩 누르면 다음과 같은 테이블이 완성!

  • 예시로 완성된 회원정보와 게시글 테이블

→ 시간상의 이유로 회원정보의 id, 게시글의 id만 필수적으로 생성해보기!

ERD 관계 맺기

  • 위 회원정보와 게시글 테이블 관계 맺기
  • 하나의 회원은 여러개의 게시글 작성 가능, 회원은 게시글을 하나도 작성하지 않을 수 있음
  • 게시글은 한명의 회원만이 게시글을 쓸 수 있음, 반드시 회원 정보를 가지고 있어야 함
  • ⇒ 회원정보(1) : 게시글(N)

따라서 왼쪽 사이드 메뉴에서 알맞는 아이콘 클릭 후 회원정보 테이블, 게시글 테이블을 순서대로 클릭

  • Non-Identifying Relationship클릭 - 외래키가 자식 테이블의 기본키이지 않음 게시글 테이블에서 user_id는 외래키지만 기본키는 아님

  • 자동으로 외래키 레코드 삽입

  • 마지막으로 내보내기를 통해 쿼리문 추출도 가능

🥳 끝!! 모두 수고 많으셨습니당 ~~🦁

0개의 댓글