실습> 테이블 생성하기
[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 윈도우에서 설치하기
나중에...