정보보안/공부 기록

인코딩, Join, view

고고잉 2023. 1. 1. 19:02

DBMS 기본 인코딩 설정
vim /etc/my.cnf 

[client] (추가)
default-character-set=utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
(추가)
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
character-set-server=utf8
collation-server=utf8_general_ci

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump] (추가)
default-character-set=utf8

[mysql] (추가)
default-character-set=utf8
"/etc/my.cnf" 23L, 507C                                                              2,1          모두


데이터베이스 확인
how create database entest; 

데이터베이스 안에 테이블은 별도 설정이 없다면 데이터베이스 설정을 따라간다.

ascii 로 지정하여 데이터베이스 생성
create database entest2 default character set ascii;
euckr 로 지정하여 데이터베이스 생성
create database entest3 default character set euckr;
utf8로 변경
alter database entest3 default character set utf8;

테이블 생성
mysql> create table entest.entable ( no int auto_increment primary key, name varchar(20) );

mysql> create table entest2.entable ( no int auto_increment primary key, name varchar(20) );

인코딩 설정 확인 
- 데이터베이스에 상속받아 데이터베이스와 같은 결과를 보여준다.
show create table entest.entable;
show create table entest2.entable;

엔진 확인
show engines;

select table_name, engine from information_schema.tables where table_schema='naver_db';
+------------+--------+
| table_name | engine |
+------------+--------+
| member     | MyISAM |
+------------+--------+

기본 엔진임시변경
set global storage_engine = InnoDB;
설정 후 나갔다가 다시 접속해서 확인해보면 default값이 변경되어잇다.
show engines;

+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| MyISAM     | YES     | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| InnoDB     | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
+------------+---------+------------------------------------------------------------+--------------+------+------------+

mysqld 를 재시작하면 다시 원래대로 돌아온다.

inner join 
- 내부 조인
- 두 테이블 모두 조건구문에 일치하는 데이터만 반환

첫번째 방식
select m_category, m_name, m_seller, s_level, s_attack from market inner join sword on m_name = s_name;
두번째 방식
select m_category, m_name, m_seller, s_name, s_level, s_attack from market, sword where m_name = s_name;

+------------+-----------+-----------+---------+----------+
| m_category | m_name    | m_seller  | s_level | s_attack |
+------------+-----------+-----------+---------+----------+
| 검         | 곤륜검    | everynick |      50 |      540 |
| 검         | 풍뢰검    | ruina     |      45 |      263 |
+------------+-----------+-----------+---------+----------+

OUTER JOIN

left outer join
select m_category, m_name, m_seller, s_level, s_attack from market left join sword on m_name = s_name;
+------------+-----------------+-----------+---------+----------+
| m_category | m_name          | m_seller  | s_level | s_attack |
+------------+-----------------+-----------+---------+----------+
| 지팡이     | 촉마지팡이      | merry     |    NULL |     NULL |
| 검         | 곤륜검          | everynick |      50 |      540 |
| 기공패     | 곤륜기공패      | jamienick |    NULL |     NULL |
| 검         | 풍뢰검          | ruina     |      45 |      263 |
+------------+-----------------+-----------+---------+----------+

right outer join
select m_category, m_name, m_seller, s_level, s_attack from market right join sword on m_name = s_name;
+------------+-----------+-----------+---------+----------+
| m_category | m_name    | m_seller  | s_level | s_attack |
+------------+-----------+-----------+---------+----------+
| 검         | 곤륜검    | everynick |      50 |      540 |
| NULL       | NULL      | NULL      |      36 |      147 |
| NULL       | NULL      | NULL      |      20 |       64 |
| 검         | 풍뢰검    | ruina     |      45 |      263 |
+------------+-----------+-----------+---------+----------+



집합연산자
union
- 첫번째 select된 레코드 먼저 출력되고 그다음 select 된 레코드가 출력된다.
- 첫번째 컬럼이 출력된다.
select m_category, m_name, m_seller from market union select s_name, s_level, s_attack from sword;
+------------+-----------------+-----------+
| m_category | m_name          | m_seller  |
+------------+-----------------+-----------+
| 지팡이     | 촉마지팡이      | merry     |
| 검         | 곤륜검          | everynick |
| 기공패     | 곤륜기공패      | jamienick |
| 검         | 풍뢰검          | ruina     |
| 곤륜검     | 50              | 540       |
| 염화검     | 36              | 147       |
| 요마검     | 20              | 64        |
| 풍뢰검     | 45              | 263       |
+------------+-----------------+-----------+


select * from staff union select * from sword;
+-----------------+---------+----------+
| f_name          | f_level | f_attack |
+-----------------+---------+----------+
| 촉마지팡이      |      50 |      311 |
| 유성지팡이      |      50 |      400 |
| 곤륜검          |      50 |      540 |
| 염화검          |      36 |      147 |
| 요마검          |      20 |       64 |
| 풍뢰검          |      45 |      263 |
+-----------------+---------+----------+

aliace 별칭
- 컬럼명 as 별칭
select s_name as name, s_attack as attack from sword union select f_name, f_attack from staff;
+-----------------+--------+
| name            | attack |
+-----------------+--------+
| 곤륜검          |    540 |
| 염화검          |    147 |
| 요마검          |     64 |
| 풍뢰검          |    263 |
| 촉마지팡이      |    311 |
| 유성지팡이      |    400 |
+-----------------+--------+

- 컬럼명 as 별칭 에서 as는 생략가능
select s_name name, s_attack attack from sword union select f_name, f_attack from staff;
+-----------------+--------+
| name            | attack |
+-----------------+--------+
| 곤륜검          |    540 |
| 염화검          |    147 |
| 요마검          |     64 |
| 풍뢰검          |    263 |
| 촉마지팡이      |    311 |
| 유성지팡이      |    400 |
+-----------------+--------+

 뷰 - view
- 가상테이블, 논리적인 독립성 제공
- 따로 실체가 없다. 기존에 있던것을 select해서 출력하는 것이다.
- view 는 데이터베이스(뷰) art_board_list 테이블(뷰)
create view art_board_list as select b_subject, u_name, reg_date from art_board join art_member on b_id=u_id;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+---------------------+
| Tables_in_artist_db |
+---------------------+
| art_board           |
| art_board_list      |
| art_member          |
+---------------------+

뷰도 수정할 수 있다.
alter view art_board_list as 
    -> select b_no, b_subject, u_name, reg_date from art_board, art_member where b_id=u_id;

뷰에서 insert는 조건에따라 가능하다.