DB(Database)
- DB는 상이한 시스템에서 데이터를 공용하여 사용하기 위해 필요
- 겹친 데이터를 통합하여 관리해 정보를 구조적, 효율적으로 저장
- 한마디로
데이터의 집합
- 실생활의 대부분이 정보가 저장되고 관리됨
DBMS( Database Management System )
- 데이터베이스를 관리하고 운영하는 소프트웨어
- 여러명의 사용자나 응용프로그램과 공유하고 동시 접근 가능해야 함
- DBMS 종류
- 계층형 DBMS
- 망형 DBMS
- 관계형 DBMS
- RDBMS
- 테이블이라는 최소 단위로 구성되고, 테이블은 하나 이상의 열과 행으로 이뤄짐
SQL
- 데이터를 정해진 틀에 따라 테이블에 저장
- 장점
- 명확하게 정의된 스키마, 데이터 무결성 보장
- 관계는 각 데이터 중복업싱 한번만 저장
- 단점
- 덜 유연
- 데이터 스키마를 사전에 계획하고 알려야함 ( 수정 어려움 )
- 관계를 맺고 있으므로 조인문이 많은 쿼리 만들어질 수 있음
- 대체로 수직적 확장만 가능
- MySQL, PostgreSQL, Oracle ...
NoSQL
- SQL보다 데이터를 자유롭게 다양한 형태로 저장
- 정해진 구조나, 관계 없음
- 장점
- 스키마가 없어서 유연
- 데이터 조정, 새로운 필드 추가 가능
- 데이터 읽어오는 속도 빨라짐
- 수직, 수평 확장이 가능해서 읽기, 쓰기 요청 처리 가능
- 단점
- 유연성으로 인해 데이터 구조 결정 미루게 될 수 있음
- 데이터 중복을 계속 업데이트
- 여러 컬렉션에 중복되어 있기 때문에 수정시 모든 컬렉션 수행해야 함
( SQL은 중복 데이터가 없으므로 한번만 수행 )
DB Naming Convention
기본
- 소문자 사용
- 숫자 no
- 64자 미만
- prefix 사용 no
db 이름
table 이름
필드 이름 (컬럼명)
- 소문자
- 최대 2단어
- 단어 거꾸로 no
- 컬럼명과 테이블 이름 동일하게 no
- 외래키 사용
mysql -uroot -p
> 비밀번호 입력
SHOW DATABASES;
USE mysql;
SELECT DATABASE();
SELECT USER();
SELECT Host, `User` FROM USER;
DROP USER sparta@localhost;
CREATE USER 'sparta'@'localhost' identified BY '12345678';
set global validate_password.policy=LOW;
CREATE DATABASE cs_special_lecture;
SHOW DATABASES;
grant all privileges on cs_special_lecture.* to 'sparta'@'localhost';
FLUSH PRIVILEGES;
mysql -usparta -p12345678;
SELECT USER();
SELECT DATABASE();
USE cs_special_lecture;
CREATE TABLE city(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(50) NOT NULL
);
CREATE TABLE student(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(50) NOT NULL,
email varchar(50) UNIQUE,
english_grade int,
math_grade int,
city_id int,
FOREIGN KEY (city_id)
REFERENCES city(id) ON UPDATE CASCADE
)
INSERT INTO
city (name)
VALUES
('서울'),
('부산'),
('인천'),
('뉴욕'),
('도쿄')
INSERT INTO
student (name, email, english_grade, math_grade, city_id)
VALUES
("정영훈", "jyha@gmail.com" , 70, 70 , 1),
("이재관", "leejaekwan@naver.com", 70, 70 , 2),
("홍길동", "hjd@naver.com" , 80, NULL, 3),
("김민수", NULL , 90, 90 , 3),
("한동주", NULL , 90, 90 , 5),
("우태현", NULL , 70, 70 , 5)
SELECT * FROM student s;
SELECT name, email
FROM student s
WHERE email = "jyha@gmail.com";
SELECT name, email
FROM student s
WHERE email != "jyha@gmail.com";
SELECT name
FROM student s
WHERE email != NULL;
SELECT name
FROM student s
WHERE email is NULL;
SELECT *
FROM student s
WHERE email LIKE '%@naver%';
SELECT *
FROM student s
WHERE email LIKE '___@%';
DELETE FROM student
WHERE id = 6;
DELETE FROM student
INSERT INTO
student (name, email, english_grade, math_grade, city_id)
VALUES
("정영훈", "jyha@gmail.com" , 70, 70 , 1),
("이재관", "leejaekwan@naver.com", 70, 70 , 2),
("홍길동", "hjd@naver.com" , 80, NULL, 3),
("김민수", NULL , 90, 90 , 3),
("한동주", NULL , 90, 90 , 5),
("우태현", NULL , 70, 70 , 5)
SELECT
SUM(english_grade) AS total_english_grade,
SUM(math_grade) AS total_math_grade
FROM student s
SELECT
city_id,
SUM(english_grade) AS total_english_grade,
SUM(math_grade) AS total_math_grade
FROM student s
GROUP BY city_id
SELECT
city_id,
SUM(english_grade) AS total_english_grade,
SUM(math_grade) AS total_math_grade
FROM student s
GROUP BY city_id
HAVING city_id = 3
SELECT
AVG(english_grade) AS english_grade_avg,
AVG(math_grade) AS math_grade_avg,
SUM(math_grade) / COUNT(*) AS math_grade_avg
FROM student s
SELECT 390 / 5;
SELECT 390 / 6;
SELECT * FROM student s;
SELECT *
FROM student s
LEFT JOIN city c ON s.city_id = c.id;
mysqldump -uroot -p12345678 cs_special_lecture > cs_special_lecture.sql
mysql -uroot -p12345678 test < cs_special_lecture.sql
ERD (Entity-Relation Diagram: 개체 관계도)
- ER 모델(개체-관계 모델, Entity-Relationship Model)
- 1:1 / 1:n / n:m
ERD표준 기호