Database2
DataBase2
Intro
- 1960년대 부터 폭발적으로 늘어나는 데이터를 처리 할 방법에 대한 고민이 시작됩니다.
- 1970년 에드가 프랭크 테드가 포는 관계형 데이터 베이스를 고안해 냅니다.
- 지금까지 관계형 데이터 베이스는 절대 강자로 군림하고 있습니다.
- 관계형 데이터 베이스를 통해 표로 정리 할 수 있으며, 빠르게 데이터를 searching 할 수도 있게 됩니다.
- MySQL, Oracle, SQL Server, DB2, Access 모두 이와 같은 관계형 데이터 베이스에서 만들어진 기술들입니다.
- 여기에서 세손가락안에 들어가는 마법의 케비닛인 MySQL을 배워 보도록 합시다.
데이터베이스의 목적
- 스프레드 시트 VS MySQL
- 스프레드 시트는 GUI로 우리가 어떤 데이터를 Sorting하거나 추출하려고 할때 클릭을 이용해서 편리하게 가져 올 수 있습니다.
- MySQL은 데이터베이스를 코딩을 통해서 데이터를 가져오게 됩니다.
- 예를들어 웹사이트에 특정 정보를 제공하는 경우 데이터 베이스를 통해 모두가 동일한 결과물을 확인할 수 있게 됩니다.
MySQL
- 데이터 베이스(= 스키마)
- 표들의 묶음
- 연관된 표들의 묶음
- 데이터베이스 서버
- 스키마들의 묶음
- 권한의 제한
- 특정 권한(읽기, 쓰기)을 제한적으로 제공 할 수 있다.
- ./mysql -uroot -p를 터미널에 적고 인스톨시에 제공되는 비밀번호를 입력하면됩니다.
- 스키마 만들기
- 데이터베이스 만들기: CREATE DATABASE 데이터베이스이름
- 데이터베이스 지우기: DROP DATABASE 데이터베이스이름
- 데이터베이스 보기: SHOW DATABASES
- 사용 순서
- 사용하기전 MySQL에게 사용함을 알리기: USE 데이터베이스이름
- 데이터 베이스(= 스키마)
- SQL (Structured Query Language)
- Structured
- 표로 만들어서 정리 정돈한다는 의미입니다.
- Query
- 데이터베이스에게 표를 만들고, 수정하고, 삭제하고는 등의 요청을 말합니다.
- Language
- 데이터베이스도 이해하고 개발자도 이해할 수 있는 언어라는 말입니다.
- 종합
- 사람이 SQL이라는 언어를 통해서 MySQL Server에게 표와 같은 구조화된 데이터를 만들고, 수정하고, 삭제하는등의 요청을 위한 언어라고 생각시면 됩니다.
- 특징
- 쉽습니다.
- 중요합니다.
- 사용되는 용어 정리
- table, 표
- row, record, 행
- column, 열
- table, 표
- Structured
표 만들기
- 테이블에 대한 cheatSheet를 참조하게 되면 쉽게 SQL과 관련된 Syntax를 배울 수 있습니다.
- 통상 스프레드시트와 같은 경우 하나의 column(열)에 다른 데이터 타입을 넣을 수 있지만 SQL에서는 하나의 데이터 타입으로 강제 할 수 있습니다. 이것을 통해 우리게 얻게 되는 장점은 꺼낼때 어떠한 데이터를 가져오게 될지에 대해서 신경 쓸 필요가 없게 되는 것입니다.
그렇다면 질문
- 각 열을 어떠한 데이터 타입으로 강제 해야 할 것인가?
- 우리가 저장하게 될 데이터의 종류 중에서 최대치 또는 최소치를 커버할 수 있는 데이터 타입으로 정하는 것이 타당해 보입니다.
MySQL 데이터 타입 정리가 잘 된 사이트 입니다. https://www.techonthenet.com/mysql/datatypes.php
테이블 열 구성하기
CREATE TABLE 테이블이름( id INT(11) NOT NULL AUTO_INCREMENT, title VARCHAR(100) NOT NULL, description TEXT NULL, created DATETIME NOT NULL, author VARCHAR(30) NULL, profile VARCHAR(100) NULL, PRIMARY KEY(id) <- id가 main키야! 기억해
- id값을 사용하는 이유
- 성능에 대해서는 나중에..
- 중복: 개별 데이터에 유일한 ID를 제공함으로해서 데이터를 다루는데 있어 매우 유리하게 됩니다.
Create Read Update Delete
- 모든 데이터 베이스가 가지고 있는 4가지 주요한 기능 입니다.
- Create, Read는 데이터에서 가장 중요한 꽃입니다.
어떤 데이터에서는 수정과 삭제를 죄악시 하기도 합니다.(종범 실록, 다스 장부)
INSERT
INSERT INTO 테이블이름 (컬럼이름1, 컬럼이름2, 컬럼이름3, ... ) VALUES(컬럼값1, 컬럼값2, 컬럼값3, ...);
통상 우리가 저장해 놓은 테이블의 형태를 까먹는 경우가 많습니다.(적어도 저는... 또륵) 우리가 저장한 테이블의 형태를 알기 위해서는 DESC(Description이겠지요?) 테이블 이름을 적어 주면 됩니다.
DESC 테이블이름;
READ
SELECT * FROM 테이블이름;
구체적으로 가져오고자 하는 정보를 말하지 않는다면 우리는 모든 정보를 가져오게 됩니다.
SELECT id,title,created,author FROM 테이블이름;
SELECT와 FROM 사이에 입력한 PROJECTION(컬럼이름)에 해당하는 값들만 가져오게 됩니다.
SELECT id,title,created,author FROM 테이블이름 WHERE author='PACMAN';
SELECT와 FROM 사이에 입력한 PROJECTION(컬럼이름)에 해당하는 값들 중에서 author의 값이 PACMAN인 row만 가져옵니다.
SELECT id,title,created,author FROM 테이블이름 WHERE author='PACMAN' ORDER BY id DESC;
SELECT와 FROM 사이에 입력한 PROJECTION(컬럼이름)에 해당하는 값들 중에서 author의 값이 PACMAN이며 정렬 순서는 내림차순으로 정렬됩니다.
SELECT id,title,created,author FROM 테이블이름 WHERE author='PACMAN' ORDER BY id DESC LIMIT 2;
엄청나게 많은 데이터가 저장되어 있는 경우 예를 들어 1억, 10억개... 한꺼번에 데이터를 가져오게 된다면 우리의 컴퓨터는 감당할 수 없을 것입니다. 이것을 예방하기 위해 우리는 limit을 걸 수 있습니다.
UPDATE
UPDATE userInfo SET description='Oracle is ...', title='Oracle' WHERE id=2;
특정 위치에 있는 정보를 바꿀 수도 있습니다. 여기서 반드시 기억하셔야 할 것은 WHERE문입니다. 만약 특정 위치를 정해 주지 않는다면 SET 뒤에 명시한 컬럼의 정보들이 모두 입력한 정보로 바뀌게 되기 때문입니다.
DELETE
DELETE FROM userInfo WHERE id = 5;
특정 위치에 있는 정보를 삭제 하고 싶을 때 사용하면 됩니다. 여기서 중요한 것은 반드시 어느 위치의 정보를 삭제할 것이고 해당 위치를 구분 할 수 있는 유일한 값에 대한 정보를 함께 제공해 줘야 한다는 것입니다.
수업의 정상
- Relational(혁신) Database(본질 = Create Read Update Delete)
관계형 데이터베이스
- 왜 이것을 사용하는가?
- 기분 좋은 상상을 해봅시다. 여러분이 만든 서비스를 매우 많은 사람들이 이용하게 되었고, 유저의 정보량이 1억개이며 여기에서 1000만개 이상이 중복되는 정보라고 생각해봅시다. 중복된 정보는 제거 되어야 할 것인데 이것을 관계형 데이터로 바꿔 놓는다면 우리는 이와 같은 작업을 쉽고 빠르게 해낼 수 있습니다.
- 장점
- 유지보수의 편의성이 있습니다.
- 예를 들어서, author의 이름을 관계형 데이터 베이스로 만들어 놓고 author_id 제공을 통해 참조하게 한다면, 참조된 값과 연결되어 있는 author의 값이 들어 있는 테이블만 변형 시키면 모든 테이블에 동시에 적용됨으로 아주 편리합니다. 그렇지 않다면.. 우리가 하나하나 다 바꿔야 겠지요(재앙).
- 동일한 정보를 가지고 있는 사람을 구분 할 수 있게 됩니다.
- 단점
- 표에 참조값만 있는 경우 해당 참조값이 내포하고 있는 정보를 파악하기 위해 다른 표를 봐야 하는 번거로움이 생깁니다.
- 이러한 번거로움을 제거 하기 위해 우리는 JOIN을 사용하게 됩니다.
- 표에 참조값만 있는 경우 해당 참조값이 내포하고 있는 정보를 파악하기 위해 다른 표를 봐야 하는 번거로움이 생깁니다.
- JOIN
SELECT * FROM userInfo LEFT JOIN author ON userInfo.author_id = author.id;
- 다음과 같이 표현하게 되면 우리는 분리한 두개의 테이블을 하나의 테이블로 보여줄 수 있습니다.
- 출력시 author_id와 id가 겹쳐 보이는 모습을 보이게 되므로 특정 컬럼의 값만 가져오는 코드를 이용해 가져오도록 합니다.
SELECT userInfo.id, title, description, created, author, profile FROM userInfo LEFT JOIN author ON userInfo.author_id = author.id;
- 여기서 명시적으로 userInfo.id라고 말해주는 이유는 MySQL이 author 테이블에 있는 id와 구분하지 못하기 때문입니다.
SELECT userInfo.id AS USER_ID, title, description, created, name, profile FROM userInfo LEFT JOIN author ON userInfo.author_id = author.id;
- 여기서 첫번째 들어가는 userInfo.id를 USER_ID로 바꿔 줄 수도 있습니다.
- 여기서 관계형 데이터베이스는 JOIN과 함께 강력한 힘을 발휘하게 됩니다.
잠깐 관계형 데이터베이스는 테이블의 1:1 대응이 아니라 Many : Many의 대응이 가능하게 한다는 점이 인상적인입니다. 즉 테이블들 사이에서 서로 공유하고 있는 유일한 값인 ID를 통해서 하나의 테이블 정보가 바뀌게 되면 이를 참조하고 있는 모든 테이블내의 정보가 바뀌게 된다는 것이죠. 생각만해도 매우 강력한 기능입니다.
- 왜 이것을 사용하는가?