데이터베이스의 목적
스프레드시트 vs 관계형 데이터베이스
스프레드시트는 사용자가 메뉴를 클릭해서 데이터를 조작한다.
관계형 DB는 SQL이라는 컴퓨터 언어를 이용해서 데이터를 제어할 수 있다. 즉, 코드를 통해 데이터를 조작한다.
데이터베이스의 목적
- 전세계에 있는 누구나 웹사이트에 접속하면 데이터베이스에 있는 정보를 볼 수 있다.
- 사용자들이 웹사이트에 글을 써서 저장하면 직접 데이터베이스를 제어하지 않아도 그 글이 데이터베이스에 저장된다.
MySQL의 구조
- 표(table): 데이터를 기록하는 최종적인 곳. 스프레드시트와 비슷한 구조 // 글들을 저장하는 표, 댓글을 저장하는 표, 회원 정보를 저장하는 표 등등..
- 데이터베이스(database) = 스키마(schema): 서로 연관된 표들을 그룹핑하여 연관되어 있지 않은 표들과 분리하는 데 사용하는 폴더 같은 존재
- 데이터베이스 서버(database server): 스키마들이 저장되는 곳
MySQL 서버접속
데이터베이스의 효용
- 보안: 데이터베이스는 자체적인 보안 체계를 가지고 있기 때문에 안전하게 데이터를 보관할 수 있다.
- 권한: MySQL에 여러 사람을 등록하여 차등적인 권한을 부여할 수 있다. ex) A는 모든 테이블과 스키마에 대해 읽기, 쓰기, 수정, 삭제를 할 수 있는 반면, B는 읽기만 가능하게 설정
스키마의 사용
- 스키마(=데이터베이스) 생성: CREATE DATABASE opentutorials;
- 스키마(=데이터베이스) 삭제: DROP DATABASE opentutorials;
- 스키마(=데이터베이스) 확인: SHOW DATABASES;
- 스키마(=데이터베이스)를 사용하겠다고 하는 명령어: USE opentutorials;
mysql> CREATE DATABASE opentutorials;
Query OK, 1 row affected (0.01 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| opentutorials |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> USE opentutorials;
Database changed
SQL과 테이블의 구조
스키마(=데이터베이스)는 만들었고 이제 표(table)를 만들 차례!
SQL (Structured Query Language)
- Structured: 구조화 - 표를 작성하는 것. 정리정돈하는 것
- Query: 데이터베이스에게 질의하는 것
- Language: 데이터베이스와 개발자 모두 이해할 수 있는 공통의 약속(언어)를 사용하여 서버에 질의를 요청해야 함
SQL의 특징
- 쉽다 - HTML, SQL
- 중요하다
테이블의 구조
표(테이블)
- x축: 행(=row =record) - 데이터 하나 하나. 데이터 자체 // 여기서는 행이 2개
- y축: 열(=column) - 데이터의 타입(구조) // 여기서는 열이 4개
테이블의 생성
스프레드시트
id, title, description, created, author, profile - 컬럼(열)을 만들어보자!
데이터 타입(Data Type)
MySQL에서 테이블을 만들 때에는 필드별로 저장할 수 있는 데이터 타입을 명시해야 한다.
데이터베이스는 컬럼(열)의 데이터 타입을 제한할 수 있다.
※ 정수 타입
컬럼(열)을 생성하는 코드
mysql> CREATE TABLE topic(
-> 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));
Query OK, 0 rows affected, 1 warning (0.03 sec)
- (11) (100) 등: 괄호 안의 숫자는 몇 개까지 보여질지 노출 정도를 의미함
- NULL: 공백값 허용 ↔ NOT NULL: 공백 허용 안 함
- AUTO_INCREMENT: 열 추가시 자동으로 +1씩 숫자가 증가하게 하는 설정
- VARCHAR: 가변길이 문자열 타입. 타입의 크기만큼의 데이터가 들어오지 않더라도 이후의 공간을 스페이스로 채워넣지 않음
- VARCHAR(100): 100글자만 입력하도록 함. 100글자 이상 작성하면 초과된 문자는 잘림
- TEXT: VARCHAR보다 더 많은 문자열 수용
- DATETIME: 날짜와 시간을 모두 표현할 수 있음
- PRIMARY KEY( ): 중복되지 않는 고유의 값. 성능적인 측면 + 중복을 방지하는 측면에서 중요함
CRUD
데이터베이스에서 데이터를 다루는 4가지 방법
- Create(생성): 정보를 생성한다 - INSERT
- Read(조회): 정보를 읽는다 - SELECT
- Update(갱신): 기존의 정보를 수정한다 - UPDATE
- Delete(삭제): 기존의 정보를 삭제한다 - DELETE
1. INSERT
데이터를 생성하는 명령어
SHOW TABLES;
데이터베이스 안에 소속된 테이블의 목록을 불러옴
mysql> SHOW TABLES;
+-------------------------+
| Tables_in_opentutorials |
+-------------------------+
| topic |
+-------------------------+
1 row in set (0.01 sec)
DESC table_name;
특정 테이블에 어떤 칼럼이 있는지 구조를 조회하는 명령어 (Describe)
mysql> DESC topic;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| description | text | YES | | NULL | |
| created | datetime | NO | | NULL | |
| author | varchar(30) | YES | | NULL | |
| profile | varchar(100) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
INSERT
이미 생성된 테이블에 데이터를 삽입하는 명령어
mysql> INSERT INTO topic (title, description, created, author, profile)
VALUES('MySQL', 'MySQL is ...', NOW(), 'chaeeun', 'developer');
Query OK, 1 row affected (0.01 sec)
2. SELECT
데이터를 조회하는 명령어
모든 컬럼 조회
SELECT * FROM table_name;
※ 별표(*) : SQL에서 모든 것을 의미
5개의 데이터를 입력하고, topic에 있는 모든 행을 출력함
mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+---------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+---------+---------------------------+
| 1 | MySQL | MySQL is ... | 2024-01-09 14:07:17 | chaeeun | developer |
| 2 | ORACLE | ORACLE is | 2024-01-09 14:22:04 | chaeeun | developer |
| 3 | SQL Server | SQL Server is ... | 2024-01-09 14:24:06 | duru | data administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2024-01-09 14:24:48 | taeho | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2024-01-09 14:25:33 | chaeeun | developer |
+----+------------+-------------------+---------------------+---------+---------------------------+
5 rows in set (0.00 sec)
일부 컬럼만 조회
SELECT column1, column2, ⋯
FROM table_name;
mysql> SELECT id, title, created, author FROM topic;
+----+------------+---------------------+---------+
| id | title | created | author |
+----+------------+---------------------+---------+
| 1 | MySQL | 2024-01-09 14:07:17 | chaeeun |
| 2 | ORACLE | 2024-01-09 14:22:04 | chaeeun |
| 3 | SQL Server | 2024-01-09 14:24:06 | duru |
| 4 | PostgreSQL | 2024-01-09 14:24:48 | taeho |
| 5 | MongoDB | 2024-01-09 14:25:33 | chaeeun |
+----+------------+---------------------+---------+
5 rows in set (0.00 sec)
SELECT문에 조건 넣기
SELECT column1, column2
FROM table_name
WHERE conditions
mysql> SELECT id, title, created, author FROM topic WHERE author='chaeeun';
+----+---------+---------------------+---------+
| id | title | created | author |
+----+---------+---------------------+---------+
| 1 | MySQL | 2024-01-09 14:07:17 | chaeeun |
| 2 | ORACLE | 2024-01-09 14:22:04 | chaeeun |
| 5 | MongoDB | 2024-01-09 14:25:33 | chaeeun |
+----+---------+---------------------+---------+
3 rows in set (0.00 sec)
author의 값이 'chaeeun'인 열만 조회
정렬 기능
SELECT column1, column2
FROM table_name
WHERE conditions
ORDER BY column1 ASC | DESC
ASC(Ascending): 오름차순
DESC(Descending): 내림차순
mysql> SELECT id, title, created, author FROM topic WHERE author='chaeeun'
-> ORDER BY id DESC;
+----+---------+---------------------+---------+
| id | title | created | author |
+----+---------+---------------------+---------+
| 5 | MongoDB | 2024-01-09 14:25:33 | chaeeun |
| 2 | ORACLE | 2024-01-09 14:22:04 | chaeeun |
| 1 | MySQL | 2024-01-09 14:07:17 | chaeeun |
+----+---------+---------------------+---------+
3 rows in set (0.00 sec)
LIMIT
가져오고 싶은 행의 개수를 제한하는 명령어
SELECT column1, column2
FROM table_name
WHERE conditions
ORDER BY column1 ASC | DESC
LIMIT number_rows;
mysql> SELECT id, title, created, author FROM topic WHERE author='chaeeun'
-> ORDER BY id DESC LIMIT 2;
+----+---------+---------------------+---------+
| id | title | created | author |
+----+---------+---------------------+---------+
| 5 | MongoDB | 2024-01-09 14:25:33 | chaeeun |
| 2 | ORACLE | 2024-01-09 14:22:04 | chaeeun |
+----+---------+---------------------+---------+
2 rows in set (0.00 sec)
3. UPDATE
기존의 데이터를 수정하는 명령어
UPDATE table_name
SET column_1 = value_1, column_2 = value_2, ⋯
WHERE conditions
id값이 2인 행의 title: ORACLE → Oracle, description: ORACLE is → Oracle is ... 로 바꾸려고 함
mysql> SELECT * from topic;
+----+------------+-------------------+---------------------+---------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+---------+---------------------------+
| 1 | MySQL | MySQL is ... | 2024-01-09 14:07:17 | chaeeun | developer |
| 2 | ORACLE | ORACLE is | 2024-01-09 14:22:04 | chaeeun | developer |
| 3 | SQL Server | SQL Server is ... | 2024-01-09 14:24:06 | duru | data administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2024-01-09 14:24:48 | taeho | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2024-01-09 14:25:33 | chaeeun | developer |
+----+------------+-------------------+---------------------+---------+---------------------------+
5 rows in set (0.00 sec)
mysql> UPDATE topic SET title='Oracle', description='Oracle is ...' WHERE id = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * from topic;
+----+------------+-------------------+---------------------+---------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+---------+---------------------------+
| 1 | MySQL | MySQL is ... | 2024-01-09 14:07:17 | chaeeun | developer |
| 2 | Oracle | Oracle is ... | 2024-01-09 14:22:04 | chaeeun | developer |
| 3 | SQL Server | SQL Server is ... | 2024-01-09 14:24:06 | duru | data administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2024-01-09 14:24:48 | taeho | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2024-01-09 14:25:33 | chaeeun | developer |
+----+------------+-------------------+---------------------+---------+---------------------------+
5 rows in set (0.00 sec)
4. DELETE
기존의 행을 삭제하는 명령어
DELETE FROM table_name
WHERE conditions
mysql> SELECT * from topic;
+----+------------+-------------------+---------------------+---------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+---------+---------------------------+
| 1 | MySQL | MySQL is ... | 2024-01-09 14:07:17 | chaeeun | developer |
| 2 | Oracle | Oracle is ... | 2024-01-09 14:22:04 | chaeeun | developer |
| 3 | SQL Server | SQL Server is ... | 2024-01-09 14:24:06 | duru | data administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2024-01-09 14:24:48 | taeho | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2024-01-09 14:25:33 | chaeeun | developer |
+----+------------+-------------------+---------------------+---------+---------------------------+
5 rows in set (0.00 sec)
mysql> DELETE FROM topic WHERE id = 5;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * from topic;
+----+------------+-------------------+---------------------+---------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+---------+---------------------------+
| 1 | MySQL | MySQL is ... | 2024-01-09 14:07:17 | chaeeun | developer |
| 2 | Oracle | Oracle is ... | 2024-01-09 14:22:04 | chaeeun | developer |
| 3 | SQL Server | SQL Server is ... | 2024-01-09 14:24:06 | duru | data administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2024-01-09 14:24:48 | taeho | data scientist, developer |
+----+------------+-------------------+---------------------+---------+---------------------------+
4 rows in set (0.00 sec)