RISK IT

[TIL6_23.1.14.] mySQL 데이터 추가/수정/삭제/조회 본문

IT/TIL

[TIL6_23.1.14.] mySQL 데이터 추가/수정/삭제/조회

nomoremystery 2023. 1. 14. 19:30
반응형

데이터 추가/수정/삭제

DML(Data Manipulation Language): 데이터를 조작하는 쿼리문

  • INSERT, UPDATE, DELETE문이 대표적인 쿼리문

실습 예시

✍️ 입력

mysql> SHOW DATABASES;

💻 출력

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westagram          |
+--------------------+
5 rows in set (0.01 sec)

✍️ 입력

mysql> USE westagram;

💻 출력

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

✍️ 입력

mysql> SHOW TABLES;

💻 출력

+---------------------+
| Tables_in_westagram |
+---------------------+
| posts               |
| users               |
+---------------------+
2 rows in set (0.00 sec)

✍️ 입력

mysql> INSERT INTO users (name, email, password, age) VALUES ('Rebekah', 'Glover12345@gmail.com', 'password', 31)
    -> ;

// users 테이블에 데이터 추가

💻 출력

Query OK, 1 row affected (0.00 sec)

✍️ 입력

mysql> SELECT * FROM users;

// users 테이블의 모든(*) 데이터 보기

💻 출력

+----+---------+-----------------------+----------+---------------------+------------+-----+
| id | name    | email                 | password | created_at          | updated_at | age |
+----+---------+-----------------------+----------+---------------------+------------+-----+
|  1 | Rebekah | Glover12345@gmail.com | password | 2023-01-14 16:32:55 | NULL       |  31 |
+----+---------+-----------------------+----------+---------------------+------------+-----+
1 row in set (0.01 sec)

// 방금 추가한 데이터가 추가된 모습 확인

✍️ 입력

mysql> INSERT INTO users (name, email, password, age) VALUES ('Fabian','Connell12345@gmail.com','password',31)
    -> ;

💻 출력

Query OK, 1 row affected (0.01 sec)

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+----------+---------------------+------------+-----+
| id | name    | email                  | password | created_at          | updated_at | age |
+----+---------+------------------------+----------+---------------------+------------+-----+
|  1 | Rebekah | Glover12345@gmail.com  | password | 2023-01-14 16:32:55 | NULL       |  31 |
|  2 | Fabian  | Connell12345@gmail.com | password | 2023-01-14 16:34:42 | NULL       |  31 |
+----+---------+------------------------+----------+---------------------+------------+-----+
2 rows in set (0.00 sec)

✍️ 입력

mysql> INSERT INTO users (name, email, password, age) VALUES ('Elenor','Skiles12345@gmail.com','password2',20), ('Madge','Quitzon12345@gmail.com','password3',25),('Zelma','Kozey12345@email.com','password4',42)
    -> ;

// 데이터 한 번에 여러개 추가하는 방법

💻 출력

Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+------------+-----+
| id | name    | email                  | password  | created_at          | updated_at | age |
+----+---------+------------------------+-----------+---------------------+------------+-----+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | NULL       |  31 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL       |  31 |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL       |  20 |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL       |  25 |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL       |  42 |
+----+---------+------------------------+-----------+---------------------+------------+-----+
5 rows in set (0.00 sec)

✍️ 입력

mysql> DESC posts;

💻 출력

+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment              |
| title      | varchar(100) | NO   |     | NULL              |                             |
| content    | text         | YES  |     | NULL              |                             |
| user_id    | int          | NO   | MUL | NULL              |                             |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp    | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

✍️ 입력

mysql> INSERT INTO posts (title,content,user_id) VALUES ('위코드 1일차','HTML과 CSS 익숙해지기', 1), ('위코드 2일차','Javascript 기본 문법 학습..',1), ('위코드 3일차','웹서비스의 역사와 발전 세션을 듣고..',1),('자료구조 1번', 'BigO Notation이란 무엇 인가?',2), ('자료구조 2번','시간 복잡도와 공간 복잡도에 대해서..',2),('프론트 개발 입문', '프론트 입문 HTML이란 무엇인가?',3)
    -> ;

// posts 테이블에도 데이터 추가

💻 출력

Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> SELECT * FROM posts;

💻 출력

+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
| id | title                | content                                             | user_id | created_at          | updated_at |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
|  1 | 위코드 1일차         | HTML과 CSS 익숙해지기                               |       1 | 2023-01-14 16:44:03 | NULL       |
|  2 | 위코드 2일차         | Javascript 기본 문법 학습..                         |       1 | 2023-01-14 16:44:03 | NULL       |
|  3 | 위코드 3일차         | 웹서비스의 역사와 발전 세션을 듣고..                |       1 | 2023-01-14 16:44:03 | NULL       |
|  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
6 rows in set (0.01 sec)

✍️ 입력

mysql> SELECT * FROM posts;

💻 출력

+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
| id | title                | content                                             | user_id | created_at          | updated_at |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
|  1 | 위코드 1일차         | HTML과 CSS 익숙해지기                               |       1 | 2023-01-14 16:44:03 | NULL       |
|  2 | 위코드 2일차         | Javascript 기본 문법 학습..                         |       1 | 2023-01-14 16:44:03 | NULL       |
|  3 | 위코드 3일차         | 웹서비스의 역사와 발전 세션을 듣고..                |       1 | 2023-01-14 16:44:03 | NULL       |
|  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
6 rows in set (0.00 sec)

✍️ 입력

mysql> UPDATE posts SET content='위코드 3개월 과정을 시작하며...' WHERE user_id=1 AND id=1;

// posts 테이블에서 user_id=1, id=1인 row의 content를 다음과 같이 수정

💻 출력

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> SELECT * FROM posts;

💻 출력

+----+----------------------+-----------------------------------------------------+---------+---------------------+---------------------+
| id | title                | content                                             | user_id | created_at          | updated_at          |
+----+----------------------+-----------------------------------------------------+---------+---------------------+---------------------+
|  1 | 위코드 1일차         | 위코드 3개월 과정을 시작하며...                     |       1 | 2023-01-14 16:44:03 | 2023-01-14 16:47:46 |
|  2 | 위코드 2일차         | Javascript 기본 문법 학습..                         |       1 | 2023-01-14 16:44:03 | NULL                |
|  3 | 위코드 3일차         | 웹서비스의 역사와 발전 세션을 듣고..                |       1 | 2023-01-14 16:44:03 | NULL                |
|  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL                |
|  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL                |
|  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL                |
+----+----------------------+-----------------------------------------------------+---------+---------------------+---------------------+
6 rows in set (0.00 sec)

// 수정된 내용 확인

✍️ 입력

mysql> DELETE FROM posts WHERE user_id = 1;

// posts 테이블에서 user_id = 1인 row 모두 삭제

💻 출력

Query OK, 3 rows affected (0.00 sec)

✍️ 입력

mysql> SELECT * FROM posts;

💻 출력

+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
| id | title                | content                                             | user_id | created_at          | updated_at |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
|  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
3 rows in set (0.00 sec)

// 삭제된 내용 확인

데이터 검색 / 조회

DQL(Data Query Language): 데이터를 쿼리(조회)하는데 사용되는 SQL문

  • 대표적으로 SELECT문이 있음
  • JOIN을 통한 테이블 결합
  • WHERE, LIKE로 조건을 주어서 데이터를 쿼리하기

실습 예시

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+------------+-----+
| id | name    | email                  | password  | created_at          | updated_at | age |
+----+---------+------------------------+-----------+---------------------+------------+-----+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | NULL       |  31 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL       |  31 |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL       |  20 |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL       |  25 |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL       |  42 |
+----+---------+------------------------+-----------+---------------------+------------+-----+
5 rows in set (0.01 sec)

✍️ 입력

mysql> SELECT * FROM posts;

💻 출력

+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
| id | title                | content                                             | user_id | created_at          | updated_at |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
|  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
3 rows in set (0.00 sec)

✍️ 입력

mysql> SELECT * FROM users, posts;

// 곱집합

💻 출력

+----+---------+------------------------+-----------+---------------------+------------+-----+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
| id | name    | email                  | password  | created_at          | updated_at | age | id | title                | content                                             | user_id | created_at          | updated_at |
+----+---------+------------------------+-----------+---------------------+------------+-----+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | NULL       |  31 |  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | NULL       |  31 |  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | NULL       |  31 |  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL       |  31 |  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL       |  31 |  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL       |  31 |  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL       |  20 |  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL       |  20 |  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL       |  20 |  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL       |  25 |  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL       |  25 |  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL       |  25 |  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL       |  42 |  6 | 프론 개발 입문       | 프론트 입문 HTML이란 무엇인가?                      |       3 | 2023-01-14 16:44:03 | NULL       |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL       |  42 |  5 | 자료구조 2번         | 시간 복잡도와 공간 복잡도에 대해서..                |       2 | 2023-01-14 16:44:03 | NULL       |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL       |  42 |  4 | 자료구조 1번         | BigO Notation이란 무엇인가?                         |       2 | 2023-01-14 16:44:03 | NULL       |
+----+---------+------------------------+-----------+---------------------+------------+-----+----+----------------------+-----------------------------------------------------+---------+---------------------+------------+
15 rows in set (0.00 sec)

// 곱집합 출력 결과

✍️ 입력

mysql> SELECT u.id, u.name, p.id, p.title, p.user_id FROM users u, posts p;

// alias를 활용하여 users를 u, posts를 p로 간략하게 표현
// 전체 column 대신 user.id, user.name, post.id, post.title, post.user_id column만 출력

💻 출력

+----+---------+----+----------------------+---------+
| id | name    | id | title                | user_id |
+----+---------+----+----------------------+---------+
|  1 | Rebekah |  6 | 프론 개발 입문       |       3 |
|  1 | Rebekah |  5 | 자료구조 2번         |       2 |
|  1 | Rebekah |  4 | 자료구조 1번         |       2 |
|  2 | Fabian  |  6 | 프론 개발 입문       |       3 |
|  2 | Fabian  |  5 | 자료구조 2번         |       2 |
|  2 | Fabian  |  4 | 자료구조 1번         |       2 |
|  3 | Elenor  |  6 | 프론 개발 입문       |       3 |
|  3 | Elenor  |  5 | 자료구조 2번         |       2 |
|  3 | Elenor  |  4 | 자료구조 1번         |       2 |
|  4 | Madge   |  6 | 프론 개발 입문       |       3 |
|  4 | Madge   |  5 | 자료구조 2번         |       2 |
|  4 | Madge   |  4 | 자료구조 1번         |       2 |
|  5 | Zelma   |  6 | 프론 개발 입문       |       3 |
|  5 | Zelma   |  5 | 자료구조 2번         |       2 |
|  5 | Zelma   |  4 | 자료구조 1번         |       2 |
+----+---------+----+----------------------+---------+
15 rows in set (0.00 sec)

✍️ 입력

mysql> SELECT u.id, u.name, p.id, p.title, p.user_id FROM users u, posts p WHERE u.id = p.user_id;

// WHERE 키워드로 조건을 주어 해당 조건 결과값만 출력

💻 출력

+----+--------+----+----------------------+---------+
| id | name   | id | title                | user_id |
+----+--------+----+----------------------+---------+
|  2 | Fabian |  4 | 자료구조 1번         |       2 |
|  2 | Fabian |  5 | 자료구조 2번         |       2 |
|  3 | Elenor |  6 | 프론 개발 입문       |       3 |
+----+--------+----+----------------------+---------+
3 rows in set (0.00 sec)

✍️ 입력

mysql> SELECT u.id, u.name, p.id, p.title, p.user_id FROM users u INNER JOIN posts p ON u.id = p.user_id;

// 위와 같은 결과를 INNER JOIN을 사용하여 출력

💻 출력

+----+--------+----+----------------------+---------+
| id | name   | id | title                | user_id |
+----+--------+----+----------------------+---------+
|  2 | Fabian |  4 | 자료구조 1번         |       2 |
|  2 | Fabian |  5 | 자료구조 2번         |       2 |
|  3 | Elenor |  6 | 프론 개발 입문       |       3 |
+----+--------+----+----------------------+---------+
3 rows in set (0.00 sec)

✍️ 입력

mysql> CREATE TABLE jobs (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> job VARCHAR(50) NOT NULL,
    -> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -> updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
    -> PRIMARY KEY(id)
    -> );

// OUTER JOIN을 적용해보기 위하여 새로운 테이블 생성

💻 출력

Query OK, 0 rows affected (0.01 sec)

✍️ 입력

mysql> INSERT INTO jobs(job) VALUES ('개발자'),('경찰'),('소방관'),('교사'),('건축가')
    -> ;

💻 출력

Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> SELECT * FROM jobs;

💻 출력

+----+-----------+---------------------+------------+
| id | job       | created_at          | updated_at |
+----+-----------+---------------------+------------+
|  1 | 개발자    | 2023-01-14 17:22:55 | NULL       |
|  2 | 경찰      | 2023-01-14 17:22:55 | NULL       |
|  3 | 소방관    | 2023-01-14 17:22:55 | NULL       |
|  4 | 교사      | 2023-01-14 17:22:55 | NULL       |
|  5 | 건축가    | 2023-01-14 17:22:55 | NULL       |
+----+-----------+---------------------+------------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> DESC users;

💻 출력

+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment              |
| name       | varchar(50)  | NO   |     | NULL              |                             |
| email      | varchar(200) | NO   |     | NULL              |                             |
| password   | varchar(200) | NO   |     | NULL              |                             |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp    | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
| age        | int          | NO   |     | NULL              |                             |
+------------+--------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.01 sec)

✍️ 입력

mysql> ALTER TABLE users ADD COLUMN job_id INT NULL;

// users 테이블에 job_id column 추가

💻 출력

Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> DESC users;

💻 출력

+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment              |
| name       | varchar(50)  | NO   |     | NULL              |                             |
| email      | varchar(200) | NO   |     | NULL              |                             |
| password   | varchar(200) | NO   |     | NULL              |                             |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp    | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
| age        | int          | NO   |     | NULL              |                             |
| job_id     | int          | YES  |     | NULL              |                             |
+------------+--------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.00 sec)

✍️ 입력

mysql> ALTER TABLE users ADD CONSTRAINT users_job_id_fkey FOREIGN KEY (job_id) REFERENCES jobs(id);

// users 테이블의 job_id column에 jobs(id) Foreign Key 적용

💻 출력

Query OK, 5 rows affected (0.02 sec)
Records: 5  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> DESC users;

💻 출력

+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment              |
| name       | varchar(50)  | NO   |     | NULL              |                             |
| email      | varchar(200) | NO   |     | NULL              |                             |
| password   | varchar(200) | NO   |     | NULL              |                             |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp    | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
| age        | int          | NO   |     | NULL              |                             |
| job_id     | int          | YES  | MUL | NULL              |                             |
+------------+--------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.01 sec)

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+------------+-----+--------+
| id | name    | email                  | password  | created_at          | updated_at | age | job_id |
+----+---------+------------------------+-----------+---------------------+------------+-----+--------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | NULL       |  31 |   NULL |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL       |  31 |   NULL |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL       |  20 |   NULL |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL       |  25 |   NULL |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL       |  42 |   NULL |
+----+---------+------------------------+-----------+---------------------+------------+-----+--------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> UPDATE users SET job_id = 1 WHERE id = 1;

// users 테이블의 id = 1인 곳에 job_id = 1 추가

💻 출력

Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
| id | name    | email                  | password  | created_at          | updated_at          | age | job_id |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | 2023-01-14 17:27:23 |  31 |      1 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | NULL                |  31 |   NULL |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | NULL                |  20 |   NULL |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | NULL                |  25 |   NULL |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL                |  42 |   NULL |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> UPDATE users SET job_id = 1 WHERE id = 2;

// users 테이블의 id = 2인 곳에 job_id = 1 추가

💻 출력

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> UPDATE users SET job_id = 2 WHERE id = 3;

// users 테이블의 id = 3인 곳에 job_id = 2 추가

💻 출력

Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> UPDATE users SET job_id = 3 WHERE id = 4;

// users 테이블의 id = 4인 곳에 job_id = 3 추가

💻 출력

Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
| id | name    | email                  | password  | created_at          | updated_at          | age | job_id |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | 2023-01-14 17:27:23 |  31 |      1 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | 2023-01-14 17:28:04 |  31 |      1 |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | 2023-01-14 17:28:14 |  20 |      2 |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | 2023-01-14 17:28:22 |  25 |      3 |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | NULL                |  42 |   NULL |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> UPDATE users SET job_id = 3 WHERE id = 5;

// users 테이블의 id = 5인 곳에 job_id = 3 추가

💻 출력

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
| id | name    | email                  | password  | created_at          | updated_at          | age | job_id |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | 2023-01-14 17:27:23 |  31 |      1 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | 2023-01-14 17:28:04 |  31 |      1 |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | 2023-01-14 17:28:14 |  20 |      2 |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | 2023-01-14 17:28:22 |  25 |      3 |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | 2023-01-14 17:28:41 |  42 |      3 |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> SELECT u.id, u.name, u.job_id, j.id, j.job FROM users u INNER JOIN jobs j ON u.job_id = j.id;

// jobs 테이블의 id를 기준으로 users의 job_id와 jobs의 id가 같은 것을 inner join

💻 출력

+----+---------+--------+----+-----------+
| id | name    | job_id | id | job       |
+----+---------+--------+----+-----------+
|  1 | Rebekah |      1 |  1 | 개발자    |
|  2 | Fabian  |      1 |  1 | 개발자    |
|  3 | Elenor  |      2 |  2 | 경찰      |
|  4 | Madge   |      3 |  3 | 소방관    |
|  5 | Zelma   |      3 |  3 | 소방관    |
+----+---------+--------+----+-----------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
| id | name    | email                  | password  | created_at          | updated_at          | age | job_id |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | 2023-01-14 17:27:23 |  31 |      1 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | 2023-01-14 17:28:04 |  31 |      1 |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | 2023-01-14 17:28:14 |  20 |      2 |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | 2023-01-14 17:28:22 |  25 |      3 |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | 2023-01-14 17:28:41 |  42 |      3 |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
5 rows in set (0.00 sec)

✍️ 입력

mysql> UPDATE users SET job_id = NULL WHERE id = 5;

// users 테이블의 id=5인 row의 job_id를 NULL로 변경

💻 출력

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

✍️ 입력

mysql> SELECT * FROM users;

💻 출력

+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
| id | name    | email                  | password  | created_at          | updated_at          | age | job_id |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
|  1 | Rebekah | Glover12345@gmail.com  | password  | 2023-01-14 16:32:55 | 2023-01-14 17:27:23 |  31 |      1 |
|  2 | Fabian  | Connell12345@gmail.com | password  | 2023-01-14 16:34:42 | 2023-01-14 17:28:04 |  31 |      1 |
|  3 | Elenor  | Skiles12345@gmail.com  | password2 | 2023-01-14 16:37:27 | 2023-01-14 17:28:14 |  20 |      2 |
|  4 | Madge   | Quitzon12345@gmail.com | password3 | 2023-01-14 16:37:27 | 2023-01-14 17:28:22 |  25 |      3 |
|  5 | Zelma   | Kozey12345@email.com   | password4 | 2023-01-14 16:37:27 | 2023-01-14 17:32:51 |  42 |   NULL |
+----+---------+------------------------+-----------+---------------------+---------------------+-----+--------+
5 rows in set (0.01 sec)

✍️ 입력

mysql> SELECT u.id, u.name, u.job_id, j.id, j.job FROM users u INNER JOIN jobs j ON u.job_id = j.id;

// 다시 jobs 테이블의 id를 기준으로 inner join

💻 출력

+----+---------+--------+----+-----------+
| id | name    | job_id | id | job       |
+----+---------+--------+----+-----------+
|  1 | Rebekah |      1 |  1 | 개발자    |
|  2 | Fabian  |      1 |  1 | 개발자    |
|  3 | Elenor  |      2 |  2 | 경찰      |
|  4 | Madge   |      3 |  3 | 소방관    |
+----+---------+--------+----+-----------+
4 rows in set (0.00 sec)

// user id가 5인 row는 job_id가 NULL 이라서 출력되지 않음

✍️ 입력

mysql> SELECT u.id, u.name, u.job_id, j.id, j.job FROM users u LEFT OUTER JOIN jobs j ON u.job_id = j.id;

// 기준이되는 테이블 (left table)의 모든 row와 join이 걸리는 테이블(right table) 중에서 left table과 매칭되는 row만 검색
// 기준이 되는 테이블(left table) 쪽에만 존재하는 row는 전부 그대로 가져오면서, join이 걸리는 테이블에서 매칭되는 결과가 없는 경우 빈 값(NULL)로 표시
//따라서, 유저 이름과 직업을 결합하고 싶은데, 모든 유저를 그대로 유지하는 테이블을 만들 때 자주 사용

💻 출력

+----+---------+--------+------+-----------+
| id | name    | job_id | id   | job       |
+----+---------+--------+------+-----------+
|  1 | Rebekah |      1 |    1 | 개발자    |
|  2 | Fabian  |      1 |    1 | 개발자    |
|  3 | Elenor  |      2 |    2 | 경찰      |
|  4 | Madge   |      3 |    3 | 소방관    |
|  5 | Zelma   |   NULL | NULL | NULL      |
+----+---------+--------+------+-----------+
5 rows in set (0.01 sec)

✍️ 입력

mysql> SELECT u.id, u.name, u.job_id, j.id, j.job FROM users u RIGHT OUTER JOIN jobs j ON u.job_id = j.id;

// join이 걸리는 테이블(right table)의 모든 row와 기준이 되는 테이블 (left table)에서 right table과 matching되는 row만 검색하고, 매칭되는 데이터가 없는 경우 NULL을 표시

💻 출력

+------+---------+--------+----+-----------+
| id   | name    | job_id | id | job       |
+------+---------+--------+----+-----------+
|    1 | Rebekah |      1 |  1 | 개발자    |
|    2 | Fabian  |      1 |  1 | 개발자    |
|    3 | Elenor  |      2 |  2 | 경찰      |
|    4 | Madge   |      3 |  3 | 소방관    |
| NULL | NULL    |   NULL |  4 | 교사      |
| NULL | NULL    |   NULL |  5 | 건축가    |
+------+---------+--------+----+-----------+
6 rows in set (0.00 sec)

✍️ 입력

mysql> SELECT u.id, u.name, u.job_id, j.id, j.job FROM users u LEFT OUTER JOIN jobs j ON u.job_id = j.id UNION SELECT u.id, u.name, u.job_id, j.id, j.job FROM users u RIGHT OUTER JOIN jobs j ON u.job_id = j.id;

// LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 결합 방법으로 기준이 되는 테이블(left table)과 join이 걸리는 테이블(right table) 양쪽 모두의 row를 검색
// MySQL에서는 FULL OUTER JOIN과 같은 직접적인 키워드가 없기 때문에, 아래와 같이 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 UNION 하는 방식으로 FULL OUTER JOIN을 구현할 수 있음

💻 출력

+------+---------+--------+------+-----------+
| id   | name    | job_id | id   | job       |
+------+---------+--------+------+-----------+
|    1 | Rebekah |      1 |    1 | 개발자    |
|    2 | Fabian  |      1 |    1 | 개발자    |
|    3 | Elenor  |      2 |    2 | 경찰      |
|    4 | Madge   |      3 |    3 | 소방관    |
|    5 | Zelma   |   NULL | NULL | NULL      |
| NULL | NULL    |   NULL |    4 | 교사      |
| NULL | NULL    |   NULL |    5 | 건축가    |
+------+---------+--------+------+-----------+
7 rows in set (0.00 sec)
반응형