데이터 베이스
데이터를 체계적으로 저장하고 관리하는 시스템
DBMS는 이러한 데이터베이스를 관리하는 소프트웨어
정규화
데이터의 중복을 최소화하고 일관성을 유지하기 위한 데이터베이스 설계기법
이상 현상을 방지하여 데이터의 무결성 방지
-삽입이상: 불필요한 데이터 없이도 원하는 데이터를 삽입 할 수 있다
-삭제이상: 하나의 데이터 삭제로 인해 다른 중요한 데이터 손실되지 않아야 한다
-갱신이상: 데이터 변경시 모든 관련 데이터가 일관되게 업데이트 되어야 한다
1정규화: 데이터의 원자성 유지하기
모든 데이블의 필드가 원자값을 가지도록 보장
원자성: 하나의 칸(셀)에 하나의 값만 저장
2정규화: 부분 종속성 제거
복합 키를 사용하는 테이블에서 발생
부분 종속성 제거: 기본 키의 일부가 아닌 전체에 종속되도록 한다
학생: 수강 = 1:n 의 관계
3정규화:이행적 종속적 제거하기
즉, 기본키->A->B 형태의 종속성을 제거
이행적 종속성 제거: 기본 키가 아닌 컬럼이 다른 기본키가 아닌 컬럼을 결정하지 않도록 한다
BCNF:추가적인 중복성제거(3정규화보다 엄격)
4정규화: 다치 종속성 제거
다치 종속성 제거: 하나의 테이블에 여러 개의 다치 종속성 존재할때 이를 분리
다치 종속성: 한 키에 대해 여러 값이 독립적으로 존대
5정규화(5NF): 조합적 종속성 제거
모든 조합 가능한 종속성을 고려하여 분해
조합적 종속성 제거: 테이블을 가능한 분해 하여 데이터 중복을 최소화
정규화 요약
요약 및 한계
-1정규화: 모든 필드는 원자값을 가져야 한다
-2정규화: 부분적 종속성을 제거
-3정규화: 이행적 종속석을 제거
-BCNF: 모든 결정자가 후보키가 되도록 한다
-4정규화: 다치 종속성을제거
-5정규화: 조합적 종속성을 제거
실무에서의 비정규화 사례의 필요성
성능 향상을 위해 비정규화를 적용하기도 함
-JOIN 연산의 감소로 인한 조회 속도 향상
-데이터 중복을 허용해 캐싱 효율성 증가
비정규화는 신중하게 고려해서 적용해야함
SQL
SQL
관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 관리하고 조작하기 위한 표준 프로그래밍 언어
데이터의 정의, 데이터의 조작, 데이터 제어 등을 수행
관계형 데이터베이스
데이터를 테이블 형태로 저장하며, 테이블 간의 관계를 정의
ex)엑셀 시트와 비슷한 형태로 데이터를 저장하지만, 더 구조화된 관계를 정의할 수 있음
RDBMS 종류
MySQL,PostgreSQL, Oracle,SQL Server 등
데이터 정의 언어(DDL)
데이터 정의란? 테이블을 만든다
테이블-> 데이터를 저장하기 위한 틀= class의 뭉치
객체 인스턴스
DDL
데이터베이스의 구조를 변경할 댸 사용하는 언어
테이블만 바꾼다
데이터 조작언어(DML)
커멘트 엔터 누르니까 업데이트 sql
JOIN
두개 이상의 테이블을 연결하여 데이터를 조회하는 방법
관계형 데이터 베이스의 핵심 기능 중 하나
이너조인 = 둘다 있어야
레프트 조인= 왼쪽을 기준으로 값을 조회
- 예시: 학생 정보를 저장하는 students 테이블 생성
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
major VARCHAR(50)
);
🔹 테이블 수정하기
- 컬럼 추가
ALTER TABLE students ADD COLUMN email VARCHAR(100);
- 컬럼 삭제
ALTER TABLE students DROP COLUMN email;
- 주의: 테이블을 삭제하면 데이터도 함께 삭제됩니다.
DROP TABLE students;
- 문법
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);
- 예시
INSERT INTO students (student_id, name, age, major)
VALUES (1, '김철수', 20, '컴퓨터공학');
- 문법
SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명 WHERE 조건;
- 예시
SELECT * FROM students;
SELECT name, major FROM students WHERE age >= 20;
- 문법
UPDATE 테이블명 SET 컬럼명 = 값, ... WHERE 조건;
- 예시
UPDATE students SET age = 21 WHERE student_id = 1;
- 문법
DELETE FROM 테이블명 WHERE 조건;
- 예시
DELETE FROM students WHERE student_id = 1;
- 학생과 수강 과목 정보를 관리하는 시스템입니다.
- 학생 테이블
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50),
major VARCHAR(50)
);
- 과목 테이블
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100),
instructor VARCHAR(50)
);
- 수강 테이블
CREATE TABLE enrollment (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
- 학생 데이터
INSERT INTO students (student_id, name, major)
VALUES
(1, '김철수', '컴퓨터공학'),
(2, '이영희', '경영학'),
(3, '박민수', '전자공학');
- 과목 데이터
INSERT INTO courses (course_id, course_name, instructor)
VALUES
(101, '데이터베이스', '최교수'),
(102, '운영체제', '박교수'),
(103, 'Spring(JAVA)', '김교수');
- 수강 데이터
INSERT INTO enrollment (student_id, course_id)
VALUES
(1, 101),
(1, 102),
(2, 103),
(3, 101),
(3, 103);
- 학생별 수강 과목 조회
SELECT s.name AS 학생이름, c.course_name AS 과목명
FROM students s
INNER JOIN enrollment e ON s.student_id = e.student_id
INNER JOIN courses c ON e.course_id = c.course_id;
결과학생이름과목명

🔹 LEFT JOIN 예제
- 모든 학생의 수강 과목 조회 (수강하지 않은 학생도 포함)
SELECT s.name AS 학생이름, c.course_name AS 과목명
FROM students s
LEFT JOIN enrollment e ON s.student_id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id;
- 결과: 수강하지 않은 학생은 과목명이 NULL로 표시됩니다.
- 모든 과목의 수강 학생 조회 (수강한 학생이 없는 과목도 포함)
SELECT s.name AS 학생이름, c.course_name AS 과목명
FROM students s
RIGHT JOIN enrollment e ON s.student_id = e.student_id
RIGHT JOIN courses c ON e.course_id = c.course_id;
- 결과: 수강생이 없는 과목은 학생이름이 NULL로 표시됩니다.
- 모든 학생과 모든 과목의 조합 조회
SELECT s.name AS 학생이름, c.course_name AS 과목명
FROM students s
LEFT JOIN enrollment e ON s.student_id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id
UNION
SELECT s.name AS 학생이름, c.course_name AS 과목명
FROM students s
RIGHT JOIN enrollment e ON s.student_id = e.student_id
RIGHT JOIN courses c ON e.course_id = c.course_id;