학습용 공간

DB/MySQL 2020.08.07 댓글 개 starmk95

MySQL)테이블에 데이터 추가하기, 보기 (INSERT, SELECT, UPDATE, DELETE)

SQL의 CRUD

 - Create, Read, Update, Delete

 

테이블은 만들어져 있다고 할 때, 아래와 같이 데이터를 추가해보자.

먼저 테이블이 어떤 형식으로 만들어져 있는지 확인한다. 

# DESC

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(15)  | YES  |     | NULL    |                |
| profile     | varchar(200) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

describe을 뜻하는 명령어 DESC를 통해 topic 테이블에 대한 정보를 확인한다.

 

# INSERT

mysql> INSERT INTO topic (title, description, created, author, profile) VALUES('MySQL', 'MySQL is ...', NOW(), 'Kim', 'developer');

MySQL을 title로 하는 데이터 1개를 추가하기 위해 위와 같은 명령어를 실행한다.

id는 auto_increment로 설정되어 있으므로 직접 추가하지 않아도 자동으로 오름차순으로 추가된다.

INSERT INTO 명령어를 통해 topic이라는 테이블의 각 열에 대해 VALUES에 들어가는 데이터들을 추가한다.

이때 NOW()는 datatime 형식인 created 열에 추가되는 데이터를 위한 함수인데, 데이터를 추가하는 시점의 날짜, 시각을 자동으로 입력해주는 기능을 한다. 

 

# SELECT

mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+--------+-----------+
| id | title      | description       | created             | author | profile   |
+----+------------+-------------------+---------------------+--------+-----------+
|  1 | MySQL      | MySQL is ...      | 2020-08-07 18:04:06 | Kim    | developer |
|  2 | Oracle     | Oracle is ...     | 2020-08-07 18:06:08 | Kim    | developer |
|  3 | SQL Server | SQL Server is ... | 2020-08-07 18:07:39 | Lee    | Developer |
|  4 | PostgreSQL | PostgreSQL is ... | 2020-08-07 18:08:36 | Lee    | Developer |
|  5 | MongoDB    | MongoDB is ...    | 2020-08-07 18:09:34 | Park   | student   |
+----+------------+-------------------+---------------------+--------+-----------+
5 rows in set (0.00 sec)

또한 SELECT * FROM 명령어를 통해 topic 테이블에 있는 데이터들을 모두 확인할 수 있다.

여기서 SELECT *은 모든 데이터를 선택한다는 것을 뜻하고 (*은 주로 모든 것을 포함하는 의미),

FROM topic은 topic 테이블에서 앞 명령어를 수행할 것이라는 의미를 갖는다.

/* SELECT 뒤에 원하는 열들의 이름을 넣는 것으로
열람하고 싶은 열들로 접근해서 해당 열들의 정보만 확인도 가능하다.*/
mysql> SELECT id, title, created, author FROM topic;
+----+------------+---------------------+--------+
| id | title      | created             | author |
+----+------------+---------------------+--------+
|  1 | MySQL      | 2020-08-07 18:04:06 | Kim    |
|  2 | Oracle     | 2020-08-07 18:06:08 | Kim    |
|  3 | SQL Server | 2020-08-07 18:07:39 | Lee    |
|  4 | PostgreSQL | 2020-08-07 18:08:36 | Lee    |
|  5 | MongoDB    | 2020-08-07 18:09:34 | Park   |
+----+------------+---------------------+--------+
5 rows in set (0.00 sec)

/* WHERE 명령어를 통해 특정 데이터에 해당하는 데이터들만 확인하는 것도 가능하다.
밑의 예시의 경우, author가 kim인 데이터들만 가져온다. */
mysql> SELECT id, title, created, author FROM topic WHERE author = 'kim';
+----+--------+---------------------+--------+
| id | title  | created             | author |
+----+--------+---------------------+--------+
|  1 | MySQL  | 2020-08-07 18:04:06 | Kim    |
|  2 | Oracle | 2020-08-07 18:06:08 | Kim    |
+----+--------+---------------------+--------+
2 rows in set (0.00 sec)

/* ORDER BY 명령어를 통해 데이터를 오름차순 또는 내림차순으로도 가져올 수 있다.
DESC는 descend의 약자로 내림차순으로 데이터를 가져온다.
ASC는 ascend의 약자로 오름차순으로 데이터를 가져오며 이가 default이다. */
mysql> SELECT id, title, created, author FROM topic WHERE author = 'kim' ORDER BY id DESC;
+----+--------+---------------------+--------+
| id | title  | created             | author |
+----+--------+---------------------+--------+
|  2 | Oracle | 2020-08-07 18:06:08 | Kim    |
|  1 | MySQL  | 2020-08-07 18:04:06 | Kim    |
+----+--------+---------------------+--------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM topic ORDER BY id DESC;
+----+------------+-------------------+---------------------+--------+-----------+
| id | title      | description       | created             | author | profile   |
+----+------------+-------------------+---------------------+--------+-----------+
|  5 | MongoDB    | MongoDB is ...    | 2020-08-07 18:09:34 | Park   | student   |
|  4 | PostgreSQL | PostgreSQL is ... | 2020-08-07 18:08:36 | Lee    | Developer |
|  3 | SQL Server | SQL Server is ... | 2020-08-07 18:07:39 | Lee    | Developer |
|  2 | Oracle     | Oracle is ...     | 2020-08-07 18:06:08 | Kim    | developer |
|  1 | MySQL      | MySQL is ...      | 2020-08-07 18:04:06 | Kim    | developer |
+----+------------+-------------------+---------------------+--------+-----------+
5 rows in set (0.00 sec)

/* LIMIT 명령어를 통해 해당 조건에 부합하는 데이터를 순서에 맞추어 일부만 가져오는 것도 가능하다.
아래의 예시는 해당 조건에 맞는 데이터를 1개만 가져오는 명령어이다. */
mysql> SELECT id, title, created, author FROM topic WHERE author = 'kim' ORDER BY id DESC LIMIT 1;
+----+--------+---------------------+--------+
| id | title  | created             | author |
+----+--------+---------------------+--------+
|  2 | Oracle | 2020-08-07 18:06:08 | Kim    |
+----+--------+---------------------+--------+
1 row in set (0.00 sec)

 

# UPDATE 

 

아래 예시는 topic 테이블에서 특정 데이터를 수정하는 예시이다.

이를 위해 UPDATE 명령어가 사용되었다.

mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+--------+-----------+
| id | title      | description       | created             | author | profile   |
+----+------------+-------------------+---------------------+--------+-----------+
|  1 | MySQL      | MySQL is ...      | 2020-08-07 18:04:06 | Kim    | developer |
|  2 | Oracle     | Oracle is ...     | 2020-08-07 18:06:08 | Kim    | developer |
|  3 | SQL Server | SQL Server is ... | 2020-08-07 18:07:39 | Lee    | Developer |
|  4 | PostgreSQL | PostgreSQL is ... | 2020-08-07 18:08:36 | Lee    | Developer |
|  5 | MongoDB    | MongoDB is ...    | 2020-08-07 18:09:34 | Park   | student   |
+----+------------+-------------------+---------------------+--------+-----------+
5 rows in set (0.00 sec)

위 테이블에서 author가 Park인 데이터를 Kim으로, 그리고 profile 또한 developer로 고쳐주려고 한다.

UPDATE topic SET author = 'Kim', profile = 'developer' WHERE id = 5;

topic 테이블의 데이터를 업데이트 하는데 id가 5인 데이터의 author를 'Kim', profile을 'developer'로 바꾼다는 것이다.

위 명령어에서 주의할 점은 바로 WHERE이다.

WHERE를 빠뜨리고 위 명령어를 실행하면 topic 테이블의 모든 데이터들이 SET으로 설정한 데이터로 모두 수정되기 때문이다. 

mysql> UPDATE topic SET author = 'Kim', profile = 'developer' WHERE id = 5;
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 ...      | 2020-08-07 18:04:06 | Kim    | developer |
|  2 | Oracle     | Oracle is ...     | 2020-08-07 18:06:08 | Kim    | developer |
|  3 | SQL Server | SQL Server is ... | 2020-08-07 18:07:39 | Lee    | Developer |
|  4 | PostgreSQL | PostgreSQL is ... | 2020-08-07 18:08:36 | Lee    | Developer |
|  5 | MongoDB    | MongoDB is ...    | 2020-08-07 18:09:34 | Kim    | developer |
+----+------------+-------------------+---------------------+--------+-----------+
5 rows in set (0.00 sec)

 

# DELETE

 

DELETE 명령어를 통해 테이블에서 특정 데이터를 지울 수 있다.

그러나 데이터를 삭제하는 것인만큼 신중하게 수행해야 한다.

 

id 6번 데이터로 지우기 위한 더미 데이터를 만들어서 INSERT해주었다.

해당 데이터를 지우는 명령어는

DELETE FROM topic WHERE id = 6;

으로 topic 테이블에서 id가 6인 데이터를 지우는 작업을 수행한다.

mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+--------+-----------+
| id | title      | description       | created             | author | profile   |
+----+------------+-------------------+---------------------+--------+-----------+
|  1 | MySQL      | MySQL is ...      | 2020-08-07 18:04:06 | Kim    | developer |
|  2 | Oracle     | Oracle is ...     | 2020-08-07 18:06:08 | Kim    | developer |
|  3 | SQL Server | SQL Server is ... | 2020-08-07 18:07:39 | Lee    | Developer |
|  4 | PostgreSQL | PostgreSQL is ... | 2020-08-07 18:08:36 | Lee    | Developer |
|  5 | MongoDB    | MongoDB is ...    | 2020-08-07 18:09:34 | Kim    | developer |
|  6 | temp       | Temp is null...   | 2020-08-07 19:07:11 | null   | null      |
+----+------------+-------------------+---------------------+--------+-----------+
6 rows in set (0.00 sec)

mysql> DELETE FROM topic WHERE id = 6;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+--------+-----------+
| id | title      | description       | created             | author | profile   |
+----+------------+-------------------+---------------------+--------+-----------+
|  1 | MySQL      | MySQL is ...      | 2020-08-07 18:04:06 | Kim    | developer |
|  2 | Oracle     | Oracle is ...     | 2020-08-07 18:06:08 | Kim    | developer |
|  3 | SQL Server | SQL Server is ... | 2020-08-07 18:07:39 | Lee    | Developer |
|  4 | PostgreSQL | PostgreSQL is ... | 2020-08-07 18:08:36 | Lee    | Developer |
|  5 | MongoDB    | MongoDB is ...    | 2020-08-07 18:09:34 | Kim    | developer |
+----+------------+-------------------+---------------------+--------+-----------+
5 rows in set (0.00 sec)