데이터베이스의 목적

스프레드시트 vs 관계형 데이터베이스

 

스프레드시트는 사용자가 메뉴를 클릭해서 데이터를 조작한다.

관계형 DBSQL이라는 컴퓨터 언어를 이용해서 데이터를 제어할 수 있다. 즉, 코드를 통해 데이터를 조작한다.

 

 

데이터베이스의 목적
  1. 전세계에 있는 누구나 웹사이트에 접속하면 데이터베이스에 있는 정보를 볼 수 있다.
  2. 사용자들이 웹사이트에 글을 써서 저장하면 직접 데이터베이스를 제어하지 않아도 그 글이 데이터베이스에 저장된다.

 


MySQL의 구조

  • 표(table): 데이터를 기록하는 최종적인 곳. 스프레드시트와 비슷한 구조 // 글들을 저장하는 표, 댓글을 저장하는 표, 회원 정보를 저장하는 표 등등..
  • 데이터베이스(database) = 스키마(schema): 서로 연관된 표들을 그룹핑하여 연관되어 있지 않은 표들과 분리하는 데 사용하는 폴더 같은 존재
  • 데이터베이스 서버(database server): 스키마들이 저장되는 곳

 


MySQL 서버접속

데이터베이스의 효용
  1. 보안: 데이터베이스는 자체적인 보안 체계를 가지고 있기 때문에 안전하게 데이터를 보관할 수 있다.
  2. 권한: 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의 특징
  1. 쉽다 - HTML, SQL
  2. 중요하다

 

테이블의 구조

표(테이블)

  • x축: 행(=row =record) - 데이터 하나 하나. 데이터 자체 // 여기서는 행이 2개
  • y축: 열(=column) - 데이터의 타입(구조) // 여기서는 열이 4개

 


테이블의 생성

스프레드시트

생성하고자 하는 테이블을 스프레드시트로 나타냄

 

id, title, description, created, author, profile - 컬럼(열)을 만들어보자!

create table in mysql cheat sheet

 

데이터 타입(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가지 방법

 

  1. Create(생성): 정보를 생성한다 - INSERT
  2. Read(조회): 정보를 읽는다 - SELECT
  3. Update(갱신): 기존의 정보를 수정한다 - UPDATE
  4. 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)

+ Recent posts