[MySQL] TABLE 생성 및 데이터 입력(INSERT)

Bpius·2023년 11월 11일
0

MySQL

목록 보기
2/15
post-thumbnail

실습할 데이터를 project 라는 database를 생성하여 실습환경을 구축한 후 진행한다.

database를 생성할 시 'default character set utf8mb4'를 사용하여 생성하는데,
이유는 utf8은 다국어를 사용하겠다는 것이고 mb4는 이모지 문자도 사용할 것이기 때문이다.
database를 생성할 때 많이 사용하는 형태이다.

mysql> create database project default character set utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| project            | # 생성
| sakila             |
| sys                |
| world              |
+--------------------+

project 안에서 table을 생성하기 위해 database project를 사용한다.
항상 생성이나 삭제 등을 진행한 후 제대로 반영이 되었는지 확인해보자.

mysql> use project;
Database changed

TABLE

database 안에서 실제 데이터가 저장되는 형태로, 행(row)과 열(column)으로 구성된 데이터 모음이다.
엑셀이나 pandas.DataFrame, csv 등이 table 타입의 데이터들이다.
이런 table 타입의 데이터들이 서로 관계를 맺고 저장되어 있다.

table은 기본적으로 행과 열을 가진 구조를 가지기에, 어떤 열의 데이터들을 가지는지 명시해주어야 한다.
그래서 열의 이름과 열의 데이터 타입(숫자형, 문자형, 날짜형 등)을 명시해서 구조를 만든다.

기본적인 타입

  • int : 4byte 정수형 데이터(bigint : 8byte, smallint : 2byte, tinyint : 1byte) 정의
  • float(길이, 소수) : 4byte 부동 소수형 데이터 정의
  • varchar(n) : n개 문자 이하의 가변 크기 문자형(varchar(100)는 100이하의 문자 - 최대 65535byte) 정의
  • char(n) : 고정 크기 n개의 문자 데이터 형식(UTF-8 문자 인코딩 사용) 정의
  • date : 날짜 형태의 기간 표현 데이터 타입 정의(년, 월, 일)
  • time : 시간 형태의 기간 표현 데이터 타입 정의(시, 분, 초)
  • datetime : 날짜 + 시간 형태의 기간 표현 데이터 타입 정의
  • double(길이, 소수) : 8byte 부동 소수형 테이터 타입 정의 - 문자열로 저장

생성할 때 데이터 타입은

  • 타입은 작을수록 메모리, CPU 캐시에 더 적은 공간을 사용하고 더 빠르며 덜 소비한다.
  • 타입은 단순할수록 CPU 사이클로 덜 소비한다.
  • not null로 생성하자. 기본값이 null값 허용이며, null 허용 컬럼은 저장 공간도 많이 차지한다.

table는 크게 2단계를 거치는데 1단계는 table구조를 생성하는 것이고 2단계는 table구조에 맞게 실질적인 데이터를 입력하는 단계로 이루어진다.

1단계 : table구조 생성

table 생성

create table table_name(table 구조 작성)으로 생성한다.
컬럼과 컬럼의 타입은 '띄어쓰기'로, 컬럼과 컬럼 사이는 콜론(',')으로 구분한다.
정상적으로 생성이 되었다면 Query OK를 출력한다.

mysql> create table mytable
    -> (
    -> id int,
    -> name varchar(16)
    -> );
Query OK, 0 rows affected (0.03 sec)

table 리스트 보기

show tables;

database 안에 table을 생성하거나, 기존의 table들을 확인할 때는 database와 같이 명령어(쿼리)를 입력한다.

mysql> show tables;
+-------------------+
| Tables_in_project |
+-------------------+
| mytable           |
+-------------------+
1 row in set (0.01 sec)

table 정보 확인

desc table_name;

해당 table의 컬럼 이름과 컬럼 타입 등을 확인할 수 있다.

mysql> desc mytable;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       | # Default는 NULL값을 허용하는 것을 볼 수 있다.
| name  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

table 이름 변경

alter table table_name rename new_table_name;

정상적으로 처리되었으면 Query OK를 출력한다.

mysql> alter table mytable rename person;
Query OK, 0 rows affected (0.02 sec)

제대로 반영이 되었는지 확인해보자.

# 테이블 리스트 확인
mysql> show tables;
+-------------------+
| Tables_in_project |
+-------------------+
| person            |
+-------------------+
1 row in set (0.00 sec)

# 테이블 정보 확인
mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

table에 열(column) 추가

alter table table_name add column column_name column_datatype;

정상적으로 처리되었으면 Query OK를 출력한다.

mysql> alter table person add column agee double;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

제대로 반영이 되었는지 확인해보자.

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| agee  | double      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

table column 이름 변경

alter table table_name change collumn old_column_name new_column_name new_datatype;

명령어가 길다면 엔터키로 다음 줄로 바꾼 후 연속으로 진행하면 된다.
1줄에 모든 명령어를 치든 10줄에 명령어를 치든 같기에, 엔터는 사용자가 보기 편하게 사용하면 된다.

mysql> alter table person change column agee age double;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

바꾼 컬럼을 확인해보자.

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | double      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

table column datatype 변경

alter table table_name modify column column_name datatype;

컬럼의 이름을 바꿀 때 데이터 타입도 같이 바꿀 수 있었는데,
이번엔 데이터 타입만 바꿀 때를 알아보자.

mysql> alter table person
    -> modify column age int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

바꾼 컬럼의 데이터 타입을 확인해보자.

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

table column 삭제

alter table table_name drop column column_name;

table의 컬럼(column)을 삭제하는 방법이다.

mysql> alter table person
    -> drop column age;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

age 컬럼이 제대로 삭제가 되었는지 확인해보자.

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

table 삭제

drop table table_name;

table을 삭제해보자.

mysql> drop table person;
Query OK, 0 rows affected (0.01 sec)

table이 삭제가 되었다면 database에 해당 table이 없다는 것을 확인할 수 있다.

mysql> show tables;
Empty set (0.00 sec)

2단계 : table구조에 맞게 데이터 입력

먼저 person이라는 table을 생성하고 실습을 진행한다.
person에는 id, name, age, sex가 입력되도록 구조를 만든다.

mysql> create table person
    -> (
    -> id int,
    -> name varchar(16),
    -> age int,
    -> sex char
    -> );
Query OK, 0 rows affected (0.02 sec)

생성된 table을 확인해보자.

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

insert

insert 구문은 구조화된 table에 실질적인 데이터를 입력하는 방법이다.
입력할 때, '문자'는 따옴표('')로 감싸도록 하여 문자임을 지정해야 한다.

insert into table_name(column1, 2...) values(value1, 2...);

컬럼의 '이름'과 '값'은 1:1로 매칭되게 입력을 시킨다.
예로 메리라는 20살 여성의 데이터를 입력해보자.

mysql> insert into person(id, name, age, sex)
    -> values(1, 'marry', 20, 'F'); # 문자는 ''로 지정
Query OK, 1 row affected (0.01 sec)

insert into table_name values(value1, 2...);

만약 모든 컬럼에 대한 데이터를 입력할 시, column은 지정하지 않아도 되지만
반드시 입력하는 순서는 column의 순서와 같아야 한다.
예로 찰리라는 30살 남성의 데이터를 입력해보자.

mysql> insert into person
    -> values(2, 'charles', 30, 'M');
Query OK, 1 row affected (0.00 sec)

다음 챕터에서 select 구문을 확인할 것이지만,
입력된 데이터가 제대로 들어갔는지 확인하기 위해 select 구문으로 확인해보자.
'*'는 모든 컬럼을 불러오겠다는 의미이며 'from' 다음은 어느 table에서 불러올지 table_name을 넣는다.

2개의 데이터가 제데로 입력된 것을 확인할 수 있다.

mysql> select * from person;
+------+---------+------+------+
| id   | name    | age  | sex  |
+------+---------+------+------+
|    1 | marry   |   20 | F    |
|    2 | charles |   30 | M    |
+------+---------+------+------+
2 rows in set (0.00 sec)
profile
데이터 굽는 타자기

0개의 댓글