0. SQL 실행 순서
- FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
1. 관계형 데이터 베이스의 관계 두가지 특성
- 관계의 선택성 : 두 테이블간의 관계 설정 시 페어링 필수 여부, 관계의 중요성과 비슷한 의미
- 꼭 가져야 하는지? 안 가질 수 도 있는지?
- 관계의 기수성 : 두 테이블간의 관계 설정 시 참여 멤버수 표현, 관계의 다중성과 비슷한 의미
- 하나를 가질 수 있는지? 여러개를 가질 수 있는지?
1-1. 관계의 선택성(Optionality)
- Optional = O 표시
- Mandatory = | 표시
1-2. 관계의 기수성(Caridnality)
- One : 0 or 1 -> O 표시 / 정확히 1 : |
- Many : 0이상 -> O< 갈래표시 / 1이상 -> |< 갈래표시
2. 테이블 관계와 키
2-1. Primary Key (기본키)
- NOT NULL : 빈칸이 될 수 없음
- UNIQUE : 다른 Row와 중복될 수 없음. 단일 값
2-2. Foreign Key (외래키)
- 다른 테이블의 PK, UNIQUE 필드와 대응, 참조 관계를 표현하는 속성
3. 테이블 대표 관계
- 1대1 관계
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(25),
enabled BOOLEAN
);
CREATE TABLE addresses (
addr_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE, -- PRIMARY가 아니면 UNIQUE 사용.
street VARCHAR(30),
city VARCHAR(30),
state VARCHAR(30),
FOREIGN KEY(user_id) REFERENCES users (id) -- 외래키 선언
);
- 1대N 관계
CREATE TABLE book (
id INT AUTO_INCREMENT PRIMARY KEY,
book_name VARCHAR(25),
author VARCHAR(20),
content LONGTEXT
);
CREATE TABLE reviews (
reviews_id INT PRIMARY KEY,
book_id INT NOT NULL,
user_name VARCHAR(20),
content MEDIUMTEXT,
FOREIGN KEY(book_id) REFERENCES book (id)
);
- N대M 관계
CREATE TABLE users_book_purchase (
id INT AUTO_INCREMENT PRIMARY KEY,
book_id INT NOT NULL,
user_id INT NOT NULL,
purchase_date DATETIME,
price INT NOT NULL,
FOREIGN KEY(book_id) REFERENCES book (id),
FOREIGN KEY(user_id) REFERENCES users (id)
);
- 참조 무결성 : 데이터간 항상 일관된 값/관계가 유지되어야 한다.
1)FK가 참조하는 테이블 순서 안맞는 생성/삭제 실패
DROP TABLE book; //삭제 실패 -> 다른 테이블에서 참조하고 있기때문에
2) FK가 참조하는 값 없으면 INSERT 실패
INSERT INTO book(book_name, author, content)
VALUES ('백설공주', '그림형제','잘 살았습니다~~');
INSERT INTO users(user_name, enabled)
VALUES ('아이유', true);
-- 정상 실행 --
INSERT INTO users_book_purchase(book_id, user_id, purchase_date, price)
VALUES (1,1,'2023-07-07', 1000);
-- 실행되지 않음 --
INSERT INTO users_book_purchase(book_id, user_id, purchase_date, price)
VALUES (1,2,'2023-07-07', 1000); //user 테이블에 user_id가 1밖에 없음
1. MySQL JOIN
- 여러 테이블을 합쳐 하나의 테이블로 생성
- JOIN의 종류
2. Inner JOIN, Outer JOIN
- Inner JOIN : 두 테이블의 겹치는 부분을 리턴
SELECT *
FROM group_singer
INNER JOIN buy_history
ON group_singer.mem_id = buy_history.mem_id;
// 두 테이블의 모든 칼럼 출력
SELECT group_singer.mem_id, group_singer.mem_name,
buy_history.prod_name, buy_history.price
FROM group_singer
INNER JOIN buy_history
ON group_singer.mem_id = buy_history.mem_id;
// 조인 후 특정 몇개 칼럼만 출력
- Outer JOIN
SELECT * from group_singer g
left join buy_history b
on g.mem_id =b.mem_id ;
//buy_history에 없는 값은 null로 표시되어 출력
3. Other JOIN
- Self JOIN
SELECT E1.employee_id AS '사번', E1.employee_name AS '이름', E1.duty AS '직급',
E2.employee_name AS '상사 이름', E2.duty AS '상사 직급'
FROM employee E1
LEFT JOIN employee E2
ON E1.manager_id = E2.employee_id;
- CROSS JOIN
SELECT *
FROM group_singer G
CROSS JOIN buy_history;
SELECT COUNT(*)
FROM group_singer G
CROSS JOIN buy_history;
1. MySQL 제약조건 개요
- 제약조건이 필요한 이유 : 데이터의 무결성을 지키기 위해(중복값, null값 등 방지)
2. MySQL 대표, 기타 제약 조건
- 제약조건 선언 방식 : 인라인 제약조건, 외부 제약 조건, ALTER문 사용 제약 조건 선언
- NOT NULL : 해당 필드는 NULL이 될 수 없음
- UNIQUE : 해당 필드는 고유의 값을 가져야함. NULL은 가능
사진 설명을 입력하세요.
- PRIMARY KEY : 해당 필드는 UNIQUE & NOT NULL, 테이블에 하나만 가능
- FOREIGN KEY :
- CHECK : 해당 필드는 CHECK 조건문 통과 필수
- DEFAULT : 해당 필드가 NULL이면 기본값 입력되도록 자동 지정
3. MySQL 외래키 더 알아보기
#슈퍼코딩, #1:1관리형부트캠프, #백엔드, #backend, #백엔드공부, #개발공부, #백엔드개발자 #취준일기, #취준기록, #취뽀, #빡공, #HTML/CSS, #javascript, #react , #java, #spring