테이블 생성, 구조변경, 삭제, 구조수정, DML테스트, 일괄처리, SQLite (w 파이썬) (교육 52일차)

SW·2023년 2월 3일

실습> 테이블 생성하기

[DBMS]# mysql mysql
MariaDB [mysql]> DESC user;

+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
  :
  :(생략)

MariaDB [mysql]> USE kh_db
MariaDB [mysql]> \e

CREATE TABLE user
(
    Host char(60) NOT NULL,
    User char(16) NOT NULL,
    Password char(41) NOT NULL,
    PRIMARY KEY(`Host`, `User`)
)

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| kh_member       |
| user            |
+-----------------+
2 rows in set (0.00 sec)

MariaDB [kh_db]> DESC user;

+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| Host     | char(60) | NO   | PRI | NULL    |       |
| User     | char(16) | NO   | PRI | NULL    |       |
| Password | char(41) | NO   |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [kh_db]> DROP TABLE user;
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| kh_member       |
+-----------------+
1 row in set (0.00 sec)

실습> 테이블 생성하기

데이터 타입(자료형)
C & C++ & Java
자료형 변수명;
int a;
a = 1;

SQL
컬럼명 자료형;

1byte 8bit
0 ~ 255 까지의 값을 가진다.

signed (+, - 를 표현할 수 있다.)
맨 왼쪽이 부호비트를 의미하므로 7bit 만 사용이 가능한다.

unsigned (+ 만 표현할 수 있다., -는 표현할 수 없다.)
맨 왼쪽도 값으로 사용할 수 있으므로 8bit 전체를 사용이 가능한다.

int (4byte) signed -2147483648 ~ 2147483647
int (4byte) unsigned 0 ~ 4294967295

[DBMS]# yum -y install python3
[DBMS]# python3

>>> 2 ** 8
256  
>>> 2 ** 8 - 1
255
>>> 2 ** 7 
128
>>> 2 ** 7 - 1
127

tinyint signed 범위: -128 ~ 127

가장 첫 번째 bit를 부호비트로 사용

  +-- + : 0 
  |
+---+---+---+---+---+---+---+---+
| + | 0 | 0 | 0 | 0 | 0 | 0 | 0 |       
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| + | 1 | 1 | 1 | 1 | 1 | 1 | 1 |       
+---+---+---+---+---+---+---+---+

  +-- + : 1 
  |
+---+---+---+---+---+---+---+---+
| - | 0 | 0 | 0 | 0 | 0 | 0 | 0 |       
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| - | 1 | 1 | 1 | 1 | 1 | 1 | 1 |       
+---+---+---+---+---+---+---+---+

숫자 자료형 테스트

MariaDB [kh_db]> CREATE TABLE t1(no tinyint);
Query OK, 0 rows affected (0.01 sec)

MariaDB [kh_db]> DESC t1;

+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| no    | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

데이터 입력 형식:
INSERT INTO <테이블명> VALUES( 값 ... );
MariaDB [kh_db]> INSERT INTO t1 VALUES(128);
Query OK, 1 row affected, 1 warning (0.00 sec)

데이터 입력 형식:
SELECT <컬럼명> FROM <테이블명>;
MariaDB [kh_db]> SELECT * FROM t1;

+------+
| no   |
+------+
|  127 |  <-- 값의 범위를 넘어가면 에러가 아니라 마지막 숫자가 저장된다.
+------+
1 row in set (0.00 sec)

-128까지만 저장되기 때문에 범위를 넘어가면 가장 마지막 숫자가 저장된다.
MariaDB [kh_db]> INSERT INTO t1 VALUES(-129);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [kh_db]> SELECT * FROM t1;

+------+
| no   |
+------+
|  127 |
| -128 |
+------+
2 rows in set (0.00 sec)

tinyint unsigned 범위: 0 ~ 255
가장 첫 번째 bit를 부호비트로 사용하지 않는다.

+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |       
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |       
+---+---+---+---+---+---+---+---+

unsigned를 사용하기 위해서는 자료형 뒤에서 써야 한다.
MariaDB [kh_db]> CREATE TABLE t2(no tinyint unsigned);
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> DESC t2;

+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| no    | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [kh_db]> INSERT INTO t2 VALUES(-1);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [kh_db]> SELECT no FROM t2;

+------+
| no   |
+------+
|    0 |  <-- 값의 범위를 넘어가면 에러가 아니라 가장 작은 숫자 0이 저장된다.
+------+
1 row in set (0.00 sec)

MariaDB [kh_db]> INSERT INTO t2 VALUES(256);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [kh_db]> SELECT * FROM t2;

+------+
| no   |
+------+
|    0 |
|  255 |  <-- 값의 범위를 넘어가면 에러가 아니라 가장 큰 숫자 255가 저장된다.
+------+
2 rows in set (0.00 sec)

문자 자료형 테스트
MariaDB [kh_db]> CREATE TABLE t3 (name char(1));
Query OK, 0 rows affected (0.01 sec)

MariaDB [kh_db]> DESC t3;

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name  | char(1) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [kh_db]> INSERT INTO t3 VALUES('a');
Query OK, 1 row affected (0.00 sec)

MariaDB [kh_db]> SELECT * FROM t3;

+------+
| name |
+------+
| a    |
+------+
1 row in set (0.00 sec)

글자 2개는 범위가 벗어났기 때문에 저장이 안된다.
MariaDB [kh_db]> INSERT INTO t3 VALUES('ab');
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [kh_db]> SELECT name FROM t3;

+------+
| name |
+------+
| a    |
| a    |
+------+
2 rows in set (0.00 sec)

MariaDB [kh_db]> \s
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8

MariaDB [kh_db]> INSERT INTO t3 VALUES('가');
Query OK, 1 row affected (0.00 sec)

MariaDB [kh_db]> SELECT name FROM t3;

+------+
| name |
+------+
| a    |
| a    |
| 가   |  <-- utf8 형식의 한글 한 글자는 3byte 이지만 저장된 이유는 char(1)은 글자수를 의미한다.
+------+
3 rows in set (0.00 sec)

두 글자를 저장하면 저장이 안된다.
MariaDB [kh_db]> INSERT INTO t3 VALUES('가나');
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [kh_db]> SELECT name FROM t3;

+------+
| name |
+------+
| a    |
| a    |
| 가   |
| 가   |  <-- 범위가 벗어났기 때문에 두 글자는 저장이 안된다.
+------+
4 rows in set (0.00 sec)

MariaDB [kh_db]> exit

UTF-8, utf8 형식의 한글 byte를 확인한다.

# echo $LANG
ko_KR.UTF-8

# echo 가 > a.txt
# ll a.txt 
-rw-r--r--. 1 root root 4  2월  3 01:45 a.txt
# od -c a.txt 
0000000 352 260 200  \n  <-- (엔터)
0000004
# cat a.txt 
가
#  <-- 프롬프트가 밑으로 떨어지는 이유는 a.txt 파일의 끝에 엔터(\n)가 있기 때문이다.

실습> 테이블 구조 변경하기

ALTER: 바꾸다, 고치다
ALTER TABLE 명령어를 사용한다.

ALTER TABLE 형식
ALTER TABLE <테이블명> <컬럼명 자료형 옵션 제약조건>;

ACTION 종류
ADD: 컬럼 추가
DROP: 컬럼 삭제
MODIFY: 컬럼 수정
CHANGE: 컬럼 변경
RENAME: 테이블명 변경

1. 컬럼 추가
ADD로 컬럼을 추가하면 마지막 컬럼에 추가된다. (iptables -A INPUT 을 생각하면 된다.)
ALTER TABLE kh_member ADD nickname VARCHAR(30) UNIQUE;

MariaDB [kh_db]> ALTER TABLE kh_member ADD nickname VARCHAR(30) UNIQUE;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | char(20)    | YES  |     | NULL    |                |
| id       | varchar(20) | YES  | UNI | NULL    |                |
| password | varchar(50) | YES  |     | 1234    |                |
| reg_date | datetime    | NO   |     | NULL    |                |
| nickname | varchar(30) | YES  | UNI | NULL    |                |  <-- 추가된 컬럼
+----------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

age 컬럼을 가장 처음의 위치로 추가한다.
MariaDB [kh_db]> ALTER TABLE kh_member ADD age INT FIRST;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| age      | int(11)     | YES  |     | NULL    |                |  <-- 추가된 컬럼
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | char(20)    | YES  |     | NULL    |                |
| id       | varchar(20) | YES  | UNI | NULL    |                |
| password | varchar(50) | YES  |     | 1234    |                |
| reg_date | datetime    | NO   |     | NULL    |                |
| nickname | varchar(30) | YES  | UNI | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

memo 컬럼을 password 컬럼 다음의 위치로 추가한다.
MariaDB [kh_db]> ALTER TABLE kh_member ADD memo TEXT AFTER password;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| age      | int(11)     | YES  |     | NULL    |                |
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | char(20)    | YES  |     | NULL    |                |
| id       | varchar(20) | YES  | UNI | NULL    |                |
| password | varchar(50) | YES  |     | 1234    |                |
| memo     | text        | YES  |     | NULL    |                |  <-- 추가된 컬럼
| reg_date | datetime    | NO   |     | NULL    |                |
| nickname | varchar(30) | YES  | UNI | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

2. 컬럼 삭제
컬럼 삭제 형식:
ALTER TABLE <테이블명> DROP <컬럼명>;

MariaDB [kh_db]> ALTER TABLE kh_member DROP age;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | char(20)    | YES  |     | NULL    |                |
| id       | varchar(20) | YES  | UNI | NULL    |                |
| password | varchar(50) | YES  |     | 1234    |                |
| memo     | text        | YES  |     | NULL    |                |
| reg_date | datetime    | NO   |     | NULL    |                |
| nickname | varchar(30) | YES  | UNI | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

3. 컬럼 수정
컬럼 수정 형식:
ALTER TABLE <테이블명> MODIFY <컬럼명> <데이터타입> [옵션][제약조건];
password: varchar(50): 1234 -> password: varchar(50): qwer1234

MariaDB [kh_db]> ALTER TABLE kh_member MODIFY password VARCHAR(50) DEFAULT 'qwer1234';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+-------------+------+-----+----------+----------------+
| Field    | Type        | Null | Key | Default  | Extra          |
+----------+-------------+------+-----+----------+----------------+
| no       | int(11)     | NO   | PRI | NULL     | auto_increment |
| name     | char(20)    | YES  |     | NULL     |                |
| id       | varchar(20) | YES  | UNI | NULL     |                |
| password | varchar(50) | YES  |     | qwer1234 |                |  <-- 수정된 컬럼
| memo     | text        | YES  |     | NULL     |                |
| reg_date | datetime    | NO   |     | NULL     |                |
| nickname | varchar(30) | YES  | UNI | NULL     |                |
+----------+-------------+------+-----+----------+----------------+
7 rows in set (0.00 sec)

4. 컬럼 변경
컬럼 변경 형식:
ALTER TABLE <테이블명> CHANGE <이전컬럼명> <새컬럼명> <데이터타입> [옵션][제약조건];
memo TEXT -> address VARCHAR(100)

ALTER TABLE kh_member CHANGE memo address VARCHAR(100);

MariaDB [kh_db]> ALTER TABLE kh_member CHANGE memo address VARCHAR(100);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+--------------+------+-----+----------+----------------+
| Field    | Type         | Null | Key | Default  | Extra          |
+----------+--------------+------+-----+----------+----------------+
| no       | int(11)      | NO   | PRI | NULL     | auto_increment |
| name     | char(20)     | YES  |     | NULL     |                |
| id       | varchar(20)  | YES  | UNI | NULL     |                |
| password | varchar(50)  | YES  |     | qwer1234 |                |
| address  | varchar(100) | YES  |     | NULL     |                |  <-- 변경된 컬럼
| reg_date | datetime     | NO   |     | NULL     |                |
| nickname | varchar(30)  | YES  | UNI | NULL     |                |
+----------+--------------+------+-----+----------+----------------+
7 rows in set (0.00 sec)

컬럼명이 변경된 것이 아니므로 MODIFY를 사용해야 한다.
address VARCHAR(100) -> address VARCHAR(1000)

컬럼명이 변경된 것이 아니므로 CHANGE를 사용하면 에러가 발생된다.
컬럼명이 변경되지 않고 데이터타입, 옵션, 제약조건이 바뀌면 MODIFY를 사용한다.
MariaDB [kh_db]> ALTER TABLE kh_member CHANGE address VARCHAR(1000);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VARCHAR(1000)' at line 1

MariaDB [kh_db]> ALTER TABLE kh_member MODIFY address VARCHAR(1000);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+---------------+------+-----+----------+----------------+
| Field    | Type          | Null | Key | Default  | Extra          |
+----------+---------------+------+-----+----------+----------------+
| no       | int(11)       | NO   | PRI | NULL     | auto_increment |
| name     | char(20)      | YES  |     | NULL     |                |
| id       | varchar(20)   | YES  | UNI | NULL     |                |
| password | varchar(50)   | YES  |     | qwer1234 |                |
| address  | varchar(1000) | YES  |     | NULL     |                |  <-- 수정된 컬럼
| reg_date | datetime      | NO   |     | NULL     |                |
| nickname | varchar(30)   | YES  | UNI | NULL     |                |
+----------+---------------+------+-----+----------+----------------+
7 rows in set (0.00 sec)

address VARCHAR(1000) -> address VARCHAR(100)
MariaDB [kh_db]> ALTER TABLE kh_member MODIFY address VARCHAR(100);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [kh_db]> DESC kh_member;

+----------+--------------+------+-----+----------+----------------+
| Field    | Type         | Null | Key | Default  | Extra          |
+----------+--------------+------+-----+----------+----------------+
| no       | int(11)      | NO   | PRI | NULL     | auto_increment |
| name     | char(20)     | YES  |     | NULL     |                |
| id       | varchar(20)  | YES  | UNI | NULL     |                |
| password | varchar(50)  | YES  |     | qwer1234 |                |
| address  | varchar(100) | YES  |     | NULL     |                |  <-- 수정된 컬럼
| reg_date | datetime     | NO   |     | NULL     |                |
| nickname | varchar(30)  | YES  | UNI | NULL     |                |
+----------+--------------+------+-----+----------+----------------+
7 rows in set (0.00 sec)

5. 테이블명 변경

테이블명 변경 형식:
ALTER TABLE <이전테이블명> RENAME <변경할테이블명>;
RENAME TABLE <이전테이블명> TO <변경할테이블명>;

MariaDB [kh_db]> SHOW TABLES;
+-----------------+
| Tables_in_kh_db |
+-----------------+
| kh_member |
+-----------------+
1 row in set (0.00 sec)

ALTER TABLE을 이용해서 테이블명을 변경한다.
kh_member -> kisa_mem
MariaDB [kh_db]> ALTER TABLE kh_member RENAME kisa_mem;
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| kisa_mem        |
+-----------------+
1 row in set (0.00 sec)

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| kisa_mem        |
+-----------------+
1 row in set (0.00 sec)

RENAME TABLE을 이용해서 테이블명을 변경한다.
kisa_mem -> kh_mem
MariaDB [kh_db]> RENAME TABLE kisa_mem TO kh_mem;
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| kh_mem          |
+-----------------+
1 row in set (0.00 sec)

[root@ns1 ~]# rdate -s time.bora.net
[root@ns1 ~]# date
2023. 02. 03. (금) 12:02:54 KST
[root@ns1 ~]# ls -li /var/lib/mysql/kh_db/kh_mem.frm
33644298 -rw-rw----. 1 mysql mysql 8762 2월 3 02:45 /var/lib/mysql/kh_db/kh_mem.frm
[root@ns1 ~]# stat /var/lib/mysql/kh_db/kh_mem.frm
File: `/var/lib/mysql/kh_db/kh_mem.frm'
Size: 8762 Blocks: 24 IO Block: 4096 일반 파일
Device: fd00h/64768d Inode: 33644298 Links: 1
Access: (0660/-rw-rw----) Uid: ( 27/ mysql) Gid: ( 27/ mysql)
Context: system_u:object_r:mysqld_db_t:s0
Access: 2023-02-03 12:02:40.788869205 +0900
Modify: 2023-02-03 02:45:32.397149051 +0900
Change: 2023-02-03 02:50:03.772889330 +0900
Birth: -
[root@ns1 ~]# mysql kh_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 49
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [kh_db]> TRUNCATE kh_mem;
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> exit
Bye
[root@ns1 ~]# ls -li /var/lib/mysql/kh_db/kh_mem.frm
33644298 -rw-rw----. 1 mysql mysql 8762 2월 3 02:45 /var/lib/mysql/kh_db/kh_mem.frm
[root@ns1 ~]# stat /var/lib/mysql/kh_db/kh_mem.frm
File: `/var/lib/mysql/kh_db/kh_mem.frm'
Size: 8762 Blocks: 24 IO Block: 4096 일반 파일
Device: fd00h/64768d Inode: 33644298 Links: 1
Access: (0660/-rw-rw----) Uid: ( 27/ mysql) Gid: ( 27/ mysql)
Context: system_u:object_r:mysqld_db_t:s0
Access: 2023-02-03 12:02:40.788869205 +0900
Modify: 2023-02-03 02:45:32.397149051 +0900
Change: 2023-02-03 02:50:03.772889330 +0900
Birth: -

실습> 테이블 삭제하기

테이블 삭제 형식:
DROP TABLE <테이블명>;

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| kh_mem          |
+-----------------+
1 rows in set (0.00 sec)

MariaDB [kh_db]> DROP TABLE kh_mem;
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> SHOW TABLES;
Empty set (0.00 sec)

실습> 테이블에 코멘트 사용하기

코멘트를 사용하는 형식:
컬럼명 자료형 COMMENT '코멘트'

테이블의 코멘트를 확인하는 방법:
SHOW CREATE TABLE <테이블명>\G

ariaDB [kh_db]> CREATE TABLE test (no INT COMMENT '번호');
Query OK, 0 rows affected (0.00 sec)

MariaDB [kh_db]> SHOW TABLES;

+-----------------+
| Tables_in_kh_db |
+-----------------+
| test            |
+-----------------+
1 row in set (0.00 sec)

MariaDB [kh_db]> DESC test;

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| no    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [kh_db]> SHOW CREATE TABLE test\G

*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `no` int(11) DEFAULT NULL COMMENT '번호'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

실습> 테이블 생성하기

-- khacademy DB 생성
CREATE DATABASE khacademy;
USE khacademy

-- member 테이블 생성

CREATE TABLE member
(
    id   VARCHAR(20) NOT NULL UNIQUE COMMENT '아이디',
    pass VARCHAR(20) NOT NULL COMMENT '비밀번호',
    name VARCHAR(20) NOT NULL COMMENT '이름',
    sex  CHAR(1) COMMENT '성별',
    tel  VARCHAR(20) DEFAULT '010-0000-0000' COMMENT '전화번호',
    address VARCHAR(90) COMMENT '주소'
);

-- freeboard 테이블 생성

CREATE TABLE freeboard
(
    num        INT  NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '일련번호',
    name       VARCHAR(20)  NOT NULL COMMENT '이름',
    email      VARCHAR(20)  COMMENT '메일주소',
    subject    VARCHAR(100) NOT NULL COMMENT '제목',
    content    VARCHAR(500) NOT NULL COMMENT '글내용',
    regist_day VARCHAR(20)  COMMENT '글쓴날짜',
    ip         VARCHAR(20)  COMMENT '접속IP'
);

MariaDB [khacademy]> DESC member;

+---------+-------------+------+-----+---------------+-------+
| Field   | Type        | Null | Key | Default       | Extra |
+---------+-------------+------+-----+---------------+-------+
| id      | varchar(20) | NO   | PRI | NULL          |       |
| pass    | varchar(20) | NO   |     | NULL          |       |
| name    | varchar(20) | NO   |     | NULL          |       |
| sex     | char(1)     | YES  |     | NULL          |       |
| tel     | varchar(20) | YES  |     | 010-0000-0000 |       |
| address | varchar(90) | YES  |     | NULL          |       |
+---------+-------------+------+-----+---------------+-------+
6 rows in set (0.00 sec)

MariaDB [khacademy]> SHOW CREATE TABLE member\G

*************************** 1. row ***************************
       Table: member
Create Table: CREATE TABLE `member` (
  `id` varchar(20) NOT NULL COMMENT '아이디',
  `pass` varchar(20) NOT NULL COMMENT '비밀번호',
  `name` varchar(20) NOT NULL COMMENT '이름',
  `sex` char(1) DEFAULT NULL COMMENT '성별',
  `tel` varchar(20) DEFAULT '010-0000-0000' COMMENT '전화번호',
  `address` varchar(90) DEFAULT NULL COMMENT '주소',
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

MariaDB [khacademy]> DESC freeboard;

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| num        | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20)  | NO   |     | NULL    |                |
| email      | varchar(20)  | YES  |     | NULL    |                |
| subject    | varchar(100) | NO   |     | NULL    |                |
| content    | varchar(500) | NO   |     | NULL    |                |
| regist_day | varchar(20)  | YES  |     | NULL    |                |
| ip         | varchar(20)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

MariaDB [khacademy]> SHOW CREATE TABLE freeboard\G

*************************** 1. row ***************************
       Table: freeboard
Create Table: CREATE TABLE `freeboard` (
  `num` int(11) NOT NULL AUTO_INCREMENT COMMENT '일련번호',
  `name` varchar(20) NOT NULL COMMENT '이름',
  `email` varchar(20) DEFAULT NULL COMMENT '메일주소',
  `subject` varchar(100) NOT NULL COMMENT '제목',
  `content` varchar(500) NOT NULL COMMENT '글내용',
  `regist_day` varchar(20) DEFAULT NULL COMMENT '글쓴날짜',
  `ip` varchar(20) DEFAULT NULL COMMENT '접속IP',
  PRIMARY KEY (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

MariaDB [khacademy]> SHOW TABLES;

+---------------------+
| Tables_in_khacademy |
+---------------------+
| freeboard           |
| member              |
+---------------------+
2 rows in set (0.00 sec)

실습> 테이블 구조 수정하기

위에서 생성한 테이블을 이용해서 테이블 구조를 수정하는 실습을 진행한다.

member 테이블의 가장 위에 일련 번호 컬럼 추가
컬럼명 : no, 데이터 타입 : int, 옵션 : 번호 자동증가, 제약조건 : primary key

MariaDB [khacademy]> ALTER TABLE member ADD no INT AUTO_INCREMENT PRIMARY KEY FIRST;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC member;

+---------+-------------+------+-----+---------------+----------------+
| Field   | Type        | Null | Key | Default       | Extra          |
+---------+-------------+------+-----+---------------+----------------+
| no      | int(11)     | NO   | PRI | NULL          | auto_increment |  <-- 추가된 컬럼
| id      | varchar(20) | NO   | UNI | NULL          |                |
| pass    | varchar(20) | NO   |     | NULL          |                |
| name    | varchar(20) | NO   |     | NULL          |                |
| sex     | char(1)     | YES  |     | NULL          |                |
| tel     | varchar(20) | YES  |     | 010-0000-0000 |                |
| address | varchar(90) | YES  |     | NULL          |                |
+---------+-------------+------+-----+---------------+----------------+
7 rows in set (0.00 sec)

member 테이블의 비밀번호 컬럼 데이터 타입을 varchar(50) 으로 수정
pass varchar(20) NOT NULL -> pass varchar(50) NOT NULL

!!! 컬럼명은 그대로 유지하고 데이터타입, 옵션, 제약조건만 바뀌면 MODIFY !!!

MariaDB [khacademy]> ALTER TABLE member MODIFY pass VARCHAR(50) NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC member;

+---------+-------------+------+-----+---------------+----------------+
| Field   | Type        | Null | Key | Default       | Extra          |
+---------+-------------+------+-----+---------------+----------------+
| no      | int(11)     | NO   | PRI | NULL          | auto_increment |
| id      | varchar(20) | NO   | UNI | NULL          |                |
| pass    | varchar(50) | NO   |     | NULL          |                |  <-- 수정된 컬럼
| name    | varchar(20) | NO   |     | NULL          |                |
| sex     | char(1)     | YES  |     | NULL          |                |
| tel     | varchar(20) | YES  |     | 010-0000-0000 |                |
| address | varchar(90) | YES  |     | NULL          |                |
+---------+-------------+------+-----+---------------+----------------+
7 rows in set (0.00 sec)

member 테이블의 성별 컬럼을 나이 컬럼으로 변경
컬럼명 : age , 데이터 타입 : int , 옵션 및 제약조건 없음
sex char(1) -> age int

!!! 컬럼명이 바뀌면 CHANGE !!!

MariaDB [khacademy]> ALTER TABLE member CHANGE sex age INT;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC member;

+---------+-------------+------+-----+---------------+----------------+
| Field   | Type        | Null | Key | Default       | Extra          |
+---------+-------------+------+-----+---------------+----------------+
| no      | int(11)     | NO   | PRI | NULL          | auto_increment |
| id      | varchar(20) | NO   | UNI | NULL          |                |
| pass    | varchar(50) | NO   |     | NULL          |                |
| name    | varchar(20) | NO   |     | NULL          |                |
| age     | int(11)     | YES  |     | NULL          |                |  <-- 변경된 컬럼
| tel     | varchar(20) | YES  |     | 010-0000-0000 |                |
| address | varchar(90) | YES  |     | NULL          |                |
+---------+-------------+------+-----+---------------+----------------+
7 rows in set (0.00 sec)

member 테이블의 주소 컬럼을 작성일시 컬럼으로 변경
컬럼명: reg_date , 데이터 타입 : datetime , 옵션 없음 , 제약조건 : not null

MariaDB [khacademy]> ALTER TABLE member CHANGE address reg_date DATETIME NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC member;

+----------+-------------+------+-----+---------------+----------------+
| Field    | Type        | Null | Key | Default       | Extra          |
+----------+-------------+------+-----+---------------+----------------+
| no       | int(11)     | NO   | PRI | NULL          | auto_increment |
| id       | varchar(20) | NO   | UNI | NULL          |                |
| pass     | varchar(50) | NO   |     | NULL          |                |
| name     | varchar(20) | NO   |     | NULL          |                |
| age      | int(11)     | YES  |     | NULL          |                |
| tel      | varchar(20) | YES  |     | 010-0000-0000 |                |
| reg_date | datetime    | NO   |     | NULL          |                |
+----------+-------------+------+-----+---------------+----------------+
7 rows in set (0.00 sec)

member 테이블의 전화번호 컬럼 삭제

MariaDB [khacademy]> ALTER TABLE member DROP tel;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC member;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| id       | varchar(20) | NO   | UNI | NULL    |                |
| pass     | varchar(50) | NO   |     | NULL    |                |
| name     | varchar(20) | NO   |     | NULL    |                |
| age      | int(11)     | YES  |     | NULL    |                |
| reg_date | datetime    | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

member 테이블 이름을 kh_mem 으로 변경

MariaDB [khacademy]> SHOW TABLES;

+---------------------+
| Tables_in_khacademy |
+---------------------+
| freeboard           |
| member              |
+---------------------+
2 rows in set (0.00 sec)

MariaDB [khacademy]> ALTER TABLE member RENAME kh_mem;
Query OK, 0 rows affected (0.00 sec)

MariaDB [khacademy]> SHOW TABLES;

+---------------------+
| Tables_in_khacademy |
+---------------------+
| freeboard           |
| kh_mem              |
+---------------------+
2 rows in set (0.00 sec)

freeboard 테이블의 이름 컬럼 다음에 게시글 비밀번호 컬럼 추가
컬럼명 : passwd , 데이터 타입 : varchar(20) , 옵션 : 기본값 0000 으로 설정 , 제약조건 없음
MariaDB [khacademy]> DESC freeboard;

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| num        | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20)  | NO   |     | NULL    |                |
| email      | varchar(20)  | YES  |     | NULL    |                |
| subject    | varchar(100) | NO   |     | NULL    |                |
| content    | varchar(500) | NO   |     | NULL    |                |
| regist_day | varchar(20)  | YES  |     | NULL    |                |
| ip         | varchar(20)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

MariaDB [khacademy]> ALTER TABLE freeboard ADD passwd VARCHAR(20) DEFAULT '0000' AFTER name;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC freeboard;

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| num        | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20)  | NO   |     | NULL    |                |
| passwd     | varchar(20)  | YES  |     | 0000    |                |  <-- 추가된 컬럼
| email      | varchar(20)  | YES  |     | NULL    |                |
| subject    | varchar(100) | NO   |     | NULL    |                |
| content    | varchar(500) | NO   |     | NULL    |                |
| regist_day | varchar(20)  | YES  |     | NULL    |                |
| ip         | varchar(20)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

freeboard 테이블의 글 내용 컬럼 데이터 타입을 text 로 수정
MariaDB [khacademy]> ALTER TABLE freeboard MODIFY content text NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC freeboard;

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| num        | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20)  | NO   |     | NULL    |                |
| passwd     | varchar(20)  | YES  |     | 0000    |                |
| email      | varchar(20)  | YES  |     | NULL    |                |
| subject    | varchar(100) | NO   |     | NULL    |                |
| content    | text         | NO   |     | NULL    |                |  <-- 수정된 컬럼
| regist_day | varchar(20)  | YES  |     | NULL    |                |
| ip         | varchar(20)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

freeboard 테이블의 글쓴 날짜 컬럼 이름 및 데이터 타입 변경
컬럼명 : reg_date , 데이터 타입: datetime , 옵션 없음 , 제약조건 : not null

MariaDB [khacademy]> ALTER TABLE freeboard CHANGE regist_day reg_date DATETIME NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC freeboard;

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| num      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(20)  | NO   |     | NULL    |                |
| passwd   | varchar(20)  | YES  |     | 0000    |                |
| email    | varchar(20)  | YES  |     | NULL    |                |
| subject  | varchar(100) | NO   |     | NULL    |                |
| content  | text         | NO   |     | NULL    |                |
| reg_date | datetime     | NO   |     | NULL    |                |  <-- 변경된 컬럼
| ip       | varchar(20)  | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

freeboard 테이블의 메일주소 컬럼 삭제

MariaDB [khacademy]> ALTER TABLE freeboard DROP email;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [khacademy]> DESC freeboard;

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| num      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(20)  | NO   |     | NULL    |                |
| passwd   | varchar(20)  | YES  |     | 0000    |                |
| subject  | varchar(100) | NO   |     | NULL    |                |
| content  | text         | NO   |     | NULL    |                |
| reg_date | datetime     | NO   |     | NULL    |                |
| ip       | varchar(20)  | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

실습> 테이블 구조 수정하기 복습

DROP TABLE kh_mem;
DROP TABLE freeboard;

-- member 테이블 생성

CREATE TABLE member
(
    id   VARCHAR(20) NOT NULL UNIQUE COMMENT '아이디',
    pass VARCHAR(20) NOT NULL COMMENT '비밀번호',
    name VARCHAR(20) NOT NULL COMMENT '이름',
    sex  CHAR(1) COMMENT '성별',
    tel  VARCHAR(20) DEFAULT '010-0000-0000' COMMENT '전화번호',
    address VARCHAR(90) COMMENT '주소'
);

-- freeboard 테이블 생성

CREATE TABLE freeboard
(
    num        INT  NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '일련번호',
    name       VARCHAR(20)  NOT NULL COMMENT '이름',
    email      VARCHAR(20)  COMMENT '메일주소',
    subject    VARCHAR(100) NOT NULL COMMENT '제목',
    content    VARCHAR(500) NOT NULL COMMENT '글내용',
    regist_day VARCHAR(20)  COMMENT '글쓴날짜',
    ip         VARCHAR(20)  COMMENT '접속IP'
);

member 테이블의 가장 위에 일련 번호 컬럼 추가
컬렴명 : no, 데이터 타입 : int, 옵션 : 번호 자동증가, 제약조건 : primary key

member 테이블의 비밀번호 컬럼 데이터 타입을 varchar(50) 으로 수정
pass varchar(20) NOT NULL -> pass varchar(50) NOT NULL

!!! 컬럼명은 그대로 유지하고 데이터타입, 옵션, 제약조건만 바뀌면 MODIFY !!!

member 테이블의 성별 컬럼을 나이 컬럼으로 변경
컬럼명 : age , 데이터 타입 : int , 옵션 및 제약조건 없음
sex char(1) -> age int

!!! 컬럼명이 바뀌면 CHANGE !!!

member 테이블의 주소 컬럼을 작성일시 컬럼으로 변경
컬럼명: reg_date , 데이터 타입 : datetime , 옵션 없음 , 제약조건 : not null

member 테이블의 전화번호 컬럼 삭제

member 테이블 이름을 kh_mem 으로 변경

freeboard 테이블의 이름 컬럼 다음에 게시글 비밀번호 컬럼 추가
컬럼명 : passwd , 데이터 타입 : varchar(20) , 옵션 : 기본값 0000 으로 설정 , 제약조건 없음

freeboard 테이블의 글 내용 컬럼 데이터 타입을 text 로 수정

freeboard 테이블의 글쓴 날짜 컬럼 이름 및 데이터 타입 변경
컬럼명 : reg_date , 데이터 타입: datetime , 옵션 없음 , 제약조건 : not null

freeboard 테이블의 메일주소 컬럼 삭제

실습> DML 테스트

DML(데이터 조작어): INSERT(저장), UPDATE(수정), DELETE(삭제), SELECT(조회)

MariaDB [khacademy]> DROP TABLE kh_mem;
Query OK, 0 rows affected (0.00 sec)

CREATE TABLE kh_mem
(
    no   INT AUTO_INCREMENT PRIMARY KEY COMMENT '번호',
    id   VARCHAR(20) NOT NULL UNIQUE COMMENT '아이디',
    pass VARCHAR(50) NOT NULL COMMENT '비밀번호',
    name VARCHAR(20) NOT NULL COMMENT '이름',
    age  INT COMMENT '나이',
    reg_date DATETIME NOT NULL COMMENT '가입일'
);

MariaDB [khacademy]> DESC kh_mem;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| id       | varchar(20) | NO   | UNI | NULL    |                |
| pass     | varchar(50) | NO   |     | NULL    |                |
| name     | varchar(20) | NO   |     | NULL    |                |
| age      | int(11)     | YES  |     | NULL    |                |
| reg_date | datetime    | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MariaDB에서 함수를 단독으로 실행하는 경우 형식:
SELECT 함수명();

SELECT now();
SELECT password('111111');
SELECT user();

테이블에 데이터를 저장하는 형식:
형식1: INSERT INTO <테이블명> VALUES(데이터, ...);
형식2: INSERT INTO <테이블명> (컬럼명, ...) VALUES(데이터, ...);
형식3: INSERT INTO kh_mem SET 컬럼명=값 [, ...];

형식1과 형식2를 많이 사용한다.

형식1로 저장하는 경우: 컬럼의 순서대로 데이터가 저장된다.
INSERT INTO kh_mem VALUES('', 'test', 'qwer1234', '테스터', 25, now());

형식2로 저장하는 경우: 컬럼을 지정해야 하는 경우에는 반드시 써야 한다.
INSERT INTO kh_mem(name,id,pass,reg_date) VALUES('테스터2','test2','1234qwer',now());

형식3으로 저장하는 경우: 컬럼을 지정해야 하는 경우에는 반드시 써야 한다.
INSERT INTO kh_mem SET id='test3', pass='P@ssw0rd', name='테스터', reg_date=now();

MariaDB [khacademy]> SELECT * FROM kh_mem;

+----+-------+----------+------------+------+---------------------+
| no | id    | pass     | name       | age  | reg_date            |
+----+-------+----------+------------+------+---------------------+
|  1 | test  | qwer1234 | 테스터     |   25 | 2023-02-03 14:38:01 |
|  2 | test2 | 1234qwer | 테스터2    | NULL | 2023-02-03 14:44:16 |
|  3 | test3 | P@ssw0rd | 테스터     | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+------------+------+---------------------+
3 rows in set (0.00 sec)

데이터를 출력하는 형식:
형식1: SELECT FROM <테이블명>;
은 모든 컬럼을 의미한다.
형식2: SELECT <컬럼명>[,컬럼명 ...] <테이블명>;

형식1로 출력하는 경우
kh_mem 테이블에서 모든 컬럼을 출력한다.
MariaDB [khacademy]> SELECT * FROM kh_mem;

+----+-------+----------+------------+------+---------------------+
| no | id    | pass     | name       | age  | reg_date            |
+----+-------+----------+------------+------+---------------------+
|  1 | test  | qwer1234 | 테스터     |   25 | 2023-02-03 14:38:01 |
|  2 | test2 | 1234qwer | 테스터2    | NULL | 2023-02-03 14:44:16 |
|  3 | test3 | P@ssw0rd | 테스터     | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+------------+------+---------------------+
3 rows in set (0.00 sec)

형식2로 출력하는 경우
컬럼의 순서는 사용자가 출력하는 순서대로 출력된다.

kh_mem 테이블에서 name, age reg_date 를 출력한다.
MariaDB [khacademy]> SELECT name, age, reg_date FROM kh_mem;

+------------+------+---------------------+
| name       | age  | reg_date            |
+------------+------+---------------------+
| 테스터     |   25 | 2023-02-03 14:38:01 |
| 테스터2    | NULL | 2023-02-03 14:44:16 |
| 테스터     | NULL | 2023-02-03 14:49:27 |
+------------+------+---------------------+
3 rows in set (0.00 sec)

MariaDB [khacademy]> SELECT reg_date, age, name FROM kh_mem;

+---------------------+------+------------+
| reg_date            | age  | name       |
+---------------------+------+------------+
| 2023-02-03 14:38:01 |   25 | 테스터     |
| 2023-02-03 14:44:16 | NULL | 테스터2    |
| 2023-02-03 14:49:27 | NULL | 테스터     |
+---------------------+------+------------+
3 rows in set (0.00 sec)

MariaDB [khacademy]> SELECT age, reg_date, name FROM kh_mem;

+------+---------------------+------------+
| age  | reg_date            | name       |
+------+---------------------+------------+
|   25 | 2023-02-03 14:38:01 | 테스터     |
| NULL | 2023-02-03 14:44:16 | 테스터2    |
| NULL | 2023-02-03 14:49:27 | 테스터     |
+------+---------------------+------------+
3 rows in set (0.00 sec)

MariaDB [khacademy]> SELECT * FROM kh_mem WHERE id = 'test';

+----+------+----------+-----------+------+---------------------+
| no | id   | pass     | name      | age  | reg_date            |
+----+------+----------+-----------+------+---------------------+
|  1 | test | qwer1234 | 테스터    |   25 | 2023-02-03 14:38:01 |
+----+------+----------+-----------+------+---------------------+
1 row in set (0.00 sec)

데이터 조회를 할 때 WHERE절 사용하지 않은 경우(전체 데이터가 출력된다.)
SELECT 컬럼명 FROM 테이블명;

데이터 조회를 할 때 WHERE절 사용한 경우(전체 데이터에서 조건식에 만족하는 레코드만 출력된다.)
SELECT 컬럼명 FROM 테이블명 WHERE 조건식;

o 관계 연산자 (비교 연산자) (Relational operator)
-두 값을 비교하기 위한 연산자

관계 연산자는 좌변과 우변의 값을 비교해서 크기 관계를 평가하며, 
그 결과를 참(True)과 거짓(False)으로 나타낸다. 

형식 :   
값1 관계연산자 값2 ---> 결과는 true/false

true : 참
false : 거짓
a = 2, b = 8 이 저장되어 있다라고 할 때  

연산자    사용 예            의미 설명
>         a > b  --> false   크다 (초과) 
<         a < b  --> true    작다 (미만) 
>=        a >= b --> false   크거나 같다 (이상) 
<=        a <= b --> true    작거나 같다 (이하) 
=         a = b  --> false   같다 (동등) (SQL에서는 프로그래밍 언어처럼 == 를 사용하지 않는다.)
<>        a <> b --> true    같지 않다 (실무에서 많이 사용!)
!=        a != b --> true    같지 않다

MariaDB [khacademy]> SELECT FROM kh_mem WHERE id = 'test'; -- 1이 출력
MariaDB [khacademy]> SELECT
FROM kh_mem WHERE id == 'test'; -- 에러 == X
MariaDB [khacademy]> SELECT FROM kh_mem WHERE id != 'test'; -- 2,3이 출력
MariaDB [khacademy]> SELECT
FROM kh_mem WHERE id <> 'test'; -- 2,3이 출력

o 논리 연산자 (Logical Operator)
두 개 이상의 관계 연산자를 묶을 때 사용하는 연산자

형식 : 조건1 논리연산자 조건2  --> 결과는 true/false
조건1 : <관계 연산자>
조건2 : <관계 연산자>

논리 연산자 : AND, OR, NOT

true = 1, false = 0 이라고 할 때

논리곱(AND)은 두 가지 조건이 모두 참일 경우 참이된다.
논리곱(AND) 진리표           
A      B      A AND B
0      0         0
0      1         0
1      0         0
1      1         1

  A      B     A AND B
FALSE  FALSE    FALSE
FALSE  TRUE     FALSE
TRUE   FALSE    FALSE
TRUE   TRUE     TRUE

논리합(OR)은 두 가지 조건중 한 가지만 참이면 참이된다.
논리합(OR) 진리표
A      B      A OR B
0      0         0
0      1         1
1      0         1
1      1         1

  A      B    A OR B
FALSE  FALSE   FALSE
FALSE  TRUE    TRUE
TRUE   FALSE   TRUE
TRUE   TRUE    TRUE

논리 부정 연산자 
논리부정(NOT)은 TRUE->FALSE, FALSE->TRUE 로 뒤바꾼다.
 A      NOT A
TRUE    FALSE
FALSE   TRUE  

SELECT FROM kh_mem WHERE no > 2 or no = 1; -- 1, 3이 출력된다.
SELECT
FROM kh_mem WHERE no > 2 and no = 1; -- 아무것도 출력되지 않는다.
SELECT FROM kh_mem WHERE no > 2 and no = 3; -- 3이 출력된다.
SELECT
FROM kh_mem WHERE no = 1; -- no가 1인 데이터만 출력
SELECT FROM kh_mem WHERE NOT no = 1; -- no가 1이 아닌 모든 데이터가 출력
SELECT
FROM kh_mem WHERE age > 20 AND age < 29; -- 21 ~ 28
SELECT FROM kh_mem WHERE id='test' OR no=3 AND name='테스터3';
SELECT
FROM kh_mem WHERE id='test';
SELECT FROM kh_mem WHERE no=3 AND name='테스터3';
SELECT
FROM kh_mem WHERE id='test' OR no=3;
SELECT FROM kh_mem WHERE (id='test' OR no=3);
SELECT
FROM kh_mem WHERE (id='test' OR no=3) AND name = '테스터3';

o LIKE 연산자와 와일드 카드
-LIKE 연산자는 검색하는 값을 정확히 모를 경우에 사용한다.
-특히 게시판에서 특정 단어의 검색을 할 때 사용한다.

형식:
컬럼명 LIKE 패턴
컬럼명 NOT LIKE 패턴

패턴에는 다음과 같이 두 가지 와일드 카드가 사용된다.
<와일드 카드>    <설명>
%: 문자가 없거나 하나 이상의 문자에 어떤 값이 와도 상관없다.
_: 하나의 문자에 해당하며 어떤 문자가 와도 상관없다.

SELECT FROM kh_mem WHERE pass LIKE '12%';
SELECT
FROM khmem WHERE pass LIKE '%12';
SELECT FROM kh_mem WHERE pass LIKE '%12%';
SELECT
FROM kh_mem WHERE pass = '%12%';
SELECT * FROM kh_mem WHERE id LIKE 'tes
';
SELECT FROM kh_mem WHERE id LIKE 'tes%';
SELECT
FROM khmem WHERE id NOT LIKE 'tes';

kh_mem 테이블에서 나이가 21세 ~ 28세 까지만 출력한다.
MariaDB [khacademy]> SELECT * FROM kh_mem
-> WHERE
-> age > 20 AND age < 29;

+----+------+----------+-----------+------+---------------------+
| no | id   | pass     | name      | age  | reg_date            |
+----+------+----------+-----------+------+---------------------+
|  1 | test | qwer1234 | 테스터    |   25 | 2023-02-03 14:38:01 |
+----+------+----------+-----------+------+---------------------+
1 row in set (0.00 sec)

MariaDB [khacademy]> SELECT * FROM kh_mem WHERE id = 'test' OR no = 3 AND id = 'test3';

+----+-------+----------+-----------+------+---------------------+
| no | id    | pass     | name      | age  | reg_date            |
+----+-------+----------+-----------+------+---------------------+
|  1 | test  | qwer1234 | 테스터    |   25 | 2023-02-03 14:38:01 |
|  3 | test3 | P@ssw0rd | 테스터    | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+-----------+------+---------------------+
2 rows in set (0.00 sec)

MariaDB [khacademy]> SELECT no,id FROM kh_mem WHERE id = 'test' OR no = 3 AND id = 'test3';

+----+-------+
| no | id    |
+----+-------+
|  1 | test  |
|  3 | test3 |
+----+-------+
2 rows in set (0.00 sec)

MariaDB [khacademy]> UPDATE kh_mem SET name='테스터3' WHERE no = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [khacademy]> SELECT * FROM kh_mem WHERE (id = 'test' OR no = 3);

+----+-------+----------+------------+------+---------------------+
| no | id    | pass     | name       | age  | reg_date            |
+----+-------+----------+------------+------+---------------------+
|  1 | test  | qwer1234 | 테스터     |   25 | 2023-02-03 14:38:01 |
|  3 | test3 | P@ssw0rd | 테스터3    | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+------------+------+---------------------+
2 rows in set (0.00 sec)

MariaDB [khacademy]> SELECT * FROM kh_mem WHERE (id = 'test' OR no = 3) AND name='테스터3';

+----+-------+----------+------------+------+---------------------+
| no | id    | pass     | name       | age  | reg_date            |
+----+-------+----------+------------+------+---------------------+
|  3 | test3 | P@ssw0rd | 테스터3    | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+------------+------+---------------------+
1 row in set (0.00 sec)

MariaDB [khacademy]> SELECT * FROM kh_mem WHERE no = 3 AND id = 'test3';

+----+-------+----------+------------+------+---------------------+
| no | id    | pass     | name       | age  | reg_date            |
+----+-------+----------+------------+------+---------------------+
|  3 | test3 | P@ssw0rd | 테스터3    | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+------------+------+---------------------+
1 row in set (0.00 sec)

MariaDB [khacademy]> SELECT * FROM kh_mem WHERE id = 'test' OR no = 3 AND id = 'test3';

+----+-------+----------+------------+------+---------------------+
| no | id    | pass     | name       | age  | reg_date            |
+----+-------+----------+------------+------+---------------------+
|  1 | test  | qwer1234 | 테스터     |   25 | 2023-02-03 14:38:01 |
|  3 | test3 | P@ssw0rd | 테스터3    | NULL | 2023-02-03 14:49:27 |
+----+-------+----------+------------+------+---------------------+
2 rows in set (0.00 sec)

데이터 수정
형식:
UPDATE <테이블명> SET 컬럼명=값 [,...]; -- WHERE절이 생략되면 전체 데이터를 수정 (!!! 조심 !!!)
UPDATE <테이블명> SET 컬럼명=값 [,...] WHERE 조건; -- 조건에 일치하는 데이터만 수정

SELECT * FROM kh_mem;

-- kh_mem 테이블에서 test3 사용자의 pass, age의 값을 변경한다.
UPDATE kh_mem SET pass='1q2w3e4r', age=31 WHERE id = 'test3';

-- test 사용자의 name을 tester로 변경한다.
UPDATE kh_mem SET name='tester' WHERE id='test';

-- test2 사용자의 name을 tester2로 변경한다.
UPDATE kh_mem SET name='tester2' WHERE id='test2';

-- test3 사용자의 name을 tester3로 변경한다.
UPDATE kh_mem SET name='tester3' WHERE no=3; -- WHERE id='test3';

MariaDB [khacademy]> SELECT * FROM kh_mem;

+----+-------+----------+---------+------+---------------------+
| no | id    | pass     | name    | age  | reg_date            |
+----+-------+----------+---------+------+---------------------+
|  1 | test  | qwer1234 | tester  |   25 | 2023-02-03 14:38:01 |
|  2 | test2 | 1234qwer | tester2 | NULL | 2023-02-03 14:44:16 |
|  3 | test3 | 1q2w3e4r | tester3 |   31 | 2023-02-03 14:49:27 |
+----+-------+----------+---------+------+---------------------+
3 rows in set (0.00 sec)

게시판
-글 목록: SELECT
-글 저장: INSERT
-글 수정: UPDATE
-글 삭제: DELETE

데이터 삭제
형식:
DELETE FROM 테이블명; -- WHERE절이 생략되면 전체 데이터를 삭제 (!!! 조심 !!!)
DELETE FROM 테이블명 WHERE 조건; -- 조건에 맞는 데이터만 해당된다.

DELETE FROM kh_mem WHERE no=2; -- no가 2인 데이터를 삭제한다.
DELETE FROM kh_mem; -- 모든 데이터를 삭제한다.

실습> 일괄처리로 DB/TB 생성해서 자료 저장하기

1. 일괄처리 파일 생성

# vi naverdb.sql
CREATE DATABASE naver_db;
USE naver_db
CREATE TABLE member 
(
    no INT AUTO_INCREMENT PRIMARY KEY COMMENT '번호',
    id VARCHAR(10) NOT NULL UNIQUE COMMENT '아이디',
    name VARCHAR(20) NOT NULL COMMENT '이름',
    sex CHAR  COMMENT '성별',
    post_num CHAR(8) COMMENT '우편번호',
    address VARCHAR(80) COMMENT '주소',
    tel VARCHAR(15) COMMENT '전화번호',
    age INT COMMENT '나이'
);
INSERT INTO member VALUES ('', 'yjhwang', '황영주', 'M', '100-011', '서울시 중구 충무로1가', '234-8879', 35);
INSERT INTO member VALUES ('', 'khshul', '설기형', 'M', '607-010', '부산시 동래구 명륜동', '764-3784', 33);
INSERT INTO member VALUES ('', 'chpark', '박철호', 'M', '503-200', '광주시 남구 지석동', '298-9730', 34);
INSERT INTO member VALUES ('', 'shlee', '이상훈', 'M', '503-200', '광주시 남구 도금동', '838-4347', 32);
INSERT INTO member VALUES ('', 'jyjang', '장영숙', 'W', '503-201', '부산시 영도구 봉래동5가', '399-9809', 24);
INSERT INTO member VALUES ('', 'yjbae', '배용진', 'M', '606-065', '서울시 은평구 응암4동', '857-5683', 30);
INSERT INTO member VALUES ('', 'hbpark', '박혜빈', 'W', '122-014', '경기도 과천시 중앙동', '234-7677', 22);
INSERT INTO member VALUES ('', 'mskim', '김문수', 'M', '427-760', '경기도 시흥시 신천동', '370-6003', 63);
INSERT INTO member VALUES ('', 'bkcha', '차범길', 'M', '429-020', '대전시 서구 둔산1동', '432-9877', 49);
INSERT INTO member VALUES ('', 'kskim', '김길수', 'M', '302-121', '경기도 수원시 장안구 파장동', '324-5875', 54);
INSERT INTO member VALUES ('', 'srkim', '김수련', 'M', '440-747', '대구시 달서구 신당동', '987-3688', 23);
INSERT INTO member VALUES ('', 'srlee', '이성현', 'M', '704-701', '경기도 수원시 권선구 매산로1가', '243-6844', 36);
INSERT INTO member VALUES ('', 'hnjang', '정한나', 'W', '441-081', '광주시 서구 화정4동', '845-4547', 58);
INSERT INTO member VALUES ('', 'mylee', '이명연', 'W', '502-791', '광주시 서구 쌍촌동', '837-9432', 33);
INSERT INTO member VALUES ('', 'yskim', '김영숙', 'W', '429-010', '경기도 시흥시 대야동', '374-8438', 53);

2. 일괄처리 실행
일괄처리는 SQL 명령어를 파일에 저장한 후 한번에 실행하는 것으로 쉘스크립트와 비슷하게 생각하면 된다.

# mysql < naverdb.sql 
# mysql
MariaDB [(none)]> SHOW DATABASES;
MariaDB [(none)]> USE naver_db
MariaDB [naver_db]> SHOW TABLES;
MariaDB [naver_db]> DESC member;
MariaDB [naver_db]> SELECT * FROM member;

3. DML 실습
o 자신의 계정 추가
INSERT INTO member VALUES('', 'khuser', '케이', 'M', '111-222', '서울시 강남구 역삼동', '02-1111-2222', 17
);

o '배용진' 의 모든 정보 출력
SELECT * FROM member WHERE name='배용진';

o 20대의 이름, 주소, 나이 출력
SELECT name,address,age FROM member WHERE age>=20 AND age<30;
SELECT name,address,age FROM member WHERE age>=20 AND age<=29;

o 남성의 이름, 나이, 성별, 전화번호, 아이디 출력
SELECT name,age,sex,tel,id FROM member WHERE sex='M';

o 30세 미만 또는 50세 이상 여성의 나이, 주소 출력
-- sex는 성별을 확인하기 위해서 필요하다.
SELECT age,address,sex FROM member WHERE (age<30 OR age>=50);
SELECT age,address,sex FROM member WHERE (age<30 OR age>=50) AND sex='W';

o 20대 또는 40대 남성의 나이, 아이디, 전화번호 출력
-- sex는 성별을 확인하기 위해서 필요하다.
SELECT age, id, tel, sex FROM member WHERE age>=20 and age<30;
SELECT age, id, tel, sex FROM member WHERE age>=40 and age<50;
SELECT age, id, tel, sex FROM member WHERE (age>=20 and age<30) OR (age>=40 AND age<50);
SELECT age, id, tel, sex FROM member WHERE ((age>=20 and age<30) OR (age>=40 AND age<50)) AND sex='M';

실습> SQLite 설치하기

SQLite는 오픈소스 파일 DB이다.
API도 간단해서 쉽게 사용할 수 있다.

윈도우/리눅스에서 사용할 수 있고 경량 DB이므로 스마트폰/스마트TV에도 들어가 있다.

(참고) SQLite - Alter table command
https://www.tutorialspoint.com/sqlite/sqlite_alter_command.htm

o 리눅스에서 설치하기
1. 패키지 설치

# yum -y install sqlite

2. 데이터베이스 생성

형식: sqlite3 DB파일명.db

# sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .help

3. 테이블 작성

형식 : 
CREATE TABLE 테이블명 ( 컬럼명1 자료형, 컬럼명2 자료형 ...);
CREATE TABLE 테이블명 ( 컬럼1 INTEGER, 컬럼2 VARCHAR(정수));
MariaDB   SQLite 자료형
NULL      NULL
int       INTEGER
float     REAL
text      TEXT
member 테이블을 생성한다.
컬럼1 : no  , 정수
컬럼2 : name, 문자열 16개
CREATE TABLE member 
(
    no integer primary key autoincrement, 
    name varchar(16)
);

테이블을 확인할 때 .table 명령어를 사용한다.
sqlite> .table

member

4. 데이터 저장
형식 1 : INSERT INTO <테이블명> VALUES(값1, 값2);
형식 2 : INSERT INTO <테이블명> (컬럼1, 컬럼2) VALUES(값1, 값2);
ex) INSERT INTO member VALUES(1, '홍길동');
ex) INSERT INTO member (id, name) VALUES(1, '홍길동');

sqlite> INSERT INTO member VALUES(NULL, '고길동');
sqlite> INSERT INTO member VALUES(NULL, '홍길동');
sqlite> INSERT INTO member VALUES(NULL, '홍길순');

5. 데이터 출력
형식 : SELECT <컬럼명> FROM <테이블명> [WHERE 조건];
컬럼명 : 은 모든 컬럼
sqlite> SELECT
FROM member;
1|고길동
2|홍길동
3|홍길순
sqlite> SELECT no FROM member;
1
2
3
sqlite> SELECT name FROM member;
고길동
홍길동
홍길순

6. 조건식으로 데이터 검색
조건식
WHERE 컬럼명 > 값 크다
WHERE 컬럼명 < 값 작다
WHERE 컬럼명 >= 값 크거나 같다
WHERE 컬럼명 <= 값 작거나 같다
WHERE 컬럼명 = 값 같다
WHERE 컬럼명 != 값 같지 않다

SELECT 컬럼명 FROM 테이블명 WHERE 조건식;

member 테이블에서 no가 3인 데이터의 모든 컬럼을 출력한다.
SELECT * FROM member WHERE no=3;
3|홍길순

member테이블에서 name이 홍길동인 데이터의 모든 컬럼을 출력한다.
SELECT * FROM member WHERE name='홍길동';

member 테이블에서 no가 1 또는 3인 데이터의 모든 컬럼을 출력한다.
sqlite> SELECT * FROM member WHERE no=1 OR no=3;
1|고길동
3|홍길순

7. 레코드 정렬
형식 : SELECT 컬럼명 FROM 테이블명 ORDER BY 컬럼명 정렬방법;
ASC: 오름차순, DESC: 내림차순
SELECT FROM member ORDER BY no ASC;
SELECT
FROM member ORDER BY no DESC;

member 테이블에서 no를 기준으로 오름차순으로 정렬해서 모두 출력한다.
sqlite> SELECT * FROM member ORDER BY no ASC;
1|고길동
2|홍길동
3|홍길순

member 테이블에서 no를 기준으로 내림차순으로 정렬해서 모두 출력한다.
sqlite> SELECT * FROM member ORDER BY no DESC;
3|홍길순
2|홍길동
1|고길동

8. 참조하는 레코드 수를 지정
형식 : SELECT 컬럼명 FROM 테이블명 LIMIT 개수;
SELECT FROM member; <-- 전체 레코드 수를 출력
SELECT
FROM member LIMIT 3; <-- 3개의 레코드 수를 출력
SELECT * FROM member LIMIT 2; <-- 2개의 레코드 수를 출력

sqlite> SELECT * FROM member;
1|고길동
2|홍길동
3|홍길순

sqlite> SELECT * FROM member LIMIT 2;
1|고길동
2|홍길동

sqlite> SELECT * FROM member LIMIT 1;
1|고길동

sqlite> SELECT * FROM member ORDER BY no DESC LIMIT 1;
3|홍길순

9. 데이터 변경
형식 :
UPDATE 테이블명 SET 컬럼명=값[, ...]; (전체 레코드 변경)
UPDATE 테이블명 SET 컬럼명=값 WHERE 조건식; (조건식에 해당하는 레코드만 변경)
ex) UPDATE member SET name='홍길자' WHERE id=1;

sqlite> SELECT * FROM member;
1|고길동 <-- 원래 값
2|홍길동
3|홍길순

member 테이블에서 no가 1인 레코드 중에서 name의 값을 홍길자로 변경한다.
sqlite> UPDATE member SET name='홍길자' WHERE no=1;

sqlite> SELECT * FROM member;
1|홍길자 <-- 변경된 값
2|홍길동
3|홍길순

member 테이블에서 no가 3인 레코드 중에서 name의 값을 김길동으로 변경한다.
sqlite> UPDATE member SET name='김길동' WHERE no=3;
sqlite> SELECT * FROM member;
1|홍길자
2|홍길동
3|김길동 <-- 변경된 값

10. 레코드 삭제
형식 :
DELETE FROM 테이블명; <-- 테이블에 있는 모든 데이터 삭제
DELETE FROM 테이블명 WHERE 조건식; <-- 조건에 맞는 데이터 삭제
e.g.) DELETE FROM member WHERE no=1;

sqlite> SELECT * FROM member;
1|홍길자
2|홍길동
3|김길동

member 테이블에서 no가 1인 자료를 삭제한다.
sqlite> DELETE FROM member WHERE no=1;
sqlite> SELECT * FROM member;
2|홍길동
3|김길동

WHERE절이 생략 되었으므로 member 테이블의 모든 자료를 삭제한다.
sqlite> DELETE FROM member;
sqlite> SELECT * FROM member;

sqlite> INSERT INTO member VALUES(NULL, '고길동');
sqlite> INSERT INTO member VALUES(NULL, '홍길동');
sqlite> INSERT INTO member VALUES(NULL, '홍길순');

sqlite> SELECT * FROM member;
4|고길동
5|홍길동
6|홍길순
sqlite> .quit

실습> 파이썬에서 SQLite3 DB에 값 저장하기

python에서 sqlite3에 저장하는 순서
1. sqlite3 모듈을 임포트한다.
2. db에 연결해서 커넥션 객체를 생성한다.
conn = sqlite3.connect('test.db')
3. cursor 객체를 생성한다.
c = conn.cursor()
4. 명령어를 실행한다.
c.execute('SQL 명령어')
5. commit으로 완료해준다.
conn.commit()
6. db를 닫는다.
c.close()
conn.close()

# yum -y install python3
# vi sql1.py
"""
파일명: sql1.py
프로그램 설명: example.db 에 데이터 저장하기
SQL문: INSERT
작성자: 리눅스마스터넷
"""

# 1. 모듈을 불러들인다.
import sqlite3

# 2. example.db에 연결해서 connectin 객체를 생성한다.
conn = sqlite3.connect('test.db')

# 3. cursor 객체를 생성한다.
c = conn.cursor()

# 4. SQL 명령어를 실행한다.
query = "INSERT INTO member VALUES(NULL, '김길동')"
c.execute(query)

# 5. commit 으로 완료한다.
conn.commit()

# 6. DB를 닫는다.
c.close()     # 커서 객체 종료
conn.close()  # 커넥션 객체 종료

# python3 sql1.py 

# sqlite3 test.db 
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT * FROM member;
4|고길동
5|홍길동
6|홍길순
7|김길동
sqlite> .quit


# vi sql2.py 
"""
파일명: sql1.py
프로그램 설명: example.db 에 데이터 저장하기
SQL문: INSERT
작성자: 리눅스마스터넷
"""

# 1. 모듈을 불러들인다.
import sqlite3

# 2. example.db에 연결해서 connectin 객체를 생성한다.
conn = sqlite3.connect('test.db')

# 3. cursor 객체를 생성한다.
c = conn.cursor()

# 4. SQL 명령어를 실행한다.
name  = input('이름 입력: ')
query = f"INSERT INTO member VALUES(NULL, '{name}')"
c.execute(query)

# 5. commit 으로 완료한다.
conn.commit()

# 6. DB를 닫는다.
c.close()     # 커서 객체 종료
conn.close()  # 커넥션 객체 종료

# python3 sql2.py 
이름 입력: James 

# sqlite3 test.db 
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT * FROM member;
4|고길동
5|홍길동
6|홍길순
7|김길동
8|James   <-- 입력 받은 이름이 저장된다.
sqlite> .quit

o 윈도우에서 설치하기
나중에...

profile
정보보안 전문가

0개의 댓글