오늘은 부트캠프 30일차이다. 오늘은 알고리즘과 스프링 심화과정 수업을 듣고 클론코딩하듯이 따라 치면서 이해하려고 했으나, 시작하자마자 막혀버려서 어김없이 구글링을 하였다. 그러던 도중 팀원 분 한분이 포스트맨 이용해서 API 보는 법을 알려달라고 하셔서 내 생각을 잘 알려주었다 생각했다. 여기서 중요한 것이 누군가에게 가르쳐주었을 때 학습효과가 배로 된다는 것이 신기했다.
오늘 배운 것
1. 데이터베이스(Datebase, DB)
-데이터의 집합
-일상생활 대부분의 정보가 저장되고 관리된다.2. DBMS
-데이터베이스를 관리하고 운영하는 소프트웨어
3. DBMS의 분류
3-1. 계층형 DBMS
3-2. 망형 DBMS
3-3. 관계형 DBMS
-테이블이라는 최소 단위로 구성하며, 이 테이블은 열과 행으로 이루어져 있다.
4. SQL
-DBMS에서 사용하는 언어
-SQL이 데이터베이스를 조작하는 언어
-데이터를 액셀과 같이 정해진 틀(데이터 스키마)에 따라 테이블에 저장된다.4-1. 장점
-명확하게 정의된 스키마. 데이터 무결성 보장
-관계는 각 데이터를 중복없이 한번만 저장4-2. 단점
-덜 유연함, 데이터 스키마를 사전에 계획하고 알려야 함.
-관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음.
-대체로 수직적 확장만 가능함.4-3. 제품
-MySQL, PostgerSQL, Oracle 등
5. NoSQL
-SQL보다 데이터를 자유롭게 다양한 형태로 저장한다.
-5-1. 장점
-스키마가 없어서 유연함.
-언제든지 저장된 데이터를 조정하고 새로운 필드 추가 기능.
-데이터는 애플리케이션이 필요로 하는 형식으로 저장됨.
-데이터 읽어오는 속도 빨라짐.
-수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능.5-2. 단점
-유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음.
-데이터 중복을 계속 업데이트 해야 함.
-데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함.5-3. 제품
-Firestore, MongoDB, Redis 등
5-4. MySQL 관련
mysql 접속 (커맨드창)
mysql -uroot -p
비밀번호 입력데이터베이스 확인
SHOW DATABASES;
mysql 데이터 베이스
USE mysql;
선택된 데이터베이스 확인
SELECT DATABASE();
현재 유저 확인
SELECT USER();
user 테이블 살펴보기
SELECT Host,
User
FROM USER;sparta 계정 삭제 (sparta 계정 있을시)
DROP USER sparta@localhost;
사용자 추가
CREATE USER 'sparta'@'localhost' identified BY '12345678';
패스워드 정책 에러시(mysql8)
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;
유저 변경
유저 변경 (cli 환경에서 입력, dbeaver 에서는 Edit Connection 설정)
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;-- email이 jyha@gmail.com 인 학생 이름, 이메일 출력
SELECT name, email
FROM student s
WHERE email = "jyha@gmail.com";-- email이 jyha@gmail.com 이 아닌 학생들 이름, 이메일 출력
SELECT name, email
FROM student s
WHERE email != "jyha@gmail.com";-- email이 없는 학생들 이름만 출력(1)
SELECT name
FROM student s
WHERE email != NULL;-- email이 없는 학생들 이름만 출력(2)
SELECT name
FROM student s
WHERE email is NULL;-- email이 네이버 사용 하는 학생 모든 컬럼 출력 (MySQL Wildcards)
SELECT *
FROM student s
WHERE email LIKE '%@naver%';-- email컬럼에 @ 앞 글자가 3글자인 학생 모든 컬럼 출 (MySQL Wildcards)
SELECT *
FROM student s
WHERE email LIKE '___@%';-- 학생테이블 데이터 삭제
-- id가 6인 학생 데이터 삭제
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-- 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-- city_id그룹이 3 영어, 수학 점수 총점 출력
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 sSELECT 390 / 5;
SELECT 390 / 6;
-- LEFT JOIN
-- 학생 테이블에서 학생이 살고 있는 도시이름 출력
-- 도시 번호는 나오나 도시 이름이 출력 X
SELECT * FROM student s;-- LEFT JOIN 으로 student, city 테이블을 합쳐줌 조건은 student.city_id = city.id
SELECT *
FROM student s
LEFT JOIN city c ON s.city_id = c.id;-- DB DUMP (커맨드창에서)
mysqldump -uroot -p12345678 cs_special_lecture > cs_special_lecture.sql
-- DB RESTORE (커맨드창에서)
mysql -uroot -p12345678 test < cs_special_lecture.sql